@contentrain/types 1.57.0 → 1.59.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.
package/dist/index.mjs CHANGED
@@ -1361,6 +1361,13 @@ function validateProjectPlan(plan) {
1361
1361
  if (site?.lists?.tone !== void 0 && site.lists.tone !== "muted") errors.push(`site.lists.tone ${String(site.lists.tone)} is not muted`);
1362
1362
  if (site?.lists?.columns !== void 0 && (!Number.isInteger(site.lists.columns) || site.lists.columns < 1 || site.lists.columns > 6)) errors.push(`site.lists.columns ${String(site.lists.columns)} is not a whole number from 1 to 6`);
1363
1363
  if (site?.lists?.text !== void 0 && !CSS_LENGTH.test(site.lists.text)) errors.push(`site.lists.text ${site.lists.text} is not a CSS size`);
1364
+ for (const key of ["gap", "headingWidth"]) {
1365
+ const value = site?.lists?.[key];
1366
+ if (value !== void 0 && !CSS_LENGTH.test(value)) errors.push(`site.lists.${key} ${value} is not a CSS size`);
1367
+ }
1368
+ if (site?.lists?.image?.height !== void 0 && !CSS_LENGTH.test(site.lists.image.height)) errors.push(`site.lists.image.height ${site.lists.image.height} is not a CSS size`);
1369
+ if (site?.lists?.image?.aspect !== void 0 && !/^\d+(?:\.\d+)?\s*\/\s*\d+(?:\.\d+)?$/.test(site.lists.image.aspect)) errors.push(`site.lists.image.aspect ${site.lists.image.aspect} is not a ratio like 16 / 9`);
1370
+ if (site?.lists?.tieOrder !== void 0 && site.lists.tieOrder !== "asc" && site.lists.tieOrder !== "desc") errors.push(`site.lists.tieOrder ${String(site.lists.tieOrder)} is not asc or desc`);
1364
1371
  for (const [route, layout] of Object.entries(site?.entryLayouts ?? {})) {
1365
1372
  if (typeof layout?.adjacent !== "boolean") errors.push(`site.entryLayouts.${route}.adjacent is not true or false`);
1366
1373
  if (layout?.more !== void 0 && (!Number.isSafeInteger(layout.more) || layout.more < 0 || layout.more > 20)) errors.push(`site.entryLayouts.${route}.more is not a count from 0 to 20`);
@@ -1604,6 +1611,341 @@ function validateProjectPlan(plan) {
1604
1611
  };
1605
1612
  }
1606
1613
  //#endregion
1614
+ //#region src/understand.ts
1615
+ /** The widths every template is rendered at; the widest is the reference outline. */
1616
+ const UNDERSTAND_WIDTHS = [
1617
+ 390,
1618
+ 768,
1619
+ 1280
1620
+ ];
1621
+ /** The width whose outline numbers the nodes (see `SlotRef.node`). */
1622
+ const UNDERSTAND_REFERENCE_WIDTH = 1280;
1623
+ const BAND_LANDMARKS = [
1624
+ "header",
1625
+ "nav",
1626
+ "main",
1627
+ "footer"
1628
+ ];
1629
+ /**
1630
+ * What the capture did to a band before measuring it, so the still shows a settled state: a slider held at its first
1631
+ * slide, a counter at its final value, a lazy background loaded, a preloader removed, closed panels (accordion, tabs)
1632
+ * opened. A difference from the live page in such a band is a difference of state, and is reported as one.
1633
+ */
1634
+ const SETTLED_STATES = [
1635
+ "slide0",
1636
+ "counter-final",
1637
+ "lazy-bg",
1638
+ "preloader-off",
1639
+ "panels-open"
1640
+ ];
1641
+ const ARCHETYPES = [
1642
+ "header",
1643
+ "footer",
1644
+ "hero",
1645
+ "card-grid",
1646
+ "feature-split",
1647
+ "logo-strip",
1648
+ "stats",
1649
+ "testimonial",
1650
+ "faq",
1651
+ "cta-band",
1652
+ "pricing",
1653
+ "team",
1654
+ "gallery",
1655
+ "slider",
1656
+ "post-list",
1657
+ "contact-form",
1658
+ "timeline",
1659
+ "text",
1660
+ "other"
1661
+ ];
1662
+ /** Archetypes that are nothing without their repeated items. */
1663
+ const ITEM_ARCHETYPES = [
1664
+ "card-grid",
1665
+ "logo-strip",
1666
+ "stats",
1667
+ "testimonial",
1668
+ "faq",
1669
+ "pricing",
1670
+ "team",
1671
+ "gallery",
1672
+ "slider",
1673
+ "timeline"
1674
+ ];
1675
+ /**
1676
+ * Archetypes whose content is not in the band's nodes, so a region may hold no slot at all: `post-list` reads a
1677
+ * collection (its rendered cards only show which card fields the source uses), `contact-form` reads the detected
1678
+ * form, and `other` is the fallback.
1679
+ */
1680
+ const SLOTLESS_ARCHETYPES = [
1681
+ "post-list",
1682
+ "contact-form",
1683
+ "other"
1684
+ ];
1685
+ const one = (kind) => ({
1686
+ kind,
1687
+ many: false
1688
+ });
1689
+ const many = (kind) => ({
1690
+ kind,
1691
+ many: true
1692
+ });
1693
+ /** The slot vocabulary as data: a prompt, a schema and the validator all read these, so they cannot drift apart. */
1694
+ const REGION_SLOT_DEFS = {
1695
+ eyebrow: one("text"),
1696
+ heading: one("text"),
1697
+ lead: one("text"),
1698
+ body: many("text"),
1699
+ media: one("image"),
1700
+ actions: many("link"),
1701
+ logo: one("image"),
1702
+ nav: many("link"),
1703
+ utility: many("link"),
1704
+ social: many("link"),
1705
+ copyright: one("text")
1706
+ };
1707
+ const REGION_ITEM_SLOT_DEFS = {
1708
+ media: one("image"),
1709
+ icon: one("icon"),
1710
+ title: one("text"),
1711
+ text: one("text"),
1712
+ meta: one("text"),
1713
+ value: one("text"),
1714
+ link: one("link"),
1715
+ points: many("text"),
1716
+ links: many("link")
1717
+ };
1718
+ const REGION_GROUP_SLOT_DEFS = {
1719
+ title: one("text"),
1720
+ text: many("text"),
1721
+ links: many("link")
1722
+ };
1723
+ /** What a still capture cannot hold: the region shows one state of something that moves or opens. */
1724
+ const DYNAMIC_STATES = [
1725
+ "slider",
1726
+ "tabs",
1727
+ "accordion",
1728
+ "counter",
1729
+ "hover",
1730
+ "animation",
1731
+ "video",
1732
+ "embed"
1733
+ ];
1734
+ /** A region's id: unique in a run, the value `sameAs` and `continues` hold. */
1735
+ function regionId(spec) {
1736
+ return `${spec.band}#${spec.part}`;
1737
+ }
1738
+ /** Below this confidence a region is not trusted to be its archetype. */
1739
+ const UNDERSTAND_MIN_CONFIDENCE = .5;
1740
+ /** The region is built as the styled fallback section (never as unstyled prose). */
1741
+ function needsFallback(spec) {
1742
+ return spec.archetype === "other" || !(spec.confidence >= .5);
1743
+ }
1744
+ const FIDELITIES = [
1745
+ "modern",
1746
+ "middle",
1747
+ "faithful"
1748
+ ];
1749
+ const UNDERSTAND_ISSUE_CODES = [
1750
+ "bad_band",
1751
+ "unknown_band",
1752
+ "duplicate_region",
1753
+ "unknown_archetype",
1754
+ "bad_confidence",
1755
+ "unknown_slot",
1756
+ "bad_slot",
1757
+ "node_outside_band",
1758
+ "background_not_image",
1759
+ "slot_unresolved",
1760
+ "missing_items",
1761
+ "empty_region",
1762
+ "bad_ungrounded",
1763
+ "bad_dynamic",
1764
+ "bad_same_as",
1765
+ "bad_continues"
1766
+ ];
1767
+ function isRecord(value) {
1768
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1769
+ }
1770
+ function isIndex(value) {
1771
+ return typeof value === "number" && Number.isInteger(value) && value >= 0;
1772
+ }
1773
+ function isBox(value) {
1774
+ return isRecord(value) && [value["x"], value["y"]].every((n) => typeof n === "number" && Number.isFinite(n)) && [value["w"], value["h"]].every((n) => typeof n === "number" && Number.isFinite(n) && n >= 0);
1775
+ }
1776
+ /**
1777
+ * Checks the facts side of the contract: unique ids, a box at the reference width, one order per band and node ranges
1778
+ * that do not overlap inside a template. Empty result: the bands are safe to hand to the understanding stage.
1779
+ */
1780
+ function validateBands(bands) {
1781
+ const issues = [];
1782
+ const bad = (band, message) => issues.push({
1783
+ code: "bad_band",
1784
+ band,
1785
+ message
1786
+ });
1787
+ const ids = /* @__PURE__ */ new Set();
1788
+ const byTemplate = /* @__PURE__ */ new Map();
1789
+ for (const band of bands) {
1790
+ const id = typeof band.id === "string" ? band.id : "";
1791
+ if (!id || id.includes("#")) bad(id, "A band id is a non-empty string without \"#\".");
1792
+ else if (ids.has(id)) bad(id, "Two bands share this id.");
1793
+ ids.add(id);
1794
+ if (typeof band.template !== "string" || !band.template) bad(id, "A band names its template.");
1795
+ if (!isIndex(band.order)) bad(id, "A band's order is a whole number from 0.");
1796
+ if (!isRecord(band.boxes) || !isBox(band.boxes[1280])) bad(id, `A band has a box at ${UNDERSTAND_REFERENCE_WIDTH}.`);
1797
+ else if (Object.entries(band.boxes).some(([width, box]) => !UNDERSTAND_WIDTHS.includes(Number(width)) || !isBox(box))) bad(id, `A band's boxes are keyed by ${UNDERSTAND_WIDTHS.join(", ")}.`);
1798
+ if (!isRecord(band.nodes) || !isIndex(band.nodes.first) || !isIndex(band.nodes.last) || band.nodes.first > band.nodes.last) {
1799
+ bad(id, "A band's node range is two whole numbers, first ≤ last.");
1800
+ continue;
1801
+ }
1802
+ if (!isRecord(band.style)) bad(id, "A band carries its measured style (an empty object when nothing was measured).");
1803
+ if (band.settled !== void 0 && !(Array.isArray(band.settled) && band.settled.every((state) => SETTLED_STATES.includes(state)))) bad(id, `settled is a list of: ${SETTLED_STATES.join(", ")}.`);
1804
+ byTemplate.set(band.template, [...byTemplate.get(band.template) ?? [], band]);
1805
+ }
1806
+ for (const group of byTemplate.values()) {
1807
+ const orders = /* @__PURE__ */ new Map();
1808
+ for (const band of group) {
1809
+ const same = orders.get(band.order);
1810
+ if (same) bad(band.id, `Bands ${same.id} and ${band.id} share an order.`);
1811
+ else orders.set(band.order, band);
1812
+ }
1813
+ const byNodes = group.toSorted((a, b) => a.nodes.first - b.nodes.first);
1814
+ for (let i = 1; i < byNodes.length; i++) {
1815
+ const [prev, band] = [byNodes[i - 1], byNodes[i]];
1816
+ if (band.nodes.first <= prev.nodes.last) bad(band.id, `The node range overlaps band ${prev.id}'s.`);
1817
+ }
1818
+ }
1819
+ return issues;
1820
+ }
1821
+ function isSlotRef(value) {
1822
+ return isRecord(value) && isIndex(value["node"]) && Object.keys(value).every((key) => key === "node" || key === "background" && (value[key] === true || value[key] === void 0));
1823
+ }
1824
+ /** Walks one slot holder in the table's order, so the visiting order never depends on the input's key order. */
1825
+ function walkHolder(holder, defs, prefix, nested, visit, problem) {
1826
+ const visitRef = (value, kind, path) => {
1827
+ if (isSlotRef(value)) visit(value, kind, path);
1828
+ else problem("bad_slot", path, "A slot is { node } with a whole-number node id, and at most background: true.");
1829
+ };
1830
+ for (const [name, def] of Object.entries(defs)) {
1831
+ const value = holder[name];
1832
+ if (value === void 0) continue;
1833
+ const path = `${prefix}${name}`;
1834
+ if (!def.many) visitRef(value, def.kind, path);
1835
+ else if (!Array.isArray(value)) problem("bad_slot", path, "This slot holds a list of refs.");
1836
+ else value.forEach((ref, i) => visitRef(ref, def.kind, `${path}.${i}`));
1837
+ }
1838
+ for (const name of Object.keys(holder)) if (!(name in defs) && !nested.includes(name) && holder[name] !== void 0) problem("unknown_slot", `${prefix}${name}`, "No such slot.");
1839
+ }
1840
+ function walkSlots(slots, visit, problem) {
1841
+ if (!isRecord(slots)) {
1842
+ problem("bad_slot", "slots", "A region's slots are an object.");
1843
+ return;
1844
+ }
1845
+ walkHolder(slots, REGION_SLOT_DEFS, "", ["items", "groups"], visit, problem);
1846
+ const lists = [["items", REGION_ITEM_SLOT_DEFS], ["groups", REGION_GROUP_SLOT_DEFS]];
1847
+ for (const [name, defs] of lists) {
1848
+ const list = slots[name];
1849
+ if (list === void 0) continue;
1850
+ if (!Array.isArray(list)) {
1851
+ problem("bad_slot", name, "This slot holds a list.");
1852
+ continue;
1853
+ }
1854
+ list.forEach((entry, i) => {
1855
+ if (!isRecord(entry) || Object.values(entry).every((value) => value === void 0)) problem("bad_slot", `${name}.${i}`, "An entry holds at least one slot.");
1856
+ else walkHolder(entry, defs, `${name}.${i}.`, [], visit, problem);
1857
+ });
1858
+ }
1859
+ }
1860
+ /**
1861
+ * Visits every ref of a region with its kind and its path (`heading`, `items.2.title`), in a fixed order: the region's
1862
+ * own slots, then its items, then its groups. Malformed slots are skipped; `validateRegionSpecs` reports them.
1863
+ */
1864
+ function forEachSlot(spec, visit) {
1865
+ walkSlots(spec.slots, visit, () => {});
1866
+ }
1867
+ const SLOT_PATHS = new Set([
1868
+ ...Object.keys(REGION_SLOT_DEFS),
1869
+ "items",
1870
+ ...Object.keys(REGION_ITEM_SLOT_DEFS).map((name) => `items.${name}`),
1871
+ "groups",
1872
+ ...Object.keys(REGION_GROUP_SLOT_DEFS).map((name) => `groups.${name}`)
1873
+ ]);
1874
+ /** `items.2.icon` → `items.icon`. */
1875
+ function slotPathOf(path) {
1876
+ return path.split(".").filter((part) => !/^\d+$/.test(part)).join(".");
1877
+ }
1878
+ /**
1879
+ * The gate between the model and the engine. Every region must name a known band, a known archetype and slots from
1880
+ * the vocabulary; every ref must lie inside its band's node range and, when `resolves` is given, hold content of its
1881
+ * kind. A region with an issue must not reach the plan: it goes to `UnderstandRun.issues`, not to `specs`.
1882
+ *
1883
+ * Empty result: every region is safe to build from.
1884
+ */
1885
+ function validateRegionSpecs(specs, bands, options = {}) {
1886
+ const issues = [];
1887
+ const bandById = new Map(bands.map((band) => [band.id, band]));
1888
+ const specById = /* @__PURE__ */ new Map();
1889
+ for (const spec of specs) {
1890
+ const id = regionId(spec);
1891
+ if (!specById.has(id)) specById.set(id, spec);
1892
+ }
1893
+ const seen = /* @__PURE__ */ new Set();
1894
+ for (const spec of specs) {
1895
+ const band = bandById.get(spec.band);
1896
+ const add = (code, message, slot) => issues.push({
1897
+ code,
1898
+ band: String(spec.band),
1899
+ ...isIndex(spec.part) ? { part: spec.part } : {},
1900
+ ...slot === void 0 ? {} : { slot },
1901
+ message
1902
+ });
1903
+ if (!band) {
1904
+ add("unknown_band", "The region names a band that is not in the run.");
1905
+ continue;
1906
+ }
1907
+ const id = regionId(spec);
1908
+ if (!isIndex(spec.part)) add("duplicate_region", "A region's part is a whole number from 0.");
1909
+ else if (seen.has(id)) add("duplicate_region", "Two regions share this band and part.");
1910
+ seen.add(id);
1911
+ const known = ARCHETYPES.includes(spec.archetype);
1912
+ if (!known) add("unknown_archetype", `"${String(spec.archetype)}" is not an archetype.`);
1913
+ if (typeof spec.confidence !== "number" || !(spec.confidence >= 0 && spec.confidence <= 1)) add("bad_confidence", "Confidence is a number from 0 to 1.");
1914
+ let refs = 0;
1915
+ walkSlots(spec.slots, (ref, kind, path) => {
1916
+ refs++;
1917
+ if (ref.background && kind !== "image") add("background_not_image", "Only an image slot can read a background.", path);
1918
+ if (ref.node < band.nodes.first || ref.node > band.nodes.last) add("node_outside_band", `Node ${ref.node} is outside the band's nodes (${band.nodes.first}–${band.nodes.last}).`, path);
1919
+ else if (options.resolves && !options.resolves(ref, kind, band)) add("slot_unresolved", `Node ${ref.node} holds no ${kind}.`, path);
1920
+ }, (code, path, message) => {
1921
+ refs++;
1922
+ add(code, message, path);
1923
+ });
1924
+ if (known) {
1925
+ const items = isRecord(spec.slots) ? spec.slots["items"] : void 0;
1926
+ if (ITEM_ARCHETYPES.includes(spec.archetype) && !(Array.isArray(items) && items.length > 0)) add("missing_items", `A ${spec.archetype} needs at least one item.`, "items");
1927
+ else if (refs === 0 && !SLOTLESS_ARCHETYPES.includes(spec.archetype)) add("empty_region", `A ${spec.archetype} needs at least one slot.`);
1928
+ }
1929
+ if (!Array.isArray(spec.ungrounded)) add("bad_ungrounded", "ungrounded is a list of slot paths (empty when everything is grounded).");
1930
+ else for (const path of spec.ungrounded) if (typeof path !== "string" || !SLOT_PATHS.has(slotPathOf(path))) add("bad_ungrounded", `"${String(path)}" is not a slot path.`);
1931
+ if (spec.dynamic !== void 0 && !(Array.isArray(spec.dynamic) && spec.dynamic.every((state) => DYNAMIC_STATES.includes(state)))) add("bad_dynamic", `dynamic is a list of: ${DYNAMIC_STATES.join(", ")}.`);
1932
+ if (spec.sameAs !== void 0) {
1933
+ const target = specById.get(spec.sameAs);
1934
+ if (!target || spec.sameAs === id) add("bad_same_as", "sameAs names another region of the run.");
1935
+ else if (target.archetype !== spec.archetype) add("bad_same_as", "sameAs joins regions of one archetype.");
1936
+ else if (target.sameAs !== void 0) add("bad_same_as", "sameAs points at a region that has no sameAs itself.");
1937
+ }
1938
+ if (spec.continues !== void 0) {
1939
+ const target = specById.get(spec.continues);
1940
+ const targetBand = target && bandById.get(target.band);
1941
+ if (!target || !targetBand) add("bad_continues", "continues names another region of the run.");
1942
+ else if (targetBand.template !== band.template || !(targetBand.order < band.order)) add("bad_continues", "continues points at a region in an earlier band of the same template.");
1943
+ else if (target.archetype !== spec.archetype && target.archetype !== "text") add("bad_continues", "continues joins regions of one archetype, or carries on a text introduction.");
1944
+ }
1945
+ }
1946
+ return issues;
1947
+ }
1948
+ //#endregion
1607
1949
  //#region src/provider.ts
1608
1950
  /** Capability set for the LocalProvider (simple-git + worktree). */
1609
1951
  const LOCAL_CAPABILITIES = {
@@ -2678,6 +3020,6 @@ function serializeMarkdownFrontmatter(data, body) {
2678
3020
  return lines.join("\n");
2679
3021
  }
2680
3022
  //#endregion
2681
- export { APPROVAL_GATES, APPROVAL_MODES, CANONICAL_JSON, CAPABILITY_KEYS, CHROME_BODY_SLOT, CHROME_COMPONENT_CLOSE, CHROME_COMPONENT_OPEN, CHROME_IF_CLOSE, CHROME_IF_OPEN, CHROME_REPEAT_CLOSE, CHROME_REPEAT_OPEN, COMMENTS_EXPORT_FORMAT, COMPONENT_TYPES, CONTENTRAIN_BRANCH, CONTENTRAIN_DIR, DEFAULT_APPROVAL_POLICY, DICTIONARY_TITLE_FIELD, ENTRY_ID_PATTERN, EXECUTION_CONTRACT_VERSION, INTEGRATION_CATEGORIES, INTEGRATION_EVIDENCE_KINDS, LEGACY_CSS_LAYER, LIST_ITEMS_SLOT, LOCALE_PATTERN, LOCAL_CAPABILITIES, MIGRATE_ACCOUNT_STATES, MIGRATE_GRANT_STATES, MIGRATE_REVOKE_REASONS, MIGRATE_STUDIO_CLAIM_ALG, MIGRATE_STUDIO_CLAIM_AUDIENCE, MIGRATE_STUDIO_CLAIM_CLOCK_SKEW_SECONDS, MIGRATE_STUDIO_CLAIM_ISSUER, MIGRATE_STUDIO_CLAIM_MAX_TRIAL_DAYS, MIGRATE_STUDIO_CLAIM_MAX_TTL_SECONDS, MIGRATE_STUDIO_CLAIM_VERSION, MIGRATE_STUDIO_CLAIM_VERSION_2, MIGRATE_STUDIO_PLANS, MIGRATION_CONTRACT_VERSION, MIGRATION_HANDOFF_GOLDEN, MODEL_EXTENSION_KEYS, MODEL_FIELD_ORDER, PAGE_BODY_KINDS, PATH_PATTERNS, PLAN_BEHAVIOR_REASON, PLAN_SECTION_RULE, PLAN_STARTER_FEATURES, PLAN_TOKEN_ROLES, PLAN_VALUE_PATTERN, PROJECT_PLAN_FORMAT, RAW_MARK_SUFFIX, RESERVED_PATHS, RISK_CLASSES, RUN_STATUSES, SCHEDULE_KINDS, SECRET_PATTERNS, SEO_PROVIDERS, SLUG_PATTERN, SOURCE_ACCESS_LADDER, SOURCE_DELTA_OPS, TERMINAL_RUN_STATUSES, TEXT_CANDIDATE_KINDS, TEXT_EXCLUDE_REASONS, TITLE_FIELD_TYPES, approversFor, canonicalStringify, commentsExportSource, componentSlot, computePlanHash, conflictId, describeModelLocaleScope, detectSecrets, effectiveRisk, evaluateApproval, fieldDepth, footerMenusOf, generateEntryId, highestRisk, isMediaType, isMigrateStudioClaim, isRepoRelativePath, isReservedPath, isStoredMediaPath, isTerminalRunStatus, isTitleFieldType, looksLikeCredential, orderedFieldNames, parseFrontmatterScalar, parseFrontmatterScalarString, parseMarkdownFrontmatter, planHashPayload, requiredApprovals, resolveFieldLabel, resolveModelLocales, rewriteEntryMedia, rewriteFieldMedia, rewriteMarkdownMedia, rewriteMediaUrl, riskRank, sectionFieldName, serializeMarkdownFrontmatter, sortKeys, splitFrontmatterList, stableHash, titleFieldTarget, titleFieldValue, toDeliveryUrl, validateAccept, validateEntryId, validateFieldValue, validateHandoffCommentsExport, validateLocale, validateMigrateAccountStateRequest, validateMigrateAccountStateResponse, validateMigrateGrantStatusRequest, validateMigrateGrantStatusResponse, validateMigrateInstallUrlRequest, validateMigrateInstallUrlResponse, validateMigrateProvisionResponse, validateMigrateRevokeRequest, validateMigrateRevokeResponse, validateMigrateStudioClaim, validateMigrateStudioClaimAny, validateMigrateStudioClaimV2, validateModelLocales, validateProjectPlan, validateSemanticType, validateSlug };
3023
+ export { APPROVAL_GATES, APPROVAL_MODES, ARCHETYPES, BAND_LANDMARKS, CANONICAL_JSON, CAPABILITY_KEYS, CHROME_BODY_SLOT, CHROME_COMPONENT_CLOSE, CHROME_COMPONENT_OPEN, CHROME_IF_CLOSE, CHROME_IF_OPEN, CHROME_REPEAT_CLOSE, CHROME_REPEAT_OPEN, COMMENTS_EXPORT_FORMAT, COMPONENT_TYPES, CONTENTRAIN_BRANCH, CONTENTRAIN_DIR, DEFAULT_APPROVAL_POLICY, DICTIONARY_TITLE_FIELD, DYNAMIC_STATES, ENTRY_ID_PATTERN, EXECUTION_CONTRACT_VERSION, FIDELITIES, INTEGRATION_CATEGORIES, INTEGRATION_EVIDENCE_KINDS, ITEM_ARCHETYPES, LEGACY_CSS_LAYER, LIST_ITEMS_SLOT, LOCALE_PATTERN, LOCAL_CAPABILITIES, MIGRATE_ACCOUNT_STATES, MIGRATE_GRANT_STATES, MIGRATE_REVOKE_REASONS, MIGRATE_STUDIO_CLAIM_ALG, MIGRATE_STUDIO_CLAIM_AUDIENCE, MIGRATE_STUDIO_CLAIM_CLOCK_SKEW_SECONDS, MIGRATE_STUDIO_CLAIM_ISSUER, MIGRATE_STUDIO_CLAIM_MAX_TRIAL_DAYS, MIGRATE_STUDIO_CLAIM_MAX_TTL_SECONDS, MIGRATE_STUDIO_CLAIM_VERSION, MIGRATE_STUDIO_CLAIM_VERSION_2, MIGRATE_STUDIO_PLANS, MIGRATION_CONTRACT_VERSION, MIGRATION_HANDOFF_GOLDEN, MODEL_EXTENSION_KEYS, MODEL_FIELD_ORDER, PAGE_BODY_KINDS, PATH_PATTERNS, PLAN_BEHAVIOR_REASON, PLAN_SECTION_RULE, PLAN_STARTER_FEATURES, PLAN_TOKEN_ROLES, PLAN_VALUE_PATTERN, PROJECT_PLAN_FORMAT, RAW_MARK_SUFFIX, REGION_GROUP_SLOT_DEFS, REGION_ITEM_SLOT_DEFS, REGION_SLOT_DEFS, RESERVED_PATHS, RISK_CLASSES, RUN_STATUSES, SCHEDULE_KINDS, SECRET_PATTERNS, SEO_PROVIDERS, SETTLED_STATES, SLOTLESS_ARCHETYPES, SLUG_PATTERN, SOURCE_ACCESS_LADDER, SOURCE_DELTA_OPS, TERMINAL_RUN_STATUSES, TEXT_CANDIDATE_KINDS, TEXT_EXCLUDE_REASONS, TITLE_FIELD_TYPES, UNDERSTAND_ISSUE_CODES, UNDERSTAND_MIN_CONFIDENCE, UNDERSTAND_REFERENCE_WIDTH, UNDERSTAND_WIDTHS, approversFor, canonicalStringify, commentsExportSource, componentSlot, computePlanHash, conflictId, describeModelLocaleScope, detectSecrets, effectiveRisk, evaluateApproval, fieldDepth, footerMenusOf, forEachSlot, generateEntryId, highestRisk, isMediaType, isMigrateStudioClaim, isRepoRelativePath, isReservedPath, isStoredMediaPath, isTerminalRunStatus, isTitleFieldType, looksLikeCredential, needsFallback, orderedFieldNames, parseFrontmatterScalar, parseFrontmatterScalarString, parseMarkdownFrontmatter, planHashPayload, regionId, requiredApprovals, resolveFieldLabel, resolveModelLocales, rewriteEntryMedia, rewriteFieldMedia, rewriteMarkdownMedia, rewriteMediaUrl, riskRank, sectionFieldName, serializeMarkdownFrontmatter, sortKeys, splitFrontmatterList, stableHash, titleFieldTarget, titleFieldValue, toDeliveryUrl, validateAccept, validateBands, validateEntryId, validateFieldValue, validateHandoffCommentsExport, validateLocale, validateMigrateAccountStateRequest, validateMigrateAccountStateResponse, validateMigrateGrantStatusRequest, validateMigrateGrantStatusResponse, validateMigrateInstallUrlRequest, validateMigrateInstallUrlResponse, validateMigrateProvisionResponse, validateMigrateRevokeRequest, validateMigrateRevokeResponse, validateMigrateStudioClaim, validateMigrateStudioClaimAny, validateMigrateStudioClaimV2, validateModelLocales, validateProjectPlan, validateRegionSpecs, validateSemanticType, validateSlug };
2682
3024
 
2683
3025
  //# sourceMappingURL=index.mjs.map