@conduction/nextcloud-vue 2.56.0-beta.13 → 2.56.0-beta.15

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 (90) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +19 -0
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +10 -3
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +2 -2
  6. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  8. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +37 -26
  9. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  10. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js +3 -3
  11. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  12. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +4 -4
  13. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  14. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  15. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +89 -49
  16. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  17. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +337 -315
  18. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  19. package/dist/esm/components/CnIndexPage/defaultActions.js +6 -7
  20. package/dist/esm/components/CnIndexPage/defaultActions.js.map +1 -1
  21. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +33 -34
  22. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  23. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js +3 -3
  24. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  25. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +5 -11
  26. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  27. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  28. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +3 -2
  29. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
  30. package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
  31. package/dist/esm/composables/useContextMenu.js +4 -2
  32. package/dist/esm/composables/useContextMenu.js.map +1 -1
  33. package/dist/esm/composables/useDependencyCheck.js +44 -1
  34. package/dist/esm/composables/useDependencyCheck.js.map +1 -1
  35. package/dist/esm/composables/useListView.js +43 -1
  36. package/dist/esm/composables/useListView.js.map +1 -1
  37. package/dist/esm/composables/useSetupStatus.js +26 -3
  38. package/dist/esm/composables/useSetupStatus.js.map +1 -1
  39. package/dist/esm/l10n/en.json.js +4 -1
  40. package/dist/esm/l10n/en.json.js.map +1 -1
  41. package/dist/esm/l10n/nl.json.js +4 -1
  42. package/dist/esm/l10n/nl.json.js.map +1 -1
  43. package/dist/esm/nextcloud-vue.css +20 -2
  44. package/dist/esm/store/plugins/liveUpdates.js +19 -9
  45. package/dist/esm/store/plugins/liveUpdates.js.map +1 -1
  46. package/dist/esm/store/useObjectStore.js +20 -9
  47. package/dist/esm/store/useObjectStore.js.map +1 -1
  48. package/dist/esm/utils/resolveRowActions.js +130 -0
  49. package/dist/esm/utils/resolveRowActions.js.map +1 -0
  50. package/dist/esm/utils/rowActionItem.js +99 -0
  51. package/dist/esm/utils/rowActionItem.js.map +1 -0
  52. package/dist/esm/utils/timelineEvents.js +44 -1
  53. package/dist/esm/utils/timelineEvents.js.map +1 -1
  54. package/dist/esm/utils/validateManifest.js +59 -3
  55. package/dist/esm/utils/validateManifest.js.map +1 -1
  56. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  57. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  58. package/dist/nextcloud-vue.cjs.js +1325 -781
  59. package/dist/nextcloud-vue.cjs.js.map +2 -2
  60. package/dist/nextcloud-vue.css +20 -2
  61. package/l10n/en.json +4 -1
  62. package/l10n/nl.json +4 -1
  63. package/package.json +1 -1
  64. package/scripts/.jsdoc-baselines.json +2 -2
  65. package/src/components/CnActionsBar/CnActionsBar.md +2 -1
  66. package/src/components/CnActionsBar/CnActionsBar.vue +25 -1
  67. package/src/components/CnAppNav/CnAppNav.vue +2 -2
  68. package/src/components/CnContextMenu/CnContextMenu.vue +40 -29
  69. package/src/components/CnDataTable/CnDataTable.md +1 -1
  70. package/src/components/CnDataTable/CnDataTable.vue +4 -4
  71. package/src/components/CnIndexPage/CnIndexPage.md +23 -1
  72. package/src/components/CnIndexPage/CnIndexPage.vue +108 -52
  73. package/src/components/CnIndexPage/defaultActions.js +6 -7
  74. package/src/components/CnRowActions/CnRowActions.vue +36 -37
  75. package/src/components/CnSetupWizard/CnSetupWizard.vue +5 -11
  76. package/src/components/CnTimelineWidget/CnTimelineWidget.vue +3 -2
  77. package/src/composables/useContextMenu.js +4 -2
  78. package/src/composables/useDependencyCheck.js +43 -0
  79. package/src/composables/useListView.js +43 -1
  80. package/src/composables/useSetupStatus.js +26 -3
  81. package/src/css/actions-bar.css +20 -2
  82. package/src/schemas/app-manifest-v2.schema.json +48 -10
  83. package/src/schemas/app-manifest.schema.json +1 -1
  84. package/src/store/plugins/liveUpdates.js +19 -9
  85. package/src/store/useObjectStore.js +19 -8
  86. package/src/utils/resolveRowActions.js +127 -0
  87. package/src/utils/rowActionItem.js +95 -0
  88. package/src/utils/timelineEvents.js +43 -0
  89. package/src/utils/validateManifest.js +60 -3
  90. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"validateManifest.js","sources":["../../../src/utils/validateManifest.js"],"sourcesContent":["// Single source of truth for \"which widget keys does the library render\n// itself?\", bound to the runtime registries by\n// tests/utils/libraryWidgetKeys.spec.js so the two cannot drift apart again.\n// The built-in files-browser column names, imported from the component that\n// renders them so the validator and the browser cannot disagree about which\n// names exist.\nimport { BUILT_IN_FILE_COLUMNS } from '../components/CnFilesBrowser/filesBrowserColumns.js'\nimport { LIBRARY_WIDGET_KEYS } from './libraryWidgetKeys.js'\n// Shared slot→columns resolution so the validator's grid bound matches the\n// renderer (CnWidgetGrid) exactly. A mismatch would let a manifest pass\n// validation yet clip at render time.\nimport { resolveSlotColumns } from './resolveSlotColumns.js'\n// The standalone validator is pre-compiled at build time by\n// scripts/build-validators.js. It does NOT use new Function() at\n// runtime, which is required because Nextcloud's CSP blocks unsafe-eval\n// (EvalError on every v2 app boot without this). See ADR-036.\n//\n// The file is regenerated on every `npm run build` and `npm test`\n// via the `build:validators` script, and is gitignored.\nimport _compiledValidateV2 from './validateManifestV2.compiled.js'\n\n// CJS/ESM interop: compiled file exports default via module.exports.default\n// in some bundlers. Unwrap when present.\nconst _validateV2Schema = _compiledValidateV2.default || _compiledValidateV2\n\n/** Module-level flag so the unknown-$schema console.warn fires only once. */\nlet _unknownSchemaWarned = false\n\n/**\n * The v2 schema URL suffix used for dispatch detection.\n */\nconst V2_SCHEMA_SUFFIX = '/app-manifest-v2.schema.json'\n\n/**\n * Convert an Ajv ErrorObject's instancePath + message to a bracket-path\n * string matching the v1 validator's format (e.g. \"pages[0]/...\").\n *\n * Ajv uses JSON Pointer paths like \"/pages/0/widgets/1/gridWidth\".\n * We convert the leading \"/pages/0\" segment to \"pages[0]\" and keep\n * the rest as slash-separated for consistency with v1.\n *\n * @param {import('ajv').ErrorObject} err - Ajv error object\n * @return {string} Formatted error message\n */\nfunction ajvErrorToString(err) {\n\t// instancePath is like \"/pages/0/widgets/1/gridWidth\" or \"\"\n\t// keyword-based errors with no instancePath use the schemaPath\n\tconst path = err.instancePath || err.schemaPath || ''\n\n\t// Convert /pages/0/... → pages[0]/...\n\tconst bracketPath = path.replace(/^\\//, '').replace(/\\/(\\d+)(\\/|$)/g, '[$1]$2')\n\n\tconst message = err.message || 'validation error'\n\n\tif (bracketPath) {\n\t\treturn `${bracketPath}: ${message}`\n\t}\n\treturn message\n}\n\n/**\n * Library built-in v2 widget keys. A `widgetKey` resolving to one of\n * these is rendered by a library `Cn*` SFC and does NOT count as a\n * custom registry component for the single-12×12-widget dashboard\n * rule (see the consumer below).\n *\n * This used to be a hand-written array carrying a comment telling the\n * next author to append new built-ins \"in the same PR\". Eleven keys\n * were listed while the library rendered forty-five, and nothing\n * failed, because the only symptom is a legitimate library dashboard\n * being told to redeclare itself as `type:\"custom\"`. The list now\n * lives in `utils/libraryWidgetKeys.js`, which\n * `tests/utils/libraryWidgetKeys.spec.js` holds to set equality\n * against the two registries that actually resolve a key at runtime —\n * `BUILT_IN_WIDGETS` and the dashboard catalog `CnWidgetGrid` falls\n * back to. Adding a widget to either registry without updating that\n * module now fails CI.\n *\n * Imported as bare strings on purpose: the registries themselves pull\n * in ~50 SFCs (leaflet, the chart stack), and `validateManifest.js` is\n * a lazily-loaded chunk that must stay cheap to import in Node.\n *\n * @type {Set<string>}\n */\nconst LIBRARY_BUILT_IN_WIDGET_KEYS = new Set(LIBRARY_WIDGET_KEYS)\n\n/**\n * Closed enum of valid chart `valueAxisBaseline` values — mirrors\n * `CnChartWidget`'s own prop validator. Checked post-schema because the key\n * sits inside the free-form widget `props` / `content` bag.\n *\n * @type {string[]}\n */\nconst CHART_VALUE_AXIS_BASELINES = ['auto', 'zero', 'fit']\n\n/**\n * Validate a v2 manifest using the Ajv-compiled `app-manifest-v2.schema.json`.\n *\n * In addition to JSON Schema validation, applies the following post-schema\n * checks that cannot be expressed in pure JSON Schema:\n * - `pages[].id` uniqueness across the array\n * - `pages[].widgets[].id` uniqueness across the WHOLE manifest for every\n * entry declaring `ncDashboard` (Nextcloud's widget namespace is per app,\n * not per page)\n * - `gridX + gridWidth <= 12` for every widget in every page (only on\n * slots where gridColumns is 12 — i.e. all non-sidebar slots)\n * - Single-12×12-custom-widget dashboard rule (ADR-036 Decision 1): a\n * `pages[].type === \"dashboard\"` with exactly one `widgets[]` entry\n * where `slot === \"body\"`, `gridX/gridY === 0`, `gridWidth/gridHeight\n * === 12`, and `widgetKey` does NOT resolve to a library built-in.\n * - `@resolve:` sentinel REJECTION on registry-key paths (mirrors v1 rules):\n * `pages[].id`, `pages[].route`, `pages[].component`,\n * `pages[].headerComponent`, `pages[].actionsComponent`,\n * `pages[].slots.*`, `menu[].id`, `menu[].route`,\n * `dependencies[]`, `version`\n * - A `type: 'files'` page whose `config.columns` names a built-in column\n * that does not exist, or declares one with an unknown `source` or an\n * `attribute` source reading no property\n * - A `config.folderSidebar.folders[]` scope naming a column key that the\n * page's own `config.columns` does not declare (the page declares which\n * columns it has; a scope only chooses among them)\n *\n * @spec openspec/changes/manifest-v2-schema/specs/manifest-v2-schema/spec.md\n * @param {object} manifest The v2 manifest object to validate.\n * @return {{ valid: boolean, errors: string[] }}\n */\nexport function validateManifestV2(manifest) {\n\t// Clone so Ajv useDefaults mutations don't affect the caller's copy.\n\tconst clone = JSON.parse(JSON.stringify(manifest))\n\n\tconst ajvValid = _validateV2Schema(clone)\n\tconst errors = []\n\n\tif (!ajvValid && _validateV2Schema.errors) {\n\t\tfor (const err of _validateV2Schema.errors) {\n\t\t\terrors.push(ajvErrorToString(err))\n\t\t}\n\t}\n\n\t// --- Post-schema checks ---\n\n\t// 1. pages[].id uniqueness\n\tif (Array.isArray(clone.pages)) {\n\t\tconst seenIds = new Set()\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (page && typeof page.id === 'string') {\n\t\t\t\tif (seenIds.has(page.id)) {\n\t\t\t\t\terrors.push(`pages[${index}]/id: \"${page.id}\" must be unique within pages[]`)\n\t\t\t\t} else {\n\t\t\t\t\tseenIds.add(page.id)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 1b. Entity-scaffold templating (manifest-entity-scaffold-templating):\n\t// pageTemplates[].id uniqueness + pageInstances[].templateRef resolves.\n\t// Cheap early feedback so a dangling ref is caught at validation time,\n\t// not only when the expander runs. No-op for a manifest without\n\t// templating (the fleet corpus), so it can't break the regression.\n\tif (Array.isArray(clone.pageTemplates) || Array.isArray(clone.pageInstances)) {\n\t\tconst templateIds = new Set()\n\t\tif (Array.isArray(clone.pageTemplates)) {\n\t\t\tclone.pageTemplates.forEach((tpl, index) => {\n\t\t\t\tif (!tpl || typeof tpl.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (templateIds.has(tpl.id)) {\n\t\t\t\t\terrors.push(`pageTemplates[${index}]/id: \"${tpl.id}\" must be unique within pageTemplates[]`)\n\t\t\t\t} else {\n\t\t\t\t\ttemplateIds.add(tpl.id)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (Array.isArray(clone.pageInstances)) {\n\t\t\tclone.pageInstances.forEach((inst, index) => {\n\t\t\t\tif (!inst || typeof inst.templateRef !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!templateIds.has(inst.templateRef)) {\n\t\t\t\t\terrors.push(`pageInstances[${index}]/templateRef: \"${inst.templateRef}\" references no pageTemplates[] entry`)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\t// 2. gridX + gridWidth <= 12 for widget entries (sidebar already\n\t// constrained to gridWidth:1 by schema, so the sum is always ≤12 for\n\t// sidebar; we still run the arithmetic check for clarity).\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst gx = widget.gridX\n\t\t\t\tconst gw = widget.gridWidth\n\t\t\t\tif (typeof gx === 'number' && typeof gw === 'number') {\n\t\t\t\t\tconst resolved = resolveSlotColumns(widget.slot, isPlainObject(page.config) ? page.config.slotColumns : null)\n\t\t\t\t\tif (gx + gw > resolved) {\n\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: Widget '${widget.widgetKey}' in slot '${widget.slot}': gridX (${gx}) + gridWidth (${gw}) exceeds ${resolved}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 2b. `ncDashboard` widget ids are unique across the WHOLE manifest.\n\t// The schema can require the id but not compare two pages, and the\n\t// page is the wrong scope anyway: Nextcloud keys each user's chosen\n\t// dashboard widgets per APP, so two pages both declaring id 'recent'\n\t// derive one panel and the second silently replaces the first in a\n\t// namespace no migration of this app can reach.\n\tif (Array.isArray(clone.pages)) {\n\t\tconst seenDashboardIds = new Map()\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || !isPlainObject(widget.ncDashboard) || typeof widget.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst here = `pages[${pIndex}]/widgets[${wIndex}]`\n\t\t\t\tconst first = seenDashboardIds.get(widget.id)\n\t\t\t\tif (first) {\n\t\t\t\t\terrors.push(`${here}/id: \"${widget.id}\" already publishes to the Nextcloud dashboard at ${first} — an ncDashboard id must be unique across the whole manifest`)\n\t\t\t\t} else {\n\t\t\t\t\tseenDashboardIds.set(widget.id, here)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3. Single-12×12-custom-widget dashboard rule (ADR-036 Decision 1 /\n\t// manifest-v2 spec). A `type: \"dashboard\"` page with exactly one\n\t// widget that fills the body grid AND references a custom registry\n\t// component is always a custom page in disguise — the wrapping\n\t// `CnDashboardPage` adds visible nesting on top of the custom view.\n\t// Counts widgets across ALL slots (a sidebar widget makes it\n\t// multi-widget). Every key the library renders itself is exempt —\n\t// those are legitimate full-page library widgets. The exempt set is\n\t// `LIBRARY_WIDGET_KEYS` (utils/libraryWidgetKeys.js), deliberately\n\t// not restated here: a second copy of a list is how the first one\n\t// went stale.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'dashboard') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!Array.isArray(page.widgets) || page.widgets.length !== 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst widget = page.widgets[0]\n\t\t\tif (!widget) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Normalise omitted grid coords against the body-slot defaults\n\t\t\t// (gridX/Y → 0, gridWidth/Height → 12) so authors cannot\n\t\t\t// circumvent the rule by omitting fields. Required-field\n\t\t\t// validation upstream means this is mostly defensive, but\n\t\t\t// keeps the rule correct under future schema relaxations.\n\t\t\tconst slot = widget.slot\n\t\t\tconst gx = typeof widget.gridX === 'number' ? widget.gridX : 0\n\t\t\tconst gy = typeof widget.gridY === 'number' ? widget.gridY : 0\n\t\t\tconst gw = typeof widget.gridWidth === 'number' ? widget.gridWidth : 12\n\t\t\tconst gh = typeof widget.gridHeight === 'number' ? widget.gridHeight : 12\n\t\t\tif (slot !== 'body' || gx !== 0 || gy !== 0 || gw !== 12 || gh !== 12) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst widgetKey = typeof widget.widgetKey === 'string' ? widget.widgetKey : ''\n\t\t\tif (!widgetKey || LIBRARY_BUILT_IN_WIDGET_KEYS.has(widgetKey)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' ? page.id : `[${pIndex}]`\n\t\t\terrors.push(`pages[${pageId}]/widgets[0]: pages[${pageId}] is type:\"dashboard\" with a single 12×12 custom widget — this is always a custom page in disguise.\\n`\n\t\t\t\t+ 'Valid alternatives:\\n'\n\t\t\t\t+ ` (a) declare as type:\"custom\" with component:\"${widgetKey}\" and register the component with kind:\"page\"\\n`\n\t\t\t\t+ ' (b) split into N>1 widgets if this is genuinely a multi-widget dashboard\\n'\n\t\t\t\t+ 'See ADR-036 Decision 1 (single-widget dashboard anti-pattern).')\n\t\t})\n\t}\n\n\t// 3a. Optional widget-id uniqueness within a page. The id is the delta\n\t// merge key, so duplicates would make a patch ambiguous.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst seen = new Set()\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || typeof widget.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (seen.has(widget.id)) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]/id: \"${widget.id}\" must be unique within the page's widgets[]`)\n\t\t\t\t} else {\n\t\t\t\t\tseen.add(widget.id)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3b. Delta-only artefacts must not appear in a full (non-delta) manifest.\n\t// $op / __order are markers consumed by mergeManifestDelta; their\n\t// presence means a delta was loaded as a manifest. (props subtrees\n\t// are free-form user data and are not scanned.)\n\t(function walkReserved(node, path) {\n\t\tif (Array.isArray(node)) {\n\t\t\tnode.forEach((v, i) => walkReserved(v, `${path}[${i}]`))\n\t\t\treturn\n\t\t}\n\t\tif (!isPlainObject(node)) {\n\t\t\treturn\n\t\t}\n\t\tfor (const k of Object.keys(node)) {\n\t\t\tif (k === '$op' || k === '__order') {\n\t\t\t\terrors.push(`${path || ''}/${k}: reserved delta marker \"${k}\" is not allowed in a manifest (only inside a delta payload consumed by mergeManifestDelta)`)\n\t\t\t}\n\t\t\tif (k === 'props') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\twalkReserved(node[k], `${path}/${k}`)\n\t\t}\n\t})(clone, '')\n\n\t// 3c. Optional per-page config.slotColumns override shape (slot →\n\t// positive integer). A wrong shape silently falls back to defaults\n\t// at render time, so flag it here.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tconst sc = isPlainObject(page && page.config) ? page.config.slotColumns : undefined\n\t\t\tif (sc === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!isPlainObject(sc)) {\n\t\t\t\terrors.push(`pages[${pIndex}]/config/slotColumns: must be an object mapping slot name to a positive integer`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor (const [slotName, value] of Object.entries(sc)) {\n\t\t\t\tif (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/config/slotColumns/${slotName}: must be a positive integer`)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 3d. stats-block dataSource | entries mutual exclusion. A multi-entry\n\t// stats-block (`props.entries[]`) declares one source PER entry, so a\n\t// widget-level `dataSource` (entry-level or `props.dataSource`) at the\n\t// same time is ambiguous — exactly one of the two forms is allowed.\n\t// Cross-field rule → post-schema check (clear message), matching the\n\t// gridX+gridWidth precedent. A stats-block with NEITHER is left to the\n\t// component (CnStatsBlockWidget flags it at mount time) because the\n\t// in-app widget editor legitimately creates not-yet-configured widgets.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || widget.widgetKey !== 'stats-block') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst props = isPlainObject(widget.props) ? widget.props : {}\n\t\t\t\tconst hasEntries = Array.isArray(props.entries) && props.entries.length > 0\n\t\t\t\tconst hasDataSource = (widget.dataSource !== undefined && widget.dataSource !== null)\n\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\tif (hasEntries && hasDataSource) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: stats-block widget declares BOTH a dataSource and props.entries[] — exactly one of the two source forms is allowed (single-KPI dataSource OR multi-entry entries[])`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3e. endpointSource mutual exclusion (Wave 2, nextcloud-vue#91). Every\n\t// endpoint-capable widget binds to exactly ONE data source: the stat /\n\t// delta KPI tiles to `content.source` OR `content.endpointSource`, the\n\t// chart to `dataSource` OR `props.endpointSource`, the object-table to\n\t// `props.source` OR `props.endpointSource`. Cross-field rule →\n\t// post-schema check (clear message), matching the stats-block 3d\n\t// precedent. An OpenRegister source only counts when it is MEANINGFULLY\n\t// configured (register+schema, an endpoint kind, or a url) — the\n\t// in-app widget editor seeds stat/delta content with an EMPTY\n\t// `source: { register: '', schema: '', … }` blob, which must not trip\n\t// the rule when an endpointSource is added. Covers BOTH placements:\n\t// the v2 pages[].widgets[] grid (content under props.content) and the\n\t// legacy pages[].config.widgets[] dashboard catalog (content under\n\t// widget.content, chart inputs under widget.props).\n\tconst _hasConfiguredOrSource = (source) => isPlainObject(source) && (\n\t\t(typeof source.register === 'string' && source.register !== ''\n\t\t\t&& typeof source.schema === 'string' && source.schema !== '')\n\t\t|| source.kind === 'endpoint'\n\t\t|| typeof source.url === 'string'\n\t)\n\tconst _hasEndpointSource = (es) => isPlainObject(es)\n\t// Shared with the v1 path — see `validateChartBaseline`.\n\tconst _checkChartBaseline = (bag, path) => validateChartBaseline(bag, path, errors)\n\tconst _checkKpiContent = (content, path) => {\n\t\tif (!isPlainObject(content)) {\n\t\t\treturn\n\t\t}\n\t\tif (_hasConfiguredOrSource(content.source) && _hasEndpointSource(content.endpointSource)) {\n\t\t\terrors.push(`${path}: widget content declares BOTH a source and an endpointSource — exactly one of the two data bindings is allowed (OpenRegister source OR endpointSource)`)\n\t\t}\n\t}\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// v2 grid placement: pages[].widgets[]\n\t\t\tif (Array.isArray(page.widgets)) {\n\t\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\t\tif (!widget) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst props = isPlainObject(widget.props) ? widget.props : {}\n\t\t\t\t\tif (widget.widgetKey === 'stat' || widget.widgetKey === 'delta') {\n\t\t\t\t\t\t_checkKpiContent(props.content, `pages[${pIndex}]/widgets[${wIndex}]`)\n\t\t\t\t\t}\n\t\t\t\t\tif (widget.widgetKey === 'chart') {\n\t\t\t\t\t\tconst hasDataSource = (widget.dataSource !== undefined && widget.dataSource !== null)\n\t\t\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\t\t\tif (hasDataSource && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: chart widget declares BOTH a dataSource and props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Both bags, in the same precedence CnDashboardPage's\n\t\t\t\t\t\t// getChartProps reads them: `content` (in-app editor) then `props`.\n\t\t\t\t\t\t_checkChartBaseline(props.content, `pages[${pIndex}]/widgets[${wIndex}]/props/content`)\n\t\t\t\t\t\t_checkChartBaseline(props, `pages[${pIndex}]/widgets[${wIndex}]/props`)\n\t\t\t\t\t}\n\t\t\t\t\tif (widget.widgetKey === 'object-table') {\n\t\t\t\t\t\tif (_hasConfiguredOrSource(props.source) && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: object-table widget declares BOTH a props.source and a props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\t// Legacy dashboard catalog placement: pages[].config.widgets[]\n\t\t\tconst legacy = page.config && Array.isArray(page.config.widgets) ? page.config.widgets : null\n\t\t\tif (legacy) {\n\t\t\t\tlegacy.forEach((def, wIndex) => {\n\t\t\t\t\tif (!def) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (def.type === 'stat' || def.type === 'delta') {\n\t\t\t\t\t\t_checkKpiContent(def.content, `pages[${pIndex}]/config/widgets[${wIndex}]`)\n\t\t\t\t\t}\n\t\t\t\t\tif (def.type === 'chart') {\n\t\t\t\t\t\tconst props = isPlainObject(def.props) ? def.props : {}\n\t\t\t\t\t\tconst hasDataSource = (def.dataSource !== undefined && def.dataSource !== null)\n\t\t\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\t\t\tif (hasDataSource && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/config/widgets[${wIndex}]: chart widget declares BOTH a dataSource and props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_checkChartBaseline(def.content, `pages[${pIndex}]/config/widgets[${wIndex}]/content`)\n\t\t\t\t\t\t_checkChartBaseline(props, `pages[${pIndex}]/config/widgets[${wIndex}]/props`)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t// 4. @resolve: sentinel rejection on registry-key paths\n\tconst _v2Sentinel = /^@resolve:[a-z][a-z0-9_-]*$/\n\tif (typeof clone.version === 'string' && _v2Sentinel.test(clone.version)) {\n\t\terrors.push('/version must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)')\n\t}\n\tif (Array.isArray(clone.dependencies)) {\n\t\tclone.dependencies.forEach((dep, index) => {\n\t\t\t// String (HARD) or { id, required?, name? } (required:false = SOFT).\n\t\t\tconst id = typeof dep === 'string' ? dep : (dep && typeof dep === 'object' ? dep.id : null)\n\t\t\tif (typeof id === 'string' && _v2Sentinel.test(id)) {\n\t\t\t\terrors.push(`/dependencies/${index} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t})\n\t}\n\tif (Array.isArray(clone.menu)) {\n\t\tclone.menu.forEach((item, index) => {\n\t\t\tif (!item) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof item.id === 'string' && _v2Sentinel.test(item.id)) {\n\t\t\t\terrors.push(`/menu/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof item.route === 'string' && _v2Sentinel.test(item.route)) {\n\t\t\t\terrors.push(`/menu/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t})\n\t}\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (!page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst _isS = (v) => typeof v === 'string' && _v2Sentinel.test(v)\n\t\t\tif (_isS(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.route)) {\n\t\t\t\terrors.push(`/pages/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.component)) {\n\t\t\t\terrors.push(`/pages/${index}/component must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.headerComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/headerComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.actionsComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/actionsComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.slots && typeof page.slots === 'object') {\n\t\t\t\tfor (const [slotName, slotValue] of Object.entries(page.slots)) {\n\t\t\t\t\tif (_isS(slotValue)) {\n\t\t\t\t\t\terrors.push(`/pages/${index}/slots/${slotName} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 5. Detail `config.sidebarTabs[]` SHAPE validation (id/label\n\t// presence + id uniqueness) the JSON schema can't fully express.\n\t// Only fires when `sidebarTabs` is present — in v2 it usually\n\t// is NOT: the `liftSidebarTabWidgets` migration strips it,\n\t// lifting each tab's widgets to `slot:\"sidebar\"` + a\n\t// self-declaring `tabGroup`. So the v1 `tabGroup → sidebarTabs[].id`\n\t// cross-reference is deliberately NOT run for v2 — an\n\t// undeclared `tabGroup` is the designed post-lift state, not an\n\t// orphan. (Wiki register/schema is likewise not enforced — wiki\n\t// content comes from the xwiki leaf integration; see\n\t// ConductionNL/nextcloud-vue#445.)\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (!page || page.type !== 'detail') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cfg = isPlainObject(page.config) ? page.config : null\n\t\t\tconst pathSlash = `/pages/${index}/config`\n\t\t\tconst pathBracket = `pages[${index}].config`\n\t\t\tvalidateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors)\n\t\t})\n\t}\n\n\t// 6. Dashboard custom-widget slot wiring (CnDashboardPage /\n\t// CnPageRenderer). A `type:\"dashboard\"` page wires each\n\t// `type:\"custom\"` widget in `config.widgets[]` to a registry\n\t// component through the PAGE-TOP-LEVEL `slots` map\n\t// (`{ \"widget-<id>\": \"<ComponentName>\" }`), which CnPageRenderer\n\t// reads as `page.slots` and turns into the `#widget-<id>` scoped\n\t// slots CnDashboardPage consumes. Two ways to get this wrong — both\n\t// pass JSON-schema validation (config is additionalProperties:true)\n\t// yet render every affected widget as the `unavailableLabel`\n\t// (\"Widget not available\") at runtime:\n\t// (a) the slots map nested under `config` (config.slots) — never\n\t// read by the renderer; must be a sibling of `config`.\n\t// (b) a custom widget with no slots entry at all.\n\t// Built-in widget types (stats-block, chart, tile, integration, …)\n\t// render via their own paths and need no slots entry, so only\n\t// `type:\"custom\"` is checked. Observed 2026-06-13 on\n\t// decidesk-dashboard-v2-layout: the slots map shipped under config,\n\t// so 9 of 11 widgets rendered the unavailable placeholder while\n\t// gate-22 (schema-only) reported the manifest clean.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'dashboard') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst config = isPlainObject(page.config) ? page.config : null\n\t\t\tif (!config || !Array.isArray(config.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' ? page.id : `[${pIndex}]`\n\t\t\tconst topSlots = isPlainObject(page.slots) ? page.slots : {}\n\t\t\tconst configSlots = isPlainObject(config.slots) ? config.slots : null\n\n\t\t\t// (a) slots map misplaced under config\n\t\t\tif (configSlots) {\n\t\t\t\terrors.push(`pages[${pageId}]/config/slots: the dashboard widget slots map must be at the page top level (pages[${pIndex}]/slots, a sibling of \"config\"), not under \"config\". `\n\t\t\t\t\t+ 'CnPageRenderer reads page.slots; a slots map under config is never wired, so every custom widget renders the unavailable placeholder. '\n\t\t\t\t\t+ 'Move \"slots\" up one level to sit beside \"config\".')\n\t\t\t}\n\n\t\t\t// (b) each custom widget needs a top-level slots entry\n\t\t\tconfig.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || widget.type !== 'custom') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst id = typeof widget.id === 'string' ? widget.id : null\n\t\t\t\tif (!id) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst slotKey = `widget-${id}`\n\t\t\t\tconst wiredTop = typeof topSlots[slotKey] === 'string' && topSlots[slotKey].length > 0\n\t\t\t\t// If it is (only) under config.slots, (a) already named the\n\t\t\t\t// real fix — don't double-report the same widget.\n\t\t\t\tconst underConfig = configSlots && typeof configSlots[slotKey] === 'string'\n\t\t\t\tif (!wiredTop && !underConfig) {\n\t\t\t\t\terrors.push(`pages[${pageId}]/config/widgets[${wIndex}]: custom widget \"${id}\" has no slot-component mapping at pages[${pIndex}]/slots[\"${slotKey}\"]. `\n\t\t\t\t\t\t+ `It will render the unavailable placeholder. Add \"${slotKey}\": \"<ComponentName>\" to the page-top-level slots map, or use a built-in widget type.`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 7. Form logic (manifest-form-logic): cross-shape rules over\n\t// `type: \"form\"` pages' `config.steps[]` / `config.fields[].visibleWhen`\n\t// / `config.fields[].validation` that JSON Schema cannot express —\n\t// step id uniqueness, step→field key reference integrity, complete\n\t// step/field partition, min<=max, pattern compilability,\n\t// type-inapplicable rules, and LOCAL visibleWhen field-ref resolution.\n\t// The v2 path does not call validateTypeConfig(); the v1 `form`\n\t// branch is untouched.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'form') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst config = isPlainObject(page.config) ? page.config : null\n\t\t\tif (!config) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pathBase = `/pages/${pIndex}/config`\n\n\t\t\tconst fieldList = Array.isArray(config.fields) ? config.fields : []\n\t\t\tconst declaredKeys = new Set(fieldList\n\t\t\t\t.filter((f) => f && typeof f.key === 'string')\n\t\t\t\t.map((f) => f.key))\n\t\t\t// steps[] cross-shape rules\n\t\t\tif (Array.isArray(config.steps)) {\n\t\t\t\tconst seenStepIds = new Set()\n\t\t\t\tconst assignmentCount = new Map()\n\t\t\t\tconfig.steps.forEach((step, sIndex) => {\n\t\t\t\t\tif (!step) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof step.id === 'string') {\n\t\t\t\t\t\tif (seenStepIds.has(step.id)) {\n\t\t\t\t\t\t\terrors.push(`${pathBase}/steps[${sIndex}]/id: duplicate step id \"${step.id}\" — step ids must be unique within the page`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tseenStepIds.add(step.id)\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(step.fields)) {\n\t\t\t\t\t\tstep.fields.forEach((key, fIndex) => {\n\t\t\t\t\t\t\tif (typeof key !== 'string' || !declaredKeys.has(key)) {\n\t\t\t\t\t\t\t\terrors.push(`${pathBase}/steps[${sIndex}]/fields[${fIndex}]: \"${key}\" does not match any declared config.fields[].key`)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tassignmentCount.set(key, (assignmentCount.get(key) || 0) + 1)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Complete partition: every declared field key MUST appear in\n\t\t\t\t// exactly one step.\n\t\t\t\tconst unassigned = []\n\t\t\t\tconst duplicated = []\n\t\t\t\tdeclaredKeys.forEach((key) => {\n\t\t\t\t\tconst count = assignmentCount.get(key) || 0\n\t\t\t\t\tif (count === 0) {\n\t\t\t\t\t\tunassigned.push(key)\n\t\t\t\t\t} else if (count > 1) {\n\t\t\t\t\t\tduplicated.push(key)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (unassigned.length > 0) {\n\t\t\t\t\terrors.push(`${pathBase}/steps: field key(s) ${unassigned.map((k) => `\"${k}\"`).join(', ')} are not assigned to any step — every declared field must appear in exactly one step when steps is present`)\n\t\t\t\t}\n\t\t\t\tif (duplicated.length > 0) {\n\t\t\t\t\terrors.push(`${pathBase}/steps: field key(s) ${duplicated.map((k) => `\"${k}\"`).join(', ')} are assigned to more than one step — every declared field must appear in exactly one step`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fields[].validation / fields[].visibleWhen cross-shape rules\n\t\t\tfieldList.forEach((field, fIndex) => {\n\t\t\t\tif (!field || typeof field !== 'object') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst fieldPath = `${pathBase}/fields[${fIndex}]`\n\t\t\t\tconst fieldType = field.type\n\n\t\t\t\tconst validation = isPlainObject(field.validation) ? field.validation : null\n\t\t\t\tif (validation) {\n\t\t\t\t\tif (typeof validation.min === 'number' && typeof validation.max === 'number' && validation.min > validation.max) {\n\t\t\t\t\t\terrors.push(`${fieldPath}/validation: min (${validation.min}) must be <= max (${validation.max})`)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof validation.pattern === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnew RegExp(validation.pattern)\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/pattern: \"${validation.pattern}\" does not compile as a regular expression (${e.message})`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fieldType !== 'string' && fieldType !== 'password') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/pattern: pattern only applies to string/password fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst boundsApplicable = fieldType === 'string' || fieldType === 'password' || fieldType === 'number'\n\t\t\t\t\tif (!boundsApplicable) {\n\t\t\t\t\t\tif (typeof validation.min === 'number') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/min: min only applies to string/password/number fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof validation.max === 'number') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/max: max only applies to string/password/number fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst visibleWhen = isPlainObject(field.visibleWhen) ? field.visibleWhen : null\n\t\t\t\tif (visibleWhen && !visibleWhen.endpoint && !visibleWhen.source && typeof visibleWhen.field === 'string') {\n\t\t\t\t\tconst firstSegment = visibleWhen.field.split('.')[0]\n\t\t\t\t\tif (!declaredKeys.has(firstSegment)) {\n\t\t\t\t\t\terrors.push(`${fieldPath}/visibleWhen/field: \"${firstSegment}\" does not match any declared config.fields[].key`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// N. A files browser's `columns` may name a built-in or declare its own.\n\t// A string naming no built-in is refused here, with the page and the\n\t// name in the message: dropping it silently would look like a column\n\t// that failed to load rather than a name that does not exist.\n\tif (Array.isArray(clone.pages)) {\n\t\tconst builtIns = Object.keys(BUILT_IN_FILE_COLUMNS)\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'files' || !isPlainObject(page.config) || !Array.isArray(page.config.columns)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' && page.id !== '' ? page.id : `pages[${pIndex}]`\n\t\t\tpage.config.columns.forEach((entry, cIndex) => {\n\t\t\t\tconst at = `pages[${pIndex}]/config/columns/${cIndex}`\n\t\t\t\tif (typeof entry === 'string') {\n\t\t\t\t\tif (!builtIns.includes(entry)) {\n\t\t\t\t\t\terrors.push(`${at}: \"${pageId}\" names no built-in column \"${entry}\". The built-ins are ${builtIns.join(', ')}; declare an object with key, label and source for anything else`)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!isPlainObject(entry) || typeof entry.key !== 'string' || entry.key === '') {\n\t\t\t\t\terrors.push(`${at}: \"${pageId}\" has a column that is neither a built-in name nor an object with a key`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (entry.source !== undefined && !['node', 'attribute', 'row'].includes(entry.source)) {\n\t\t\t\t\terrors.push(`${at}/source: \"${pageId}\" column \"${entry.key}\" has source \"${entry.source}\"; it must be node, attribute or row`)\n\t\t\t\t}\n\t\t\t\tif (entry.source === 'attribute' && (typeof entry.attribute !== 'string' || entry.attribute === '')) {\n\t\t\t\t\terrors.push(`${at}/attribute: \"${pageId}\" column \"${entry.key}\" reads a DAV property but names none`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// N. A `folderSidebar` scope may narrow and reorder the page's columns, not\n\t// add to them. `config.columns` is the page's declaration of which\n\t// columns it HAS; a scope entry decides which of them it shows. So a\n\t// scope naming a key the page does not declare is refused here, rather\n\t// than silently dropped at render time — a scope written before a column\n\t// was taken out of the page would otherwise look like it still worked.\n\t// A page declaring no columns derives them from its schema at runtime,\n\t// which this validator cannot see, so there is nothing to measure a\n\t// scope against and the check stays silent instead of guessing.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tconst config = page && isPlainObject(page.config) ? page.config : null\n\t\t\tconst sidebar = config && isPlainObject(config.folderSidebar) ? config.folderSidebar : null\n\t\t\tif (!sidebar || !Array.isArray(sidebar.folders) || !Array.isArray(config.columns) || config.columns.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst declaredKeyList = config.columns\n\t\t\t\t.map((col) => (typeof col === 'string' ? col : (col && typeof col.key === 'string' ? col.key : '')))\n\t\t\t\t.filter((key) => key !== '')\n\t\t\tconst declared = new Set(declaredKeyList)\n\t\t\tsidebar.folders.forEach((scope, sIndex) => {\n\t\t\t\tif (!isPlainObject(scope) || !Array.isArray(scope.columns)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst scopeId = typeof scope.id === 'string' && scope.id !== '' ? scope.id : `folders[${sIndex}]`\n\t\t\t\tscope.columns.forEach((col, cIndex) => {\n\t\t\t\t\tconst key = typeof col === 'string' ? col : (col && typeof col.key === 'string' ? col.key : '')\n\t\t\t\t\tif (key !== '' && !declared.has(key)) {\n\t\t\t\t\t\terrors.push(`pages[${pIndex}]/config/folderSidebar/folders/${sIndex}/columns/${cIndex}: scope \"${scopeId}\" names column \"${key}\", which pages[${pIndex}].config.columns does not declare`)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\treturn { valid: errors.length === 0, errors }\n}\n\n/**\n * Pattern matching the `manifest-resolve-sentinel` capability's\n * sentinel — `@resolve:<key>` where `<key>` is lowercase alphanumeric\n * with `_` / `-` separators. The full string IS the sentinel; partial\n * substitution like `prefix-@resolve:foo` is NOT supported and is left\n * as a plain string for downstream renderers.\n *\n * Build-time validation accepts this pattern as a valid `string` for\n * any `string`-typed field UNDER `pages[].config`, regardless of any\n * narrower per-field constraint. Other paths reject it explicitly.\n */\nconst SENTINEL_PATTERN = /^@resolve:[a-z][a-z0-9_-]*$/\n\n/**\n * Test whether a string is a manifest `@resolve:` sentinel.\n *\n * @param {unknown} value Candidate value.\n * @return {boolean} True when the value is a fully-matched sentinel.\n */\nfunction isSentinel(value) {\n\treturn typeof value === 'string' && SENTINEL_PATTERN.test(value)\n}\n\n/**\n * Validate a manifest object against the manifest JSON Schema.\n *\n * Hand-rolled minimal validator covering the rules required by\n * REQ-JMR-001 of the json-manifest-renderer spec:\n * - Top-level `version`, `menu`, `pages` are required.\n * - `version` matches the semver pattern.\n * - `pages[].type` is a non-empty string. Whether the type resolves\n * to a real component is checked by CnPageRenderer at render time\n * against the consumer-resolved `pageTypes` map; the validator\n * cannot enforce that without knowing the runtime registry.\n * - `pages[].id` is unique across the array.\n * - Required fields on menu items and pages are present.\n * - `dependencies` (when present) is an array of strings.\n * - `pages[].component` is required when `type` is \"custom\".\n * - Per-type `config` shape rules for the built-in types `logs`,\n * `settings`, `chat`, `files` (REQ from manifest-page-type-extensions).\n * - The `manifest-resolve-sentinel` sentinel `@resolve:<key>` is\n * permissively accepted under `pages[].config.*` and explicitly\n * REJECTED in `version`, `dependencies[]`, `menu[].route`,\n * `menu[].id`, `pages[].id`, `pages[].route`, `pages[].component`,\n * `pages[].headerComponent`, `pages[].actionsComponent`,\n * `pages[].slots.*` — those are router invariants or registry\n * keys.\n *\n * The richer schema constraints (`additionalProperties: false`, `format`\n * URI, etc.) are enforced by the BE / hydra CI validators that consume\n * the same schema file with Ajv. The FE validator is intentionally\n * narrow so a FE-only failure produces tight, actionable messages.\n *\n * @param {object} manifest The manifest object to validate.\n * @param {object} [options] Optional validation options.\n * @param {Array<string>} [options.allowedTypes] When provided, restrict\n * the allowed `pages[].type` values to this list (plus `\"custom\"`).\n * Useful in CI / build-time checks where the consumer's full\n * `pageTypes` registry is known up-front. When omitted, any\n * non-empty string is accepted; the runtime renderer logs a warning\n * for unknown types.\n * @return {{ valid: boolean, errors: string[] }}\n */\nexport function validateManifest(manifest, options = {}) {\n\t// Dispatch to v2 validator when the manifest declares a v2 $schema.\n\tif (manifest && typeof manifest === 'object' && typeof manifest.$schema === 'string') {\n\t\tif (manifest.$schema.endsWith(V2_SCHEMA_SUFFIX)) {\n\t\t\treturn validateManifestV2(manifest)\n\t\t}\n\t\t// $schema present but doesn't match any known schema URL —\n\t\t// warn once and fall through to v1 validator.\n\t\tconst knownV1Suffix = '/app-manifest.schema.json'\n\t\tif (!manifest.$schema.endsWith(knownV1Suffix)) {\n\t\t\tif (!_unknownSchemaWarned) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`[validateManifest] Unknown $schema URL \"${manifest.$schema}\". `\n\t\t\t\t\t+ 'Expected one of: app-manifest.schema.json (v1) or app-manifest-v2.schema.json (v2). '\n\t\t\t\t\t+ 'Falling back to v1 validator.')\n\t\t\t\t_unknownSchemaWarned = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst errors = []\n\n\tif (!isPlainObject(manifest)) {\n\t\treturn { valid: false, errors: ['manifest must be an object'] }\n\t}\n\n\tconst versionPattern = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\n\n\tif (typeof manifest.version !== 'string') {\n\t\terrors.push('/version must be a string')\n\t} else if (isSentinel(manifest.version)) {\n\t\t// `manifest-resolve-sentinel` REQ-MRS-004: sentinel is a router /\n\t\t// registry invariant violation when used here.\n\t\terrors.push(`/version \"${manifest.version}\" must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t} else if (!versionPattern.test(manifest.version)) {\n\t\terrors.push(`/version \"${manifest.version}\" must match semver pattern`)\n\t}\n\n\tif (!Array.isArray(manifest.menu)) {\n\t\terrors.push('/menu must be an array')\n\t} else {\n\t\tmanifest.menu.forEach((item, index) => {\n\t\t\tif (!isPlainObject(item)) {\n\t\t\t\terrors.push(`/menu/${index} must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof item.id !== 'string') {\n\t\t\t\terrors.push(`/menu/${index}/id must be a string`)\n\t\t\t} else if (isSentinel(item.id)) {\n\t\t\t\terrors.push(`/menu/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof item.label !== 'string') {\n\t\t\t\terrors.push(`/menu/${index}/label must be a string`)\n\t\t\t}\n\t\t\tif (item.route !== undefined && isSentinel(item.route)) {\n\t\t\t\terrors.push(`/menu/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (item.children !== undefined && !Array.isArray(item.children)) {\n\t\t\t\terrors.push(`/menu/${index}/children must be an array`)\n\t\t\t}\n\t\t\tvalidateMenuAction(item, `/menu/${index}`, errors)\n\t\t\t// `visibleIf` validation — when set, must be a plain object;\n\t\t\t// the only known sub-key is `appInstalled` (non-empty string).\n\t\t\tvalidateMenuItemVisibleIf(item.visibleIf, `/menu/${index}/visibleIf`, errors)\n\t\t\t// Also validate visibleIf and action on children when present.\n\t\t\tif (Array.isArray(item.children)) {\n\t\t\t\titem.children.forEach((child, cIndex) => {\n\t\t\t\t\tif (isPlainObject(child)) {\n\t\t\t\t\t\tvalidateMenuAction(child, `/menu/${index}/children/${cIndex}`, errors)\n\t\t\t\t\t\tvalidateMenuItemVisibleIf(\n\t\t\t\t\t\t\tchild.visibleIf,\n\t\t\t\t\t\t\t`/menu/${index}/children/${cIndex}/visibleIf`,\n\t\t\t\t\t\t\terrors,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t// `runtime` is optional; when present it MUST be a plain object.\n\t// The validator does not constrain its shape beyond that — the\n\t// contract lives in the schema description and the OR backend.\n\tif (manifest.runtime !== undefined && !isPlainObject(manifest.runtime)) {\n\t\terrors.push('/runtime must be an object when set')\n\t}\n\n\tconst allowedTypes = Array.isArray(options.allowedTypes)\n\t\t? Array.from(new Set([...options.allowedTypes, 'custom']))\n\t\t: null\n\n\tif (!Array.isArray(manifest.pages)) {\n\t\terrors.push('/pages must be an array')\n\t} else {\n\t\tconst seenIds = new Set()\n\t\tmanifest.pages.forEach((page, index) => {\n\t\t\tif (!isPlainObject(page)) {\n\t\t\t\terrors.push(`/pages/${index} must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof page.id !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/id must be a string`)\n\t\t\t} else if (isSentinel(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t} else if (seenIds.has(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id \"${page.id}\" must be unique within pages[]`)\n\t\t\t} else {\n\t\t\t\tseenIds.add(page.id)\n\t\t\t}\n\t\t\tif (typeof page.route !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/route must be a string`)\n\t\t\t} else if (isSentinel(page.route)) {\n\t\t\t\terrors.push(`/pages/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof page.title !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/title must be a string`)\n\t\t\t}\n\t\t\tif (typeof page.type !== 'string' || page.type.length === 0) {\n\t\t\t\terrors.push(`/pages/${index}/type must be a non-empty string`)\n\t\t\t} else if (allowedTypes && !allowedTypes.includes(page.type)) {\n\t\t\t\terrors.push(`/pages/${index}/type \"${page.type}\" must be one of: ${allowedTypes.join(', ')}`)\n\t\t\t}\n\t\t\tif (page.type === 'custom' && typeof page.component !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/component is required when type is \"custom\"`)\n\t\t\t}\n\t\t\t// `manifest-resolve-sentinel` REQ-MRS-004: registry-key\n\t\t\t// fields cannot be dynamic — they resolve at module-load\n\t\t\t// time against `customComponents`, before the loader runs.\n\t\t\tif (page.component !== undefined && isSentinel(page.component)) {\n\t\t\t\terrors.push(`/pages/${index}/component must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.headerComponent !== undefined && isSentinel(page.headerComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/headerComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.actionsComponent !== undefined && isSentinel(page.actionsComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/actionsComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (isPlainObject(page.slots)) {\n\t\t\t\tfor (const [slotName, slotValue] of Object.entries(page.slots)) {\n\t\t\t\t\tif (isSentinel(slotValue)) {\n\t\t\t\t\t\terrors.push(`/pages/${index}/slots/${slotName} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `sidebarComponent` (per-page named-view sidebar swap) MUST\n\t\t\t// be a non-empty string when set. Free-form otherwise — the\n\t\t\t// registry-membership check is a runtime concern handled by\n\t\t\t// CnPageRenderer (console.warn + fall-through). See\n\t\t\t// manifest-named-view-sidebar spec REQ-MNVS-1.\n\t\t\tif (page.sidebarComponent !== undefined) {\n\t\t\t\tif (typeof page.sidebarComponent !== 'string' || page.sidebarComponent.length === 0) {\n\t\t\t\t\terrors.push(`/pages/${index}/sidebarComponent must be a non-empty string`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Per-type config-shape validation for built-in extended types.\n\t\t\t// (`manifest-page-type-extensions` spec — covers logs/settings/chat/files;\n\t\t\t// `manifest-map-widget` spec adds `map`.)\n\t\t\tvalidateTypeConfig(page, index, errors)\n\n\t\t\t// Manifest-driven sidebar config — additive validation\n\t\t\t// (`manifest-abstract-sidebar` spec — covers index sidebar + detail sidebar tabs).\n\t\t\tvalidateSidebarConfig(page, index, errors)\n\n\t\t\t// Per-page top-level sidebar visibility flag — additive validation\n\t\t\t// (`manifest-detail-sidebar-config` spec — sibling of config,\n\t\t\t// applies to every page type).\n\t\t\tvalidatePageSidebar(page, index, errors)\n\n\t\t\t// Per-page soft-dependency gate. Validated rather than ignored\n\t\t\t// because a typo here fails OPEN: an unrecognised key is simply\n\t\t\t// not read, the gate never fires, and the page renders an empty\n\t\t\t// list that looks like \"no data\" instead of \"install the app\".\n\t\t\tvalidatePageRequiresApp(page, index, errors)\n\t\t})\n\t}\n\n\tif (manifest.dependencies !== undefined) {\n\t\tif (!Array.isArray(manifest.dependencies)) {\n\t\t\terrors.push('/dependencies must be an array of strings or { id, required?, name? } objects')\n\t\t} else {\n\t\t\tmanifest.dependencies.forEach((dep, index) => {\n\t\t\t\t// HARD/SOFT dependency model: an entry is either a string\n\t\t\t\t// (HARD) or an object { id, required?, name? } (required:false\n\t\t\t\t// = SOFT). See REQ-DIA-4.\n\t\t\t\tif (typeof dep === 'string') {\n\t\t\t\t\tif (isSentinel(dep)) {\n\t\t\t\t\t\terrors.push(`/dependencies/${index} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t} else if (dep && typeof dep === 'object' && !Array.isArray(dep)) {\n\t\t\t\t\tif (typeof dep.id !== 'string' || dep.id === '') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/id must be a non-empty string`)\n\t\t\t\t\t} else if (isSentinel(dep.id)) {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t\tif (dep.required !== undefined && typeof dep.required !== 'boolean') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/required must be a boolean`)\n\t\t\t\t\t}\n\t\t\t\t\tif (dep.name !== undefined && typeof dep.name !== 'string') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/name must be a string`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(`/dependencies/${index} must be a string or a { id, required?, name? } object`)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors }\n}\n\nfunction isPlainObject(value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n// The accepted `type` values for `fields[]` entries: the settings-page set,\n// and the form-page set, which also accepts `file` (see validateFieldsArray).\nconst FORM_FIELD_TYPES = ['boolean', 'number', 'string', 'enum', 'password', 'json']\nconst FORM_PAGE_FIELD_TYPES = [...FORM_FIELD_TYPES, 'file']\n\n/**\n * Validate a page's `config` object against per-type rules for the\n * built-in extended types: `logs`, `settings`, `chat`, `files`, `map`.\n *\n * Skips silently for any other type (including the original\n * `index | detail | dashboard | custom`) — those have free-form\n * `config` and are validated by their target component at runtime.\n *\n * Errors include both the JSON-path style (`/pages/N/config/...`) and\n * the bracket-style hint (`pages[N].config: ...`) from the\n * manifest-page-type-extensions spec scenarios so consumers searching\n * for either form find the message.\n *\n * @param {object} page The page entry being validated.\n * @param {number} index The page's index in `pages[]`.\n * @param {string[]} errors The error array to push to (mutated).\n */\nfunction validateTypeConfig(page, index, errors) {\n\tif (!page || typeof page.type !== 'string') {\n\t\treturn\n\t}\n\tconst cfg = isPlainObject(page.config) ? page.config : null\n\tconst pathBracket = `pages[${index}].config`\n\tconst pathSlash = `/pages/${index}/config`\n\n\tswitch (page.type) {\n\t\tcase 'index': {\n\t\t// `manifest-config-refs` REQ-MCR — surface column / action shape\n\t\t// errors with sharp messages so consumers can locate the offending\n\t\t// field. Both arrays are OPTIONAL; only validated when present.\n\t\t\tvalidateColumnsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateActionsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\t// `manifest-index-action-toggles` — typed config.actions block.\n\t\t\t// Schema-validated, but cross-check structure here for sharp\n\t\t\t// error paths (consumer typo in actions.<key> surfaces with\n\t\t\t// the path rather than a JSON Schema enum mismatch).\n\t\t\tvalidateIndexActionToggles(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'detail': {\n\t\t// `manifest-detail-sidebartabs` — typed validation for the\n\t\t// human-authored sidebar-tab declaration. Tab entries lift to\n\t\t// `widgets[]` with `slot:\"sidebar\"` + `tabGroup` via the CLI\n\t\t// transform; this validator catches authoring mistakes (missing\n\t\t// id/label, duplicate ids, non-array shape) before that.\n\t\t\tvalidateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateSidebarTabGroupRefs(page, index, errors)\n\t\t\t// `manifest-public-mode` — type='detail' supports the same\n\t\t\t// mode enum (`edit | create | public`) as type='form'. The\n\t\t\t// 'public' value marks unauthenticated token-scoped detail\n\t\t\t// pages — pair with @route.<param> token binding.\n\t\t\tvalidateConfigMode(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'logs': {\n\t\t\tconst hasRegisterSchema = cfg && typeof cfg.register === 'string' && typeof cfg.schema === 'string'\n\t\t\tconst hasSource = cfg && typeof cfg.source === 'string'\n\t\t\tif (!hasRegisterSchema && !hasSource) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare register+schema or source`)\n\t\t\t}\n\t\t\t// Same column shorthand support as index.\n\t\t\tvalidateColumnsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'dashboard': {\n\t\t// `manifest-config-refs` REQ-MCR — surface widgetDef / layoutItem\n\t\t// shape errors. Both arrays are OPTIONAL; only validated when\n\t\t// present.\n\t\t\tvalidateWidgetsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateLayoutArray(cfg, pathSlash, pathBracket, errors)\n\t\t\t// `manifest-widget-ref-page-content-type` — validate the\n\t\t\t// declarative content[] array. Each item MUST be a `widget-ref`\n\t\t\t// object with a valid `ref` URI. OPTIONAL — only validated when\n\t\t\t// the `content` key is present.\n\t\t\tvalidateContentArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'settings': {\n\t\t// `manifest-settings-orchestration` REQ-MSO-1: a settings page\n\t\t// MUST declare EXACTLY ONE of `sections` | `tabs`. When both\n\t\t// are set, emit the orchestration mutex error. When neither is\n\t\t// set, fall through to the legacy `sections required` error\n\t\t// (back-compat — REQ-MSO-7 / REQ-MSO-1 last scenario).\n\t\t\tconst hasSections = cfg && Array.isArray(cfg.sections)\n\t\t\tconst hasTabs = cfg && Array.isArray(cfg.tabs)\n\n\t\t\tif (hasSections && hasTabs) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare exactly one of sections | tabs`)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif (hasTabs) {\n\t\t\t// `manifest-settings-orchestration` REQ-MSO-2..4: validate\n\t\t\t// the `tabs[]` orchestration shape.\n\t\t\t\tif (cfg.tabs.length === 0) {\n\t\t\t\t\terrors.push(`${pathSlash}/tabs: ${pathBracket}.tabs: must contain at least 1 tab`)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tconst seenTabIds = Object.create(null)\n\t\t\t\tcfg.tabs.forEach((tab, tIndex) => {\n\t\t\t\t\tif (!isPlainObject(tab)) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}: must be an object`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/id: required, must be a non-empty string`)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/label: required, must be a non-empty string`)\n\t\t\t\t\t}\n\t\t\t\t\t// REQ-MSO-3: tab IDs must be unique within a page.\n\t\t\t\t\tif (typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\t\t\t\tif (seenTabIds[tab.id]) {\n\t\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/id: ${pathBracket}.tabs[${tIndex}].id: duplicate id \"${tab.id}\" — tab IDs must be unique within a page`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tseenTabIds[tab.id] = true\n\t\t\t\t\t}\n\t\t\t\t\t// `tab.sections` MUST be a non-empty array.\n\t\t\t\t\tif (!Array.isArray(tab.sections)) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/sections: ${pathBracket}.tabs[${tIndex}].sections: required, must be an array`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (tab.sections.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/sections: ${pathBracket}.tabs[${tIndex}].sections: must contain at least 1 section`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t// REQ-MSO-4: each tab's sections follow the same rules\n\t\t\t\t\t// as the flat case — share the per-section validator.\n\t\t\t\t\ttab.sections.forEach((section, sIndex) => {\n\t\t\t\t\t\tvalidateSettingsSection(\n\t\t\t\t\t\t\tsection,\n\t\t\t\t\t\t\t`${pathSlash}/tabs/${tIndex}/sections/${sIndex}`,\n\t\t\t\t\t\t\t`${pathBracket}.tabs[${tIndex}].sections[${sIndex}]`,\n\t\t\t\t\t\t\terrors,\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Flat `sections[]` (existing path — REQ-MSRS-* + back-compat).\n\t\t\tif (!hasSections) {\n\t\t\t\terrors.push(`${pathSlash}/sections: ${pathBracket}.sections: required, must be an array`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (cfg.sections.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/sections: ${pathBracket}.sections: must contain at least 1 section`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcfg.sections.forEach((section, sIndex) => {\n\t\t\t\tvalidateSettingsSection(\n\t\t\t\t\tsection,\n\t\t\t\t\t`${pathSlash}/sections/${sIndex}`,\n\t\t\t\t\t`${pathBracket}.sections[${sIndex}]`,\n\t\t\t\t\terrors,\n\t\t\t\t)\n\t\t\t})\n\t\t\tbreak\n\t\t}\n\t\tcase 'chat': {\n\t\t\tconst hasConversationSource = cfg && typeof cfg.conversationSource === 'string'\n\t\t\tconst hasPostUrl = cfg && typeof cfg.postUrl === 'string'\n\t\t\tif (!hasConversationSource && !hasPostUrl) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare conversationSource or postUrl`)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'files': {\n\t\t\tif (!cfg || typeof cfg.folder !== 'string' || cfg.folder.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/folder: ${pathBracket}.folder: required`)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'form': {\n\t\t// `manifest-form-page-type` REQ-MFPT-* — runtime form pages\n\t\t// MUST declare a non-empty fields[] array and exactly one of\n\t\t// submitHandler | submitEndpoint as the dispatch destination.\n\t\t// Optional submitMethod and mode are constrained to closed\n\t\t// enums so manifest typos surface at validate time.\n\t\t\tconst hasFields = cfg && Array.isArray(cfg.fields) && cfg.fields.length > 0\n\t\t\tif (!hasFields) {\n\t\t\t\terrors.push(`${pathSlash}/fields: ${pathBracket}: form pages must declare a non-empty fields[] array`)\n\t\t\t} else {\n\t\t\t\tvalidateFieldsArray(cfg.fields, `${pathSlash}/fields`, errors, FORM_PAGE_FIELD_TYPES)\n\t\t\t}\n\n\t\t\tconst hasHandler = cfg && typeof cfg.submitHandler === 'string' && cfg.submitHandler.length > 0\n\t\t\tconst hasEndpoint = cfg && typeof cfg.submitEndpoint === 'string' && cfg.submitEndpoint.length > 0\n\t\t\tconst dispatchCount = (hasHandler ? 1 : 0) + (hasEndpoint ? 1 : 0)\n\t\t\tif (dispatchCount !== 1) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: form pages must declare exactly one of submitHandler | submitEndpoint`)\n\t\t\t}\n\n\t\t\tif (cfg && cfg.submitMethod !== undefined) {\n\t\t\t\tconst allowed = ['POST', 'PUT', 'PATCH']\n\t\t\t\tconst upper = typeof cfg.submitMethod === 'string' ? cfg.submitMethod.toUpperCase() : null\n\t\t\t\tif (!upper || !allowed.includes(upper)) {\n\t\t\t\t\terrors.push(`${pathSlash}/submitMethod: ${pathBracket}.submitMethod: must be one of POST | PUT | PATCH`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvalidateConfigMode(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'map': {\n\t\t// `manifest-map-widget` REQ-MMW-* — Leaflet map pages MUST\n\t\t// declare a length-2 finite-number `center`; `layers[]`\n\t\t// entries MUST have a closed-enum `type` and (except inline\n\t\t// geojson) a non-empty `url`; `markers.dataSource` MUST\n\t\t// declare exactly one of `url` OR `register + schema`.\n\t\t\tconst allowedLayerTypes = ['tile', 'wms', 'wfs', 'geojson']\n\t\t\tconst center = cfg && cfg.center\n\t\t\tconst validCenter = Array.isArray(center)\n\t\t\t\t&& center.length === 2\n\t\t\t\t&& center.every((n) => typeof n === 'number' && Number.isFinite(n))\n\t\t\tif (!validCenter) {\n\t\t\t\terrors.push(`${pathSlash}/center: ${pathBracket}.center: must be a length-2 array of finite numbers`)\n\t\t\t}\n\t\t\tif (cfg && cfg.zoom !== undefined && (typeof cfg.zoom !== 'number' || !Number.isFinite(cfg.zoom))) {\n\t\t\t\terrors.push(`${pathSlash}/zoom: ${pathBracket}.zoom: must be a finite number`)\n\t\t\t}\n\t\t\tif (cfg && cfg.layers !== undefined) {\n\t\t\t\tif (!Array.isArray(cfg.layers)) {\n\t\t\t\t\terrors.push(`${pathSlash}/layers: ${pathBracket}.layers: must be an array`)\n\t\t\t\t} else {\n\t\t\t\t\tcfg.layers.forEach((layer, lIdx) => {\n\t\t\t\t\t\tconst lPath = `${pathSlash}/layers[${lIdx}]`\n\t\t\t\t\t\tif (!layer || typeof layer !== 'object') {\n\t\t\t\t\t\t\terrors.push(`${lPath}: must be an object`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!allowedLayerTypes.includes(layer.type)) {\n\t\t\t\t\t\t\terrors.push(`${lPath}/type: must be one of tile | wms | wfs | geojson`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst hasUrl = typeof layer.url === 'string' && layer.url.length > 0\n\t\t\t\t\t\tconst hasInlineGeojson = layer.type === 'geojson'\n\t\t\t\t\t\t\t&& layer.data\n\t\t\t\t\t\t\t&& typeof layer.data === 'object'\n\t\t\t\t\t\tif (!hasUrl && !hasInlineGeojson) {\n\t\t\t\t\t\t\terrors.push(`${lPath}/url: must be a non-empty string`)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cfg && cfg.markers && typeof cfg.markers === 'object' && cfg.markers.dataSource) {\n\t\t\t\tconst ds = cfg.markers.dataSource\n\t\t\t\tconst hasUrl = typeof ds.url === 'string' && ds.url.length > 0\n\t\t\t\tconst hasReg = typeof ds.register === 'string' && ds.register.length > 0\n\t\t\t\t\t&& typeof ds.schema === 'string' && ds.schema.length > 0\n\t\t\t\tconst count = (hasUrl ? 1 : 0) + (hasReg ? 1 : 0)\n\t\t\t\tif (count !== 1) {\n\t\t\t\t\terrors.push(`${pathSlash}/markers/dataSource: ${pathBracket}.markers.dataSource: must declare exactly one of url | (register + schema)`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'wiki': {\n\t\t// `manifest-wiki-page-type` REQ — a wiki page renders one\n\t\t// manifest-declared markdown article (CnWikiPage). It MUST\n\t\t// declare both `register` and `schema` as non-empty strings so\n\t\t// the manifest stays the source of truth for which OpenRegister\n\t\t// register/schema the article body is read from.\n\t\t\tconst hasRegister = cfg && typeof cfg.register === 'string' && cfg.register.length > 0\n\t\t\tconst hasSchema = cfg && typeof cfg.schema === 'string' && cfg.schema.length > 0\n\t\t\tif (!hasRegister || !hasSchema) {\n\t\t\t\terrors.push(`${pathBracket}: wiki pages must declare register and schema`)\n\t\t\t}\n\t\t\t// `manifest-wiki-stabilise` REQ — the remaining typed config\n\t\t\t// fields the CnWikiPage component accepts MUST be strings when\n\t\t\t// present. Omitted fields are tolerated (runtime defaults take\n\t\t\t// over); unknown keys pass for forward-compat.\n\t\t\tvalidateWikiConfigFields(cfg, pathSlash, errors)\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t// No per-type rules for index/detail/dashboard/custom or\n\t\t// consumer-defined types; their `config` shape is enforced\n\t\t// by the target component at runtime (or by a future spec).\n\t\t\tbreak\n\t}\n}\n\n/**\n * Validate the optional typed config fields of a `type:'wiki'` page\n * (`manifest-wiki-stabilise`). Each known field MUST be a string when\n * present; omitted fields are tolerated and unknown keys pass for\n * forward-compatibility. `register` / `schema` are validated by the\n * caller (they are required, not merely typed) so they are excluded\n * here.\n *\n * @param {object|null} cfg The page `config` object.\n * @param {string} pathSlash JSON-pointer prefix for the config object.\n * @param {string[]} errors Accumulator for error messages.\n */\nfunction validateWikiConfigFields(cfg, pathSlash, errors) {\n\tif (!isPlainObject(cfg)) {\n\t\treturn\n\t}\n\tconst stringFields = [\n\t\t'contentField',\n\t\t'titleField',\n\t\t'idParam',\n\t\t'treeField',\n\t\t'sidebarTitleField',\n\t\t'sidebarRegister',\n\t\t'sidebarSchema',\n\t\t'emptyText',\n\t\t'emptyDescription',\n\t\t'emptyBodyText',\n\t\t'emptyBodyDescription',\n\t]\n\tstringFields.forEach((field) => {\n\t\tif (cfg[field] !== undefined && typeof cfg[field] !== 'string') {\n\t\t\terrors.push(`${pathSlash}/${field}: must be a string when set`)\n\t\t}\n\t})\n}\n\n/**\n * Validate the type-specific sidebar config introduced by the\n * `manifest-abstract-sidebar` change and extended by\n * `manifest-detail-sidebar-config`.\n *\n * - For `type: \"index\"` pages with `config.sidebar`:\n * `sidebar` MUST be a plain object. When `enabled` / `show` is set\n * it MUST be a boolean. When `columnGroups` is set it MUST be an\n * array. When `facets` is set it MUST be an object. Unknown\n * sub-fields are tolerated for forward-compat with future\n * CnIndexSidebar props.\n *\n * - For `type: \"detail\"` pages with `config.sidebar`:\n * `sidebar` MUST be either a Boolean (legacy) OR a plain object.\n * When an object: `show` / `enabled` MUST be boolean when set;\n * `register` / `schema` / `title` / `subtitle` MUST be string when\n * set; `hiddenTabs` MUST be an array of strings when set; `tabs`\n * follows the existing tabs-array rules.\n *\n * - For `type: \"detail\"` pages with `config.sidebarProps.tabs`\n * (legacy path): same tab rules as above.\n *\n * Errors push JSON-pointer-shaped paths so the consumer can locate the\n * offending field without consulting the schema source.\n *\n * @param {object} page Page definition under validation\n * @param {number} pageIndex Index of the page in `manifest.pages`\n * @param {string[]} errors Accumulator for error messages\n */\nfunction validateSidebarConfig(page, pageIndex, errors) {\n\tconst config = page.config\n\tif (!isPlainObject(config)) {\n\t\treturn\n\t}\n\n\t// --- Index sidebar ---\n\tif (page.type === 'index' && config.sidebar !== undefined) {\n\t\tconst path = `/pages/${pageIndex}/config/sidebar`\n\t\tif (!isPlainObject(config.sidebar)) {\n\t\t\terrors.push(`${path} must be an object`)\n\t\t} else {\n\t\t\tif (config.sidebar.enabled !== undefined && typeof config.sidebar.enabled !== 'boolean') {\n\t\t\t\terrors.push(`${path}/enabled must be a boolean`)\n\t\t\t}\n\t\t\t// Visibility gate added by manifest-detail-sidebar-config.\n\t\t\tif (config.sidebar.show !== undefined && typeof config.sidebar.show !== 'boolean') {\n\t\t\t\terrors.push(`${path}/show must be a boolean`)\n\t\t\t}\n\t\t\tif (config.sidebar.columnGroups !== undefined && !Array.isArray(config.sidebar.columnGroups)) {\n\t\t\t\terrors.push(`${path}/columnGroups must be an array`)\n\t\t\t}\n\t\t\tif (config.sidebar.facets !== undefined && !isPlainObject(config.sidebar.facets)) {\n\t\t\t\terrors.push(`${path}/facets must be an object`)\n\t\t\t}\n\t\t\tif (config.sidebar.showMetadata !== undefined && typeof config.sidebar.showMetadata !== 'boolean') {\n\t\t\t\terrors.push(`${path}/showMetadata must be a boolean`)\n\t\t\t}\n\t\t\tif (config.sidebar.search !== undefined && !isPlainObject(config.sidebar.search)) {\n\t\t\t\terrors.push(`${path}/search must be an object`)\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Detail sidebar (Object form) ---\n\t// `manifest-detail-sidebar-config` promotes config.sidebar from a\n\t// pure boolean to a Boolean-OR-Object. Boolean form passes through\n\t// unchanged for v1.x back-compat. Object form mirrors index +\n\t// adds detail-specific fields.\n\tif (page.type === 'detail' && config.sidebar !== undefined) {\n\t\tconst path = `/pages/${pageIndex}/config/sidebar`\n\t\tconst sb = config.sidebar\n\t\tconst isBool = typeof sb === 'boolean'\n\t\tconst isObj = isPlainObject(sb)\n\t\tif (!isBool && !isObj) {\n\t\t\terrors.push(`${path} must be a boolean (legacy) or object`)\n\t\t} else if (isObj) {\n\t\t\tif (sb.show !== undefined && typeof sb.show !== 'boolean') {\n\t\t\t\terrors.push(`${path}/show must be a boolean`)\n\t\t\t}\n\t\t\tif (sb.enabled !== undefined && typeof sb.enabled !== 'boolean') {\n\t\t\t\terrors.push(`${path}/enabled must be a boolean`)\n\t\t\t}\n\t\t\tif (sb.register !== undefined && typeof sb.register !== 'string') {\n\t\t\t\terrors.push(`${path}/register must be a string`)\n\t\t\t}\n\t\t\tif (sb.schema !== undefined && typeof sb.schema !== 'string') {\n\t\t\t\terrors.push(`${path}/schema must be a string`)\n\t\t\t}\n\t\t\tif (sb.title !== undefined && typeof sb.title !== 'string') {\n\t\t\t\terrors.push(`${path}/title must be a string`)\n\t\t\t}\n\t\t\tif (sb.subtitle !== undefined && typeof sb.subtitle !== 'string') {\n\t\t\t\terrors.push(`${path}/subtitle must be a string`)\n\t\t\t}\n\t\t\tif (sb.hiddenTabs !== undefined) {\n\t\t\t\tif (!Array.isArray(sb.hiddenTabs)) {\n\t\t\t\t\terrors.push(`${path}/hiddenTabs must be an array of strings`)\n\t\t\t\t} else {\n\t\t\t\t\tsb.hiddenTabs.forEach((t, i) => {\n\t\t\t\t\t\tif (typeof t !== 'string') {\n\t\t\t\t\t\t\terrors.push(`${path}/hiddenTabs/${i} must be a string`)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sb.tabs !== undefined) {\n\t\t\t\tvalidateDetailTabsArray(sb.tabs, `${path}/tabs`, errors)\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Detail sidebar tabs (legacy sidebarProps.tabs path) ---\n\tif (page.type === 'detail' && isPlainObject(config.sidebarProps) && config.sidebarProps.tabs !== undefined) {\n\t\tconst tabsPath = `/pages/${pageIndex}/config/sidebarProps/tabs`\n\t\tvalidateDetailTabsArray(config.sidebarProps.tabs, tabsPath, errors)\n\t}\n}\n\n/**\n * Validate the manifest-abstract-sidebar tabs array. Hoisted so both\n * the legacy `config.sidebarProps.tabs` path and the new\n * `config.sidebar.tabs` path (manifest-detail-sidebar-config) reuse\n * the same rules.\n *\n * @param {unknown} tabs The candidate tabs value (expected: array of tab defs)\n * @param {string} tabsPath JSON-pointer-shaped path prefix for errors\n * @param {string[]} errors Accumulator\n */\nfunction validateDetailTabsArray(tabs, tabsPath, errors) {\n\tif (!Array.isArray(tabs)) {\n\t\terrors.push(`${tabsPath} must be an array`)\n\t\treturn\n\t}\n\tconst seenIds = new Set()\n\ttabs.forEach((tab, tabIndex) => {\n\t\tconst tabPath = `${tabsPath}/${tabIndex}`\n\t\tif (!isPlainObject(tab)) {\n\t\t\terrors.push(`${tabPath} must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\terrors.push(`${tabPath}/id must be a non-empty string`)\n\t\t} else if (seenIds.has(tab.id)) {\n\t\t\terrors.push(`${tabPath}/id \"${tab.id}\" must be unique within tabs[]`)\n\t\t} else {\n\t\t\tseenIds.add(tab.id)\n\t\t}\n\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\terrors.push(`${tabPath}/label must be a non-empty string`)\n\t\t}\n\t\tconst hasWidgets = Array.isArray(tab.widgets) && tab.widgets.length > 0\n\t\tconst hasComponent = typeof tab.component === 'string' && tab.component.length > 0\n\t\tif (hasWidgets && hasComponent) {\n\t\t\terrors.push(`${tabPath} must declare widgets OR component, not both`)\n\t\t}\n\t\tif (tab.widgets !== undefined && !Array.isArray(tab.widgets)) {\n\t\t\terrors.push(`${tabPath}/widgets must be an array when set`)\n\t\t}\n\t\tif (tab.component !== undefined && typeof tab.component !== 'string') {\n\t\t\terrors.push(`${tabPath}/component must be a string when set`)\n\t\t}\n\t\tif (tab.icon !== undefined && typeof tab.icon !== 'string') {\n\t\t\terrors.push(`${tabPath}/icon must be a string when set`)\n\t\t}\n\t\tif (tab.order !== undefined && typeof tab.order !== 'number') {\n\t\t\terrors.push(`${tabPath}/order must be a number when set`)\n\t\t}\n\t})\n}\n\n/**\n * Validate the per-page top-level `sidebar` field (sibling of `config`)\n * introduced by `manifest-detail-sidebar-config`.\n *\n * Applies to EVERY page type (including type='custom'). Currently the\n * only declared sub-field is `show: boolean` (visibility gate consumed\n * by CnAppRoot via the `cnPageSidebarVisible` inject). Unknown\n * sub-fields are tolerated for forward-compat with future fields\n * (e.g. position, width).\n *\n * @param {object} page Page entry\n * @param {number} pageIndex Index in `manifest.pages`\n * @param {string[]} errors Accumulator\n */\n/**\n * Validate a page's `requiresApp` soft-dependency gate.\n *\n * Accepts a non-empty app id, or `{ id, name? }` when the page wants a\n * human-readable name on the missing-dependency screen.\n *\n * This gates a WHOLE page and is for the deep link: a menu entry is hidden by\n * `visibleIf.appInstalled`, so the page is still reachable by bookmark, shared\n * URL, redirect or e2e spec. Gate a single widget with `visibleIf` instead —\n * a detail page may carry many widgets where only one needs the app.\n *\n * @param {object} page The page definition.\n * @param {number} pageIndex Index of the page, for the error path.\n * @param {Array<string>} errors Collected error messages, appended in place.\n *\n * @return {void}\n */\nfunction validatePageRequiresApp(page, pageIndex, errors) {\n\tif (page.requiresApp === undefined) {\n\t\treturn\n\t}\n\n\tconst path = `/pages/${pageIndex}/requiresApp`\n\n\tif (typeof page.requiresApp === 'string') {\n\t\tif (page.requiresApp.length === 0) {\n\t\t\terrors.push(`${path} must be a non-empty string`)\n\t\t}\n\t\treturn\n\t}\n\n\tif (!isPlainObject(page.requiresApp)) {\n\t\terrors.push(`${path} must be a non-empty string or an { id, name? } object`)\n\t\treturn\n\t}\n\n\tif (typeof page.requiresApp.id !== 'string' || page.requiresApp.id.length === 0) {\n\t\terrors.push(`${path}/id must be a non-empty string`)\n\t}\n\n\tif (\n\t\tpage.requiresApp.name !== undefined\n\t\t&& (typeof page.requiresApp.name !== 'string' || page.requiresApp.name.length === 0)\n\t) {\n\t\terrors.push(`${path}/name must be a non-empty string when present`)\n\t}\n}\n\nfunction validatePageSidebar(page, pageIndex, errors) {\n\tif (page.sidebar === undefined) {\n\t\treturn\n\t}\n\tconst path = `/pages/${pageIndex}/sidebar`\n\tif (!isPlainObject(page.sidebar)) {\n\t\terrors.push(`${path} must be an object`)\n\t\treturn\n\t}\n\tif (page.sidebar.show !== undefined && typeof page.sidebar.show !== 'boolean') {\n\t\terrors.push(`${path}/show must be a boolean`)\n\t}\n}\n\n/**\n * Validate `config.columns[]` for index / logs page types\n * (`manifest-config-refs` REQ-MCR).\n *\n * Each item is EITHER a string (legacy shorthand: just the property\n * key) OR an object matching the `column` $def — i.e. with at least\n * `key` and `label` non-empty strings. The schema admits the same\n * `oneOf` shape; this validator produces sharper messages when the\n * Object form is malformed.\n *\n * Skipped silently when `cfg` or `cfg.columns` is missing.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateColumnsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.columns === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.columns)) {\n\t\terrors.push(`${pathSlash}/columns: ${pathBracket}.columns: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.columns.forEach((col, cIndex) => {\n\t\tconst colPath = `${pathSlash}/columns/${cIndex}`\n\t\tif (typeof col === 'string') {\n\t\t\t// Legacy shorthand — accepted as-is.\n\t\t\treturn\n\t\t}\n\t\tif (!isPlainObject(col)) {\n\t\t\terrors.push(`${colPath}: must be a string (legacy shorthand) or object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof col.key !== 'string' || col.key.length === 0) {\n\t\t\terrors.push(`${colPath}/key: must be a non-empty string`)\n\t\t}\n\t\tif (typeof col.label !== 'string' || col.label.length === 0) {\n\t\t\terrors.push(`${colPath}/label: must be a non-empty string`)\n\t\t}\n\t})\n}\n\n/**\n * Closed enum of valid `config.mode` values for type='form' and\n * type='detail' pages (`manifest-public-mode`).\n *\n * @type {string[]}\n */\nconst ALLOWED_CONFIG_MODES = ['edit', 'create', 'public']\n\n/**\n * Validate `config.mode` against the closed enum\n * (`manifest-public-mode`). Shared between type='form' and\n * type='detail' branches of `validateTypeConfig`. Omitted mode is\n * tolerated (consumers fall back to the component's default).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateConfigMode(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.mode === undefined) {\n\t\treturn\n\t}\n\tif (typeof cfg.mode !== 'string' || !ALLOWED_CONFIG_MODES.includes(cfg.mode)) {\n\t\terrors.push(`${pathSlash}/mode: ${pathBracket}.mode: must be one of ${ALLOWED_CONFIG_MODES.join(' | ')}`)\n\t}\n}\n\n/**\n * REQ-MAD-1 — Allowed shapes for `actions[].handler`. Either a\n * reserved keyword (`navigate` | `emit` | `none`) or a JS-identifier\n * registry name (alphanumeric + underscore, leading letter). Mirrors\n * the schema's `pattern` on the `handler` property.\n */\nconst HANDLER_PATTERN = /^(navigate|emit|none|[A-Za-z][A-Za-z0-9_]*)$/\n\n/**\n * Validate `config.actions[]` for index page type\n * (`manifest-config-refs` REQ-MCR). Each entry MUST be an object with\n * non-empty `id` and `label` strings — matches the `action` $def's\n * `required: [\"id\",\"label\"]`.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateActionsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.actions === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.actions)) {\n\t\terrors.push(`${pathSlash}/actions: ${pathBracket}.actions: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.actions.forEach((action, aIndex) => {\n\t\tconst actionPath = `${pathSlash}/actions/${aIndex}`\n\t\tif (!isPlainObject(action)) {\n\t\t\terrors.push(`${actionPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof action.id !== 'string' || action.id.length === 0) {\n\t\t\terrors.push(`${actionPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof action.label !== 'string' || action.label.length === 0) {\n\t\t\terrors.push(`${actionPath}/label: must be a non-empty string`)\n\t\t}\n\t\t// REQ-MAD-1 / REQ-MAD-2 — `handler` (string, registry name OR\n\t\t// reserved keyword `navigate`/`emit`/`none`) and the matching\n\t\t// `navigate` requirement on `route`. Schema 1.3.0+.\n\t\tif (action.handler !== undefined) {\n\t\t\tif (typeof action.handler !== 'string') {\n\t\t\t\terrors.push(`${actionPath}/handler: must be a string when set`)\n\t\t\t} else if (!HANDLER_PATTERN.test(action.handler)) {\n\t\t\t\terrors.push(`${actionPath}/handler: \"${action.handler}\" must match `\n\t\t\t\t\t+ '\"navigate\" | \"emit\" | \"none\" | [A-Za-z][A-Za-z0-9_]*')\n\t\t\t}\n\t\t\tif (action.handler === 'navigate'\n\t\t\t\t&& (typeof action.route !== 'string' || action.route.length === 0)) {\n\t\t\t\terrors.push(`${actionPath}/route: required when handler is \"navigate\"`)\n\t\t\t}\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.actionToggles` for index page type\n * (`manifest-index-action-toggles`). The block is OPTIONAL; when\n * present it MUST be a plain object whose values are booleans.\n * Unknown keys pass for forward-compat with future CnIndexPage props.\n *\n * Known keys (each maps to a CnIndexPage prop):\n * showAdd, showFormDialog, showEditAction, showCopyAction,\n * showDeleteAction, showMassImport, showMassExport, showMassCopy,\n * showMassDelete, showViewToggle, selectable.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateIndexActionToggles(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.actionToggles === undefined) {\n\t\treturn\n\t}\n\tif (!isPlainObject(cfg.actionToggles)) {\n\t\terrors.push(`${pathSlash}/actionToggles: ${pathBracket}.actionToggles: must be an object`)\n\t\treturn\n\t}\n\tfor (const [key, value] of Object.entries(cfg.actionToggles)) {\n\t\tif (typeof value !== 'boolean') {\n\t\t\terrors.push(`${pathSlash}/actionToggles/${key}: ${pathBracket}.actionToggles.${key}: must be a boolean (got ${typeof value})`)\n\t\t}\n\t}\n}\n\n/**\n * Validate `config.sidebarTabs[]` for detail page type\n * (`manifest-detail-sidebartabs`). The block is OPTIONAL; when\n * present it MUST be an array of objects each carrying non-empty\n * `id` and `label` strings. Duplicate `id`s reject; unknown keys\n * pass for forward-compat (icon, order, component, _note, …).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.sidebarTabs === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.sidebarTabs)) {\n\t\terrors.push(`${pathSlash}/sidebarTabs: ${pathBracket}.sidebarTabs: must be an array`)\n\t\treturn\n\t}\n\tconst seenIds = Object.create(null)\n\tcfg.sidebarTabs.forEach((tab, tIndex) => {\n\t\tconst tabPath = `${pathSlash}/sidebarTabs/${tIndex}`\n\t\tconst tabBracket = `${pathBracket}.sidebarTabs[${tIndex}]`\n\t\tif (!isPlainObject(tab)) {\n\t\t\terrors.push(`${tabPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\terrors.push(`${tabPath}/id: ${tabBracket}.id: required, must be a non-empty string`)\n\t\t}\n\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\terrors.push(`${tabPath}/label: ${tabBracket}.label: required, must be a non-empty string`)\n\t\t}\n\t\tif (typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\tif (seenIds[tab.id]) {\n\t\t\t\terrors.push(`${tabPath}/id: ${tabBracket}.id: duplicate \"${tab.id}\" — tab IDs must be unique within a page`)\n\t\t\t} else {\n\t\t\t\tseenIds[tab.id] = true\n\t\t\t}\n\t\t}\n\t\tif (tab.icon !== undefined && typeof tab.icon !== 'string') {\n\t\t\terrors.push(`${tabPath}/icon: must be a string when set`)\n\t\t}\n\t\tif (tab.order !== undefined && typeof tab.order !== 'number') {\n\t\t\terrors.push(`${tabPath}/order: must be a number when set`)\n\t\t}\n\t\tif (tab.component !== undefined && (typeof tab.component !== 'string' || tab.component.length === 0)) {\n\t\t\terrors.push(`${tabPath}/component: must be a non-empty string when set`)\n\t\t}\n\t})\n}\n\n/**\n * Cross-reference check: every `widgets[]` entry with\n * `slot === 'sidebar'` and a `tabGroup` value MUST match a declared\n * `config.sidebarTabs[].id`. Catches silent typos where a tab-bound\n * widget references a non-existent tab.\n *\n * Only runs when `widgets` is an array. Tolerates a missing\n * `sidebarTabs` declaration (the widgets[] can still validate\n * shape-wise; the cross-ref check is a documentation aid).\n *\n * @param {object} page The page object\n * @param {number} index The page index (for path)\n * @param {string[]} errors Accumulator\n */\nfunction validateSidebarTabGroupRefs(page, index, errors) {\n\tif (!page || !Array.isArray(page.widgets) || page.widgets.length === 0) {\n\t\treturn\n\t}\n\tconst cfg = isPlainObject(page.config) ? page.config : null\n\tconst declaredIds = new Set()\n\tif (cfg && Array.isArray(cfg.sidebarTabs)) {\n\t\tfor (const tab of cfg.sidebarTabs) {\n\t\t\tif (tab && typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\t\tdeclaredIds.add(tab.id)\n\t\t\t}\n\t\t}\n\t}\n\tpage.widgets.forEach((widget, wIndex) => {\n\t\tif (!isPlainObject(widget)) {\n\t\t\treturn\n\t\t}\n\t\tif (widget.slot !== 'sidebar') {\n\t\t\treturn\n\t\t}\n\t\tif (typeof widget.tabGroup !== 'string' || widget.tabGroup.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tif (declaredIds.size === 0) {\n\t\t\terrors.push(`pages[${index}]/widgets/${wIndex}/tabGroup: \"${widget.tabGroup}\" referenced but config.sidebarTabs[] is empty or missing — declare the tab to silence this error`)\n\t\t\treturn\n\t\t}\n\t\tif (!declaredIds.has(widget.tabGroup)) {\n\t\t\terrors.push(`pages[${index}]/widgets/${wIndex}/tabGroup: \"${widget.tabGroup}\" must match a declared config.sidebarTabs[].id`)\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.widgets[]` for dashboard page type\n * (`manifest-config-refs` REQ-MCR).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateWidgetsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.widgets === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.widgets)) {\n\t\terrors.push(`${pathSlash}/widgets: ${pathBracket}.widgets: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.widgets.forEach((widget, wIndex) => {\n\t\tconst widgetPath = `${pathSlash}/widgets/${wIndex}`\n\t\tif (!isPlainObject(widget)) {\n\t\t\terrors.push(`${widgetPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof widget.id !== 'string' || widget.id.length === 0) {\n\t\t\terrors.push(`${widgetPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof widget.title !== 'string' || widget.title.length === 0) {\n\t\t\terrors.push(`${widgetPath}/title: must be a non-empty string`)\n\t\t}\n\t\tif (typeof widget.type !== 'string' || widget.type.length === 0) {\n\t\t\terrors.push(`${widgetPath}/type: must be a non-empty string`)\n\t\t}\n\t\tif (widget.type === 'chart') {\n\t\t\tvalidateChartBaseline(widget.content, `${widgetPath}/content`, errors)\n\t\t\tvalidateChartBaseline(widget.props, `${widgetPath}/props`, errors)\n\t\t}\n\t})\n}\n\n/**\n * Validate a chart widget's `valueAxisBaseline` against its closed enum.\n *\n * The key lives inside the deliberately free-form widget `props` / `content`\n * bag, which no JSON Schema in this repo constrains — so a misspelt value\n * validated clean and then fell back to `auto` at render time, which is the\n * exact framing the author was overriding, with nothing in the manifest to\n * explain it. Omitted is fine (the component's default applies).\n *\n * @param {object|null} bag The widget's `props` or `content` block.\n * @param {string} path JSON-pointer-style path prefix for the message.\n * @param {string[]} errors Accumulator.\n * @return {void}\n */\nfunction validateChartBaseline(bag, path, errors) {\n\tif (!isPlainObject(bag)) {\n\t\treturn\n\t}\n\tconst value = bag.valueAxisBaseline\n\tif (value === undefined || value === null) {\n\t\treturn\n\t}\n\tif (typeof value !== 'string' || !CHART_VALUE_AXIS_BASELINES.includes(value)) {\n\t\terrors.push(`${path}/valueAxisBaseline: must be one of ${CHART_VALUE_AXIS_BASELINES.join(' | ')}`)\n\t}\n}\n\n/**\n * Validate `config.layout[]` for dashboard page type\n * (`manifest-config-refs` REQ-MCR). Each entry MUST be an object with\n * non-empty `id`, `widgetId` strings, and integer `gridX`/`gridY` >= 0,\n * `gridWidth`/`gridHeight` >= 1 — matches the `layoutItem` $def.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateLayoutArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.layout === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.layout)) {\n\t\terrors.push(`${pathSlash}/layout: ${pathBracket}.layout: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.layout.forEach((item, lIndex) => {\n\t\tconst layoutPath = `${pathSlash}/layout/${lIndex}`\n\t\tif (!isPlainObject(item)) {\n\t\t\terrors.push(`${layoutPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof item.id !== 'string' || item.id.length === 0) {\n\t\t\terrors.push(`${layoutPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof item.widgetId !== 'string' || item.widgetId.length === 0) {\n\t\t\terrors.push(`${layoutPath}/widgetId: must be a non-empty string`)\n\t\t}\n\t\tconst checkInt = (key, min) => {\n\t\t\tif (typeof item[key] !== 'number' || !Number.isInteger(item[key])) {\n\t\t\t\terrors.push(`${layoutPath}/${key}: must be an integer`)\n\t\t\t} else if (item[key] < min) {\n\t\t\t\terrors.push(`${layoutPath}/${key}: must be >= ${min}`)\n\t\t\t}\n\t\t}\n\t\tcheckInt('gridX', 0)\n\t\tcheckInt('gridY', 0)\n\t\tcheckInt('gridWidth', 1)\n\t\tcheckInt('gridHeight', 1)\n\t})\n}\n\n/**\n * Validate a single `sections[]` entry for `type:\"settings\"` pages.\n * Shared between the flat `pages[].config.sections[]` path AND the\n * tab-nested `pages[].config.tabs[].sections[]` path\n * (`manifest-settings-orchestration` REQ-MSO-4).\n *\n * Enforces the rich-sections REQ-MSRS-1 mutex (`fields | component |\n * widgets` exactly-one-of) plus per-widget shape rules. The new\n * `widget.type === \"component\"` discriminator (REQ-MSO-6) requires\n * `componentName: <non-empty string>`.\n *\n * @param {unknown} section The section under validation\n * @param {string} pathSlash JSON-pointer-style path prefix for errors\n * @param {string} pathBracket Human-readable bracket-path for errors\n * @param {string[]} errors Accumulator\n */\nfunction validateSettingsSection(section, pathSlash, pathBracket, errors) {\n\tif (!isPlainObject(section)) {\n\t\terrors.push(`${pathSlash}: must be an object`)\n\t\treturn\n\t}\n\tif (typeof section.title !== 'string') {\n\t\terrors.push(`${pathSlash}/title: required, must be a string`)\n\t}\n\n\t// `manifest-settings-rich-sections` REQ-MSRS-1: exactly one of\n\t// fields | component | widgets.\n\tconst hasFields = Array.isArray(section.fields)\n\tconst hasComponent = typeof section.component === 'string' && section.component.length > 0\n\tconst hasWidgets = Array.isArray(section.widgets) && section.widgets.length > 0\n\tconst bodyCount = (hasFields ? 1 : 0) + (hasComponent ? 1 : 0) + (hasWidgets ? 1 : 0)\n\n\tif (bodyCount !== 1) {\n\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare exactly one of fields | component | widgets`)\n\t}\n\n\t// `widgets` set but not an array (string / object / etc.)\n\tif (section.widgets !== undefined && !Array.isArray(section.widgets)) {\n\t\terrors.push(`${pathSlash}/widgets: must be an array when set`)\n\t}\n\n\t// `component` set but not a string.\n\tif (section.component !== undefined && typeof section.component !== 'string') {\n\t\terrors.push(`${pathSlash}/component: must be a string when set`)\n\t}\n\n\t// Per-widget shape rules.\n\tif (hasWidgets) {\n\t\tsection.widgets.forEach((widget, wIndex) => {\n\t\t\tif (!isPlainObject(widget)) {\n\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}: must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof widget.type !== 'string' || widget.type.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}/type: must be a non-empty string`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// `manifest-settings-orchestration` REQ-MSO-6: when the\n\t\t\t// discriminator is \"component\", `componentName` MUST be a\n\t\t\t// non-empty string. Other widget types ignore\n\t\t\t// `componentName`.\n\t\t\tif (widget.type === 'component') {\n\t\t\t\tif (typeof widget.componentName !== 'string' || widget.componentName.length === 0) {\n\t\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}/componentName: required when type is \"component\", must be a non-empty string`)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// `manifest-config-refs` REQ-MCR — when fields[] body is used,\n\t// each entry must match the formField $def shape.\n\tif (hasFields) {\n\t\tvalidateFieldsArray(section.fields, `${pathSlash}/fields`, errors)\n\t}\n}\n\nconst MENU_ACTIONS = ['user-settings']\n\n/**\n * Validate the optional `action` field on a menu item. The schema\n * declares a closed enum (\"user-settings\" only); this helper enforces\n * that constraint at validate time so manifest typos surface\n * immediately rather than silently no-op'ing in CnAppNav (where\n * unknown action values fall through the click handler).\n *\n * Added in schema 1.5.0 alongside the user-settings action.\n *\n * @param {object} item Menu item (top-level or leaf child).\n * @param {string} path JSON path of this item (e.g. `/menu/0`).\n * @param {string[]} errors Error array to push to (mutated).\n */\nfunction validateMenuAction(item, path, errors) {\n\tif (item.action === undefined) {\n\t\treturn\n\t}\n\tif (typeof item.action !== 'string' || !MENU_ACTIONS.includes(item.action)) {\n\t\terrors.push(`${path}/action must be one of: ${MENU_ACTIONS.join(', ')}`)\n\t}\n}\n\n/**\n * Validate a `visibleIf` block on a menu item or nested child.\n *\n * `visibleIf` is optional; when present it MUST be a plain object.\n * Supported sub-keys:\n *\n * - `appInstalled` (reserved) — a non-empty string naming the Nextcloud\n * app whose installation gates the entry.\n * - Any other key is treated as a dot-separated context path into\n * `manifest.runtime` (e.g. `\"user.primaryRole\"`). Its value is a\n * predicate expression: a scalar (shorthand eq) or an operator object\n * (`{ eq }`, `{ in }`, `{ notIn }`, `{ gt }`, `{ gte }`, `{ lt }`,\n * `{ lte }`, `{ truthy }`).\n *\n * @param {object|undefined} visibleIf The candidate value (may be undefined)\n * @param {string} path JSON-pointer-style path prefix for error messages\n * @param {string[]} errors Accumulator\n */\nfunction validateMenuItemVisibleIf(visibleIf, path, errors) {\n\tif (visibleIf === undefined) {\n\t\treturn\n\t}\n\tif (!isPlainObject(visibleIf)) {\n\t\terrors.push(`${path} must be an object when set`)\n\t\treturn\n\t}\n\t// Validate the reserved `appInstalled` key.\n\tif (visibleIf.appInstalled !== undefined) {\n\t\tif (typeof visibleIf.appInstalled !== 'string' || visibleIf.appInstalled.length === 0) {\n\t\t\terrors.push(`${path}/appInstalled must be a non-empty string`)\n\t\t}\n\t}\n\t// Validate context-path predicate keys (any non-reserved key).\n\tconst RESERVED = new Set(['appInstalled'])\n\tfor (const key of Object.keys(visibleIf)) {\n\t\tif (RESERVED.has(key)) {\n\t\t\tcontinue\n\t\t}\n\t\t// Context path key must be dot-separated with non-empty segments.\n\t\tconst segments = key.split('.')\n\t\tif (segments.some((s) => s.length === 0) || key.length === 0) {\n\t\t\terrors.push(`${path}/${key}: context path must be a non-empty dot-separated string with non-empty segments`)\n\t\t\tcontinue\n\t\t}\n\t\t// Predicate value validation.\n\t\tconst predicate = visibleIf[key]\n\t\tif (predicate !== null && typeof predicate === 'object') {\n\t\t\tif (\n\t\t\t\tObject.hasOwn(predicate, 'in')\n\t\t\t\t&& !Array.isArray(predicate.in)\n\t\t\t) {\n\t\t\t\terrors.push(`${path}/${key}/in: \"in\" operator value must be an array`)\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.hasOwn(predicate, 'notIn')\n\t\t\t\t&& !Array.isArray(predicate.notIn)\n\t\t\t) {\n\t\t\t\terrors.push(`${path}/${key}/notIn: \"notIn\" operator value must be an array`)\n\t\t\t}\n\t\t\t// Unknown operator keys are tolerated (forward-compat) — no error.\n\t\t}\n\t\t// Scalar predicates (string, number, boolean, null) are always valid.\n\t}\n}\n\n/**\n * Pattern matching the `openregister://widget/<schemaSlug>/<widgetSlug>` URI.\n * schemaSlug: lowercase alphanumeric + hyphens.\n * widgetSlug: starts with a letter (upper or lower), then alphanumeric + hyphens.\n * camelCase is supported (e.g. `coverageGrid`).\n */\nconst WIDGET_REF_URI_PATTERN = /^openregister:\\/\\/widget\\/[a-z0-9-]+\\/[a-zA-Z][a-zA-Z0-9-]+$/\n\n/**\n * Validate `config.content[]` for dashboard page type\n * (`manifest-widget-ref-page-content-type`). Each item MUST be an\n * object with:\n * - `type` === \"widget-ref\" (the only supported discriminator)\n * - `ref` matching `openregister://widget/<schemaSlug>/<widgetSlug>`\n *\n * Skipped silently when `cfg` or `cfg.content` is missing.\n *\n * @param {object|null} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateContentArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.content === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.content)) {\n\t\terrors.push(`${pathSlash}/content: ${pathBracket}.content: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.content.forEach((item, cIndex) => {\n\t\tconst itemPath = `${pathSlash}/content/${cIndex}`\n\t\tif (!isPlainObject(item)) {\n\t\t\terrors.push(`${itemPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (item.type !== 'widget-ref') {\n\t\t\terrors.push(`${itemPath}/type: must be \"widget-ref\" (got \"${item.type}\")`)\n\t\t}\n\t\tif (typeof item.ref !== 'string' || item.ref.length === 0) {\n\t\t\terrors.push(`${itemPath}/ref: must be a non-empty string`)\n\t\t} else if (!WIDGET_REF_URI_PATTERN.test(item.ref)) {\n\t\t\terrors.push(`${itemPath}/ref: \"${item.ref}\" must match openregister://widget/<schemaSlug>/<widgetSlug> `\n\t\t\t\t+ '(slugs: lowercase letters, digits, hyphens; widgetSlug must start with a letter)')\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.sections[].fields[]` for settings page type\n * (`manifest-config-refs` REQ-MCR) and `config.fields[]` for form pages.\n * Each field MUST be an object with non-empty `key`, `label` strings and\n * `type` in the closed enum `boolean | number | string | enum | password |\n * json`, which matches the `formField` $def.\n *\n * A form page also accepts `file`. A settings page does not: it saves to\n * app config, which has no place for file content, and CnSettingsPage has\n * no file input to render.\n *\n * @param {unknown} fields The candidate fields value\n * @param {string} fieldsPath JSON-pointer-style path prefix for errors\n * @param {string[]} errors Accumulator\n * @param {string[]} [allowedTypes] The accepted `type` values. Defaults to\n * the settings set, `FORM_FIELD_TYPES`.\n */\nfunction validateFieldsArray(fields, fieldsPath, errors, allowedTypes = FORM_FIELD_TYPES) {\n\tif (!Array.isArray(fields)) {\n\t\treturn\n\t}\n\tfields.forEach((field, fIndex) => {\n\t\tconst fieldPath = `${fieldsPath}/${fIndex}`\n\t\tif (!isPlainObject(field)) {\n\t\t\terrors.push(`${fieldPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof field.key !== 'string' || field.key.length === 0) {\n\t\t\terrors.push(`${fieldPath}/key: must be a non-empty string`)\n\t\t}\n\t\tif (typeof field.label !== 'string' || field.label.length === 0) {\n\t\t\terrors.push(`${fieldPath}/label: must be a non-empty string`)\n\t\t}\n\t\tif (typeof field.type !== 'string' || field.type.length === 0) {\n\t\t\terrors.push(`${fieldPath}/type: must be a non-empty string`)\n\t\t} else if (!allowedTypes.includes(field.type)) {\n\t\t\terrors.push(`${fieldPath}/type: must be one of ${allowedTypes.join(', ')}`)\n\t\t}\n\t})\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validateManifest.js","sources":["../../../src/utils/validateManifest.js"],"sourcesContent":["// Single source of truth for \"which widget keys does the library render\n// itself?\", bound to the runtime registries by\n// tests/utils/libraryWidgetKeys.spec.js so the two cannot drift apart again.\n// The built-in files-browser column names, imported from the component that\n// renders them so the validator and the browser cannot disagree about which\n// names exist.\nimport { BUILT_IN_FILE_COLUMNS } from '../components/CnFilesBrowser/filesBrowserColumns.js'\nimport { LIBRARY_WIDGET_KEYS } from './libraryWidgetKeys.js'\n// The same resolver CnIndexPage orders row actions with, so the placement warnings measure the order that actually renders.\nimport { resolveRowActions } from './resolveRowActions.js'\n// Shared slot→columns resolution so the validator's grid bound matches the\n// renderer (CnWidgetGrid) exactly. A mismatch would let a manifest pass\n// validation yet clip at render time.\nimport { resolveSlotColumns } from './resolveSlotColumns.js'\n// The standalone validator is pre-compiled at build time by\n// scripts/build-validators.js. It does NOT use new Function() at\n// runtime, which is required because Nextcloud's CSP blocks unsafe-eval\n// (EvalError on every v2 app boot without this). See ADR-036.\n//\n// The file is regenerated on every `npm run build` and `npm test`\n// via the `build:validators` script, and is gitignored.\nimport _compiledValidateV2 from './validateManifestV2.compiled.js'\n\n// CJS/ESM interop: compiled file exports default via module.exports.default\n// in some bundlers. Unwrap when present.\nconst _validateV2Schema = _compiledValidateV2.default || _compiledValidateV2\n\n/** Module-level flag so the unknown-$schema console.warn fires only once. */\nlet _unknownSchemaWarned = false\n\n/**\n * The v2 schema URL suffix used for dispatch detection.\n */\nconst V2_SCHEMA_SUFFIX = '/app-manifest-v2.schema.json'\n\n/**\n * Convert an Ajv ErrorObject's instancePath + message to a bracket-path\n * string matching the v1 validator's format (e.g. \"pages[0]/...\").\n *\n * Ajv uses JSON Pointer paths like \"/pages/0/widgets/1/gridWidth\".\n * We convert the leading \"/pages/0\" segment to \"pages[0]\" and keep\n * the rest as slash-separated for consistency with v1.\n *\n * @param {import('ajv').ErrorObject} err - Ajv error object\n * @return {string} Formatted error message\n */\nfunction ajvErrorToString(err) {\n\t// instancePath is like \"/pages/0/widgets/1/gridWidth\" or \"\"\n\t// keyword-based errors with no instancePath use the schemaPath\n\tconst path = err.instancePath || err.schemaPath || ''\n\n\t// Convert /pages/0/... → pages[0]/...\n\tconst bracketPath = path.replace(/^\\//, '').replace(/\\/(\\d+)(\\/|$)/g, '[$1]$2')\n\n\tconst message = err.message || 'validation error'\n\n\tif (bracketPath) {\n\t\treturn `${bracketPath}: ${message}`\n\t}\n\treturn message\n}\n\n/**\n * Library built-in v2 widget keys. A `widgetKey` resolving to one of\n * these is rendered by a library `Cn*` SFC and does NOT count as a\n * custom registry component for the single-12×12-widget dashboard\n * rule (see the consumer below).\n *\n * This used to be a hand-written array carrying a comment telling the\n * next author to append new built-ins \"in the same PR\". Eleven keys\n * were listed while the library rendered forty-five, and nothing\n * failed, because the only symptom is a legitimate library dashboard\n * being told to redeclare itself as `type:\"custom\"`. The list now\n * lives in `utils/libraryWidgetKeys.js`, which\n * `tests/utils/libraryWidgetKeys.spec.js` holds to set equality\n * against the two registries that actually resolve a key at runtime —\n * `BUILT_IN_WIDGETS` and the dashboard catalog `CnWidgetGrid` falls\n * back to. Adding a widget to either registry without updating that\n * module now fails CI.\n *\n * Imported as bare strings on purpose: the registries themselves pull\n * in ~50 SFCs (leaflet, the chart stack), and `validateManifest.js` is\n * a lazily-loaded chunk that must stay cheap to import in Node.\n *\n * @type {Set<string>}\n */\nconst LIBRARY_BUILT_IN_WIDGET_KEYS = new Set(LIBRARY_WIDGET_KEYS)\n\n/**\n * Closed enum of valid chart `valueAxisBaseline` values — mirrors\n * `CnChartWidget`'s own prop validator. Checked post-schema because the key\n * sits inside the free-form widget `props` / `content` bag.\n *\n * @type {string[]}\n */\nconst CHART_VALUE_AXIS_BASELINES = ['auto', 'zero', 'fit']\n\n/**\n * Validate a v2 manifest using the Ajv-compiled `app-manifest-v2.schema.json`.\n *\n * In addition to JSON Schema validation, applies the following post-schema\n * checks that cannot be expressed in pure JSON Schema:\n * - `pages[].id` uniqueness across the array\n * - `pages[].widgets[].id` uniqueness across the WHOLE manifest for every\n * entry declaring `ncDashboard` (Nextcloud's widget namespace is per app,\n * not per page)\n * - `gridX + gridWidth <= 12` for every widget in every page (only on\n * slots where gridColumns is 12 — i.e. all non-sidebar slots)\n * - Single-12×12-custom-widget dashboard rule (ADR-036 Decision 1): a\n * `pages[].type === \"dashboard\"` with exactly one `widgets[]` entry\n * where `slot === \"body\"`, `gridX/gridY === 0`, `gridWidth/gridHeight\n * === 12`, and `widgetKey` does NOT resolve to a library built-in.\n * - `@resolve:` sentinel REJECTION on registry-key paths (mirrors v1 rules):\n * `pages[].id`, `pages[].route`, `pages[].component`,\n * `pages[].headerComponent`, `pages[].actionsComponent`,\n * `pages[].slots.*`, `menu[].id`, `menu[].route`,\n * `dependencies[]`, `version`\n * - A `type: 'files'` page whose `config.columns` names a built-in column\n * that does not exist, or declares one with an unknown `source` or an\n * `attribute` source reading no property\n * - A `config.folderSidebar.folders[]` scope naming a column key that the\n * page's own `config.columns` does not declare (the page declares which\n * columns it has; a scope only chooses among them)\n *\n * It also returns non-fatal `warnings`, which never affect `valid` (index pages with an `entitySource` are skipped):\n * - A `\"builtin:<id>\"` placeholder whose built-in the manifest's toggles turn off\n * - The built-in Delete enabled but not the last entry of the rendered row action order\n *\n * @spec openspec/changes/manifest-v2-schema/specs/manifest-v2-schema/spec.md\n * @spec openspec/changes/row-action-builtin-placement/specs/index-page/spec.md\n * @param {object} manifest The v2 manifest object to validate.\n * @return {{ valid: boolean, errors: string[], warnings: string[] }}\n */\nexport function validateManifestV2(manifest) {\n\t// Clone so Ajv useDefaults mutations don't affect the caller's copy.\n\tconst clone = JSON.parse(JSON.stringify(manifest))\n\n\tconst ajvValid = _validateV2Schema(clone)\n\tconst errors = []\n\n\tif (!ajvValid && _validateV2Schema.errors) {\n\t\tfor (const err of _validateV2Schema.errors) {\n\t\t\terrors.push(ajvErrorToString(err))\n\t\t}\n\t}\n\n\t// --- Post-schema checks ---\n\n\t// 1. pages[].id uniqueness\n\tif (Array.isArray(clone.pages)) {\n\t\tconst seenIds = new Set()\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (page && typeof page.id === 'string') {\n\t\t\t\tif (seenIds.has(page.id)) {\n\t\t\t\t\terrors.push(`pages[${index}]/id: \"${page.id}\" must be unique within pages[]`)\n\t\t\t\t} else {\n\t\t\t\t\tseenIds.add(page.id)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 1b. Entity-scaffold templating (manifest-entity-scaffold-templating):\n\t// pageTemplates[].id uniqueness + pageInstances[].templateRef resolves.\n\t// Cheap early feedback so a dangling ref is caught at validation time,\n\t// not only when the expander runs. No-op for a manifest without\n\t// templating (the fleet corpus), so it can't break the regression.\n\tif (Array.isArray(clone.pageTemplates) || Array.isArray(clone.pageInstances)) {\n\t\tconst templateIds = new Set()\n\t\tif (Array.isArray(clone.pageTemplates)) {\n\t\t\tclone.pageTemplates.forEach((tpl, index) => {\n\t\t\t\tif (!tpl || typeof tpl.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (templateIds.has(tpl.id)) {\n\t\t\t\t\terrors.push(`pageTemplates[${index}]/id: \"${tpl.id}\" must be unique within pageTemplates[]`)\n\t\t\t\t} else {\n\t\t\t\t\ttemplateIds.add(tpl.id)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (Array.isArray(clone.pageInstances)) {\n\t\t\tclone.pageInstances.forEach((inst, index) => {\n\t\t\t\tif (!inst || typeof inst.templateRef !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!templateIds.has(inst.templateRef)) {\n\t\t\t\t\terrors.push(`pageInstances[${index}]/templateRef: \"${inst.templateRef}\" references no pageTemplates[] entry`)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\t// 2. gridX + gridWidth <= 12 for widget entries (sidebar already\n\t// constrained to gridWidth:1 by schema, so the sum is always ≤12 for\n\t// sidebar; we still run the arithmetic check for clarity).\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst gx = widget.gridX\n\t\t\t\tconst gw = widget.gridWidth\n\t\t\t\tif (typeof gx === 'number' && typeof gw === 'number') {\n\t\t\t\t\tconst resolved = resolveSlotColumns(widget.slot, isPlainObject(page.config) ? page.config.slotColumns : null)\n\t\t\t\t\tif (gx + gw > resolved) {\n\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: Widget '${widget.widgetKey}' in slot '${widget.slot}': gridX (${gx}) + gridWidth (${gw}) exceeds ${resolved}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 2b. `ncDashboard` widget ids are unique across the WHOLE manifest.\n\t// The schema can require the id but not compare two pages, and the\n\t// page is the wrong scope anyway: Nextcloud keys each user's chosen\n\t// dashboard widgets per APP, so two pages both declaring id 'recent'\n\t// derive one panel and the second silently replaces the first in a\n\t// namespace no migration of this app can reach.\n\tif (Array.isArray(clone.pages)) {\n\t\tconst seenDashboardIds = new Map()\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || !isPlainObject(widget.ncDashboard) || typeof widget.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst here = `pages[${pIndex}]/widgets[${wIndex}]`\n\t\t\t\tconst first = seenDashboardIds.get(widget.id)\n\t\t\t\tif (first) {\n\t\t\t\t\terrors.push(`${here}/id: \"${widget.id}\" already publishes to the Nextcloud dashboard at ${first} — an ncDashboard id must be unique across the whole manifest`)\n\t\t\t\t} else {\n\t\t\t\t\tseenDashboardIds.set(widget.id, here)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3. Single-12×12-custom-widget dashboard rule (ADR-036 Decision 1 /\n\t// manifest-v2 spec). A `type: \"dashboard\"` page with exactly one\n\t// widget that fills the body grid AND references a custom registry\n\t// component is always a custom page in disguise — the wrapping\n\t// `CnDashboardPage` adds visible nesting on top of the custom view.\n\t// Counts widgets across ALL slots (a sidebar widget makes it\n\t// multi-widget). Every key the library renders itself is exempt —\n\t// those are legitimate full-page library widgets. The exempt set is\n\t// `LIBRARY_WIDGET_KEYS` (utils/libraryWidgetKeys.js), deliberately\n\t// not restated here: a second copy of a list is how the first one\n\t// went stale.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'dashboard') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!Array.isArray(page.widgets) || page.widgets.length !== 1) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst widget = page.widgets[0]\n\t\t\tif (!widget) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Normalise omitted grid coords against the body-slot defaults\n\t\t\t// (gridX/Y → 0, gridWidth/Height → 12) so authors cannot\n\t\t\t// circumvent the rule by omitting fields. Required-field\n\t\t\t// validation upstream means this is mostly defensive, but\n\t\t\t// keeps the rule correct under future schema relaxations.\n\t\t\tconst slot = widget.slot\n\t\t\tconst gx = typeof widget.gridX === 'number' ? widget.gridX : 0\n\t\t\tconst gy = typeof widget.gridY === 'number' ? widget.gridY : 0\n\t\t\tconst gw = typeof widget.gridWidth === 'number' ? widget.gridWidth : 12\n\t\t\tconst gh = typeof widget.gridHeight === 'number' ? widget.gridHeight : 12\n\t\t\tif (slot !== 'body' || gx !== 0 || gy !== 0 || gw !== 12 || gh !== 12) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst widgetKey = typeof widget.widgetKey === 'string' ? widget.widgetKey : ''\n\t\t\tif (!widgetKey || LIBRARY_BUILT_IN_WIDGET_KEYS.has(widgetKey)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' ? page.id : `[${pIndex}]`\n\t\t\terrors.push(`pages[${pageId}]/widgets[0]: pages[${pageId}] is type:\"dashboard\" with a single 12×12 custom widget — this is always a custom page in disguise.\\n`\n\t\t\t\t+ 'Valid alternatives:\\n'\n\t\t\t\t+ ` (a) declare as type:\"custom\" with component:\"${widgetKey}\" and register the component with kind:\"page\"\\n`\n\t\t\t\t+ ' (b) split into N>1 widgets if this is genuinely a multi-widget dashboard\\n'\n\t\t\t\t+ 'See ADR-036 Decision 1 (single-widget dashboard anti-pattern).')\n\t\t})\n\t}\n\n\t// 3a. Optional widget-id uniqueness within a page. The id is the delta\n\t// merge key, so duplicates would make a patch ambiguous.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst seen = new Set()\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || typeof widget.id !== 'string') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (seen.has(widget.id)) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]/id: \"${widget.id}\" must be unique within the page's widgets[]`)\n\t\t\t\t} else {\n\t\t\t\t\tseen.add(widget.id)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3b. Delta-only artefacts must not appear in a full (non-delta) manifest.\n\t// $op / __order are markers consumed by mergeManifestDelta; their\n\t// presence means a delta was loaded as a manifest. (props subtrees\n\t// are free-form user data and are not scanned.)\n\t(function walkReserved(node, path) {\n\t\tif (Array.isArray(node)) {\n\t\t\tnode.forEach((v, i) => walkReserved(v, `${path}[${i}]`))\n\t\t\treturn\n\t\t}\n\t\tif (!isPlainObject(node)) {\n\t\t\treturn\n\t\t}\n\t\tfor (const k of Object.keys(node)) {\n\t\t\tif (k === '$op' || k === '__order') {\n\t\t\t\terrors.push(`${path || ''}/${k}: reserved delta marker \"${k}\" is not allowed in a manifest (only inside a delta payload consumed by mergeManifestDelta)`)\n\t\t\t}\n\t\t\tif (k === 'props') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\twalkReserved(node[k], `${path}/${k}`)\n\t\t}\n\t})(clone, '')\n\n\t// 3c. Optional per-page config.slotColumns override shape (slot →\n\t// positive integer). A wrong shape silently falls back to defaults\n\t// at render time, so flag it here.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tconst sc = isPlainObject(page && page.config) ? page.config.slotColumns : undefined\n\t\t\tif (sc === undefined) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!isPlainObject(sc)) {\n\t\t\t\terrors.push(`pages[${pIndex}]/config/slotColumns: must be an object mapping slot name to a positive integer`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfor (const [slotName, value] of Object.entries(sc)) {\n\t\t\t\tif (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/config/slotColumns/${slotName}: must be a positive integer`)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 3d. stats-block dataSource | entries mutual exclusion. A multi-entry\n\t// stats-block (`props.entries[]`) declares one source PER entry, so a\n\t// widget-level `dataSource` (entry-level or `props.dataSource`) at the\n\t// same time is ambiguous — exactly one of the two forms is allowed.\n\t// Cross-field rule → post-schema check (clear message), matching the\n\t// gridX+gridWidth precedent. A stats-block with NEITHER is left to the\n\t// component (CnStatsBlockWidget flags it at mount time) because the\n\t// in-app widget editor legitimately creates not-yet-configured widgets.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || !Array.isArray(page.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || widget.widgetKey !== 'stats-block') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst props = isPlainObject(widget.props) ? widget.props : {}\n\t\t\t\tconst hasEntries = Array.isArray(props.entries) && props.entries.length > 0\n\t\t\t\tconst hasDataSource = (widget.dataSource !== undefined && widget.dataSource !== null)\n\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\tif (hasEntries && hasDataSource) {\n\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: stats-block widget declares BOTH a dataSource and props.entries[] — exactly one of the two source forms is allowed (single-KPI dataSource OR multi-entry entries[])`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 3e. endpointSource mutual exclusion (Wave 2, nextcloud-vue#91). Every\n\t// endpoint-capable widget binds to exactly ONE data source: the stat /\n\t// delta KPI tiles to `content.source` OR `content.endpointSource`, the\n\t// chart to `dataSource` OR `props.endpointSource`, the object-table to\n\t// `props.source` OR `props.endpointSource`. Cross-field rule →\n\t// post-schema check (clear message), matching the stats-block 3d\n\t// precedent. An OpenRegister source only counts when it is MEANINGFULLY\n\t// configured (register+schema, an endpoint kind, or a url) — the\n\t// in-app widget editor seeds stat/delta content with an EMPTY\n\t// `source: { register: '', schema: '', … }` blob, which must not trip\n\t// the rule when an endpointSource is added. Covers BOTH placements:\n\t// the v2 pages[].widgets[] grid (content under props.content) and the\n\t// legacy pages[].config.widgets[] dashboard catalog (content under\n\t// widget.content, chart inputs under widget.props).\n\tconst _hasConfiguredOrSource = (source) => isPlainObject(source) && (\n\t\t(typeof source.register === 'string' && source.register !== ''\n\t\t\t&& typeof source.schema === 'string' && source.schema !== '')\n\t\t|| source.kind === 'endpoint'\n\t\t|| typeof source.url === 'string'\n\t)\n\tconst _hasEndpointSource = (es) => isPlainObject(es)\n\t// Shared with the v1 path — see `validateChartBaseline`.\n\tconst _checkChartBaseline = (bag, path) => validateChartBaseline(bag, path, errors)\n\tconst _checkKpiContent = (content, path) => {\n\t\tif (!isPlainObject(content)) {\n\t\t\treturn\n\t\t}\n\t\tif (_hasConfiguredOrSource(content.source) && _hasEndpointSource(content.endpointSource)) {\n\t\t\terrors.push(`${path}: widget content declares BOTH a source and an endpointSource — exactly one of the two data bindings is allowed (OpenRegister source OR endpointSource)`)\n\t\t}\n\t}\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// v2 grid placement: pages[].widgets[]\n\t\t\tif (Array.isArray(page.widgets)) {\n\t\t\t\tpage.widgets.forEach((widget, wIndex) => {\n\t\t\t\t\tif (!widget) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst props = isPlainObject(widget.props) ? widget.props : {}\n\t\t\t\t\tif (widget.widgetKey === 'stat' || widget.widgetKey === 'delta') {\n\t\t\t\t\t\t_checkKpiContent(props.content, `pages[${pIndex}]/widgets[${wIndex}]`)\n\t\t\t\t\t}\n\t\t\t\t\tif (widget.widgetKey === 'chart') {\n\t\t\t\t\t\tconst hasDataSource = (widget.dataSource !== undefined && widget.dataSource !== null)\n\t\t\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\t\t\tif (hasDataSource && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: chart widget declares BOTH a dataSource and props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Both bags, in the same precedence CnDashboardPage's\n\t\t\t\t\t\t// getChartProps reads them: `content` (in-app editor) then `props`.\n\t\t\t\t\t\t_checkChartBaseline(props.content, `pages[${pIndex}]/widgets[${wIndex}]/props/content`)\n\t\t\t\t\t\t_checkChartBaseline(props, `pages[${pIndex}]/widgets[${wIndex}]/props`)\n\t\t\t\t\t}\n\t\t\t\t\tif (widget.widgetKey === 'object-table') {\n\t\t\t\t\t\tif (_hasConfiguredOrSource(props.source) && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/widgets[${wIndex}]: object-table widget declares BOTH a props.source and a props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\t// Legacy dashboard catalog placement: pages[].config.widgets[]\n\t\t\tconst legacy = page.config && Array.isArray(page.config.widgets) ? page.config.widgets : null\n\t\t\tif (legacy) {\n\t\t\t\tlegacy.forEach((def, wIndex) => {\n\t\t\t\t\tif (!def) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (def.type === 'stat' || def.type === 'delta') {\n\t\t\t\t\t\t_checkKpiContent(def.content, `pages[${pIndex}]/config/widgets[${wIndex}]`)\n\t\t\t\t\t}\n\t\t\t\t\tif (def.type === 'chart') {\n\t\t\t\t\t\tconst props = isPlainObject(def.props) ? def.props : {}\n\t\t\t\t\t\tconst hasDataSource = (def.dataSource !== undefined && def.dataSource !== null)\n\t\t\t\t\t\t\t|| (props.dataSource !== undefined && props.dataSource !== null)\n\t\t\t\t\t\tif (hasDataSource && _hasEndpointSource(props.endpointSource)) {\n\t\t\t\t\t\t\terrors.push(`pages[${pIndex}]/config/widgets[${wIndex}]: chart widget declares BOTH a dataSource and props.endpointSource — exactly one of the two data bindings is allowed`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_checkChartBaseline(def.content, `pages[${pIndex}]/config/widgets[${wIndex}]/content`)\n\t\t\t\t\t\t_checkChartBaseline(props, `pages[${pIndex}]/config/widgets[${wIndex}]/props`)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t// 4. @resolve: sentinel rejection on registry-key paths\n\tconst _v2Sentinel = /^@resolve:[a-z][a-z0-9_-]*$/\n\tif (typeof clone.version === 'string' && _v2Sentinel.test(clone.version)) {\n\t\terrors.push('/version must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)')\n\t}\n\tif (Array.isArray(clone.dependencies)) {\n\t\tclone.dependencies.forEach((dep, index) => {\n\t\t\t// String (HARD) or { id, required?, name? } (required:false = SOFT).\n\t\t\tconst id = typeof dep === 'string' ? dep : (dep && typeof dep === 'object' ? dep.id : null)\n\t\t\tif (typeof id === 'string' && _v2Sentinel.test(id)) {\n\t\t\t\terrors.push(`/dependencies/${index} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t})\n\t}\n\tif (Array.isArray(clone.menu)) {\n\t\tclone.menu.forEach((item, index) => {\n\t\t\tif (!item) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof item.id === 'string' && _v2Sentinel.test(item.id)) {\n\t\t\t\terrors.push(`/menu/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof item.route === 'string' && _v2Sentinel.test(item.route)) {\n\t\t\t\terrors.push(`/menu/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t})\n\t}\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (!page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst _isS = (v) => typeof v === 'string' && _v2Sentinel.test(v)\n\t\t\tif (_isS(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.route)) {\n\t\t\t\terrors.push(`/pages/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.component)) {\n\t\t\t\terrors.push(`/pages/${index}/component must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.headerComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/headerComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (_isS(page.actionsComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/actionsComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.slots && typeof page.slots === 'object') {\n\t\t\t\tfor (const [slotName, slotValue] of Object.entries(page.slots)) {\n\t\t\t\t\tif (_isS(slotValue)) {\n\t\t\t\t\t\terrors.push(`/pages/${index}/slots/${slotName} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// 5. Detail `config.sidebarTabs[]` SHAPE validation (id/label\n\t// presence + id uniqueness) the JSON schema can't fully express.\n\t// Only fires when `sidebarTabs` is present — in v2 it usually\n\t// is NOT: the `liftSidebarTabWidgets` migration strips it,\n\t// lifting each tab's widgets to `slot:\"sidebar\"` + a\n\t// self-declaring `tabGroup`. So the v1 `tabGroup → sidebarTabs[].id`\n\t// cross-reference is deliberately NOT run for v2 — an\n\t// undeclared `tabGroup` is the designed post-lift state, not an\n\t// orphan. (Wiki register/schema is likewise not enforced — wiki\n\t// content comes from the xwiki leaf integration; see\n\t// ConductionNL/nextcloud-vue#445.)\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, index) => {\n\t\t\tif (!page || page.type !== 'detail') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cfg = isPlainObject(page.config) ? page.config : null\n\t\t\tconst pathSlash = `/pages/${index}/config`\n\t\t\tconst pathBracket = `pages[${index}].config`\n\t\t\tvalidateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors)\n\t\t})\n\t}\n\n\t// 6. Dashboard custom-widget slot wiring (CnDashboardPage /\n\t// CnPageRenderer). A `type:\"dashboard\"` page wires each\n\t// `type:\"custom\"` widget in `config.widgets[]` to a registry\n\t// component through the PAGE-TOP-LEVEL `slots` map\n\t// (`{ \"widget-<id>\": \"<ComponentName>\" }`), which CnPageRenderer\n\t// reads as `page.slots` and turns into the `#widget-<id>` scoped\n\t// slots CnDashboardPage consumes. Two ways to get this wrong — both\n\t// pass JSON-schema validation (config is additionalProperties:true)\n\t// yet render every affected widget as the `unavailableLabel`\n\t// (\"Widget not available\") at runtime:\n\t// (a) the slots map nested under `config` (config.slots) — never\n\t// read by the renderer; must be a sibling of `config`.\n\t// (b) a custom widget with no slots entry at all.\n\t// Built-in widget types (stats-block, chart, tile, integration, …)\n\t// render via their own paths and need no slots entry, so only\n\t// `type:\"custom\"` is checked. Observed 2026-06-13 on\n\t// decidesk-dashboard-v2-layout: the slots map shipped under config,\n\t// so 9 of 11 widgets rendered the unavailable placeholder while\n\t// gate-22 (schema-only) reported the manifest clean.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'dashboard') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst config = isPlainObject(page.config) ? page.config : null\n\t\t\tif (!config || !Array.isArray(config.widgets)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' ? page.id : `[${pIndex}]`\n\t\t\tconst topSlots = isPlainObject(page.slots) ? page.slots : {}\n\t\t\tconst configSlots = isPlainObject(config.slots) ? config.slots : null\n\n\t\t\t// (a) slots map misplaced under config\n\t\t\tif (configSlots) {\n\t\t\t\terrors.push(`pages[${pageId}]/config/slots: the dashboard widget slots map must be at the page top level (pages[${pIndex}]/slots, a sibling of \"config\"), not under \"config\". `\n\t\t\t\t\t+ 'CnPageRenderer reads page.slots; a slots map under config is never wired, so every custom widget renders the unavailable placeholder. '\n\t\t\t\t\t+ 'Move \"slots\" up one level to sit beside \"config\".')\n\t\t\t}\n\n\t\t\t// (b) each custom widget needs a top-level slots entry\n\t\t\tconfig.widgets.forEach((widget, wIndex) => {\n\t\t\t\tif (!widget || widget.type !== 'custom') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst id = typeof widget.id === 'string' ? widget.id : null\n\t\t\t\tif (!id) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst slotKey = `widget-${id}`\n\t\t\t\tconst wiredTop = typeof topSlots[slotKey] === 'string' && topSlots[slotKey].length > 0\n\t\t\t\t// If it is (only) under config.slots, (a) already named the\n\t\t\t\t// real fix — don't double-report the same widget.\n\t\t\t\tconst underConfig = configSlots && typeof configSlots[slotKey] === 'string'\n\t\t\t\tif (!wiredTop && !underConfig) {\n\t\t\t\t\terrors.push(`pages[${pageId}]/config/widgets[${wIndex}]: custom widget \"${id}\" has no slot-component mapping at pages[${pIndex}]/slots[\"${slotKey}\"]. `\n\t\t\t\t\t\t+ `It will render the unavailable placeholder. Add \"${slotKey}\": \"<ComponentName>\" to the page-top-level slots map, or use a built-in widget type.`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// 7. Form logic (manifest-form-logic): cross-shape rules over\n\t// `type: \"form\"` pages' `config.steps[]` / `config.fields[].visibleWhen`\n\t// / `config.fields[].validation` that JSON Schema cannot express —\n\t// step id uniqueness, step→field key reference integrity, complete\n\t// step/field partition, min<=max, pattern compilability,\n\t// type-inapplicable rules, and LOCAL visibleWhen field-ref resolution.\n\t// The v2 path does not call validateTypeConfig(); the v1 `form`\n\t// branch is untouched.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'form') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst config = isPlainObject(page.config) ? page.config : null\n\t\t\tif (!config) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pathBase = `/pages/${pIndex}/config`\n\n\t\t\tconst fieldList = Array.isArray(config.fields) ? config.fields : []\n\t\t\tconst declaredKeys = new Set(fieldList\n\t\t\t\t.filter((f) => f && typeof f.key === 'string')\n\t\t\t\t.map((f) => f.key))\n\t\t\t// steps[] cross-shape rules\n\t\t\tif (Array.isArray(config.steps)) {\n\t\t\t\tconst seenStepIds = new Set()\n\t\t\t\tconst assignmentCount = new Map()\n\t\t\t\tconfig.steps.forEach((step, sIndex) => {\n\t\t\t\t\tif (!step) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof step.id === 'string') {\n\t\t\t\t\t\tif (seenStepIds.has(step.id)) {\n\t\t\t\t\t\t\terrors.push(`${pathBase}/steps[${sIndex}]/id: duplicate step id \"${step.id}\" — step ids must be unique within the page`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tseenStepIds.add(step.id)\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(step.fields)) {\n\t\t\t\t\t\tstep.fields.forEach((key, fIndex) => {\n\t\t\t\t\t\t\tif (typeof key !== 'string' || !declaredKeys.has(key)) {\n\t\t\t\t\t\t\t\terrors.push(`${pathBase}/steps[${sIndex}]/fields[${fIndex}]: \"${key}\" does not match any declared config.fields[].key`)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tassignmentCount.set(key, (assignmentCount.get(key) || 0) + 1)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// Complete partition: every declared field key MUST appear in\n\t\t\t\t// exactly one step.\n\t\t\t\tconst unassigned = []\n\t\t\t\tconst duplicated = []\n\t\t\t\tdeclaredKeys.forEach((key) => {\n\t\t\t\t\tconst count = assignmentCount.get(key) || 0\n\t\t\t\t\tif (count === 0) {\n\t\t\t\t\t\tunassigned.push(key)\n\t\t\t\t\t} else if (count > 1) {\n\t\t\t\t\t\tduplicated.push(key)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (unassigned.length > 0) {\n\t\t\t\t\terrors.push(`${pathBase}/steps: field key(s) ${unassigned.map((k) => `\"${k}\"`).join(', ')} are not assigned to any step — every declared field must appear in exactly one step when steps is present`)\n\t\t\t\t}\n\t\t\t\tif (duplicated.length > 0) {\n\t\t\t\t\terrors.push(`${pathBase}/steps: field key(s) ${duplicated.map((k) => `\"${k}\"`).join(', ')} are assigned to more than one step — every declared field must appear in exactly one step`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fields[].validation / fields[].visibleWhen cross-shape rules\n\t\t\tfieldList.forEach((field, fIndex) => {\n\t\t\t\tif (!field || typeof field !== 'object') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst fieldPath = `${pathBase}/fields[${fIndex}]`\n\t\t\t\tconst fieldType = field.type\n\n\t\t\t\tconst validation = isPlainObject(field.validation) ? field.validation : null\n\t\t\t\tif (validation) {\n\t\t\t\t\tif (typeof validation.min === 'number' && typeof validation.max === 'number' && validation.min > validation.max) {\n\t\t\t\t\t\terrors.push(`${fieldPath}/validation: min (${validation.min}) must be <= max (${validation.max})`)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof validation.pattern === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tnew RegExp(validation.pattern)\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/pattern: \"${validation.pattern}\" does not compile as a regular expression (${e.message})`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fieldType !== 'string' && fieldType !== 'password') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/pattern: pattern only applies to string/password fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst boundsApplicable = fieldType === 'string' || fieldType === 'password' || fieldType === 'number'\n\t\t\t\t\tif (!boundsApplicable) {\n\t\t\t\t\t\tif (typeof validation.min === 'number') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/min: min only applies to string/password/number fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof validation.max === 'number') {\n\t\t\t\t\t\t\terrors.push(`${fieldPath}/validation/max: max only applies to string/password/number fields, not \"${fieldType}\"`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst visibleWhen = isPlainObject(field.visibleWhen) ? field.visibleWhen : null\n\t\t\t\tif (visibleWhen && !visibleWhen.endpoint && !visibleWhen.source && typeof visibleWhen.field === 'string') {\n\t\t\t\t\tconst firstSegment = visibleWhen.field.split('.')[0]\n\t\t\t\t\tif (!declaredKeys.has(firstSegment)) {\n\t\t\t\t\t\terrors.push(`${fieldPath}/visibleWhen/field: \"${firstSegment}\" does not match any declared config.fields[].key`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// N. A files browser's `columns` may name a built-in or declare its own.\n\t// A string naming no built-in is refused here, with the page and the\n\t// name in the message: dropping it silently would look like a column\n\t// that failed to load rather than a name that does not exist.\n\tif (Array.isArray(clone.pages)) {\n\t\tconst builtIns = Object.keys(BUILT_IN_FILE_COLUMNS)\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tif (!page || page.type !== 'files' || !isPlainObject(page.config) || !Array.isArray(page.config.columns)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst pageId = typeof page.id === 'string' && page.id !== '' ? page.id : `pages[${pIndex}]`\n\t\t\tpage.config.columns.forEach((entry, cIndex) => {\n\t\t\t\tconst at = `pages[${pIndex}]/config/columns/${cIndex}`\n\t\t\t\tif (typeof entry === 'string') {\n\t\t\t\t\tif (!builtIns.includes(entry)) {\n\t\t\t\t\t\terrors.push(`${at}: \"${pageId}\" names no built-in column \"${entry}\". The built-ins are ${builtIns.join(', ')}; declare an object with key, label and source for anything else`)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!isPlainObject(entry) || typeof entry.key !== 'string' || entry.key === '') {\n\t\t\t\t\terrors.push(`${at}: \"${pageId}\" has a column that is neither a built-in name nor an object with a key`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (entry.source !== undefined && !['node', 'attribute', 'row'].includes(entry.source)) {\n\t\t\t\t\terrors.push(`${at}/source: \"${pageId}\" column \"${entry.key}\" has source \"${entry.source}\"; it must be node, attribute or row`)\n\t\t\t\t}\n\t\t\t\tif (entry.source === 'attribute' && (typeof entry.attribute !== 'string' || entry.attribute === '')) {\n\t\t\t\t\terrors.push(`${at}/attribute: \"${pageId}\" column \"${entry.key}\" reads a DAV property but names none`)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t// N. A `folderSidebar` scope may narrow and reorder the page's columns, not\n\t// add to them. `config.columns` is the page's declaration of which\n\t// columns it HAS; a scope entry decides which of them it shows. So a\n\t// scope naming a key the page does not declare is refused here, rather\n\t// than silently dropped at render time — a scope written before a column\n\t// was taken out of the page would otherwise look like it still worked.\n\t// A page declaring no columns derives them from its schema at runtime,\n\t// which this validator cannot see, so there is nothing to measure a\n\t// scope against and the check stays silent instead of guessing.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tconst config = page && isPlainObject(page.config) ? page.config : null\n\t\t\tconst sidebar = config && isPlainObject(config.folderSidebar) ? config.folderSidebar : null\n\t\t\tif (!sidebar || !Array.isArray(sidebar.folders) || !Array.isArray(config.columns) || config.columns.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst declaredKeyList = config.columns\n\t\t\t\t.map((col) => (typeof col === 'string' ? col : (col && typeof col.key === 'string' ? col.key : '')))\n\t\t\t\t.filter((key) => key !== '')\n\t\t\tconst declared = new Set(declaredKeyList)\n\t\t\tsidebar.folders.forEach((scope, sIndex) => {\n\t\t\t\tif (!isPlainObject(scope) || !Array.isArray(scope.columns)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst scopeId = typeof scope.id === 'string' && scope.id !== '' ? scope.id : `folders[${sIndex}]`\n\t\t\t\tscope.columns.forEach((col, cIndex) => {\n\t\t\t\t\tconst key = typeof col === 'string' ? col : (col && typeof col.key === 'string' ? col.key : '')\n\t\t\t\t\tif (key !== '' && !declared.has(key)) {\n\t\t\t\t\t\terrors.push(`pages[${pIndex}]/config/folderSidebar/folders/${sIndex}/columns/${cIndex}: scope \"${scopeId}\" names column \"${key}\", which pages[${pIndex}].config.columns does not declare`)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t// --- Post-schema warnings (never affect `valid`) ---\n\tconst warnings = []\n\n\t// W1. Row action placement on an index page: a placeholder whose built-in the manifest turns off, and the built-in Delete placed before other row actions.\n\t// An entitySource page is skipped: its built-in defaults depend on the source at runtime.\n\tif (Array.isArray(clone.pages)) {\n\t\tclone.pages.forEach((page, pIndex) => {\n\t\t\tconst config = page && page.type === 'index' && isPlainObject(page.config) ? page.config : null\n\t\t\tif (!config || !Array.isArray(config.actions) || typeof config.entitySource === 'string') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst resolved = resolveRowActions(config.actions, indexPageBuiltinStubs(config))\n\t\t\tfor (const warning of resolved.warnings) {\n\t\t\t\tif (warning.code === 'disabled-placeholder') {\n\t\t\t\t\twarnings.push(`pages[${pIndex}]/config/actions: ${warning.message}`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (resolved.deleteNotLast) {\n\t\t\t\twarnings.push(`pages[${pIndex}]/config/actions: \"builtin:delete\" is not the last row action in the rendered order (enabled built-ins the array does not place are appended after it); Delete is normally last`)\n\t\t\t}\n\t\t})\n\t}\n\n\treturn { valid: errors.length === 0, errors, warnings }\n}\n\n/**\n * The built-in row actions an index page enables, as `{ id, builtin, label }` stubs in default order.\n * They are read from its config the way CnPageRenderer derives the show*Action props: an explicit `config.show*Action` wins over `config.actionToggles`, and `config.readOnly: true` turns Edit, Copy and Delete off by default.\n * A non-boolean value counts as the default.\n *\n * @param {object} config The page's config.\n * @return {Array<{id: string, builtin: true, label: string}>} The enabled built-ins.\n */\nfunction indexPageBuiltinStubs(config) {\n\tconst toggles = isPlainObject(config.actionToggles) ? config.actionToggles : {}\n\tconst flag = (key, readOnlyOff) => {\n\t\tif (typeof config[key] === 'boolean') {\n\t\t\treturn config[key]\n\t\t}\n\t\tif (typeof toggles[key] === 'boolean') {\n\t\t\treturn toggles[key]\n\t\t}\n\t\treturn !(readOnlyOff && config.readOnly === true)\n\t}\n\treturn [\n\t\t['view', flag('showViewAction', false)],\n\t\t['edit', flag('showEditAction', true)],\n\t\t['copy', flag('showCopyAction', true)],\n\t\t['delete', flag('showDeleteAction', true)],\n\t].filter(([, on]) => on).map(([id]) => ({ id, builtin: true, label: id }))\n}\n\n/**\n * Pattern matching the `manifest-resolve-sentinel` capability's\n * sentinel — `@resolve:<key>` where `<key>` is lowercase alphanumeric\n * with `_` / `-` separators. The full string IS the sentinel; partial\n * substitution like `prefix-@resolve:foo` is NOT supported and is left\n * as a plain string for downstream renderers.\n *\n * Build-time validation accepts this pattern as a valid `string` for\n * any `string`-typed field UNDER `pages[].config`, regardless of any\n * narrower per-field constraint. Other paths reject it explicitly.\n */\nconst SENTINEL_PATTERN = /^@resolve:[a-z][a-z0-9_-]*$/\n\n/**\n * Test whether a string is a manifest `@resolve:` sentinel.\n *\n * @param {unknown} value Candidate value.\n * @return {boolean} True when the value is a fully-matched sentinel.\n */\nfunction isSentinel(value) {\n\treturn typeof value === 'string' && SENTINEL_PATTERN.test(value)\n}\n\n/**\n * Validate a manifest object against the manifest JSON Schema.\n *\n * Hand-rolled minimal validator covering the rules required by\n * REQ-JMR-001 of the json-manifest-renderer spec:\n * - Top-level `version`, `menu`, `pages` are required.\n * - `version` matches the semver pattern.\n * - `pages[].type` is a non-empty string. Whether the type resolves\n * to a real component is checked by CnPageRenderer at render time\n * against the consumer-resolved `pageTypes` map; the validator\n * cannot enforce that without knowing the runtime registry.\n * - `pages[].id` is unique across the array.\n * - Required fields on menu items and pages are present.\n * - `dependencies` (when present) is an array of strings.\n * - `pages[].component` is required when `type` is \"custom\".\n * - Per-type `config` shape rules for the built-in types `logs`,\n * `settings`, `chat`, `files` (REQ from manifest-page-type-extensions).\n * - The `manifest-resolve-sentinel` sentinel `@resolve:<key>` is\n * permissively accepted under `pages[].config.*` and explicitly\n * REJECTED in `version`, `dependencies[]`, `menu[].route`,\n * `menu[].id`, `pages[].id`, `pages[].route`, `pages[].component`,\n * `pages[].headerComponent`, `pages[].actionsComponent`,\n * `pages[].slots.*` — those are router invariants or registry\n * keys.\n *\n * The richer schema constraints (`additionalProperties: false`, `format`\n * URI, etc.) are enforced by the BE / hydra CI validators that consume\n * the same schema file with Ajv. The FE validator is intentionally\n * narrow so a FE-only failure produces tight, actionable messages.\n *\n * @param {object} manifest The manifest object to validate.\n * @param {object} [options] Optional validation options.\n * @param {Array<string>} [options.allowedTypes] When provided, restrict\n * the allowed `pages[].type` values to this list (plus `\"custom\"`).\n * Useful in CI / build-time checks where the consumer's full\n * `pageTypes` registry is known up-front. When omitted, any\n * non-empty string is accepted; the runtime renderer logs a warning\n * for unknown types.\n * @return {{ valid: boolean, errors: string[], warnings?: string[] }} A v2 manifest also gets `warnings`, which never affect `valid`.\n */\nexport function validateManifest(manifest, options = {}) {\n\t// Dispatch to v2 validator when the manifest declares a v2 $schema.\n\tif (manifest && typeof manifest === 'object' && typeof manifest.$schema === 'string') {\n\t\tif (manifest.$schema.endsWith(V2_SCHEMA_SUFFIX)) {\n\t\t\treturn validateManifestV2(manifest)\n\t\t}\n\t\t// $schema present but doesn't match any known schema URL —\n\t\t// warn once and fall through to v1 validator.\n\t\tconst knownV1Suffix = '/app-manifest.schema.json'\n\t\tif (!manifest.$schema.endsWith(knownV1Suffix)) {\n\t\t\tif (!_unknownSchemaWarned) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`[validateManifest] Unknown $schema URL \"${manifest.$schema}\". `\n\t\t\t\t\t+ 'Expected one of: app-manifest.schema.json (v1) or app-manifest-v2.schema.json (v2). '\n\t\t\t\t\t+ 'Falling back to v1 validator.')\n\t\t\t\t_unknownSchemaWarned = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst errors = []\n\n\tif (!isPlainObject(manifest)) {\n\t\treturn { valid: false, errors: ['manifest must be an object'] }\n\t}\n\n\tconst versionPattern = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/\n\n\tif (typeof manifest.version !== 'string') {\n\t\terrors.push('/version must be a string')\n\t} else if (isSentinel(manifest.version)) {\n\t\t// `manifest-resolve-sentinel` REQ-MRS-004: sentinel is a router /\n\t\t// registry invariant violation when used here.\n\t\terrors.push(`/version \"${manifest.version}\" must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t} else if (!versionPattern.test(manifest.version)) {\n\t\terrors.push(`/version \"${manifest.version}\" must match semver pattern`)\n\t}\n\n\tif (!Array.isArray(manifest.menu)) {\n\t\terrors.push('/menu must be an array')\n\t} else {\n\t\tmanifest.menu.forEach((item, index) => {\n\t\t\tif (!isPlainObject(item)) {\n\t\t\t\terrors.push(`/menu/${index} must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof item.id !== 'string') {\n\t\t\t\terrors.push(`/menu/${index}/id must be a string`)\n\t\t\t} else if (isSentinel(item.id)) {\n\t\t\t\terrors.push(`/menu/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof item.label !== 'string') {\n\t\t\t\terrors.push(`/menu/${index}/label must be a string`)\n\t\t\t}\n\t\t\tif (item.route !== undefined && isSentinel(item.route)) {\n\t\t\t\terrors.push(`/menu/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (item.children !== undefined && !Array.isArray(item.children)) {\n\t\t\t\terrors.push(`/menu/${index}/children must be an array`)\n\t\t\t}\n\t\t\tvalidateMenuAction(item, `/menu/${index}`, errors)\n\t\t\t// `visibleIf` validation — when set, must be a plain object;\n\t\t\t// the only known sub-key is `appInstalled` (non-empty string).\n\t\t\tvalidateMenuItemVisibleIf(item.visibleIf, `/menu/${index}/visibleIf`, errors)\n\t\t\t// Also validate visibleIf and action on children when present.\n\t\t\tif (Array.isArray(item.children)) {\n\t\t\t\titem.children.forEach((child, cIndex) => {\n\t\t\t\t\tif (isPlainObject(child)) {\n\t\t\t\t\t\tvalidateMenuAction(child, `/menu/${index}/children/${cIndex}`, errors)\n\t\t\t\t\t\tvalidateMenuItemVisibleIf(\n\t\t\t\t\t\t\tchild.visibleIf,\n\t\t\t\t\t\t\t`/menu/${index}/children/${cIndex}/visibleIf`,\n\t\t\t\t\t\t\terrors,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t// `runtime` is optional; when present it MUST be a plain object.\n\t// The validator does not constrain its shape beyond that — the\n\t// contract lives in the schema description and the OR backend.\n\tif (manifest.runtime !== undefined && !isPlainObject(manifest.runtime)) {\n\t\terrors.push('/runtime must be an object when set')\n\t}\n\n\tconst allowedTypes = Array.isArray(options.allowedTypes)\n\t\t? Array.from(new Set([...options.allowedTypes, 'custom']))\n\t\t: null\n\n\tif (!Array.isArray(manifest.pages)) {\n\t\terrors.push('/pages must be an array')\n\t} else {\n\t\tconst seenIds = new Set()\n\t\tmanifest.pages.forEach((page, index) => {\n\t\t\tif (!isPlainObject(page)) {\n\t\t\t\terrors.push(`/pages/${index} must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof page.id !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/id must be a string`)\n\t\t\t} else if (isSentinel(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t} else if (seenIds.has(page.id)) {\n\t\t\t\terrors.push(`/pages/${index}/id \"${page.id}\" must be unique within pages[]`)\n\t\t\t} else {\n\t\t\t\tseenIds.add(page.id)\n\t\t\t}\n\t\t\tif (typeof page.route !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/route must be a string`)\n\t\t\t} else if (isSentinel(page.route)) {\n\t\t\t\terrors.push(`/pages/${index}/route must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (typeof page.title !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/title must be a string`)\n\t\t\t}\n\t\t\tif (typeof page.type !== 'string' || page.type.length === 0) {\n\t\t\t\terrors.push(`/pages/${index}/type must be a non-empty string`)\n\t\t\t} else if (allowedTypes && !allowedTypes.includes(page.type)) {\n\t\t\t\terrors.push(`/pages/${index}/type \"${page.type}\" must be one of: ${allowedTypes.join(', ')}`)\n\t\t\t}\n\t\t\tif (page.type === 'custom' && typeof page.component !== 'string') {\n\t\t\t\terrors.push(`/pages/${index}/component is required when type is \"custom\"`)\n\t\t\t}\n\t\t\t// `manifest-resolve-sentinel` REQ-MRS-004: registry-key\n\t\t\t// fields cannot be dynamic — they resolve at module-load\n\t\t\t// time against `customComponents`, before the loader runs.\n\t\t\tif (page.component !== undefined && isSentinel(page.component)) {\n\t\t\t\terrors.push(`/pages/${index}/component must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.headerComponent !== undefined && isSentinel(page.headerComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/headerComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (page.actionsComponent !== undefined && isSentinel(page.actionsComponent)) {\n\t\t\t\terrors.push(`/pages/${index}/actionsComponent must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t}\n\t\t\tif (isPlainObject(page.slots)) {\n\t\t\t\tfor (const [slotName, slotValue] of Object.entries(page.slots)) {\n\t\t\t\t\tif (isSentinel(slotValue)) {\n\t\t\t\t\t\terrors.push(`/pages/${index}/slots/${slotName} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `sidebarComponent` (per-page named-view sidebar swap) MUST\n\t\t\t// be a non-empty string when set. Free-form otherwise — the\n\t\t\t// registry-membership check is a runtime concern handled by\n\t\t\t// CnPageRenderer (console.warn + fall-through). See\n\t\t\t// manifest-named-view-sidebar spec REQ-MNVS-1.\n\t\t\tif (page.sidebarComponent !== undefined) {\n\t\t\t\tif (typeof page.sidebarComponent !== 'string' || page.sidebarComponent.length === 0) {\n\t\t\t\t\terrors.push(`/pages/${index}/sidebarComponent must be a non-empty string`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Per-type config-shape validation for built-in extended types.\n\t\t\t// (`manifest-page-type-extensions` spec — covers logs/settings/chat/files;\n\t\t\t// `manifest-map-widget` spec adds `map`.)\n\t\t\tvalidateTypeConfig(page, index, errors)\n\n\t\t\t// Manifest-driven sidebar config — additive validation\n\t\t\t// (`manifest-abstract-sidebar` spec — covers index sidebar + detail sidebar tabs).\n\t\t\tvalidateSidebarConfig(page, index, errors)\n\n\t\t\t// Per-page top-level sidebar visibility flag — additive validation\n\t\t\t// (`manifest-detail-sidebar-config` spec — sibling of config,\n\t\t\t// applies to every page type).\n\t\t\tvalidatePageSidebar(page, index, errors)\n\n\t\t\t// Per-page soft-dependency gate. Validated rather than ignored\n\t\t\t// because a typo here fails OPEN: an unrecognised key is simply\n\t\t\t// not read, the gate never fires, and the page renders an empty\n\t\t\t// list that looks like \"no data\" instead of \"install the app\".\n\t\t\tvalidatePageRequiresApp(page, index, errors)\n\t\t})\n\t}\n\n\tif (manifest.dependencies !== undefined) {\n\t\tif (!Array.isArray(manifest.dependencies)) {\n\t\t\terrors.push('/dependencies must be an array of strings or { id, required?, name? } objects')\n\t\t} else {\n\t\t\tmanifest.dependencies.forEach((dep, index) => {\n\t\t\t\t// HARD/SOFT dependency model: an entry is either a string\n\t\t\t\t// (HARD) or an object { id, required?, name? } (required:false\n\t\t\t\t// = SOFT). See REQ-DIA-4.\n\t\t\t\tif (typeof dep === 'string') {\n\t\t\t\t\tif (isSentinel(dep)) {\n\t\t\t\t\t\terrors.push(`/dependencies/${index} must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t} else if (dep && typeof dep === 'object' && !Array.isArray(dep)) {\n\t\t\t\t\tif (typeof dep.id !== 'string' || dep.id === '') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/id must be a non-empty string`)\n\t\t\t\t\t} else if (isSentinel(dep.id)) {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/id must not be a @resolve: sentinel (sentinels are only valid under pages[].config.*)`)\n\t\t\t\t\t}\n\t\t\t\t\tif (dep.required !== undefined && typeof dep.required !== 'boolean') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/required must be a boolean`)\n\t\t\t\t\t}\n\t\t\t\t\tif (dep.name !== undefined && typeof dep.name !== 'string') {\n\t\t\t\t\t\terrors.push(`/dependencies/${index}/name must be a string`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(`/dependencies/${index} must be a string or a { id, required?, name? } object`)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors }\n}\n\nfunction isPlainObject(value) {\n\treturn value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n// The accepted `type` values for `fields[]` entries: the settings-page set,\n// and the form-page set, which also accepts `file` (see validateFieldsArray).\nconst FORM_FIELD_TYPES = ['boolean', 'number', 'string', 'enum', 'password', 'json']\nconst FORM_PAGE_FIELD_TYPES = [...FORM_FIELD_TYPES, 'file']\n\n/**\n * Validate a page's `config` object against per-type rules for the\n * built-in extended types: `logs`, `settings`, `chat`, `files`, `map`.\n *\n * Skips silently for any other type (including the original\n * `index | detail | dashboard | custom`) — those have free-form\n * `config` and are validated by their target component at runtime.\n *\n * Errors include both the JSON-path style (`/pages/N/config/...`) and\n * the bracket-style hint (`pages[N].config: ...`) from the\n * manifest-page-type-extensions spec scenarios so consumers searching\n * for either form find the message.\n *\n * @param {object} page The page entry being validated.\n * @param {number} index The page's index in `pages[]`.\n * @param {string[]} errors The error array to push to (mutated).\n */\nfunction validateTypeConfig(page, index, errors) {\n\tif (!page || typeof page.type !== 'string') {\n\t\treturn\n\t}\n\tconst cfg = isPlainObject(page.config) ? page.config : null\n\tconst pathBracket = `pages[${index}].config`\n\tconst pathSlash = `/pages/${index}/config`\n\n\tswitch (page.type) {\n\t\tcase 'index': {\n\t\t// `manifest-config-refs` REQ-MCR — surface column / action shape\n\t\t// errors with sharp messages so consumers can locate the offending\n\t\t// field. Both arrays are OPTIONAL; only validated when present.\n\t\t\tvalidateColumnsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateActionsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\t// `manifest-index-action-toggles` — typed config.actions block.\n\t\t\t// Schema-validated, but cross-check structure here for sharp\n\t\t\t// error paths (consumer typo in actions.<key> surfaces with\n\t\t\t// the path rather than a JSON Schema enum mismatch).\n\t\t\tvalidateIndexActionToggles(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'detail': {\n\t\t// `manifest-detail-sidebartabs` — typed validation for the\n\t\t// human-authored sidebar-tab declaration. Tab entries lift to\n\t\t// `widgets[]` with `slot:\"sidebar\"` + `tabGroup` via the CLI\n\t\t// transform; this validator catches authoring mistakes (missing\n\t\t// id/label, duplicate ids, non-array shape) before that.\n\t\t\tvalidateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateSidebarTabGroupRefs(page, index, errors)\n\t\t\t// `manifest-public-mode` — type='detail' supports the same\n\t\t\t// mode enum (`edit | create | public`) as type='form'. The\n\t\t\t// 'public' value marks unauthenticated token-scoped detail\n\t\t\t// pages — pair with @route.<param> token binding.\n\t\t\tvalidateConfigMode(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'logs': {\n\t\t\tconst hasRegisterSchema = cfg && typeof cfg.register === 'string' && typeof cfg.schema === 'string'\n\t\t\tconst hasSource = cfg && typeof cfg.source === 'string'\n\t\t\tif (!hasRegisterSchema && !hasSource) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare register+schema or source`)\n\t\t\t}\n\t\t\t// Same column shorthand support as index.\n\t\t\tvalidateColumnsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'dashboard': {\n\t\t// `manifest-config-refs` REQ-MCR — surface widgetDef / layoutItem\n\t\t// shape errors. Both arrays are OPTIONAL; only validated when\n\t\t// present.\n\t\t\tvalidateWidgetsArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tvalidateLayoutArray(cfg, pathSlash, pathBracket, errors)\n\t\t\t// `manifest-widget-ref-page-content-type` — validate the\n\t\t\t// declarative content[] array. Each item MUST be a `widget-ref`\n\t\t\t// object with a valid `ref` URI. OPTIONAL — only validated when\n\t\t\t// the `content` key is present.\n\t\t\tvalidateContentArray(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'settings': {\n\t\t// `manifest-settings-orchestration` REQ-MSO-1: a settings page\n\t\t// MUST declare EXACTLY ONE of `sections` | `tabs`. When both\n\t\t// are set, emit the orchestration mutex error. When neither is\n\t\t// set, fall through to the legacy `sections required` error\n\t\t// (back-compat — REQ-MSO-7 / REQ-MSO-1 last scenario).\n\t\t\tconst hasSections = cfg && Array.isArray(cfg.sections)\n\t\t\tconst hasTabs = cfg && Array.isArray(cfg.tabs)\n\n\t\t\tif (hasSections && hasTabs) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare exactly one of sections | tabs`)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif (hasTabs) {\n\t\t\t// `manifest-settings-orchestration` REQ-MSO-2..4: validate\n\t\t\t// the `tabs[]` orchestration shape.\n\t\t\t\tif (cfg.tabs.length === 0) {\n\t\t\t\t\terrors.push(`${pathSlash}/tabs: ${pathBracket}.tabs: must contain at least 1 tab`)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tconst seenTabIds = Object.create(null)\n\t\t\t\tcfg.tabs.forEach((tab, tIndex) => {\n\t\t\t\t\tif (!isPlainObject(tab)) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}: must be an object`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/id: required, must be a non-empty string`)\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/label: required, must be a non-empty string`)\n\t\t\t\t\t}\n\t\t\t\t\t// REQ-MSO-3: tab IDs must be unique within a page.\n\t\t\t\t\tif (typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\t\t\t\tif (seenTabIds[tab.id]) {\n\t\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/id: ${pathBracket}.tabs[${tIndex}].id: duplicate id \"${tab.id}\" — tab IDs must be unique within a page`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tseenTabIds[tab.id] = true\n\t\t\t\t\t}\n\t\t\t\t\t// `tab.sections` MUST be a non-empty array.\n\t\t\t\t\tif (!Array.isArray(tab.sections)) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/sections: ${pathBracket}.tabs[${tIndex}].sections: required, must be an array`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (tab.sections.length === 0) {\n\t\t\t\t\t\terrors.push(`${pathSlash}/tabs/${tIndex}/sections: ${pathBracket}.tabs[${tIndex}].sections: must contain at least 1 section`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t// REQ-MSO-4: each tab's sections follow the same rules\n\t\t\t\t\t// as the flat case — share the per-section validator.\n\t\t\t\t\ttab.sections.forEach((section, sIndex) => {\n\t\t\t\t\t\tvalidateSettingsSection(\n\t\t\t\t\t\t\tsection,\n\t\t\t\t\t\t\t`${pathSlash}/tabs/${tIndex}/sections/${sIndex}`,\n\t\t\t\t\t\t\t`${pathBracket}.tabs[${tIndex}].sections[${sIndex}]`,\n\t\t\t\t\t\t\terrors,\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// Flat `sections[]` (existing path — REQ-MSRS-* + back-compat).\n\t\t\tif (!hasSections) {\n\t\t\t\terrors.push(`${pathSlash}/sections: ${pathBracket}.sections: required, must be an array`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (cfg.sections.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/sections: ${pathBracket}.sections: must contain at least 1 section`)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcfg.sections.forEach((section, sIndex) => {\n\t\t\t\tvalidateSettingsSection(\n\t\t\t\t\tsection,\n\t\t\t\t\t`${pathSlash}/sections/${sIndex}`,\n\t\t\t\t\t`${pathBracket}.sections[${sIndex}]`,\n\t\t\t\t\terrors,\n\t\t\t\t)\n\t\t\t})\n\t\t\tbreak\n\t\t}\n\t\tcase 'chat': {\n\t\t\tconst hasConversationSource = cfg && typeof cfg.conversationSource === 'string'\n\t\t\tconst hasPostUrl = cfg && typeof cfg.postUrl === 'string'\n\t\t\tif (!hasConversationSource && !hasPostUrl) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare conversationSource or postUrl`)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'files': {\n\t\t\tif (!cfg || typeof cfg.folder !== 'string' || cfg.folder.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/folder: ${pathBracket}.folder: required`)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'form': {\n\t\t// `manifest-form-page-type` REQ-MFPT-* — runtime form pages\n\t\t// MUST declare a non-empty fields[] array and exactly one of\n\t\t// submitHandler | submitEndpoint as the dispatch destination.\n\t\t// Optional submitMethod and mode are constrained to closed\n\t\t// enums so manifest typos surface at validate time.\n\t\t\tconst hasFields = cfg && Array.isArray(cfg.fields) && cfg.fields.length > 0\n\t\t\tif (!hasFields) {\n\t\t\t\terrors.push(`${pathSlash}/fields: ${pathBracket}: form pages must declare a non-empty fields[] array`)\n\t\t\t} else {\n\t\t\t\tvalidateFieldsArray(cfg.fields, `${pathSlash}/fields`, errors, FORM_PAGE_FIELD_TYPES)\n\t\t\t}\n\n\t\t\tconst hasHandler = cfg && typeof cfg.submitHandler === 'string' && cfg.submitHandler.length > 0\n\t\t\tconst hasEndpoint = cfg && typeof cfg.submitEndpoint === 'string' && cfg.submitEndpoint.length > 0\n\t\t\tconst dispatchCount = (hasHandler ? 1 : 0) + (hasEndpoint ? 1 : 0)\n\t\t\tif (dispatchCount !== 1) {\n\t\t\t\terrors.push(`${pathSlash}: ${pathBracket}: form pages must declare exactly one of submitHandler | submitEndpoint`)\n\t\t\t}\n\n\t\t\tif (cfg && cfg.submitMethod !== undefined) {\n\t\t\t\tconst allowed = ['POST', 'PUT', 'PATCH']\n\t\t\t\tconst upper = typeof cfg.submitMethod === 'string' ? cfg.submitMethod.toUpperCase() : null\n\t\t\t\tif (!upper || !allowed.includes(upper)) {\n\t\t\t\t\terrors.push(`${pathSlash}/submitMethod: ${pathBracket}.submitMethod: must be one of POST | PUT | PATCH`)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvalidateConfigMode(cfg, pathSlash, pathBracket, errors)\n\t\t\tbreak\n\t\t}\n\t\tcase 'map': {\n\t\t// `manifest-map-widget` REQ-MMW-* — Leaflet map pages MUST\n\t\t// declare a length-2 finite-number `center`; `layers[]`\n\t\t// entries MUST have a closed-enum `type` and (except inline\n\t\t// geojson) a non-empty `url`; `markers.dataSource` MUST\n\t\t// declare exactly one of `url` OR `register + schema`.\n\t\t\tconst allowedLayerTypes = ['tile', 'wms', 'wfs', 'geojson']\n\t\t\tconst center = cfg && cfg.center\n\t\t\tconst validCenter = Array.isArray(center)\n\t\t\t\t&& center.length === 2\n\t\t\t\t&& center.every((n) => typeof n === 'number' && Number.isFinite(n))\n\t\t\tif (!validCenter) {\n\t\t\t\terrors.push(`${pathSlash}/center: ${pathBracket}.center: must be a length-2 array of finite numbers`)\n\t\t\t}\n\t\t\tif (cfg && cfg.zoom !== undefined && (typeof cfg.zoom !== 'number' || !Number.isFinite(cfg.zoom))) {\n\t\t\t\terrors.push(`${pathSlash}/zoom: ${pathBracket}.zoom: must be a finite number`)\n\t\t\t}\n\t\t\tif (cfg && cfg.layers !== undefined) {\n\t\t\t\tif (!Array.isArray(cfg.layers)) {\n\t\t\t\t\terrors.push(`${pathSlash}/layers: ${pathBracket}.layers: must be an array`)\n\t\t\t\t} else {\n\t\t\t\t\tcfg.layers.forEach((layer, lIdx) => {\n\t\t\t\t\t\tconst lPath = `${pathSlash}/layers[${lIdx}]`\n\t\t\t\t\t\tif (!layer || typeof layer !== 'object') {\n\t\t\t\t\t\t\terrors.push(`${lPath}: must be an object`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!allowedLayerTypes.includes(layer.type)) {\n\t\t\t\t\t\t\terrors.push(`${lPath}/type: must be one of tile | wms | wfs | geojson`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst hasUrl = typeof layer.url === 'string' && layer.url.length > 0\n\t\t\t\t\t\tconst hasInlineGeojson = layer.type === 'geojson'\n\t\t\t\t\t\t\t&& layer.data\n\t\t\t\t\t\t\t&& typeof layer.data === 'object'\n\t\t\t\t\t\tif (!hasUrl && !hasInlineGeojson) {\n\t\t\t\t\t\t\terrors.push(`${lPath}/url: must be a non-empty string`)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cfg && cfg.markers && typeof cfg.markers === 'object' && cfg.markers.dataSource) {\n\t\t\t\tconst ds = cfg.markers.dataSource\n\t\t\t\tconst hasUrl = typeof ds.url === 'string' && ds.url.length > 0\n\t\t\t\tconst hasReg = typeof ds.register === 'string' && ds.register.length > 0\n\t\t\t\t\t&& typeof ds.schema === 'string' && ds.schema.length > 0\n\t\t\t\tconst count = (hasUrl ? 1 : 0) + (hasReg ? 1 : 0)\n\t\t\t\tif (count !== 1) {\n\t\t\t\t\terrors.push(`${pathSlash}/markers/dataSource: ${pathBracket}.markers.dataSource: must declare exactly one of url | (register + schema)`)\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase 'wiki': {\n\t\t// `manifest-wiki-page-type` REQ — a wiki page renders one\n\t\t// manifest-declared markdown article (CnWikiPage). It MUST\n\t\t// declare both `register` and `schema` as non-empty strings so\n\t\t// the manifest stays the source of truth for which OpenRegister\n\t\t// register/schema the article body is read from.\n\t\t\tconst hasRegister = cfg && typeof cfg.register === 'string' && cfg.register.length > 0\n\t\t\tconst hasSchema = cfg && typeof cfg.schema === 'string' && cfg.schema.length > 0\n\t\t\tif (!hasRegister || !hasSchema) {\n\t\t\t\terrors.push(`${pathBracket}: wiki pages must declare register and schema`)\n\t\t\t}\n\t\t\t// `manifest-wiki-stabilise` REQ — the remaining typed config\n\t\t\t// fields the CnWikiPage component accepts MUST be strings when\n\t\t\t// present. Omitted fields are tolerated (runtime defaults take\n\t\t\t// over); unknown keys pass for forward-compat.\n\t\t\tvalidateWikiConfigFields(cfg, pathSlash, errors)\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t// No per-type rules for index/detail/dashboard/custom or\n\t\t// consumer-defined types; their `config` shape is enforced\n\t\t// by the target component at runtime (or by a future spec).\n\t\t\tbreak\n\t}\n}\n\n/**\n * Validate the optional typed config fields of a `type:'wiki'` page\n * (`manifest-wiki-stabilise`). Each known field MUST be a string when\n * present; omitted fields are tolerated and unknown keys pass for\n * forward-compatibility. `register` / `schema` are validated by the\n * caller (they are required, not merely typed) so they are excluded\n * here.\n *\n * @param {object|null} cfg The page `config` object.\n * @param {string} pathSlash JSON-pointer prefix for the config object.\n * @param {string[]} errors Accumulator for error messages.\n */\nfunction validateWikiConfigFields(cfg, pathSlash, errors) {\n\tif (!isPlainObject(cfg)) {\n\t\treturn\n\t}\n\tconst stringFields = [\n\t\t'contentField',\n\t\t'titleField',\n\t\t'idParam',\n\t\t'treeField',\n\t\t'sidebarTitleField',\n\t\t'sidebarRegister',\n\t\t'sidebarSchema',\n\t\t'emptyText',\n\t\t'emptyDescription',\n\t\t'emptyBodyText',\n\t\t'emptyBodyDescription',\n\t]\n\tstringFields.forEach((field) => {\n\t\tif (cfg[field] !== undefined && typeof cfg[field] !== 'string') {\n\t\t\terrors.push(`${pathSlash}/${field}: must be a string when set`)\n\t\t}\n\t})\n}\n\n/**\n * Validate the type-specific sidebar config introduced by the\n * `manifest-abstract-sidebar` change and extended by\n * `manifest-detail-sidebar-config`.\n *\n * - For `type: \"index\"` pages with `config.sidebar`:\n * `sidebar` MUST be a plain object. When `enabled` / `show` is set\n * it MUST be a boolean. When `columnGroups` is set it MUST be an\n * array. When `facets` is set it MUST be an object. Unknown\n * sub-fields are tolerated for forward-compat with future\n * CnIndexSidebar props.\n *\n * - For `type: \"detail\"` pages with `config.sidebar`:\n * `sidebar` MUST be either a Boolean (legacy) OR a plain object.\n * When an object: `show` / `enabled` MUST be boolean when set;\n * `register` / `schema` / `title` / `subtitle` MUST be string when\n * set; `hiddenTabs` MUST be an array of strings when set; `tabs`\n * follows the existing tabs-array rules.\n *\n * - For `type: \"detail\"` pages with `config.sidebarProps.tabs`\n * (legacy path): same tab rules as above.\n *\n * Errors push JSON-pointer-shaped paths so the consumer can locate the\n * offending field without consulting the schema source.\n *\n * @param {object} page Page definition under validation\n * @param {number} pageIndex Index of the page in `manifest.pages`\n * @param {string[]} errors Accumulator for error messages\n */\nfunction validateSidebarConfig(page, pageIndex, errors) {\n\tconst config = page.config\n\tif (!isPlainObject(config)) {\n\t\treturn\n\t}\n\n\t// --- Index sidebar ---\n\tif (page.type === 'index' && config.sidebar !== undefined) {\n\t\tconst path = `/pages/${pageIndex}/config/sidebar`\n\t\tif (!isPlainObject(config.sidebar)) {\n\t\t\terrors.push(`${path} must be an object`)\n\t\t} else {\n\t\t\tif (config.sidebar.enabled !== undefined && typeof config.sidebar.enabled !== 'boolean') {\n\t\t\t\terrors.push(`${path}/enabled must be a boolean`)\n\t\t\t}\n\t\t\t// Visibility gate added by manifest-detail-sidebar-config.\n\t\t\tif (config.sidebar.show !== undefined && typeof config.sidebar.show !== 'boolean') {\n\t\t\t\terrors.push(`${path}/show must be a boolean`)\n\t\t\t}\n\t\t\tif (config.sidebar.columnGroups !== undefined && !Array.isArray(config.sidebar.columnGroups)) {\n\t\t\t\terrors.push(`${path}/columnGroups must be an array`)\n\t\t\t}\n\t\t\tif (config.sidebar.facets !== undefined && !isPlainObject(config.sidebar.facets)) {\n\t\t\t\terrors.push(`${path}/facets must be an object`)\n\t\t\t}\n\t\t\tif (config.sidebar.showMetadata !== undefined && typeof config.sidebar.showMetadata !== 'boolean') {\n\t\t\t\terrors.push(`${path}/showMetadata must be a boolean`)\n\t\t\t}\n\t\t\tif (config.sidebar.search !== undefined && !isPlainObject(config.sidebar.search)) {\n\t\t\t\terrors.push(`${path}/search must be an object`)\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Detail sidebar (Object form) ---\n\t// `manifest-detail-sidebar-config` promotes config.sidebar from a\n\t// pure boolean to a Boolean-OR-Object. Boolean form passes through\n\t// unchanged for v1.x back-compat. Object form mirrors index +\n\t// adds detail-specific fields.\n\tif (page.type === 'detail' && config.sidebar !== undefined) {\n\t\tconst path = `/pages/${pageIndex}/config/sidebar`\n\t\tconst sb = config.sidebar\n\t\tconst isBool = typeof sb === 'boolean'\n\t\tconst isObj = isPlainObject(sb)\n\t\tif (!isBool && !isObj) {\n\t\t\terrors.push(`${path} must be a boolean (legacy) or object`)\n\t\t} else if (isObj) {\n\t\t\tif (sb.show !== undefined && typeof sb.show !== 'boolean') {\n\t\t\t\terrors.push(`${path}/show must be a boolean`)\n\t\t\t}\n\t\t\tif (sb.enabled !== undefined && typeof sb.enabled !== 'boolean') {\n\t\t\t\terrors.push(`${path}/enabled must be a boolean`)\n\t\t\t}\n\t\t\tif (sb.register !== undefined && typeof sb.register !== 'string') {\n\t\t\t\terrors.push(`${path}/register must be a string`)\n\t\t\t}\n\t\t\tif (sb.schema !== undefined && typeof sb.schema !== 'string') {\n\t\t\t\terrors.push(`${path}/schema must be a string`)\n\t\t\t}\n\t\t\tif (sb.title !== undefined && typeof sb.title !== 'string') {\n\t\t\t\terrors.push(`${path}/title must be a string`)\n\t\t\t}\n\t\t\tif (sb.subtitle !== undefined && typeof sb.subtitle !== 'string') {\n\t\t\t\terrors.push(`${path}/subtitle must be a string`)\n\t\t\t}\n\t\t\tif (sb.hiddenTabs !== undefined) {\n\t\t\t\tif (!Array.isArray(sb.hiddenTabs)) {\n\t\t\t\t\terrors.push(`${path}/hiddenTabs must be an array of strings`)\n\t\t\t\t} else {\n\t\t\t\t\tsb.hiddenTabs.forEach((t, i) => {\n\t\t\t\t\t\tif (typeof t !== 'string') {\n\t\t\t\t\t\t\terrors.push(`${path}/hiddenTabs/${i} must be a string`)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sb.tabs !== undefined) {\n\t\t\t\tvalidateDetailTabsArray(sb.tabs, `${path}/tabs`, errors)\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Detail sidebar tabs (legacy sidebarProps.tabs path) ---\n\tif (page.type === 'detail' && isPlainObject(config.sidebarProps) && config.sidebarProps.tabs !== undefined) {\n\t\tconst tabsPath = `/pages/${pageIndex}/config/sidebarProps/tabs`\n\t\tvalidateDetailTabsArray(config.sidebarProps.tabs, tabsPath, errors)\n\t}\n}\n\n/**\n * Validate the manifest-abstract-sidebar tabs array. Hoisted so both\n * the legacy `config.sidebarProps.tabs` path and the new\n * `config.sidebar.tabs` path (manifest-detail-sidebar-config) reuse\n * the same rules.\n *\n * @param {unknown} tabs The candidate tabs value (expected: array of tab defs)\n * @param {string} tabsPath JSON-pointer-shaped path prefix for errors\n * @param {string[]} errors Accumulator\n */\nfunction validateDetailTabsArray(tabs, tabsPath, errors) {\n\tif (!Array.isArray(tabs)) {\n\t\terrors.push(`${tabsPath} must be an array`)\n\t\treturn\n\t}\n\tconst seenIds = new Set()\n\ttabs.forEach((tab, tabIndex) => {\n\t\tconst tabPath = `${tabsPath}/${tabIndex}`\n\t\tif (!isPlainObject(tab)) {\n\t\t\terrors.push(`${tabPath} must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\terrors.push(`${tabPath}/id must be a non-empty string`)\n\t\t} else if (seenIds.has(tab.id)) {\n\t\t\terrors.push(`${tabPath}/id \"${tab.id}\" must be unique within tabs[]`)\n\t\t} else {\n\t\t\tseenIds.add(tab.id)\n\t\t}\n\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\terrors.push(`${tabPath}/label must be a non-empty string`)\n\t\t}\n\t\tconst hasWidgets = Array.isArray(tab.widgets) && tab.widgets.length > 0\n\t\tconst hasComponent = typeof tab.component === 'string' && tab.component.length > 0\n\t\tif (hasWidgets && hasComponent) {\n\t\t\terrors.push(`${tabPath} must declare widgets OR component, not both`)\n\t\t}\n\t\tif (tab.widgets !== undefined && !Array.isArray(tab.widgets)) {\n\t\t\terrors.push(`${tabPath}/widgets must be an array when set`)\n\t\t}\n\t\tif (tab.component !== undefined && typeof tab.component !== 'string') {\n\t\t\terrors.push(`${tabPath}/component must be a string when set`)\n\t\t}\n\t\tif (tab.icon !== undefined && typeof tab.icon !== 'string') {\n\t\t\terrors.push(`${tabPath}/icon must be a string when set`)\n\t\t}\n\t\tif (tab.order !== undefined && typeof tab.order !== 'number') {\n\t\t\terrors.push(`${tabPath}/order must be a number when set`)\n\t\t}\n\t})\n}\n\n/**\n * Validate the per-page top-level `sidebar` field (sibling of `config`)\n * introduced by `manifest-detail-sidebar-config`.\n *\n * Applies to EVERY page type (including type='custom'). Currently the\n * only declared sub-field is `show: boolean` (visibility gate consumed\n * by CnAppRoot via the `cnPageSidebarVisible` inject). Unknown\n * sub-fields are tolerated for forward-compat with future fields\n * (e.g. position, width).\n *\n * @param {object} page Page entry\n * @param {number} pageIndex Index in `manifest.pages`\n * @param {string[]} errors Accumulator\n */\n/**\n * Validate a page's `requiresApp` soft-dependency gate.\n *\n * Accepts a non-empty app id, or `{ id, name? }` when the page wants a\n * human-readable name on the missing-dependency screen.\n *\n * This gates a WHOLE page and is for the deep link: a menu entry is hidden by\n * `visibleIf.appInstalled`, so the page is still reachable by bookmark, shared\n * URL, redirect or e2e spec. Gate a single widget with `visibleIf` instead —\n * a detail page may carry many widgets where only one needs the app.\n *\n * @param {object} page The page definition.\n * @param {number} pageIndex Index of the page, for the error path.\n * @param {Array<string>} errors Collected error messages, appended in place.\n *\n * @return {void}\n */\nfunction validatePageRequiresApp(page, pageIndex, errors) {\n\tif (page.requiresApp === undefined) {\n\t\treturn\n\t}\n\n\tconst path = `/pages/${pageIndex}/requiresApp`\n\n\tif (typeof page.requiresApp === 'string') {\n\t\tif (page.requiresApp.length === 0) {\n\t\t\terrors.push(`${path} must be a non-empty string`)\n\t\t}\n\t\treturn\n\t}\n\n\tif (!isPlainObject(page.requiresApp)) {\n\t\terrors.push(`${path} must be a non-empty string or an { id, name? } object`)\n\t\treturn\n\t}\n\n\tif (typeof page.requiresApp.id !== 'string' || page.requiresApp.id.length === 0) {\n\t\terrors.push(`${path}/id must be a non-empty string`)\n\t}\n\n\tif (\n\t\tpage.requiresApp.name !== undefined\n\t\t&& (typeof page.requiresApp.name !== 'string' || page.requiresApp.name.length === 0)\n\t) {\n\t\terrors.push(`${path}/name must be a non-empty string when present`)\n\t}\n}\n\nfunction validatePageSidebar(page, pageIndex, errors) {\n\tif (page.sidebar === undefined) {\n\t\treturn\n\t}\n\tconst path = `/pages/${pageIndex}/sidebar`\n\tif (!isPlainObject(page.sidebar)) {\n\t\terrors.push(`${path} must be an object`)\n\t\treturn\n\t}\n\tif (page.sidebar.show !== undefined && typeof page.sidebar.show !== 'boolean') {\n\t\terrors.push(`${path}/show must be a boolean`)\n\t}\n}\n\n/**\n * Validate `config.columns[]` for index / logs page types\n * (`manifest-config-refs` REQ-MCR).\n *\n * Each item is EITHER a string (legacy shorthand: just the property\n * key) OR an object matching the `column` $def — i.e. with at least\n * `key` and `label` non-empty strings. The schema admits the same\n * `oneOf` shape; this validator produces sharper messages when the\n * Object form is malformed.\n *\n * Skipped silently when `cfg` or `cfg.columns` is missing.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateColumnsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.columns === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.columns)) {\n\t\terrors.push(`${pathSlash}/columns: ${pathBracket}.columns: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.columns.forEach((col, cIndex) => {\n\t\tconst colPath = `${pathSlash}/columns/${cIndex}`\n\t\tif (typeof col === 'string') {\n\t\t\t// Legacy shorthand — accepted as-is.\n\t\t\treturn\n\t\t}\n\t\tif (!isPlainObject(col)) {\n\t\t\terrors.push(`${colPath}: must be a string (legacy shorthand) or object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof col.key !== 'string' || col.key.length === 0) {\n\t\t\terrors.push(`${colPath}/key: must be a non-empty string`)\n\t\t}\n\t\tif (typeof col.label !== 'string' || col.label.length === 0) {\n\t\t\terrors.push(`${colPath}/label: must be a non-empty string`)\n\t\t}\n\t})\n}\n\n/**\n * Closed enum of valid `config.mode` values for type='form' and\n * type='detail' pages (`manifest-public-mode`).\n *\n * @type {string[]}\n */\nconst ALLOWED_CONFIG_MODES = ['edit', 'create', 'public']\n\n/**\n * Validate `config.mode` against the closed enum\n * (`manifest-public-mode`). Shared between type='form' and\n * type='detail' branches of `validateTypeConfig`. Omitted mode is\n * tolerated (consumers fall back to the component's default).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateConfigMode(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.mode === undefined) {\n\t\treturn\n\t}\n\tif (typeof cfg.mode !== 'string' || !ALLOWED_CONFIG_MODES.includes(cfg.mode)) {\n\t\terrors.push(`${pathSlash}/mode: ${pathBracket}.mode: must be one of ${ALLOWED_CONFIG_MODES.join(' | ')}`)\n\t}\n}\n\n/**\n * REQ-MAD-1 — Allowed shapes for `actions[].handler`. Either a\n * reserved keyword (`navigate` | `emit` | `none`) or a JS-identifier\n * registry name (alphanumeric + underscore, leading letter). Mirrors\n * the schema's `pattern` on the `handler` property.\n */\nconst HANDLER_PATTERN = /^(navigate|emit|none|[A-Za-z][A-Za-z0-9_]*)$/\n\n/**\n * Validate `config.actions[]` for index page type\n * (`manifest-config-refs` REQ-MCR). Each entry MUST be an object with\n * non-empty `id` and `label` strings — matches the `action` $def's\n * `required: [\"id\",\"label\"]`.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateActionsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.actions === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.actions)) {\n\t\terrors.push(`${pathSlash}/actions: ${pathBracket}.actions: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.actions.forEach((action, aIndex) => {\n\t\tconst actionPath = `${pathSlash}/actions/${aIndex}`\n\t\tif (!isPlainObject(action)) {\n\t\t\terrors.push(`${actionPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof action.id !== 'string' || action.id.length === 0) {\n\t\t\terrors.push(`${actionPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof action.label !== 'string' || action.label.length === 0) {\n\t\t\terrors.push(`${actionPath}/label: must be a non-empty string`)\n\t\t}\n\t\t// REQ-MAD-1 / REQ-MAD-2 — `handler` (string, registry name OR\n\t\t// reserved keyword `navigate`/`emit`/`none`) and the matching\n\t\t// `navigate` requirement on `route`. Schema 1.3.0+.\n\t\tif (action.handler !== undefined) {\n\t\t\tif (typeof action.handler !== 'string') {\n\t\t\t\terrors.push(`${actionPath}/handler: must be a string when set`)\n\t\t\t} else if (!HANDLER_PATTERN.test(action.handler)) {\n\t\t\t\terrors.push(`${actionPath}/handler: \"${action.handler}\" must match `\n\t\t\t\t\t+ '\"navigate\" | \"emit\" | \"none\" | [A-Za-z][A-Za-z0-9_]*')\n\t\t\t}\n\t\t\tif (action.handler === 'navigate'\n\t\t\t\t&& (typeof action.route !== 'string' || action.route.length === 0)) {\n\t\t\t\terrors.push(`${actionPath}/route: required when handler is \"navigate\"`)\n\t\t\t}\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.actionToggles` for index page type\n * (`manifest-index-action-toggles`). The block is OPTIONAL; when\n * present it MUST be a plain object whose values are booleans.\n * Unknown keys pass for forward-compat with future CnIndexPage props.\n *\n * Known keys (each maps to a CnIndexPage prop):\n * showAdd, showFormDialog, showEditAction, showCopyAction,\n * showDeleteAction, showMassImport, showMassExport, showMassCopy,\n * showMassDelete, showViewToggle, selectable.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateIndexActionToggles(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.actionToggles === undefined) {\n\t\treturn\n\t}\n\tif (!isPlainObject(cfg.actionToggles)) {\n\t\terrors.push(`${pathSlash}/actionToggles: ${pathBracket}.actionToggles: must be an object`)\n\t\treturn\n\t}\n\tfor (const [key, value] of Object.entries(cfg.actionToggles)) {\n\t\tif (typeof value !== 'boolean') {\n\t\t\terrors.push(`${pathSlash}/actionToggles/${key}: ${pathBracket}.actionToggles.${key}: must be a boolean (got ${typeof value})`)\n\t\t}\n\t}\n}\n\n/**\n * Validate `config.sidebarTabs[]` for detail page type\n * (`manifest-detail-sidebartabs`). The block is OPTIONAL; when\n * present it MUST be an array of objects each carrying non-empty\n * `id` and `label` strings. Duplicate `id`s reject; unknown keys\n * pass for forward-compat (icon, order, component, _note, …).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateDetailSidebarTabs(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.sidebarTabs === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.sidebarTabs)) {\n\t\terrors.push(`${pathSlash}/sidebarTabs: ${pathBracket}.sidebarTabs: must be an array`)\n\t\treturn\n\t}\n\tconst seenIds = Object.create(null)\n\tcfg.sidebarTabs.forEach((tab, tIndex) => {\n\t\tconst tabPath = `${pathSlash}/sidebarTabs/${tIndex}`\n\t\tconst tabBracket = `${pathBracket}.sidebarTabs[${tIndex}]`\n\t\tif (!isPlainObject(tab)) {\n\t\t\terrors.push(`${tabPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof tab.id !== 'string' || tab.id.length === 0) {\n\t\t\terrors.push(`${tabPath}/id: ${tabBracket}.id: required, must be a non-empty string`)\n\t\t}\n\t\tif (typeof tab.label !== 'string' || tab.label.length === 0) {\n\t\t\terrors.push(`${tabPath}/label: ${tabBracket}.label: required, must be a non-empty string`)\n\t\t}\n\t\tif (typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\tif (seenIds[tab.id]) {\n\t\t\t\terrors.push(`${tabPath}/id: ${tabBracket}.id: duplicate \"${tab.id}\" — tab IDs must be unique within a page`)\n\t\t\t} else {\n\t\t\t\tseenIds[tab.id] = true\n\t\t\t}\n\t\t}\n\t\tif (tab.icon !== undefined && typeof tab.icon !== 'string') {\n\t\t\terrors.push(`${tabPath}/icon: must be a string when set`)\n\t\t}\n\t\tif (tab.order !== undefined && typeof tab.order !== 'number') {\n\t\t\terrors.push(`${tabPath}/order: must be a number when set`)\n\t\t}\n\t\tif (tab.component !== undefined && (typeof tab.component !== 'string' || tab.component.length === 0)) {\n\t\t\terrors.push(`${tabPath}/component: must be a non-empty string when set`)\n\t\t}\n\t})\n}\n\n/**\n * Cross-reference check: every `widgets[]` entry with\n * `slot === 'sidebar'` and a `tabGroup` value MUST match a declared\n * `config.sidebarTabs[].id`. Catches silent typos where a tab-bound\n * widget references a non-existent tab.\n *\n * Only runs when `widgets` is an array. Tolerates a missing\n * `sidebarTabs` declaration (the widgets[] can still validate\n * shape-wise; the cross-ref check is a documentation aid).\n *\n * @param {object} page The page object\n * @param {number} index The page index (for path)\n * @param {string[]} errors Accumulator\n */\nfunction validateSidebarTabGroupRefs(page, index, errors) {\n\tif (!page || !Array.isArray(page.widgets) || page.widgets.length === 0) {\n\t\treturn\n\t}\n\tconst cfg = isPlainObject(page.config) ? page.config : null\n\tconst declaredIds = new Set()\n\tif (cfg && Array.isArray(cfg.sidebarTabs)) {\n\t\tfor (const tab of cfg.sidebarTabs) {\n\t\t\tif (tab && typeof tab.id === 'string' && tab.id.length > 0) {\n\t\t\t\tdeclaredIds.add(tab.id)\n\t\t\t}\n\t\t}\n\t}\n\tpage.widgets.forEach((widget, wIndex) => {\n\t\tif (!isPlainObject(widget)) {\n\t\t\treturn\n\t\t}\n\t\tif (widget.slot !== 'sidebar') {\n\t\t\treturn\n\t\t}\n\t\tif (typeof widget.tabGroup !== 'string' || widget.tabGroup.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tif (declaredIds.size === 0) {\n\t\t\terrors.push(`pages[${index}]/widgets/${wIndex}/tabGroup: \"${widget.tabGroup}\" referenced but config.sidebarTabs[] is empty or missing — declare the tab to silence this error`)\n\t\t\treturn\n\t\t}\n\t\tif (!declaredIds.has(widget.tabGroup)) {\n\t\t\terrors.push(`pages[${index}]/widgets/${wIndex}/tabGroup: \"${widget.tabGroup}\" must match a declared config.sidebarTabs[].id`)\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.widgets[]` for dashboard page type\n * (`manifest-config-refs` REQ-MCR).\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateWidgetsArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.widgets === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.widgets)) {\n\t\terrors.push(`${pathSlash}/widgets: ${pathBracket}.widgets: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.widgets.forEach((widget, wIndex) => {\n\t\tconst widgetPath = `${pathSlash}/widgets/${wIndex}`\n\t\tif (!isPlainObject(widget)) {\n\t\t\terrors.push(`${widgetPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof widget.id !== 'string' || widget.id.length === 0) {\n\t\t\terrors.push(`${widgetPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof widget.title !== 'string' || widget.title.length === 0) {\n\t\t\terrors.push(`${widgetPath}/title: must be a non-empty string`)\n\t\t}\n\t\tif (typeof widget.type !== 'string' || widget.type.length === 0) {\n\t\t\terrors.push(`${widgetPath}/type: must be a non-empty string`)\n\t\t}\n\t\tif (widget.type === 'chart') {\n\t\t\tvalidateChartBaseline(widget.content, `${widgetPath}/content`, errors)\n\t\t\tvalidateChartBaseline(widget.props, `${widgetPath}/props`, errors)\n\t\t}\n\t})\n}\n\n/**\n * Validate a chart widget's `valueAxisBaseline` against its closed enum.\n *\n * The key lives inside the deliberately free-form widget `props` / `content`\n * bag, which no JSON Schema in this repo constrains — so a misspelt value\n * validated clean and then fell back to `auto` at render time, which is the\n * exact framing the author was overriding, with nothing in the manifest to\n * explain it. Omitted is fine (the component's default applies).\n *\n * @param {object|null} bag The widget's `props` or `content` block.\n * @param {string} path JSON-pointer-style path prefix for the message.\n * @param {string[]} errors Accumulator.\n * @return {void}\n */\nfunction validateChartBaseline(bag, path, errors) {\n\tif (!isPlainObject(bag)) {\n\t\treturn\n\t}\n\tconst value = bag.valueAxisBaseline\n\tif (value === undefined || value === null) {\n\t\treturn\n\t}\n\tif (typeof value !== 'string' || !CHART_VALUE_AXIS_BASELINES.includes(value)) {\n\t\terrors.push(`${path}/valueAxisBaseline: must be one of ${CHART_VALUE_AXIS_BASELINES.join(' | ')}`)\n\t}\n}\n\n/**\n * Validate `config.layout[]` for dashboard page type\n * (`manifest-config-refs` REQ-MCR). Each entry MUST be an object with\n * non-empty `id`, `widgetId` strings, and integer `gridX`/`gridY` >= 0,\n * `gridWidth`/`gridHeight` >= 1 — matches the `layoutItem` $def.\n *\n * @param {object} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateLayoutArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.layout === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.layout)) {\n\t\terrors.push(`${pathSlash}/layout: ${pathBracket}.layout: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.layout.forEach((item, lIndex) => {\n\t\tconst layoutPath = `${pathSlash}/layout/${lIndex}`\n\t\tif (!isPlainObject(item)) {\n\t\t\terrors.push(`${layoutPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof item.id !== 'string' || item.id.length === 0) {\n\t\t\terrors.push(`${layoutPath}/id: must be a non-empty string`)\n\t\t}\n\t\tif (typeof item.widgetId !== 'string' || item.widgetId.length === 0) {\n\t\t\terrors.push(`${layoutPath}/widgetId: must be a non-empty string`)\n\t\t}\n\t\tconst checkInt = (key, min) => {\n\t\t\tif (typeof item[key] !== 'number' || !Number.isInteger(item[key])) {\n\t\t\t\terrors.push(`${layoutPath}/${key}: must be an integer`)\n\t\t\t} else if (item[key] < min) {\n\t\t\t\terrors.push(`${layoutPath}/${key}: must be >= ${min}`)\n\t\t\t}\n\t\t}\n\t\tcheckInt('gridX', 0)\n\t\tcheckInt('gridY', 0)\n\t\tcheckInt('gridWidth', 1)\n\t\tcheckInt('gridHeight', 1)\n\t})\n}\n\n/**\n * Validate a single `sections[]` entry for `type:\"settings\"` pages.\n * Shared between the flat `pages[].config.sections[]` path AND the\n * tab-nested `pages[].config.tabs[].sections[]` path\n * (`manifest-settings-orchestration` REQ-MSO-4).\n *\n * Enforces the rich-sections REQ-MSRS-1 mutex (`fields | component |\n * widgets` exactly-one-of) plus per-widget shape rules. The new\n * `widget.type === \"component\"` discriminator (REQ-MSO-6) requires\n * `componentName: <non-empty string>`.\n *\n * @param {unknown} section The section under validation\n * @param {string} pathSlash JSON-pointer-style path prefix for errors\n * @param {string} pathBracket Human-readable bracket-path for errors\n * @param {string[]} errors Accumulator\n */\nfunction validateSettingsSection(section, pathSlash, pathBracket, errors) {\n\tif (!isPlainObject(section)) {\n\t\terrors.push(`${pathSlash}: must be an object`)\n\t\treturn\n\t}\n\tif (typeof section.title !== 'string') {\n\t\terrors.push(`${pathSlash}/title: required, must be a string`)\n\t}\n\n\t// `manifest-settings-rich-sections` REQ-MSRS-1: exactly one of\n\t// fields | component | widgets.\n\tconst hasFields = Array.isArray(section.fields)\n\tconst hasComponent = typeof section.component === 'string' && section.component.length > 0\n\tconst hasWidgets = Array.isArray(section.widgets) && section.widgets.length > 0\n\tconst bodyCount = (hasFields ? 1 : 0) + (hasComponent ? 1 : 0) + (hasWidgets ? 1 : 0)\n\n\tif (bodyCount !== 1) {\n\t\terrors.push(`${pathSlash}: ${pathBracket}: must declare exactly one of fields | component | widgets`)\n\t}\n\n\t// `widgets` set but not an array (string / object / etc.)\n\tif (section.widgets !== undefined && !Array.isArray(section.widgets)) {\n\t\terrors.push(`${pathSlash}/widgets: must be an array when set`)\n\t}\n\n\t// `component` set but not a string.\n\tif (section.component !== undefined && typeof section.component !== 'string') {\n\t\terrors.push(`${pathSlash}/component: must be a string when set`)\n\t}\n\n\t// Per-widget shape rules.\n\tif (hasWidgets) {\n\t\tsection.widgets.forEach((widget, wIndex) => {\n\t\t\tif (!isPlainObject(widget)) {\n\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}: must be an object`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof widget.type !== 'string' || widget.type.length === 0) {\n\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}/type: must be a non-empty string`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// `manifest-settings-orchestration` REQ-MSO-6: when the\n\t\t\t// discriminator is \"component\", `componentName` MUST be a\n\t\t\t// non-empty string. Other widget types ignore\n\t\t\t// `componentName`.\n\t\t\tif (widget.type === 'component') {\n\t\t\t\tif (typeof widget.componentName !== 'string' || widget.componentName.length === 0) {\n\t\t\t\t\terrors.push(`${pathSlash}/widgets/${wIndex}/componentName: required when type is \"component\", must be a non-empty string`)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// `manifest-config-refs` REQ-MCR — when fields[] body is used,\n\t// each entry must match the formField $def shape.\n\tif (hasFields) {\n\t\tvalidateFieldsArray(section.fields, `${pathSlash}/fields`, errors)\n\t}\n}\n\nconst MENU_ACTIONS = ['user-settings']\n\n/**\n * Validate the optional `action` field on a menu item. The schema\n * declares a closed enum (\"user-settings\" only); this helper enforces\n * that constraint at validate time so manifest typos surface\n * immediately rather than silently no-op'ing in CnAppNav (where\n * unknown action values fall through the click handler).\n *\n * Added in schema 1.5.0 alongside the user-settings action.\n *\n * @param {object} item Menu item (top-level or leaf child).\n * @param {string} path JSON path of this item (e.g. `/menu/0`).\n * @param {string[]} errors Error array to push to (mutated).\n */\nfunction validateMenuAction(item, path, errors) {\n\tif (item.action === undefined) {\n\t\treturn\n\t}\n\tif (typeof item.action !== 'string' || !MENU_ACTIONS.includes(item.action)) {\n\t\terrors.push(`${path}/action must be one of: ${MENU_ACTIONS.join(', ')}`)\n\t}\n}\n\n/**\n * Validate a `visibleIf` block on a menu item or nested child.\n *\n * `visibleIf` is optional; when present it MUST be a plain object.\n * Supported sub-keys:\n *\n * - `appInstalled` (reserved) — a non-empty string naming the Nextcloud\n * app whose installation gates the entry.\n * - Any other key is treated as a dot-separated context path into\n * `manifest.runtime` (e.g. `\"user.primaryRole\"`). Its value is a\n * predicate expression: a scalar (shorthand eq) or an operator object\n * (`{ eq }`, `{ in }`, `{ notIn }`, `{ gt }`, `{ gte }`, `{ lt }`,\n * `{ lte }`, `{ truthy }`).\n *\n * @param {object|undefined} visibleIf The candidate value (may be undefined)\n * @param {string} path JSON-pointer-style path prefix for error messages\n * @param {string[]} errors Accumulator\n */\nfunction validateMenuItemVisibleIf(visibleIf, path, errors) {\n\tif (visibleIf === undefined) {\n\t\treturn\n\t}\n\tif (!isPlainObject(visibleIf)) {\n\t\terrors.push(`${path} must be an object when set`)\n\t\treturn\n\t}\n\t// Validate the reserved `appInstalled` key.\n\tif (visibleIf.appInstalled !== undefined) {\n\t\tif (typeof visibleIf.appInstalled !== 'string' || visibleIf.appInstalled.length === 0) {\n\t\t\terrors.push(`${path}/appInstalled must be a non-empty string`)\n\t\t}\n\t}\n\t// Validate context-path predicate keys (any non-reserved key).\n\tconst RESERVED = new Set(['appInstalled'])\n\tfor (const key of Object.keys(visibleIf)) {\n\t\tif (RESERVED.has(key)) {\n\t\t\tcontinue\n\t\t}\n\t\t// Context path key must be dot-separated with non-empty segments.\n\t\tconst segments = key.split('.')\n\t\tif (segments.some((s) => s.length === 0) || key.length === 0) {\n\t\t\terrors.push(`${path}/${key}: context path must be a non-empty dot-separated string with non-empty segments`)\n\t\t\tcontinue\n\t\t}\n\t\t// Predicate value validation.\n\t\tconst predicate = visibleIf[key]\n\t\tif (predicate !== null && typeof predicate === 'object') {\n\t\t\tif (\n\t\t\t\tObject.hasOwn(predicate, 'in')\n\t\t\t\t&& !Array.isArray(predicate.in)\n\t\t\t) {\n\t\t\t\terrors.push(`${path}/${key}/in: \"in\" operator value must be an array`)\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.hasOwn(predicate, 'notIn')\n\t\t\t\t&& !Array.isArray(predicate.notIn)\n\t\t\t) {\n\t\t\t\terrors.push(`${path}/${key}/notIn: \"notIn\" operator value must be an array`)\n\t\t\t}\n\t\t\t// Unknown operator keys are tolerated (forward-compat) — no error.\n\t\t}\n\t\t// Scalar predicates (string, number, boolean, null) are always valid.\n\t}\n}\n\n/**\n * Pattern matching the `openregister://widget/<schemaSlug>/<widgetSlug>` URI.\n * schemaSlug: lowercase alphanumeric + hyphens.\n * widgetSlug: starts with a letter (upper or lower), then alphanumeric + hyphens.\n * camelCase is supported (e.g. `coverageGrid`).\n */\nconst WIDGET_REF_URI_PATTERN = /^openregister:\\/\\/widget\\/[a-z0-9-]+\\/[a-zA-Z][a-zA-Z0-9-]+$/\n\n/**\n * Validate `config.content[]` for dashboard page type\n * (`manifest-widget-ref-page-content-type`). Each item MUST be an\n * object with:\n * - `type` === \"widget-ref\" (the only supported discriminator)\n * - `ref` matching `openregister://widget/<schemaSlug>/<widgetSlug>`\n *\n * Skipped silently when `cfg` or `cfg.content` is missing.\n *\n * @param {object|null} cfg The page's `config` block (or null)\n * @param {string} pathSlash JSON-pointer-style path prefix\n * @param {string} pathBracket Bracket-style path prefix\n * @param {string[]} errors Accumulator\n */\nfunction validateContentArray(cfg, pathSlash, pathBracket, errors) {\n\tif (!cfg || cfg.content === undefined) {\n\t\treturn\n\t}\n\tif (!Array.isArray(cfg.content)) {\n\t\terrors.push(`${pathSlash}/content: ${pathBracket}.content: must be an array when set`)\n\t\treturn\n\t}\n\tcfg.content.forEach((item, cIndex) => {\n\t\tconst itemPath = `${pathSlash}/content/${cIndex}`\n\t\tif (!isPlainObject(item)) {\n\t\t\terrors.push(`${itemPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (item.type !== 'widget-ref') {\n\t\t\terrors.push(`${itemPath}/type: must be \"widget-ref\" (got \"${item.type}\")`)\n\t\t}\n\t\tif (typeof item.ref !== 'string' || item.ref.length === 0) {\n\t\t\terrors.push(`${itemPath}/ref: must be a non-empty string`)\n\t\t} else if (!WIDGET_REF_URI_PATTERN.test(item.ref)) {\n\t\t\terrors.push(`${itemPath}/ref: \"${item.ref}\" must match openregister://widget/<schemaSlug>/<widgetSlug> `\n\t\t\t\t+ '(slugs: lowercase letters, digits, hyphens; widgetSlug must start with a letter)')\n\t\t}\n\t})\n}\n\n/**\n * Validate `config.sections[].fields[]` for settings page type\n * (`manifest-config-refs` REQ-MCR) and `config.fields[]` for form pages.\n * Each field MUST be an object with non-empty `key`, `label` strings and\n * `type` in the closed enum `boolean | number | string | enum | password |\n * json`, which matches the `formField` $def.\n *\n * A form page also accepts `file`. A settings page does not: it saves to\n * app config, which has no place for file content, and CnSettingsPage has\n * no file input to render.\n *\n * @param {unknown} fields The candidate fields value\n * @param {string} fieldsPath JSON-pointer-style path prefix for errors\n * @param {string[]} errors Accumulator\n * @param {string[]} [allowedTypes] The accepted `type` values. Defaults to\n * the settings set, `FORM_FIELD_TYPES`.\n */\nfunction validateFieldsArray(fields, fieldsPath, errors, allowedTypes = FORM_FIELD_TYPES) {\n\tif (!Array.isArray(fields)) {\n\t\treturn\n\t}\n\tfields.forEach((field, fIndex) => {\n\t\tconst fieldPath = `${fieldsPath}/${fIndex}`\n\t\tif (!isPlainObject(field)) {\n\t\t\terrors.push(`${fieldPath}: must be an object`)\n\t\t\treturn\n\t\t}\n\t\tif (typeof field.key !== 'string' || field.key.length === 0) {\n\t\t\terrors.push(`${fieldPath}/key: must be a non-empty string`)\n\t\t}\n\t\tif (typeof field.label !== 'string' || field.label.length === 0) {\n\t\t\terrors.push(`${fieldPath}/label: must be a non-empty string`)\n\t\t}\n\t\tif (typeof field.type !== 'string' || field.type.length === 0) {\n\t\t\terrors.push(`${fieldPath}/type: must be a non-empty string`)\n\t\t} else if (!allowedTypes.includes(field.type)) {\n\t\t\terrors.push(`${fieldPath}/type: must be one of ${allowedTypes.join(', ')}`)\n\t\t}\n\t})\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAiBA;AACA;AACA;AACA,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,IAAI,oBAAmB;AAC5E;AACA;AACA,IAAI,oBAAoB,GAAG,MAAK;AAChC;AACA;AACA;AACA;AACA,MAAM,gBAAgB,GAAG,+BAA8B;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,GAAG,EAAE;AAC/B;AACA;AACA,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,IAAI,GAAE;AACtD;AACA;AACA,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAC;AAChF;AACA,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,mBAAkB;AAClD;AACA,CAAC,IAAI,WAAW,EAAE;AAClB,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACrC,EAAE;AACF,CAAC,OAAO,OAAO;AACf,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC,mBAAmB,EAAC;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,0BAA0B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,QAAQ,EAAE;AAC7C;AACA,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,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"}