@voltro/cms 0.86.0 → 0.87.0

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 (201) hide show
  1. package/CHANGELOG.md +5321 -0
  2. package/README.md +138 -0
  3. package/THIRD-PARTY-NOTICES.md +860 -221
  4. package/dist/RichDocumentView.js +81 -36
  5. package/dist/aiCandidates.js +3 -3
  6. package/dist/applicationBuildSnapshotService.js +101 -0
  7. package/dist/assetRenditions.js +102 -0
  8. package/dist/assetRevision.js +46 -0
  9. package/dist/assetUseRights.js +72 -0
  10. package/dist/availability.js +19 -16
  11. package/dist/blueprint.js +75 -75
  12. package/dist/build.d.ts +3063 -0
  13. package/dist/build.js +37 -0
  14. package/dist/buildApplicationAdmission.js +16 -0
  15. package/dist/buildApplicationCatalog.js +136 -0
  16. package/dist/buildApplicationCatalogTable.js +24 -0
  17. package/dist/buildApplicationRest.js +99 -0
  18. package/dist/buildApplicationUpload.js +111 -0
  19. package/dist/buildSnapshot.js +401 -0
  20. package/dist/buildSnapshotApplicationPin.js +32 -0
  21. package/dist/buildSnapshotRest.js +210 -0
  22. package/dist/buildSnapshotService.js +265 -0
  23. package/dist/buildSnapshotTables.js +25 -0
  24. package/dist/bulk.js +71 -70
  25. package/dist/changes.js +279 -62
  26. package/dist/consent.js +5 -5
  27. package/dist/contentLocations.js +53 -0
  28. package/dist/contentProjection.js +83 -0
  29. package/dist/contentRouteIdentity.js +13 -0
  30. package/dist/contentRouteMaterializer.js +97 -0
  31. package/dist/contentRouteTypes.js +39 -0
  32. package/dist/contentSeo.js +189 -0
  33. package/dist/contentTreePath.js +60 -0
  34. package/dist/contentType.js +117 -100
  35. package/dist/contentValues.js +18 -0
  36. package/dist/copies.js +3 -3
  37. package/dist/domainHost.js +7 -0
  38. package/dist/domains.js +81 -87
  39. package/dist/draftTexts.js +37 -37
  40. package/dist/duplicates.js +23 -23
  41. package/dist/environmentAliases.js +138 -0
  42. package/dist/environments.js +107 -69
  43. package/dist/errors.js +54 -14
  44. package/dist/experiments.js +7 -7
  45. package/dist/frontendBindings.js +99 -0
  46. package/dist/frontendMedia.js +18 -0
  47. package/dist/index.d.ts +760 -47
  48. package/dist/index.js +89 -73
  49. package/dist/initializePublicRoutes.js +28 -0
  50. package/dist/liveContentRouteView.js +76 -0
  51. package/dist/nativeOutputDeploymentService.js +205 -0
  52. package/dist/outputActivation.js +234 -0
  53. package/dist/outputActivationOrigin.js +51 -0
  54. package/dist/outputActivationStore.js +411 -0
  55. package/dist/outputActivationTables.js +11 -0
  56. package/dist/outputActivationTarget.js +81 -0
  57. package/dist/outputActivationTargetTable.js +25 -0
  58. package/dist/outputDeployment.js +174 -0
  59. package/dist/outputDeploymentRest.js +168 -0
  60. package/dist/outputDeploymentService.js +241 -0
  61. package/dist/outputRouteGraph.js +177 -0
  62. package/dist/outputSafetyArtifact.js +147 -0
  63. package/dist/outputTargetRest.js +62 -0
  64. package/dist/pathSegmentEncoding.js +4 -0
  65. package/dist/privateCmsTransport.js +76 -0
  66. package/dist/privateNativeRouteReservation.js +10 -0
  67. package/dist/promotion.js +68 -59
  68. package/dist/publicBuild.js +90 -0
  69. package/dist/publicBuildRest.js +98 -0
  70. package/dist/publicBuildService.js +63 -0
  71. package/dist/publicOutputHttp.js +129 -0
  72. package/dist/publicOutputService.js +287 -0
  73. package/dist/publicPresentation.js +17 -0
  74. package/dist/publicRouteDispositionAdmission.js +38 -0
  75. package/dist/publicRouteHistoryStore.js +12 -0
  76. package/dist/publicRouteHistoryView.js +34 -0
  77. package/dist/publicRouteIntegrity.js +5 -0
  78. package/dist/publicRouteMutation.js +6 -0
  79. package/dist/publicRouteNamespace.js +134 -0
  80. package/dist/publicRoutePublication.js +36 -0
  81. package/dist/publicRouteRegistry.js +17 -0
  82. package/dist/publicRouteRegistryBinding.js +194 -0
  83. package/dist/publicRouteRegistryDefinition.js +76 -0
  84. package/dist/publicRouteSitePublication.js +40 -0
  85. package/dist/publicRouteTables.js +13 -0
  86. package/dist/publicRouteUrl.js +18 -0
  87. package/dist/publicationSeo.js +52 -0
  88. package/dist/publicationState.js +296 -0
  89. package/dist/quality.js +8 -8
  90. package/dist/reconfigurePublicRoutes.js +41 -0
  91. package/dist/redirects.js +104 -73
  92. package/dist/referenceGraph.js +15 -14
  93. package/dist/references.js +2 -2
  94. package/dist/release.js +177 -141
  95. package/dist/renderReadAuthority.js +43 -0
  96. package/dist/renderReadGrant.js +137 -0
  97. package/dist/review.js +28 -28
  98. package/dist/richDocument.js +54 -24
  99. package/dist/routeDispositionGraph.js +44 -0
  100. package/dist/routeDispositionRest.js +51 -0
  101. package/dist/routeDispositionService.js +73 -0
  102. package/dist/routeDispositionStore.js +289 -0
  103. package/dist/routeDispositionTables.js +5 -0
  104. package/dist/routeDispositions.js +91 -0
  105. package/dist/routeHistoryStorage.js +320 -0
  106. package/dist/routeHistoryStore.js +12 -0
  107. package/dist/schedule.js +36 -36
  108. package/dist/seo.js +1 -1
  109. package/dist/series.js +11 -11
  110. package/dist/share.js +13 -13
  111. package/dist/siteBindings.js +159 -0
  112. package/dist/siteBuildCandidate.js +104 -0
  113. package/dist/siteDelivery.js +115 -0
  114. package/dist/siteState.js +47 -0
  115. package/dist/snapshotAddressGraph.js +55 -0
  116. package/dist/snapshotAddressRead.js +73 -0
  117. package/dist/snapshotAppConsumer.js +71 -0
  118. package/dist/snapshotAppExecution.js +102 -0
  119. package/dist/snapshotApplication.js +75 -0
  120. package/dist/snapshotApprovedRouteDispositions.js +44 -0
  121. package/dist/snapshotAssetAssembly.js +70 -0
  122. package/dist/snapshotAssetAssemblyRest.js +50 -0
  123. package/dist/snapshotBindingRead.js +61 -0
  124. package/dist/snapshotCodeSeo.js +29 -0
  125. package/dist/snapshotComponent.js +34 -0
  126. package/dist/snapshotComponentSource.js +24 -0
  127. package/dist/snapshotConsumer.js +87 -0
  128. package/dist/snapshotContentIdentity.js +10 -0
  129. package/dist/snapshotDefinitions.js +264 -0
  130. package/dist/snapshotDocumentAssembly.js +193 -0
  131. package/dist/snapshotDocumentAssemblyRest.js +84 -0
  132. package/dist/snapshotDocumentProjection.js +202 -0
  133. package/dist/snapshotDocumentTransfer.js +35 -0
  134. package/dist/snapshotDocumentTransferRest.js +80 -0
  135. package/dist/snapshotDomains.js +56 -0
  136. package/dist/snapshotEnvironment.js +31 -0
  137. package/dist/snapshotFieldPlan.js +85 -0
  138. package/dist/snapshotFrontend.js +103 -0
  139. package/dist/snapshotLink.js +8 -0
  140. package/dist/snapshotMedia.js +111 -0
  141. package/dist/snapshotMediaCapture.js +246 -0
  142. package/dist/snapshotMediaFields.js +225 -0
  143. package/dist/snapshotMediaRead.js +185 -0
  144. package/dist/snapshotMediaReader.js +13 -0
  145. package/dist/snapshotObservation.js +16 -0
  146. package/dist/snapshotObservedRouteHistory.js +34 -0
  147. package/dist/snapshotOutputTransfer.js +78 -0
  148. package/dist/snapshotPageLoader.js +7 -0
  149. package/dist/snapshotPageSeo.js +59 -0
  150. package/dist/snapshotPathLocale.js +15 -0
  151. package/dist/snapshotPresentation.js +86 -0
  152. package/dist/snapshotPresentationPolicy.js +12 -0
  153. package/dist/snapshotProjection.js +119 -0
  154. package/dist/snapshotPublicAccess.js +161 -0
  155. package/dist/snapshotPublicRouteHistory.js +40 -0
  156. package/dist/snapshotReadAdmission.js +38 -0
  157. package/dist/snapshotRedirectOutput.js +151 -0
  158. package/dist/snapshotRedirectTargets.js +24 -0
  159. package/dist/snapshotRedirects.js +132 -0
  160. package/dist/snapshotReference.js +8 -0
  161. package/dist/snapshotReferenceAddress.js +10 -0
  162. package/dist/snapshotReferenceGraph.js +79 -0
  163. package/dist/snapshotReferenceRead.js +65 -0
  164. package/dist/snapshotRelease.js +99 -0
  165. package/dist/snapshotRender.js +361 -0
  166. package/dist/snapshotRenderDependencies.js +178 -0
  167. package/dist/snapshotRenditions.js +88 -0
  168. package/dist/snapshotRichDocument.js +62 -0
  169. package/dist/snapshotRoleTransfer.js +106 -0
  170. package/dist/snapshotRoleTransferRest.js +99 -0
  171. package/dist/snapshotRouteAdmission.js +71 -0
  172. package/dist/snapshotRouteDispatch.js +111 -0
  173. package/dist/snapshotRouteDispositionPlan.js +73 -0
  174. package/dist/snapshotRouteRead.js +43 -0
  175. package/dist/snapshotRoutes.js +79 -0
  176. package/dist/snapshotRouting.js +113 -0
  177. package/dist/snapshotSeo.js +179 -0
  178. package/dist/snapshotSeoControls.js +101 -0
  179. package/dist/snapshotSeoDocumentInventory.js +115 -0
  180. package/dist/snapshotSeoDocuments.js +129 -0
  181. package/dist/snapshotSeoMerge.js +85 -0
  182. package/dist/snapshotSeoMetadata.js +137 -0
  183. package/dist/snapshotSeoOutput.js +173 -0
  184. package/dist/snapshotSeoPathSets.js +105 -0
  185. package/dist/snapshotSeoRead.js +88 -0
  186. package/dist/snapshotSite.js +128 -0
  187. package/dist/snapshotSitemapFiles.js +36 -0
  188. package/dist/snapshotTreeDependencies.js +58 -0
  189. package/dist/snapshotTreeLoader.js +10 -0
  190. package/dist/snapshotTreeRead.js +158 -0
  191. package/dist/staticPathSet.js +177 -0
  192. package/dist/staticPathSetRest.js +129 -0
  193. package/dist/staticPathSetService.js +249 -0
  194. package/dist/staticPathSetStore.js +338 -0
  195. package/dist/tree.js +9 -9
  196. package/dist/validation.js +53 -53
  197. package/dist/web.d.ts +709 -7
  198. package/dist/web.js +50 -33
  199. package/dist/workflow.js +8 -8
  200. package/dist/write.js +250 -225
  201. package/package.json +20 -6
package/dist/web.d.ts CHANGED
@@ -3,6 +3,9 @@ import { Row } from '@voltro/database';
3
3
  import { Schema as Schema_2 } from 'effect';
4
4
  import { YieldableError } from 'effect/Cause';
5
5
 
6
+ /** Validate against the captured policy, not a live purpose or a cookie version. */
7
+ export declare const admitSnapshotPresentation: (purposes: ReadonlyArray<SnapshotConsentPurpose>, supplied: unknown) => SnapshotPresentation;
8
+
6
9
  /** A document's address in every language it has its own variant in. */
7
10
  export declare const alternatesOf: (trees: ReadonlyArray<LocalizedTree>, documentId: string) => ReadonlyArray<PageAlternate>;
8
11
 
@@ -44,6 +47,12 @@ export declare const applySelection: (values: Readonly<Record<string, unknown>>,
44
47
  */
45
48
  export declare const applyTranslation: (fields: Readonly<Record<string, FieldSchema>>, source: Readonly<Record<string, unknown>>, units: ReadonlyArray<TranslationUnit>) => Record<string, unknown>;
46
49
 
50
+ /** Declares the original-file field of a versioned asset document. It does
51
+ * not imply ingestion, creative approval, rights or public delivery fitness. */
52
+ declare interface AssetConfig {
53
+ readonly file: string;
54
+ }
55
+
47
56
  /**
48
57
  * Attribute per-day values (`YYYY-MM-DD`, UTC) to the revision live at the end
49
58
  * of each day. A day when nothing was live is left out (`unattributed`).
@@ -114,6 +123,8 @@ export declare const blockMarkup: (block: RichBlock) => string;
114
123
  * Arrange one variant per document into a tree. `entries` holds at most one
115
124
  * entry per `documentId` (the first one wins). A node without a segment is
116
125
  * not routable and counts as an orphan, and so does everything below it.
126
+ * Equal positions use locale-independent JavaScript string order for segments
127
+ * and document IDs; process locale or ICU data must not reorder a snapshot.
117
128
  */
118
129
  export declare const buildTree: (entries: ReadonlyArray<TreeEntry>, config: TreeConfig) => CmsTree;
119
130
 
@@ -176,6 +187,10 @@ export declare interface CacheRequest {
176
187
  readonly headers: Readonly<Record<string, string | undefined>>;
177
188
  }
178
189
 
190
+ /** Shared with signed static URL identities. No database, crypto, server
191
+ * module or request credentials may enter this URL-only normalization. */
192
+ export declare const canonicalCmsPublicPath: (path: string) => string;
193
+
179
194
  /** Who suggests the edit, and when; `id` names the change. */
180
195
  export declare type ChangeAuthor = Omit<RichChange, 'kind'>;
181
196
 
@@ -185,6 +200,14 @@ export declare type ChangeDecision = 'accept' | 'reject' | 'keep';
185
200
  /** The declared fields whose values differ between `before` and `after`, in declaration order. */
186
201
  export declare const changedFields: (fields: Readonly<Record<string, unknown>>, before: Readonly<Record<string, unknown>>, after: Readonly<Record<string, unknown>>) => ReadonlyArray<string>;
187
202
 
203
+ /** The feed cannot issue a safe cursor; migrate, repair scope, or perform full sync. */
204
+ export declare class ChangeFeedUnavailable extends ChangeFeedUnavailable_base {
205
+ }
206
+
207
+ declare const ChangeFeedUnavailable_base: Schema_2.Class<ChangeFeedUnavailable, Schema_2.TaggedStruct<"ChangeFeedUnavailable", {
208
+ readonly reason: Schema_2.Literals<readonly ["scope", "cursor", "migration", "exhausted"]>;
209
+ }>, YieldableError>;
210
+
188
211
  /** Throws for a vendor origin that is not exactly `https://host[:port]` — it would widen the policy. */
189
212
  export declare const checkConsentPurposes: (purposes: ReadonlyArray<ConsentPurpose>) => void;
190
213
 
@@ -206,6 +229,51 @@ export declare interface CmsExtensionManifest {
206
229
  readonly settings?: ReadonlyArray<ExtensionSetting>;
207
230
  }
208
231
 
232
+ export declare interface CmsPublicBuildDocument {
233
+ readonly querySelectorAll: (selector: string) => ArrayLike<{
234
+ readonly getAttribute: (name: string) => string | null;
235
+ }>;
236
+ }
237
+
238
+ export declare interface CmsPublicBuildIdentity {
239
+ readonly version: 1;
240
+ readonly snapshotDigest: string;
241
+ readonly inputsId: string;
242
+ readonly executionId: string;
243
+ }
244
+
245
+ export declare interface CmsPublicBuildPage<T = unknown> {
246
+ readonly version: 1;
247
+ readonly build: CmsPublicBuildIdentity;
248
+ readonly path: string;
249
+ readonly page: T;
250
+ }
251
+
252
+ export declare class CmsPublicBuildUnavailable extends Error {
253
+ readonly reason: 'identity' | 'request' | 'changed' | 'not-found' | 'denied' | 'transport';
254
+ readonly _tag = "CmsPublicBuildUnavailable";
255
+ constructor(reason: 'identity' | 'request' | 'changed' | 'not-found' | 'denied' | 'transport');
256
+ }
257
+
258
+ export declare interface CmsRouteDispositionApproval extends CmsRouteDispositionRecord {
259
+ readonly count: number;
260
+ }
261
+
262
+ export declare interface CmsRouteDispositionPage {
263
+ readonly revision: number;
264
+ readonly count: number;
265
+ readonly entries: ReadonlyArray<CmsRouteDispositionRecord>;
266
+ readonly next: string | null;
267
+ }
268
+
269
+ export declare interface CmsRouteDispositionRecord {
270
+ readonly revision: number;
271
+ readonly revisionId: string;
272
+ readonly previousRevisionId: string | null;
273
+ readonly definition: RouteDispositionDefinition;
274
+ readonly approvedAt: number;
275
+ }
276
+
209
277
  /**
210
278
  * Where a content row lives besides its tenant: the site it belongs to, the
211
279
  * content environment (e.g. `production`, `staging`) and its locale. Three
@@ -246,6 +314,20 @@ export declare const compileCacheIdentity: (contract: CacheContract, request: Ca
246
314
  readonly tags?: ReadonlyArray<string>;
247
315
  }) => CacheIdentity;
248
316
 
317
+ export declare interface CompiledSiteDelivery<D extends SiteDeliveryDefinition = SiteDeliveryDefinition> {
318
+ readonly definition: D;
319
+ readonly contentLocales: readonly [ContentLocale<D>, ...ContentLocale<D>[]];
320
+ readonly defaultLocale: ContentLocale<D>;
321
+ readonly sourceLocale: ContentLocale<D>;
322
+ readonly fallback: Readonly<Record<ContentLocale<D>, ReadonlyArray<ContentLocale<D>>>>;
323
+ readonly prefixes: Readonly<Record<ContentLocale<D>, string>>;
324
+ readonly tags: Readonly<Record<ContentLocale<D>, string>>;
325
+ readonly directions: Readonly<Record<ContentLocale<D>, 'ltr' | 'rtl'>>;
326
+ }
327
+
328
+ /** Compile the one graph used by API and frontend; fallback is ordered depth-first, with each locale visited once. */
329
+ export declare const compileSiteDelivery: <const D extends SiteDeliveryDefinition>(input: D) => CompiledSiteDelivery<D>;
330
+
249
331
  declare type ComponentBlock = Extract<RichBlock, {
250
332
  readonly type: 'component';
251
333
  }>;
@@ -305,6 +387,11 @@ export declare type ConsentChoices = Readonly<Record<string, number>>;
305
387
  */
306
388
  export declare const consentContentSecurityPolicy: (purposes: ReadonlyArray<ConsentPurpose>, choices: ConsentChoices, base?: string) => string;
307
389
 
390
+ /** Every current purpose was either refused or allowed in its current version.
391
+ * A missing or superseded choice needs another decision without discarding
392
+ * still-valid grants for other purposes. */
393
+ export declare const consentDecisionComplete: (purposes: ReadonlyArray<Pick<ConsentPurpose, "id" | "version">>, choices: ConsentChoices | undefined) => boolean;
394
+
308
395
  /** The origins of the vendors whose purpose the reader granted in its current version. */
309
396
  export declare const consentedOrigins: (purposes: ReadonlyArray<ConsentPurpose>, choices: ConsentChoices) => ReadonlyArray<string>;
310
397
 
@@ -536,6 +623,36 @@ declare const ContentIdConflict_base: Schema_2.Class<ContentIdConflict, Schema_2
536
623
  readonly id: Schema_2.String;
537
624
  }>, YieldableError>;
538
625
 
626
+ declare type ContentLocale<D extends SiteDeliveryDefinition> = D['locales'][number]['contentLocale'];
627
+
628
+ export declare interface ContentLocation {
629
+ /** Stable mapping identity. Changing a slug/path must not change this ID. */
630
+ readonly id: string;
631
+ readonly segments: ReadonlyArray<ContentLocationSegment>;
632
+ }
633
+
634
+ export declare interface ContentLocationContext {
635
+ /** Decoded absolute locale prefix, or the empty string for the root locale. */
636
+ readonly prefix: string;
637
+ /** Decoded path from buildTree, required only by a tree segment. */
638
+ readonly treePath?: string;
639
+ }
640
+
641
+ /** A decoded literal segment, one string field, or the complete content-tree path. */
642
+ export declare type ContentLocationSegment = string | {
643
+ readonly field: string;
644
+ } | {
645
+ readonly tree: true;
646
+ };
647
+
648
+ /** Invalid location mapping or missing/unsafe decoded path input. */
649
+ export declare class ContentLocationUnavailable extends ContentLocationUnavailable_base {
650
+ }
651
+
652
+ declare const ContentLocationUnavailable_base: Schema_2.Class<ContentLocationUnavailable, Schema_2.TaggedStruct<"ContentLocationUnavailable", {
653
+ readonly reason: Schema_2.Literals<readonly ["definition", "field", "tree", "path", "bounds"]>;
654
+ }>, YieldableError>;
655
+
539
656
  /**
540
657
  * Raised by `publish` / `unpublish` / `archive` when the row id doesn't
541
658
  * exist in the caller's scope. On a tenant-scoped request store this is
@@ -554,12 +671,68 @@ declare const ContentNotFound_base: Schema_2.Class<ContentNotFound, Schema_2.Tag
554
671
  readonly stage: Schema_2.Literals<readonly ["draft", "published", "revision", "share"]>;
555
672
  }>, YieldableError>;
556
673
 
674
+ export declare interface ContentSeoDefaults {
675
+ readonly title?: string;
676
+ readonly description?: string;
677
+ readonly social?: {
678
+ readonly title?: string;
679
+ readonly description?: string;
680
+ };
681
+ readonly robots?: SeoRobotsPolicy;
682
+ readonly sitemap?: boolean;
683
+ }
684
+
685
+ export declare interface ContentSeoDefinition {
686
+ readonly version: 1;
687
+ readonly title: SeoTextMapping;
688
+ readonly description?: SeoTextMapping;
689
+ readonly social?: {
690
+ readonly title?: SeoTextMapping;
691
+ readonly description?: SeoTextMapping;
692
+ readonly image?: string;
693
+ };
694
+ /** Route addresses remain authoritative; no independent URL field mapping. */
695
+ readonly canonical?: 'route' | 'omit';
696
+ readonly robots?: SeoRobotsPolicy;
697
+ readonly sitemap?: boolean;
698
+ readonly structuredData?: {
699
+ readonly type: 'WebPage' | 'Article' | 'BlogPosting';
700
+ /** A field the rendered main content actually shows, not the SEO override. */
701
+ readonly title: string;
702
+ readonly description?: string;
703
+ readonly datePublished?: string;
704
+ };
705
+ }
706
+
707
+ export declare interface ContentSeoFinding {
708
+ readonly kind: 'missing' | 'invalid' | 'recommendation';
709
+ readonly target: string;
710
+ readonly field: string | null;
711
+ readonly rule: 'required' | 'text' | 'date' | 'recommendedMaxLength';
712
+ }
713
+
714
+ export declare interface ContentSeoScope {
715
+ readonly site: string;
716
+ readonly environment: string;
717
+ readonly locale: string;
718
+ }
719
+
720
+ /** Invalid editorial SEO declaration or projected input; browser-safe. */
721
+ export declare class ContentSeoUnavailable extends ContentSeoUnavailable_base {
722
+ }
723
+
724
+ declare const ContentSeoUnavailable_base: Schema_2.Class<ContentSeoUnavailable, Schema_2.TaggedStruct<"ContentSeoUnavailable", {
725
+ readonly reason: Schema_2.Literals<readonly ["definition", "field", "defaults", "values", "scope"]>;
726
+ }>, YieldableError>;
727
+
557
728
  /** A registered content type. */
558
729
  declare interface ContentType {
559
730
  readonly name: string;
560
731
  readonly displayName: string;
561
732
  readonly pluralName: string;
562
733
  readonly fields: Readonly<Record<string, FieldSchema>>;
734
+ /** Original-file field of a versioned asset document. */
735
+ readonly asset?: AssetConfig;
563
736
  readonly list?: ListConfig;
564
737
  readonly idPrefix?: string;
565
738
  /** Declared ISR revalidations fired by `revalidateContent` — see
@@ -569,6 +742,12 @@ declare interface ContentType {
569
742
  readonly tree?: TreeConfig;
570
743
  /** The field a document outside a tree is addressed by — see `ContentTypeSpec.address`. */
571
744
  readonly address?: string;
745
+ /** Serializable delivery paths with stable mapping IDs; no publish reservation implied. */
746
+ readonly locations?: ReadonlyArray<ContentLocation>;
747
+ /** Required/invalid mapped values block publication; length recommendations do not. */
748
+ readonly seo?: ContentSeoDefinition;
749
+ /** Explicit delivery definitions supplying locale-specific SEO defaults. Requires `seo`. */
750
+ readonly seoSites?: ReadonlyArray<SiteDeliveryDefinition>;
572
751
  /** Whether publishing needs an approved revision — see `ContentTypeSpec.review`. */
573
752
  readonly review?: {
574
753
  readonly required: boolean | 'workspace';
@@ -600,6 +779,8 @@ declare interface ContentTypeSpec {
600
779
  readonly displayName: string;
601
780
  readonly pluralName: string;
602
781
  readonly fields: Readonly<Record<string, FieldSchema | PipeableField>>;
782
+ /** Explicit asset identity; the original is a required Media field. */
783
+ readonly asset?: AssetConfig;
603
784
  readonly list?: ListConfig;
604
785
  /** Override the TypeID prefix for awkward plurals / long names. */
605
786
  readonly idPrefix?: string;
@@ -617,6 +798,12 @@ declare interface ContentTypeSpec {
617
798
  * page in a tree does. Read it with `redirectTarget(store, type, path, scope)`.
618
799
  */
619
800
  readonly address?: string;
801
+ /** Serializable delivery paths with stable mapping IDs; no publish reservation implied. */
802
+ readonly locations?: ReadonlyArray<ContentLocation>;
803
+ /** Required/invalid mapped values block publication; length recommendations do not. */
804
+ readonly seo?: ContentSeoDefinition;
805
+ /** Explicit delivery definitions supplying locale-specific SEO defaults. Requires `seo`. */
806
+ readonly seoSites?: ReadonlyArray<SiteDeliveryDefinition>;
620
807
  /**
621
808
  * `required: true` publishes only revisions another editor approved
622
809
  * (`approveReview`) — for every path that publishes: single, release,
@@ -655,7 +842,8 @@ declare interface ContentTypeSpec {
655
842
  /**
656
843
  * Append every publish and take-down of this type to the change feed
657
844
  * (`cms_changes`, read with `readChanges`), in the same transaction. Register
658
- * `cmsChangesTable` when set.
845
+ * `cmsChangesTable` and `cmsChangeHeadsTable` for every publication writer;
846
+ * this flag controls event emission, not publication coordination.
659
847
  */
660
848
  readonly changeFeed?: boolean;
661
849
  /**
@@ -746,12 +934,27 @@ export declare const contentViolations: (type: Pick<ContentType, "name" | "field
746
934
  /** How many variants the contract allows at most (query strings count as unbounded beyond the budget). */
747
935
  export declare const contractVariants: (contract: CacheContract) => number;
748
936
 
937
+ export declare const copyCmsPublicBuildIdentity: (value: unknown) => CmsPublicBuildIdentity;
938
+
939
+ export declare const copyRouteDispositionDefinition: (value: unknown) => RouteDispositionDefinition;
940
+
941
+ /** Detached version pins; the actual application retains its notice/vendor text. */
942
+ export declare const copySnapshotConsentPurposes: (value: unknown) => ReadonlyArray<SnapshotConsentPurpose>;
943
+
944
+ /** Detach a closed claim before asynchronous admission. This alone does not
945
+ * admit any purpose; use admitSnapshotPresentation against the captured policy. */
946
+ export declare const copySnapshotPresentationValue: (supplied: unknown) => SnapshotPresentation;
947
+
948
+ export declare const decodeCmsPublicBuildIdentity: (value: string) => CmsPublicBuildIdentity;
949
+
749
950
  /** Decode character references (`&amp;`, `&#8217;`, `&#x2014;`). */
750
951
  export declare const decodeEntities: (text: string) => string;
751
952
 
752
953
  /** The intent a `?select=…` value carries, or null. */
753
954
  export declare const decodeSelectionIntent: (value: string | null | undefined) => SelectionIntent | null;
754
955
 
956
+ export declare const decodeSnapshotPresentation: (purposes: ReadonlyArray<SnapshotConsentPurpose>, selector: string) => SnapshotPresentation;
957
+
755
958
  /** Define an audience; a rule with no condition would match everyone and is refused. */
756
959
  export declare const defineAudience: (audience: Audience) => Audience;
757
960
 
@@ -770,6 +973,15 @@ export declare const defineComponent: (spec: {
770
973
  readonly migrations?: ComponentDefinition["migrations"];
771
974
  }) => ComponentDefinition;
772
975
 
976
+ /** Validate and detach a bounded, JSON-only set of stable location mappings. */
977
+ export declare const defineContentLocations: (input: ReadonlyArray<ContentLocation>) => ReadonlyArray<ContentLocation>;
978
+
979
+ /** Detach a bounded JSON-only declaration; getters/functions/unknown keys refuse. */
980
+ export declare const defineContentSeo: (input: ContentSeoDefinition) => ContentSeoDefinition;
981
+
982
+ /** Locale-specific text and editorial policy defaults, not an access decision. */
983
+ export declare const defineContentSeoDefaults: (input: ContentSeoDefaults) => ContentSeoDefaults;
984
+
773
985
  /**
774
986
  * Declare the design tokens components may name (`Schema.Token(tokens, 'tone')`).
775
987
  * Group and token names are camelCase; the values are what an editor reads
@@ -777,6 +989,10 @@ export declare const defineComponent: (spec: {
777
989
  */
778
990
  export declare const defineDesignTokens: <T extends DesignTokens>(tokens: T) => T;
779
991
 
992
+ /** Validate actual callable bindings. Full schema compatibility is checked by
993
+ * the shared descriptor encoder when the app describes its snapshot inputs. */
994
+ export declare const defineFrontendBindings: (input: FrontendBindings) => FrontendBindings;
995
+
780
996
  /** Declare a metric; the fingerprint follows its meaning. */
781
997
  export declare const defineMetric: (spec: MetricSpec) => MetricDefinition;
782
998
 
@@ -804,6 +1020,13 @@ export declare const defineRichTextProfile: (spec: {
804
1020
  readonly contactLiterals?: boolean;
805
1021
  }) => RichTextProfile;
806
1022
 
1023
+ /**
1024
+ * Copy and validate the explicit site delivery graph. This performs no tag
1025
+ * inference, registry lookup, source migration or content writes. Authoring
1026
+ * supplies approved profiles; the complete definition is pinned with app code.
1027
+ */
1028
+ export declare const defineSiteDelivery: <const D extends SiteDeliveryDefinition>(input: D) => D;
1029
+
807
1030
  /**
808
1031
  * Mark a field computed-on-save from another field. The transform runs
809
1032
  * before the row is written — `saveDraft` applies it (via
@@ -951,9 +1174,24 @@ export declare const EMPTY_EDIT_HISTORY: EditHistory;
951
1174
  /** An empty document. */
952
1175
  export declare const emptyRichDocument: () => RichDocument;
953
1176
 
1177
+ /** Fixed ASCII framing needs no HTML attribute escaping and contains no site
1178
+ * credentials, actor, grant, personal consent or private input configuration. */
1179
+ export declare const encodeCmsPublicBuildIdentity: (value: CmsPublicBuildIdentity) => string;
1180
+
954
1181
  /** The intent as a URL parameter value (`?select=…`). */
955
1182
  export declare const encodeSelectionIntent: (intent: SelectionIntent) => string;
956
1183
 
1184
+ /** A public class selector; this is not a credential or a reader identifier. */
1185
+ export declare const encodeSnapshotPresentation: (purposes: ReadonlyArray<SnapshotConsentPurpose>, presentation: SnapshotPresentation) => string;
1186
+
1187
+ /** An environment alias never falls back to a literal environment or stale target. */
1188
+ export declare class EnvironmentAliasUnavailable extends EnvironmentAliasUnavailable_base {
1189
+ }
1190
+
1191
+ declare const EnvironmentAliasUnavailable_base: Schema_2.Class<EnvironmentAliasUnavailable, Schema_2.TaggedStruct<"EnvironmentAliasUnavailable", {
1192
+ readonly reason: Schema_2.Literals<readonly ["scope", "name", "target", "missing", "conflict", "revision", "state"]>;
1193
+ }>, YieldableError>;
1194
+
957
1195
  /** Why a dimension is in the identity or not. */
958
1196
  export declare interface ExplainLine {
959
1197
  readonly dimension: string;
@@ -1155,6 +1393,71 @@ export declare interface FieldViolation {
1155
1393
  */
1156
1394
  export declare const formPartOf: (form: ParentNode, path: string) => Element | null;
1157
1395
 
1396
+ export declare type FrontendBindings = Readonly<Record<string, FrontendComponentBinding>>;
1397
+
1398
+ export declare class FrontendBindingUnavailable extends FrontendBindingUnavailable_base {
1399
+ }
1400
+
1401
+ declare const FrontendBindingUnavailable_base: Schema_2.Class<FrontendBindingUnavailable, Schema_2.TaggedStruct<"FrontendBindingUnavailable", {
1402
+ readonly reason: Schema_2.Literals<readonly ["definition", "missing", "schema", "implementation", "context"]>;
1403
+ }>, YieldableError>;
1404
+
1405
+ export declare interface FrontendComponentBinding {
1406
+ readonly schema: ComponentDefinition;
1407
+ readonly renderer: string;
1408
+ readonly contexts: ReadonlyArray<FrontendOutputContext>;
1409
+ readonly render: (props: Readonly<Record<string, unknown>>, context: FrontendOutputContext, resources: {
1410
+ readonly media: FrontendMediaReader;
1411
+ readonly source?: SnapshotComponentSource;
1412
+ }) => unknown;
1413
+ readonly empty: (input: FrontendStateInput) => unknown;
1414
+ readonly loading: (input: FrontendStateInput) => unknown;
1415
+ readonly error: (input: FrontendStateInput) => unknown;
1416
+ readonly restricted?: (input: FrontendStateInput & {
1417
+ readonly purpose: string;
1418
+ }) => unknown;
1419
+ }
1420
+
1421
+ export declare interface FrontendMedia extends FrontendMediaSelection, FrontendMediaFile {
1422
+ }
1423
+
1424
+ export declare interface FrontendMediaFile {
1425
+ readonly url: string;
1426
+ readonly contentType: string;
1427
+ }
1428
+
1429
+ export declare type FrontendMediaOutput = {
1430
+ readonly kind: 'original';
1431
+ } | {
1432
+ readonly kind: 'rendition';
1433
+ readonly slot: string;
1434
+ };
1435
+
1436
+ export declare type FrontendMediaReader = (path: ReadonlyArray<string | number>, output?: FrontendMediaOutput) => FrontendMediaFile | null;
1437
+
1438
+ export declare interface FrontendMediaSelection {
1439
+ readonly fieldPath: ReadonlyArray<string | number>;
1440
+ readonly output: FrontendMediaOutput;
1441
+ }
1442
+
1443
+ export declare interface FrontendOutputContext extends FrontendOutputSelection {
1444
+ readonly localeId: string;
1445
+ readonly contentLocale: string;
1446
+ readonly languageTag: string;
1447
+ readonly direction: 'ltr' | 'rtl';
1448
+ }
1449
+
1450
+ export declare interface FrontendOutputSelection {
1451
+ readonly channel: string;
1452
+ readonly theme: string;
1453
+ }
1454
+
1455
+ export declare interface FrontendStateInput {
1456
+ readonly componentId: string;
1457
+ readonly context: FrontendOutputContext;
1458
+ readonly source?: SnapshotComponentSource;
1459
+ }
1460
+
1158
1461
  /**
1159
1462
  * The values with every component that needs an ungranted purpose replaced
1160
1463
  * by a {@link WithheldInstance}. Values without such components come back
@@ -1165,7 +1468,7 @@ export declare const gateConsent: (type: {
1165
1468
  }, values: Readonly<Record<string, unknown>>, granted: ReadonlySet<string>) => Record<string, unknown>;
1166
1469
 
1167
1470
  /** The purposes whose current version the reader allowed. */
1168
- export declare const grantedPurposes: (purposes: ReadonlyArray<ConsentPurpose>, choices: ConsentChoices) => ReadonlySet<string>;
1471
+ export declare const grantedPurposes: (purposes: ReadonlyArray<Pick<ConsentPurpose, "id" | "version">>, choices: ConsentChoices) => ReadonlySet<string>;
1169
1472
 
1170
1473
  /** Whether every character of text in `[start, end)` carries `mark` (links never do). */
1171
1474
  export declare const hasMark: (content: ReadonlyArray<RichInline>, start: number, end: number, mark: RichMark) => boolean;
@@ -1307,6 +1610,13 @@ export declare interface LiveStretch {
1307
1610
  readonly to: string | null;
1308
1611
  }
1309
1612
 
1613
+ /** This dedicated public data transport cannot fall back to a live delivery
1614
+ * query after a pin mismatch, denial, missing captured path or network error. */
1615
+ export declare const loadCmsPublicBuildPage: <T>(identity: CmsPublicBuildIdentity, path: string, options?: {
1616
+ readonly signal?: AbortSignal;
1617
+ readonly fetch?: typeof globalThis.fetch;
1618
+ }) => Promise<CmsPublicBuildPage<T>>;
1619
+
1310
1620
  /** One language's published page tree. */
1311
1621
  export declare interface LocalizedTree {
1312
1622
  readonly locale: string;
@@ -1590,6 +1900,18 @@ declare const PreviewShareRejected_base: Schema_2.Class<PreviewShareRejected, Sc
1590
1900
  readonly reason: Schema_2.Literals<readonly ["expiryInPast", "expiryTooFar"]>;
1591
1901
  }>, YieldableError>;
1592
1902
 
1903
+ export declare interface PublicRouteIdentity {
1904
+ readonly url: string;
1905
+ readonly routeId: string;
1906
+ }
1907
+
1908
+ export declare class PublicRouteRegistryUnavailable extends PublicRouteRegistryUnavailable_base {
1909
+ }
1910
+
1911
+ declare const PublicRouteRegistryUnavailable_base: Schema_2.Class<PublicRouteRegistryUnavailable, Schema_2.TaggedStruct<"PublicRouteRegistryUnavailable", {
1912
+ readonly reason: Schema_2.Literals<readonly ["scope", "definition", "configuration", "history", "state", "revision", "conflict", "bounds", "location"]>;
1913
+ }>, YieldableError>;
1914
+
1593
1915
  /**
1594
1916
  * What stops these values from being published: every `requiredToPublish()`
1595
1917
  * field that is empty (absent, null, or a blank string), and every rich text
@@ -1673,6 +1995,8 @@ declare const QuotaExceeded_base: Schema_2.Class<QuotaExceeded, Schema_2.TaggedS
1673
1995
  readonly used: Schema_2.Number;
1674
1996
  }>, YieldableError>;
1675
1997
 
1998
+ export declare const readCmsPublicBuildIdentity: (document?: CmsPublicBuildDocument | undefined) => CmsPublicBuildIdentity | null;
1999
+
1676
2000
  /** The editor's message, or null for anything else. */
1677
2001
  export declare const readEditorMessage: (event: VisualMessageEvent, session: VisualSession) => EditorMessage | null;
1678
2002
 
@@ -1757,6 +2081,8 @@ declare const ReleaseNotEditable_base: Schema_2.Class<ReleaseNotEditable, Schema
1757
2081
  readonly status: Schema_2.String;
1758
2082
  }>, YieldableError>;
1759
2083
 
2084
+ export declare const renderSnapshotComponent: (data: SnapshotContentData, bindings: FrontendBindings, fieldPath: ReadonlyArray<string | number>, state?: "content" | "empty" | "loading" | "error") => unknown;
2085
+
1760
2086
  /**
1761
2087
  * Replace the text in `[start, end)` with `text` (a paste, a typed line
1762
2088
  * break). It takes the marks of the first character it replaces, or — where
@@ -1767,6 +2093,40 @@ export declare const replaceText: (content: ReadonlyArray<RichInline>, start: nu
1767
2093
  /** The document with each suggestion accepted, rejected or kept, as `decide` says. */
1768
2094
  export declare const resolveChanges: (doc: RichDocument, decide: (change: RichChange) => ChangeDecision) => RichDocument;
1769
2095
 
2096
+ /** Resolve decoded inputs into one canonical absolute path; no host, query or live reads. */
2097
+ export declare const resolveContentLocation: (input: ContentLocation, values: Readonly<Record<string, unknown>>, context: ContentLocationContext) => string;
2098
+
2099
+ /** Project only mapped fields. Findings must be judged before publication/output.
2100
+ * Public visibility, runtime rights, robots.txt, URLs and resolved images are
2101
+ * separate admission/rendering contracts; true here is never a public grant. */
2102
+ export declare const resolveContentSeo: (definition: ContentSeoDefinition, values: Readonly<Record<string, unknown>>, defaults?: ContentSeoDefaults) => ResolvedContentSeo;
2103
+
2104
+ export declare interface ResolvedContentSeo {
2105
+ readonly title: string | null;
2106
+ readonly description: string | null;
2107
+ readonly canonical: 'route' | 'omit';
2108
+ readonly robots: SeoRobotsPolicy;
2109
+ readonly sitemap: boolean;
2110
+ readonly social: {
2111
+ readonly title: string | null;
2112
+ readonly description: string | null;
2113
+ readonly imageKey: string | null;
2114
+ };
2115
+ /** Typed semantic values; a renderer adds the admitted URL, locale and media. */
2116
+ readonly structuredData: {
2117
+ readonly type: 'WebPage' | 'Article' | 'BlogPosting';
2118
+ readonly title: string;
2119
+ readonly description: string | null;
2120
+ readonly datePublished: string | null;
2121
+ } | null;
2122
+ readonly sources: Readonly<Record<string, string | null>>;
2123
+ readonly findings: ReadonlyArray<ContentSeoFinding>;
2124
+ }
2125
+
2126
+ /** Project the variant's own language. Delivery fallback never supplies missing
2127
+ * publication metadata. An undeclared scope refuses even if all fields are set. */
2128
+ export declare const resolveScopedContentSeo: (policy: ScopedContentSeo, values: Readonly<Record<string, unknown>>, scope: ContentSeoScope) => ResolvedContentSeo | null;
2129
+
1770
2130
  /**
1771
2131
  * Raised when a revision of a content type that requires review is published
1772
2132
  * without an approval of exactly that revision.
@@ -1915,6 +2275,11 @@ export declare interface RichDocument {
1915
2275
  readonly profile?: string;
1916
2276
  }
1917
2277
 
2278
+ export declare interface RichDocumentBlockContext {
2279
+ /** Position in the rendered document's blocks, including repeated assets. */
2280
+ readonly index: number;
2281
+ }
2282
+
1918
2283
  export declare const RichDocumentEditor: (props: RichDocumentEditorProps) => ReactNode;
1919
2284
 
1920
2285
  export declare interface RichDocumentEditorProps extends WidgetProps {
@@ -1945,6 +2310,11 @@ export declare const richDocumentFromContentful: (root: ContentfulNode | null |
1945
2310
  */
1946
2311
  export declare const richDocumentFromHtml: (html: string, options?: HtmlImportOptions) => HtmlImportResult;
1947
2312
 
2313
+ export declare interface RichDocumentInlineContext {
2314
+ /** Exact reference scalar path relative to the document, including block/list/table positions. */
2315
+ readonly fieldPath: ReadonlyArray<string | number>;
2316
+ }
2317
+
1948
2318
  /** Renders a control that picks one document of `type`. */
1949
2319
  export declare type RichDocumentPicker = (props: {
1950
2320
  readonly id: string;
@@ -1979,6 +2349,18 @@ export declare interface RichDocumentReference {
1979
2349
  readonly targetDocumentId: string;
1980
2350
  }
1981
2351
 
2352
+ /** One direct rich-document reference, addressed at its actual scalar field. */
2353
+ export declare interface RichDocumentReferenceField {
2354
+ readonly fieldPath: ReadonlyArray<string | number>;
2355
+ readonly targetType: string;
2356
+ readonly targetDocumentId: string;
2357
+ }
2358
+
2359
+ /** Direct links, managed contacts and image/file assets in a valid document.
2360
+ * Embedded component props use their own declared component schemas. Prefix
2361
+ * segments are opaque; never recover these coordinates from display labels. */
2362
+ export declare const richDocumentReferenceFields: (prefix: ReadonlyArray<string | number>, doc: RichDocument, options: RichTextOptions) => ReadonlyArray<RichDocumentReferenceField>;
2363
+
1982
2364
  /** Every image and link reference in a (valid) document, with its path. */
1983
2365
  export declare const richDocumentReferences: (path: string, doc: RichDocument, options: RichTextOptions) => ReadonlyArray<RichDocumentReference>;
1984
2366
 
@@ -1989,18 +2371,18 @@ export declare interface RichDocumentViewProps {
1989
2371
  /** A stored `Schema.RichText()` value (a plain string renders as paragraphs). */
1990
2372
  readonly document: unknown;
1991
2373
  /** The address of a linked document, or undefined when it has none (not live). */
1992
- readonly hrefOf?: (documentId: string) => string | undefined;
2374
+ readonly hrefOf?: (documentId: string, context: RichDocumentInlineContext) => string | undefined;
1993
2375
  /** Render an image block; without it, images are left out. */
1994
2376
  readonly renderImage?: (block: {
1995
2377
  readonly asset: string;
1996
2378
  readonly caption?: string;
1997
- }) => ReactNode;
2379
+ }, context: RichDocumentBlockContext) => ReactNode;
1998
2380
  /** The `mailto:` / `tel:` address of a published contact point, or undefined when it is not live. */
1999
- readonly contactHrefOf?: (documentId: string) => string | undefined;
2381
+ readonly contactHrefOf?: (documentId: string, context: RichDocumentInlineContext) => string | undefined;
2000
2382
  /** Render a component placed between the blocks; without it, components are left out. */
2001
- readonly renderComponent?: (block: ComponentBlock) => ReactNode;
2383
+ readonly renderComponent?: (block: ComponentBlock, context: RichDocumentBlockContext) => ReactNode;
2002
2384
  /** The address a download block's file is fetched from, or undefined when it is not live — then the download is left out, never a dead link. */
2003
- readonly fileHrefOf?: (asset: string) => string | undefined;
2385
+ readonly fileHrefOf?: (asset: string, context: RichDocumentBlockContext) => string | undefined;
2004
2386
  }
2005
2387
 
2006
2388
  /** A run of text inside a block. `change` marks it as suggested. */
@@ -2084,6 +2466,71 @@ export declare interface RichTextSurfaceProps {
2084
2466
  };
2085
2467
  }
2086
2468
 
2469
+ export declare type RouteDispositionAction = {
2470
+ readonly kind: 'redirect';
2471
+ readonly status: 301 | 302;
2472
+ readonly method: 'allow-post-to-get';
2473
+ readonly target: PublicRouteIdentity;
2474
+ } | {
2475
+ readonly kind: 'redirect';
2476
+ readonly status: 307 | 308;
2477
+ readonly method: 'preserve';
2478
+ readonly target: PublicRouteIdentity;
2479
+ } | {
2480
+ readonly kind: 'gone';
2481
+ readonly status: 404 | 410;
2482
+ } | {
2483
+ readonly kind: 'hold';
2484
+ };
2485
+
2486
+ export declare interface RouteDispositionDefinition {
2487
+ readonly version: 1;
2488
+ readonly source: PublicRouteIdentity;
2489
+ readonly action: RouteDispositionAction;
2490
+ /** Inclusive lower and exclusive upper bound, UTC epoch milliseconds. */
2491
+ readonly activeFrom: number | null;
2492
+ readonly activeUntil: number | null;
2493
+ }
2494
+
2495
+ export declare const RouteDispositionDefinitionSchema: Schema_2.Struct<{
2496
+ readonly version: Schema_2.Literal<1>;
2497
+ readonly source: Schema_2.Struct<{
2498
+ readonly url: Schema_2.String;
2499
+ readonly routeId: Schema_2.String;
2500
+ }>;
2501
+ readonly action: Schema_2.Union<readonly [Schema_2.Struct<{
2502
+ readonly kind: Schema_2.Literal<"redirect">;
2503
+ readonly status: Schema_2.Literals<readonly [301, 302]>;
2504
+ readonly method: Schema_2.Literal<"allow-post-to-get">;
2505
+ readonly target: Schema_2.Struct<{
2506
+ readonly url: Schema_2.String;
2507
+ readonly routeId: Schema_2.String;
2508
+ }>;
2509
+ }>, Schema_2.Struct<{
2510
+ readonly kind: Schema_2.Literal<"redirect">;
2511
+ readonly status: Schema_2.Literals<readonly [307, 308]>;
2512
+ readonly method: Schema_2.Literal<"preserve">;
2513
+ readonly target: Schema_2.Struct<{
2514
+ readonly url: Schema_2.String;
2515
+ readonly routeId: Schema_2.String;
2516
+ }>;
2517
+ }>, Schema_2.Struct<{
2518
+ readonly kind: Schema_2.Literal<"gone">;
2519
+ readonly status: Schema_2.Literals<readonly [404, 410]>;
2520
+ }>, Schema_2.Struct<{
2521
+ readonly kind: Schema_2.Literal<"hold">;
2522
+ }>]>;
2523
+ readonly activeFrom: Schema_2.NullOr<Schema_2.Int>;
2524
+ readonly activeUntil: Schema_2.NullOr<Schema_2.Int>;
2525
+ }>;
2526
+
2527
+ export declare class RouteDispositionUnavailable extends RouteDispositionUnavailable_base {
2528
+ }
2529
+
2530
+ declare const RouteDispositionUnavailable_base: Schema_2.Class<RouteDispositionUnavailable, Schema_2.TaggedStruct<"RouteDispositionUnavailable", {
2531
+ readonly reason: Schema_2.Literals<readonly ["input", "bounds", "scope", "state", "revision", "credential", "graph", "hold"]>;
2532
+ }>, YieldableError>;
2533
+
2087
2534
  /**
2088
2535
  * The CMS field namespace. Scalars mirror the effect/Schema names the
2089
2536
  * docs use; the CMS-only constructors (RichText / Media / Reference /
@@ -2154,6 +2601,12 @@ export declare const Schema: {
2154
2601
  readonly Components: (definitions: ReadonlyArray<ComponentDefinition>) => PipeableField;
2155
2602
  };
2156
2603
 
2604
+ export declare interface ScopedContentSeo {
2605
+ readonly seo?: ContentSeoDefinition;
2606
+ /** The same site declarations used by delivery; no inferred site or language. */
2607
+ readonly seoSites?: ReadonlyArray<SiteDeliveryDefinition>;
2608
+ }
2609
+
2157
2610
  /** What makes a type findable. */
2158
2611
  declare interface SearchConfig {
2159
2612
  /** The string field ranked first — usually the title. */
@@ -2202,6 +2655,18 @@ export declare interface SelectionTarget {
2202
2655
  };
2203
2656
  }
2204
2657
 
2658
+ export declare interface SeoRobotsPolicy {
2659
+ readonly index: boolean;
2660
+ readonly follow: boolean;
2661
+ }
2662
+
2663
+ export declare interface SeoTextMapping {
2664
+ readonly fields: ReadonlyArray<string>;
2665
+ readonly required?: boolean;
2666
+ /** An editorial recommendation, never an invented search-engine limit. */
2667
+ readonly recommendedMaxLength?: number;
2668
+ }
2669
+
2205
2670
  /** What is wrong with values for a manifest's settings; empty when nothing is. Unknown keys are refused. */
2206
2671
  export declare const settingsProblems: (manifest: CmsExtensionManifest, values: Readonly<Record<string, unknown>>) => ReadonlyArray<string>;
2207
2672
 
@@ -2215,6 +2680,49 @@ export declare const settingsWithDefaults: (manifest: CmsExtensionManifest, stor
2215
2680
  */
2216
2681
  export declare const sharedCacheable: (headers: Readonly<Record<string, string | undefined>>) => boolean;
2217
2682
 
2683
+ /** A named site content binding cannot be resolved or changed as requested. */
2684
+ export declare class SiteBindingUnavailable extends SiteBindingUnavailable_base {
2685
+ }
2686
+
2687
+ declare const SiteBindingUnavailable_base: Schema_2.Class<SiteBindingUnavailable, Schema_2.TaggedStruct<"SiteBindingUnavailable", {
2688
+ readonly reason: Schema_2.Literals<readonly ["scope", "name", "target", "missing", "conflict", "revision", "state"]>;
2689
+ }>, YieldableError>;
2690
+
2691
+ export declare interface SiteDeliveryDefinition {
2692
+ readonly id: string;
2693
+ readonly version: number;
2694
+ readonly environments: ReadonlyArray<string>;
2695
+ readonly defaultEnvironment: string;
2696
+ readonly locales: ReadonlyArray<SiteDeliveryLocale>;
2697
+ readonly defaultLocale: string;
2698
+ readonly sourceLocale: string;
2699
+ /** Named site-content bindings and their registered content type names. */
2700
+ readonly bindings: Readonly<Record<string, string>>;
2701
+ /** Editorial defaults keyed by stable locale identity, never request language guesses. */
2702
+ readonly seo?: Readonly<Record<string, ContentSeoDefaults>>;
2703
+ }
2704
+
2705
+ export declare interface SiteDeliveryLocale {
2706
+ readonly id: string;
2707
+ /** An explicitly approved language tag; this compiler never canonicalizes it. */
2708
+ readonly tag: string;
2709
+ /** Existing published/draft row partition. Renaming a tag does not rewrite it. */
2710
+ readonly contentLocale: string;
2711
+ readonly direction: 'ltr' | 'rtl';
2712
+ readonly enabled: boolean;
2713
+ readonly prefix: string;
2714
+ /** Ordered fallback locale IDs, independent of translation source. */
2715
+ readonly fallback: ReadonlyArray<string>;
2716
+ }
2717
+
2718
+ /** The explicit site delivery definition is invalid; no implicit defaults are selected. */
2719
+ export declare class SiteDeliveryUnavailable extends SiteDeliveryUnavailable_base {
2720
+ }
2721
+
2722
+ declare const SiteDeliveryUnavailable_base: Schema_2.Class<SiteDeliveryUnavailable, Schema_2.TaggedStruct<"SiteDeliveryUnavailable", {
2723
+ readonly reason: Schema_2.Literals<readonly ["definition", "environment", "locale", "fallback", "prefix", "binding"]>;
2724
+ }>, YieldableError>;
2725
+
2218
2726
  export declare interface SitemapUrl extends PageAlternate {
2219
2727
  readonly documentId: string;
2220
2728
  /** ISO date of the variant's last change, when known. */
@@ -2236,6 +2744,14 @@ export declare const sitemapUrls: (trees: ReadonlyArray<LocalizedTree>, include?
2236
2744
  */
2237
2745
  export declare const sitemapXml: (urls: ReadonlyArray<SitemapUrl>, href: (locale: string, path: string) => string, xDefault?: string) => string;
2238
2746
 
2747
+ /** The site configuration scope or stored coordination state is invalid. */
2748
+ export declare class SiteStateUnavailable extends SiteStateUnavailable_base {
2749
+ }
2750
+
2751
+ declare const SiteStateUnavailable_base: Schema_2.Class<SiteStateUnavailable, Schema_2.TaggedStruct<"SiteStateUnavailable", {
2752
+ readonly reason: Schema_2.Literals<readonly ["scope", "state"]>;
2753
+ }>, YieldableError>;
2754
+
2239
2755
  /**
2240
2756
  * The canonical slug helper: lowercase, letters with accents folded to their
2241
2757
  * base letter (umlauts spelled out, `ß` as `ss`), hyphenate, strip every
@@ -2243,6 +2759,192 @@ export declare const sitemapXml: (urls: ReadonlyArray<SitemapUrl>, href: (locale
2243
2759
  */
2244
2760
  export declare const slugify: (value: unknown) => string;
2245
2761
 
2762
+ export declare interface SnapshotComponentSource {
2763
+ readonly content: SnapshotContentIdentity;
2764
+ readonly fieldPath: ReadonlyArray<string | number>;
2765
+ /** The original placed instance, or rich block id; null when not projected. */
2766
+ readonly instanceId: string | null;
2767
+ /** Paths are relative to this component's props, never document ids. */
2768
+ readonly link: (fieldPath: ReadonlyArray<string | number>) => string | null;
2769
+ readonly reference: (fieldPath: ReadonlyArray<string | number>) => SnapshotContentData | null;
2770
+ }
2771
+
2772
+ export declare type SnapshotConsentPurpose = Pick<ConsentPurpose, 'id' | 'version'>;
2773
+
2774
+ export declare interface SnapshotContentData {
2775
+ readonly content: SnapshotContentIdentity;
2776
+ readonly context: FrontendOutputContext;
2777
+ readonly sourceLocale: string;
2778
+ readonly fallback: boolean;
2779
+ readonly values: Readonly<Record<string, unknown>>;
2780
+ readonly media: ReadonlyArray<FrontendMedia>;
2781
+ readonly presentation: SnapshotPresentation;
2782
+ readonly consentPurposes: ReadonlyArray<SnapshotConsentPurpose>;
2783
+ }
2784
+
2785
+ export declare interface SnapshotContentIdentity {
2786
+ readonly contentType: string;
2787
+ readonly documentId: string;
2788
+ readonly variantId: string;
2789
+ readonly revisionId: string;
2790
+ readonly revision: number;
2791
+ }
2792
+
2793
+ /** Resolve a projected reference using the application's captured referenceRoutes. */
2794
+ export declare const snapshotLink: (data: SnapshotContentData, fieldPath: ReadonlyArray<string | number>) => string | null;
2795
+
2796
+ /** Read only an already staged representation and record its actual source occurrence. */
2797
+ export declare const snapshotMedia: (data: SnapshotContentData, fieldPath: ReadonlyArray<string | number>, output?: FrontendMediaOutput) => FrontendMediaFile | null;
2798
+
2799
+ export declare interface SnapshotPageData extends SnapshotContentData {
2800
+ readonly version: 6;
2801
+ readonly path: string;
2802
+ readonly seo: SnapshotPageSeo;
2803
+ readonly bindings: Readonly<Record<string, SnapshotContentData | null>>;
2804
+ }
2805
+
2806
+ export declare const snapshotPageLoader: (context: {
2807
+ readonly pathname: string;
2808
+ readonly query?: <T>(tag: string, input: Record<string, unknown>) => Promise<T>;
2809
+ }) => Promise<SnapshotPageData>;
2810
+
2811
+ /** Structural PageMeta: the native renderer owns HTML and JSON-LD escaping. */
2812
+ export declare const snapshotPageMeta: ({ loaderData }: {
2813
+ readonly loaderData: {
2814
+ readonly seo: SnapshotPageSeo;
2815
+ };
2816
+ }) => {
2817
+ tags: {
2818
+ name?: string;
2819
+ property?: string;
2820
+ content: string;
2821
+ }[];
2822
+ links: {
2823
+ rel: string;
2824
+ hreflang: string;
2825
+ href: string;
2826
+ }[];
2827
+ jsonLd: ({
2828
+ datePublished?: string;
2829
+ description?: string;
2830
+ image?: string;
2831
+ inLanguage: string;
2832
+ url?: string;
2833
+ name: string;
2834
+ '@context': string;
2835
+ '@type': "WebPage" | "Article" | "BlogPosting";
2836
+ } | {
2837
+ datePublished?: string;
2838
+ description?: string;
2839
+ image?: string;
2840
+ inLanguage: string;
2841
+ url?: string;
2842
+ headline: string;
2843
+ '@context': string;
2844
+ '@type': "WebPage" | "Article" | "BlogPosting";
2845
+ })[];
2846
+ canonical?: string;
2847
+ description?: string;
2848
+ title?: string;
2849
+ };
2850
+
2851
+ export declare interface SnapshotPageSeo {
2852
+ readonly title: string | null;
2853
+ readonly description: string | null;
2854
+ readonly canonical: string | null;
2855
+ readonly alternates: ReadonlyArray<{
2856
+ readonly locale: string;
2857
+ readonly href: string;
2858
+ }>;
2859
+ readonly xDefault: string | null;
2860
+ readonly languageTag: string;
2861
+ readonly robots: SeoRobotsPolicy;
2862
+ readonly social: {
2863
+ readonly title: string | null;
2864
+ readonly description: string | null;
2865
+ readonly image?: {
2866
+ readonly url: string;
2867
+ readonly contentType: string;
2868
+ };
2869
+ };
2870
+ readonly structuredData: ResolvedContentSeo['structuredData'];
2871
+ }
2872
+
2873
+ export declare interface SnapshotPresentation {
2874
+ readonly version: 1;
2875
+ readonly decided: boolean;
2876
+ readonly granted: ReadonlyArray<SnapshotConsentPurpose>;
2877
+ }
2878
+
2879
+ /** Cookie decoding belongs to the application. Retain the existing exact-version
2880
+ * consent decision, ignoring inherited properties and unknown purpose names. */
2881
+ export declare const snapshotPresentationFromChoices: (purposes: ReadonlyArray<SnapshotConsentPurpose>, choices: ConsentChoices | undefined) => SnapshotPresentation;
2882
+
2883
+ /** Complete finite public classes, including never-decided and explicit denial.
2884
+ * Refuse a build that cannot retain all classes within its declared budget. */
2885
+ export declare const snapshotPresentations: (purposes: ReadonlyArray<SnapshotConsentPurpose>, maximum?: number) => ReadonlyArray<SnapshotPresentation>;
2886
+
2887
+ export declare class SnapshotPresentationUnavailable extends SnapshotPresentationUnavailable_base {
2888
+ }
2889
+
2890
+ declare const SnapshotPresentationUnavailable_base: Schema_2.Class<SnapshotPresentationUnavailable, Schema_2.TaggedStruct<"SnapshotPresentationUnavailable", {
2891
+ readonly reason: Schema_2.Literals<readonly ["policy", "selection", "bounds"]>;
2892
+ }>, YieldableError>;
2893
+
2894
+ export declare const snapshotReference: (data: SnapshotContentData, fieldPath: ReadonlyArray<string | number>) => SnapshotContentData | null;
2895
+
2896
+ export declare const snapshotRichDocumentProps: (data: SnapshotContentData, fieldPath: ReadonlyArray<string | number>, options: {
2897
+ readonly bindings: FrontendBindings;
2898
+ /** Resolve the exact projected reference scalar path, including the source field prefix. */
2899
+ readonly hrefOf?: (fieldPath: ReadonlyArray<string | number>) => string | null | undefined;
2900
+ /** Resolve a managed contact occurrence through its independently admitted target. */
2901
+ readonly contactHrefOf?: (fieldPath: ReadonlyArray<string | number>) => string | null | undefined;
2902
+ readonly imageOutput?: FrontendMediaOutput;
2903
+ readonly renderImage: (block: {
2904
+ readonly asset: string;
2905
+ readonly caption?: string;
2906
+ }, file: FrontendMediaFile, context: SnapshotRichImageContext) => ReactNode;
2907
+ }) => RichDocumentViewProps;
2908
+
2909
+ export declare interface SnapshotRichImageContext extends RichDocumentBlockContext {
2910
+ /** Exact asset reference field, including the source document field prefix. */
2911
+ readonly fieldPath: ReadonlyArray<string | number>;
2912
+ }
2913
+
2914
+ export declare interface SnapshotTreeData {
2915
+ readonly version: 1;
2916
+ readonly contentType: string;
2917
+ readonly localeId: string;
2918
+ readonly requestedLocale: string;
2919
+ readonly currentDocumentId: string | null;
2920
+ readonly nodes: ReadonlyArray<SnapshotTreeNode>;
2921
+ /** Root-first public ancestors of the current document, independent of includeField. */
2922
+ readonly ancestors: ReadonlyArray<SnapshotTreeNode>;
2923
+ }
2924
+
2925
+ export declare const snapshotTreeLoader: (context: {
2926
+ readonly pathname: string;
2927
+ readonly query?: <T>(tag: string, input: Record<string, unknown>) => Promise<T>;
2928
+ }, name: string) => Promise<SnapshotTreeData>;
2929
+
2930
+ export declare interface SnapshotTreeNode {
2931
+ readonly documentId: string;
2932
+ readonly parent: string | null;
2933
+ readonly depth: number;
2934
+ readonly path: string;
2935
+ readonly sourceLocale: string;
2936
+ readonly fallback: boolean;
2937
+ readonly values: Readonly<Record<string, unknown>>;
2938
+ }
2939
+
2940
+ export declare interface SnapshotTreeSelection {
2941
+ readonly contentType: string;
2942
+ readonly mappingId: string;
2943
+ readonly fields: ReadonlyArray<string>;
2944
+ /** Include only true nodes whose ancestors also match this Boolean field. */
2945
+ readonly includeField?: string;
2946
+ }
2947
+
2246
2948
  /** Mark an element of the preview with the field path it renders. */
2247
2949
  export declare const sourceAttributes: (path: string) => {
2248
2950
  readonly "data-cms-source": string;