@praxisui/rich-content 9.0.0-beta.71 → 9.0.0-beta.73

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-11T00:12:06.404Z",
3
+ "generatedAt": "2026-07-12T01:34:40.567Z",
4
4
  "packageName": "@praxisui/rich-content",
5
- "packageVersion": "9.0.0-beta.71",
5
+ "packageVersion": "9.0.0-beta.73",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -14,32 +14,65 @@
14
14
  {
15
15
  "name": "document",
16
16
  "type": "RichContentDocument | null",
17
- "required": false
17
+ "required": false,
18
+ "description": "Documento canonico praxis.rich-content renderizado pelo componente.",
19
+ "label": "Rich content document",
20
+ "default": {
21
+ "kind": "praxis.rich-content",
22
+ "version": "1.0.0",
23
+ "nodes": [
24
+ {
25
+ "type": "card",
26
+ "title": "Rich content",
27
+ "content": [
28
+ {
29
+ "type": "text",
30
+ "text": "Configure este bloco com um RichContentDocument canonico."
31
+ },
32
+ {
33
+ "type": "badge",
34
+ "label": "praxis.rich-content"
35
+ }
36
+ ]
37
+ }
38
+ ]
39
+ }
18
40
  },
19
41
  {
20
42
  "name": "nodes",
21
43
  "type": "RichBlockNode[] | null",
22
- "required": false
44
+ "required": false,
45
+ "description": "Lista direta de nodes quando o host ja controla o envelope do documento.",
46
+ "label": "Nodes"
23
47
  },
24
48
  {
25
49
  "name": "context",
26
50
  "type": "JsonLogicDataRecord | null",
27
- "required": false
51
+ "required": false,
52
+ "description": "Contexto usado para resolver Json Logic, expressoes e bindings dos nodes.",
53
+ "label": "Context"
28
54
  },
29
55
  {
30
56
  "name": "hostCapabilities",
31
57
  "type": "RichBlockHostCapabilities | null",
32
- "required": false
58
+ "required": false,
59
+ "description": "Capacidades mediadas pelo host para presets, dados, actions e embeds governados.",
60
+ "label": "Host capabilities"
33
61
  },
34
62
  {
35
63
  "name": "layout",
36
64
  "type": "'block' | 'inline'",
37
- "required": false
65
+ "required": false,
66
+ "description": "Modo de renderizacao do documento: bloco ou inline.",
67
+ "label": "Layout",
68
+ "default": "block"
38
69
  },
39
70
  {
40
71
  "name": "rootClassName",
41
72
  "type": "string",
42
- "required": false
73
+ "required": false,
74
+ "description": "Classe CSS aplicada ao root do renderer para surfaces de host.",
75
+ "label": "Root class"
43
76
  }
44
77
  ],
45
78
  "outputs": [],
@@ -62,6 +95,10 @@
62
95
  "minCols": 2,
63
96
  "minRows": 1
64
97
  },
98
+ "configEditor": {
99
+ "component": "[ref:PraxisRichContentConfigEditor]",
100
+ "title": "Configurar rich content"
101
+ },
65
102
  "insertionPresets": [
66
103
  {
67
104
  "id": "editorial-card",
@@ -4303,14 +4340,12 @@
4303
4340
  "resolved",
4304
4341
  "empty",
4305
4342
  "error",
4306
- [
4307
- "draft",
4308
- "simulated",
4309
- "approved",
4310
- "published",
4311
- "superseded",
4312
- "reverted"
4313
- ]
4343
+ "draft",
4344
+ "simulated",
4345
+ "approved",
4346
+ "published",
4347
+ "superseded",
4348
+ "reverted"
4314
4349
  ]
4315
4350
  },
4316
4351
  "statusExpr": {
@@ -4383,13 +4418,11 @@
4383
4418
  "raised",
4384
4419
  "stroked",
4385
4420
  "flat",
4386
- [
4387
- "plain",
4388
- "outlined",
4389
- "elevated",
4390
- "filled",
4391
- "transparent"
4392
- ]
4421
+ "plain",
4422
+ "outlined",
4423
+ "elevated",
4424
+ "filled",
4425
+ "transparent"
4393
4426
  ]
4394
4427
  },
4395
4428
  "tone": {
@@ -5654,20 +5687,18 @@
5654
5687
  },
5655
5688
  "field": {
5656
5689
  "enum": [
5657
- [
5658
- "title",
5659
- "titleExpr",
5660
- "subtitle",
5661
- "subtitleExpr",
5662
- "meta",
5663
- "metaExpr",
5664
- "opposite",
5665
- "oppositeExpr",
5666
- "icon",
5667
- "iconExpr",
5668
- "badge",
5669
- "badgeExpr"
5670
- ],
5690
+ "title",
5691
+ "titleExpr",
5692
+ "subtitle",
5693
+ "subtitleExpr",
5694
+ "meta",
5695
+ "metaExpr",
5696
+ "opposite",
5697
+ "oppositeExpr",
5698
+ "icon",
5699
+ "iconExpr",
5700
+ "badge",
5701
+ "badgeExpr",
5671
5702
  "markerColor",
5672
5703
  "markerStyle",
5673
5704
  "connectorColor",
@@ -6526,7 +6557,7 @@
6526
6557
  "chunkIndex": 0,
6527
6558
  "chunkKind": "summary",
6528
6559
  "content": "Component ID: praxis-rich-content\nSelector: praxis-rich-content\nFriendly Name: Praxis Rich Content\nDescription: Renderer canonico de RichContentDocument para blocos editoriais, cards, grupos de metricas, media blocks, timelines e primitives de apresentacao.\nLib/Package: @praxisui/rich-content\nTags: widget, rich-content, editorial, presentation, cards, timeline\nInputs:\n - document (RichContentDocument | null)\n - nodes (RichBlockNode[] | null)\n - context (JsonLogicDataRecord | null)\n - hostCapabilities (RichBlockHostCapabilities | null)\n - layout ('block' | 'inline')\n - rootClassName (string)\nInsertion Presets:\n - editorial-card: Editorial card - Starter card with title, text and badge.\n - callout-guidance: Guidance callout - Starter callout for instructions and attention states.\n - cta-group: CTA group - Governed call-to-action cluster for next steps and host-mediated flows.\n - knowledge-surface: Knowledge surface - Starter composition with record summary and disclosure.\n - lookup-card: Lookup card - Governed lookup summary with primary host-mediated action.\n - related-record: Related record - Semantic related-record summary with optional governed primary action.\n - action-card: Action card - Governed editorial card with a primary host-mediated CTA.\n - approval-decision-surface: Approval decision surface - Domain starter for approval workbenches with KPIs, related approver context and governed decisions.\n - approval-review-surface: Approval review surface - Domain starter for approval review workbenches with queue metrics, selected request context and governed escalation actions.\n - approval-audit-surface: Approval audit surface - Domain starter for approval audit workbenches with compliance signals, evidence context and governed remediation actions.\n - approval-sla-triage-surface: Approval SLA triage surface - Domain starter for approval SLA triage workbenches with breach signals, queue ownership and governed triage actions.\n - approval-delegation-exception-surface: Approval delegation exception surface - Domain starter for approval delegation and exception workbenches with substitute coverage, policy context and governed exception actions.\n - employee-insight-surface: Employee insight surface - Domain starter for HR workbenches with employee KPIs, reporting context and governed follow-up actions.\n - hr-performance-review-surface: HR performance review surface - Domain starter for HR performance review workbenches with review signals, calibrated context and governed review actions.\n - hr-compensation-review-surface: HR compensation review surface - Domain starter for HR compensation review workbenches with budget signals, reward partner context and governed compensation actions.\n - hr-promotion-review-surface: HR promotion review surface - Domain starter for HR promotion review workbenches with readiness signals, sponsor context and governed promotion actions.\n - hr-offboarding-surface: HR offboarding surface - Domain starter for HR offboarding workbenches with exit signals, transition ownership and governed departure actions.\n - hr-succession-planning-surface: HR succession planning surface - Domain starter for HR succession planning workbenches with readiness signals, successor sponsorship and governed succession actions.\n - hr-leave-absence-surface: HR leave and absence surface - Domain starter for HR leave and absence workbenches with coverage signals, partner context and governed leave actions.\n - hr-internal-mobility-surface: HR internal mobility surface - Domain starter for HR internal mobility workbenches with readiness signals, target role context and governed mobility actions.\n - onboarding-journey-surface: Onboarding journey surface - Domain starter for onboarding workbenches with journey signals, assigned owner context and governed next-step actions.\n - onboarding-readiness-surface: Onboarding readiness surface - Domain starter for onboarding readiness workbenches with first-week signals, equipment context and governed readiness actions.\n - onboarding-manager-follow-up-surface: Onboarding manager follow-up surface - Domain starter for onboarding manager follow-up workbenches with follow-up signals, manager context and governed follow-up actions.\n - onboarding-equipment-access-recovery-surface: Onboarding equipment and access recovery surface - Domain starter for onboarding equipment and access recovery workbenches with recovery signals, access owner context and governed remediation actions.\n - onboarding-day-30-coaching-surface: Onboarding day-30 coaching surface - Domain starter for onboarding day-30 coaching workbenches with coaching signals, manager context and governed development actions.\n - corporate-information-surface: Corporate information surface - Enterprise starter for SAP-like record details with KPIs, dates, currency, notes, progress, timeline and governed decision context.\n - stat-group: Stat group - Semantic metric group for dashboards, summaries and compact knowledge surfaces.\n - timeline-surface: Timeline surface - Portable lifecycle surface with horizontal timeline defaults and governed milestone metadata.\n - tabs-surface: Tabs surface - Semantic tabbed surface for portable multi-panel editorial content.\n",
6529
- "sourcePointer": "praxis-ui-angular/projects/praxis-rich-content/src/lib/praxis-rich-content.metadata.ts",
6560
+ "sourcePointer": "projects/praxis-rich-content/src/lib/praxis-rich-content.metadata.ts",
6530
6561
  "contentHash": "f2fa5516a86a328300aab41ca0b4a9d741da1cac808471d2d8e4aabcb4af0361",
6531
6562
  "sourceKind": "component_definition",
6532
6563
  "sourceId": "praxis-rich-content",
@@ -6535,9 +6566,9 @@
6535
6566
  {
6536
6567
  "chunkIndex": 1,
6537
6568
  "chunkKind": "authoring_manifest",
6538
- "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-rich-content\",\n \"ownerPackage\": \"@praxisui/rich-content\",\n \"configSchemaId\": \"RichContentDocument\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"document\",\n \"type\": \"RichContentDocument | null\",\n \"description\": \"Canonical praxis.rich-content document rendered by the component.\"\n },\n {\n \"name\": \"nodes\",\n \"type\": \"RichBlockNode[] | null\",\n \"description\": \"Direct node list used only when the host controls the document envelope.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"JsonLogicDataRecord | null\",\n \"description\": \"External context used by expression paths and Json Logic rules.\"\n },\n {\n \"name\": \"hostCapabilities\",\n \"type\": \"RichBlockHostCapabilities | null\",\n \"description\": \"Host-mediated preset, action, action confirmation, data and embed capabilities; functions are not serialized in public contracts.\"\n },\n {\n \"name\": \"layout\",\n \"type\": \"'block' | 'inline'\",\n \"allowedValues\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Renderer layout mode.\"\n },\n {\n \"name\": \"rootClassName\",\n \"type\": \"string\",\n \"description\": \"CSS class applied to the renderer root.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"document\",\n \"resolver\": \"rich-content-document-root\",\n \"description\": \"The canonical RichContentDocument input envelope.\"\n },\n {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"description\": \"A top-level document.nodes[] block with stable id preferred over index.\"\n },\n {\n \"kind\": \"text\",\n \"resolver\": \"rich-text-node-by-id-or-path\",\n \"description\": \"Text-bearing nodes, including text, badge, metric, progress, card and timeline labels.\"\n },\n {\n \"kind\": \"link\",\n \"resolver\": \"rich-link-node-by-id-or-path\",\n \"description\": \"Canonical link node with label, href, target and rel.\"\n },\n {\n \"kind\": \"media\",\n \"resolver\": \"rich-media-node-by-id-or-path\",\n \"description\": \"Image, avatar image and mediaBlock child nodes.\"\n },\n {\n \"kind\": \"timeline\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"description\": \"Timeline nodes with visual placement, connector, marker and semantic appearance settings.\"\n },\n {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"description\": \"Timeline items nested inside timeline nodes; stable item id is preferred over index.\"\n },\n {\n \"kind\": \"metadata\",\n \"resolver\": \"rich-block-common-metadata\",\n \"description\": \"Common node metadata such as testId, className, visibleWhen and safe style.\"\n },\n {\n \"kind\": \"preset\",\n \"resolver\": \"rich-block-preset-ref\",\n \"description\": \"Preset nodes resolved through PRAXIS_RICH_BLOCK_PRESETS or hostCapabilities.resolvePreset.\"\n },\n {\n \"kind\": \"sanitizationPolicy\",\n \"resolver\": \"rich-content-validation-policy\",\n \"description\": \"Document validation policy enforced by validateRichContentDocument.\"\n },\n {\n \"kind\": \"display\",\n \"resolver\": \"rich-content-layout-and-root-class\",\n \"description\": \"Layout and rootClassName runtime inputs.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"document.set\",\n \"title\": \"Set rich content document\",\n \"scope\": \"global\",\n \"targetKind\": \"document\",\n \"target\": {\n \"kind\": \"document\",\n \"resolver\": \"rich-content-document-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"version\",\n \"nodes\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"praxis.rich-content\"\n },\n \"version\": {\n \"const\": \"1.0.0\"\n },\n \"context\": {\n \"type\": \"object\"\n },\n \"nodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"document\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"document-shape-canonical\",\n \"document-version-supported\",\n \"node-types-supported\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"block.add\",\n \"title\": \"Add rich content block\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"document-nodes-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"text\",\n \"icon\",\n \"image\",\n \"link\",\n \"badge\",\n \"avatar\",\n \"metric\",\n \"progress\",\n \"actionButton\",\n \"compose\",\n \"card\",\n \"callout\",\n \"ctaGroup\",\n \"keyValueList\",\n \"emptyState\",\n \"propertySheet\",\n \"statGroup\",\n \"tabs\",\n \"recordSummary\",\n \"lookupResult\",\n \"lookupCard\",\n \"relatedRecord\",\n \"actionCard\",\n \"decisionPackage\",\n \"collapsibleCard\",\n \"disclosure\",\n \"accordion\",\n \"formLauncher\",\n \"mediaBlock\",\n \"timeline\",\n \"preset\"\n ]\n },\n \"node\": {\n \"type\": \"object\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-block-add\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"text\",\n \"icon\",\n \"image\",\n \"link\",\n \"badge\",\n \"avatar\",\n \"metric\",\n \"progress\",\n \"actionButton\",\n \"compose\",\n \"card\",\n \"callout\",\n \"ctaGroup\",\n \"keyValueList\",\n \"emptyState\",\n \"propertySheet\",\n \"statGroup\",\n \"tabs\",\n \"recordSummary\",\n \"lookupResult\",\n \"lookupCard\",\n \"relatedRecord\",\n \"actionCard\",\n \"decisionPackage\",\n \"collapsibleCard\",\n \"disclosure\",\n \"accordion\",\n \"formLauncher\",\n \"mediaBlock\",\n \"timeline\",\n \"preset\"\n ]\n },\n \"node\": {\n \"type\": \"object\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"unsupported-node-type\",\n \"duplicate-node-id\",\n \"invalid-node-shape\",\n \"unsafe-url\",\n \"unsafe-style\"\n ],\n \"description\": \"Creates a supported RichBlockNode, validates it with validateRichContentDocument semantics and inserts it by stable neighbor id when provided.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"node-types-supported\",\n \"block-id-unique\",\n \"document-shape-canonical\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"block.update\",\n \"title\": \"Update rich content block fields\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"testId\": {\n \"type\": \"string\"\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"visibleWhen\": {\n \"type\": \"object\"\n },\n \"disabledWhen\": {\n \"type\": \"object\"\n },\n \"loadWhen\": {\n \"type\": \"object\"\n },\n \"classWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"styleWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"requiresCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"capabilityMode\": {\n \"enum\": [\n \"all\",\n \"any\"\n ]\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"textExpr\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"href\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"enum\": [\n \"_self\",\n \"_blank\"\n ]\n },\n \"rel\": {\n \"type\": \"string\"\n },\n \"src\": {\n \"type\": \"string\"\n },\n \"alt\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n },\n \"relationLabel\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"summaryExpr\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"ctaLabel\": {\n \"type\": \"string\"\n },\n \"caption\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n },\n \"errorText\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"idle\",\n \"resolved\",\n \"empty\",\n \"error\",\n [\n \"draft\",\n \"simulated\",\n \"approved\",\n \"published\",\n \"superseded\",\n \"reverted\"\n ]\n ]\n },\n \"statusExpr\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"ownerExpr\": {\n \"type\": \"string\"\n },\n \"policySource\": {\n \"type\": \"string\"\n },\n \"policySourceExpr\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"versionExpr\": {\n \"type\": \"string\"\n },\n \"confidence\": {\n \"type\": \"number\"\n },\n \"confidenceExpr\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ]\n },\n \"riskExpr\": {\n \"type\": \"string\"\n },\n \"lastReviewed\": {\n \"type\": \"string\"\n },\n \"lastReviewedExpr\": {\n \"type\": \"string\"\n },\n \"supersedes\": {\n \"type\": \"string\"\n },\n \"supersedesExpr\": {\n \"type\": \"string\"\n },\n \"evidence\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"appearance\": {\n \"enum\": [\n \"plain\",\n \"card\",\n \"underline\",\n \"pills\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"basic\",\n \"raised\",\n \"stroked\",\n \"flat\",\n [\n \"plain\",\n \"outlined\",\n \"elevated\",\n \"filled\",\n \"transparent\"\n ]\n ]\n },\n \"tone\": {\n \"enum\": [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\"\n ]\n },\n \"size\": {\n \"enum\": [\n \"sm\",\n \"md\",\n \"lg\"\n ]\n },\n \"density\": {},\n \"orientation\": {},\n \"loading\": {\n \"type\": \"boolean\"\n },\n \"loadingExpr\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"activeExpr\": {\n \"type\": \"string\"\n },\n \"defaultTabId\": {\n \"type\": \"string\"\n },\n \"order\": {\n \"enum\": [\n \"normal\",\n \"reverse\"\n ]\n },\n \"position\": {\n \"enum\": [\n \"left\",\n \"right\",\n \"alternate\",\n \"alternate-reverse\"\n ]\n },\n \"connectorVariant\": {\n \"enum\": [\n \"solid\",\n \"dashed\",\n \"none\"\n ]\n },\n \"connectorColor\": {\n \"enum\": [\n \"primary\",\n \"secondary\",\n \"tertiary\",\n \"success\",\n \"warning\",\n \"error\",\n \"info\",\n \"neutral\"\n ]\n },\n \"markerVariant\": {\n \"enum\": [\n \"dot\",\n \"icon\",\n \"number\"\n ]\n },\n \"markerColor\": {},\n \"markerStyle\": {\n \"enum\": [\n \"filled\",\n \"outlined\"\n ]\n },\n \"emphasis\": {\n \"enum\": [\n \"subtle\",\n \"standard\",\n \"strong\",\n \"hero\"\n ]\n },\n \"textAppearance\": {\n \"enum\": [\n \"default\",\n \"prominent\",\n \"eyebrow\",\n \"label\"\n ]\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"columns\": {\n \"enum\": [\n 1,\n 2\n ]\n },\n \"layout\": {\n \"enum\": [\n \"stacked\",\n \"inline\",\n \"split\",\n \"grid\"\n ]\n },\n \"action\": {\n \"type\": \"object\"\n },\n \"actions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"primaryAction\": {\n \"type\": \"object\"\n },\n \"secondaryActions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"media\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"image\",\n \"video\",\n \"icon\",\n \"avatar\"\n ]\n },\n \"src\": {\n \"type\": \"string\"\n },\n \"srcExpr\": {\n \"type\": \"string\"\n },\n \"alt\": {\n \"type\": \"string\"\n },\n \"altExpr\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"placement\": {\n \"enum\": [\n \"top\",\n \"leading\",\n \"trailing\",\n \"background\"\n ]\n },\n \"aspectRatio\": {\n \"type\": \"string\"\n }\n }\n },\n \"headerAction\": {\n \"type\": \"object\"\n },\n \"interaction\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"none\",\n \"action\",\n \"selectable\"\n ]\n },\n \"action\": {\n \"type\": \"object\"\n },\n \"selected\": {\n \"type\": \"boolean\"\n },\n \"selectedExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"accessibility\": {\n \"type\": \"object\",\n \"properties\": {\n \"role\": {\n \"enum\": [\n \"article\",\n \"group\",\n \"button\"\n ]\n },\n \"ariaLabel\": {\n \"type\": \"string\"\n },\n \"ariaLabelExpr\": {\n \"type\": \"string\"\n },\n \"ariaLabelledBy\": {\n \"type\": \"string\"\n },\n \"ariaDescribedBy\": {\n \"type\": \"string\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"header\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"body\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"footer\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"aside\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"node-types-supported\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].testId\",\n \"document.nodes[].className\",\n \"document.nodes[].style\",\n \"document.nodes[].visibleWhen\",\n \"document.nodes[].disabledWhen\",\n \"document.nodes[].loadWhen\",\n \"document.nodes[].classWhen\",\n \"document.nodes[].styleWhen\",\n \"document.nodes[].requiresCapabilities\",\n \"document.nodes[].capabilityMode\",\n \"document.nodes[].text\",\n \"document.nodes[].textExpr\",\n \"document.nodes[].label\",\n \"document.nodes[].labelExpr\",\n \"document.nodes[].href\",\n \"document.nodes[].target\",\n \"document.nodes[].rel\",\n \"document.nodes[].src\",\n \"document.nodes[].alt\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].subtitle\",\n \"document.nodes[].subtitleExpr\",\n \"document.nodes[].relationLabel\",\n \"document.nodes[].message\",\n \"document.nodes[].summary\",\n \"document.nodes[].summaryExpr\",\n \"document.nodes[].description\",\n \"document.nodes[].ctaLabel\",\n \"document.nodes[].caption\",\n \"document.nodes[].emptyText\",\n \"document.nodes[].errorText\",\n \"document.nodes[].status\",\n \"document.nodes[].statusExpr\",\n \"document.nodes[].owner\",\n \"document.nodes[].ownerExpr\",\n \"document.nodes[].policySource\",\n \"document.nodes[].policySourceExpr\",\n \"document.nodes[].version\",\n \"document.nodes[].versionExpr\",\n \"document.nodes[].confidence\",\n \"document.nodes[].confidenceExpr\",\n \"document.nodes[].risk\",\n \"document.nodes[].riskExpr\",\n \"document.nodes[].lastReviewed\",\n \"document.nodes[].lastReviewedExpr\",\n \"document.nodes[].supersedes\",\n \"document.nodes[].supersedesExpr\",\n \"document.nodes[].evidence\",\n \"document.nodes[].appearance\",\n \"document.nodes[].variant\",\n \"document.nodes[].tone\",\n \"document.nodes[].size\",\n \"document.nodes[].density\",\n \"document.nodes[].orientation\",\n \"document.nodes[].loading\",\n \"document.nodes[].loadingExpr\",\n \"document.nodes[].active\",\n \"document.nodes[].activeExpr\",\n \"document.nodes[].defaultTabId\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].icon\",\n \"document.nodes[].formId\",\n \"document.nodes[].columns\",\n \"document.nodes[].layout\",\n \"document.nodes[].action\",\n \"document.nodes[].actions\",\n \"document.nodes[].primaryAction\",\n \"document.nodes[].secondaryActions\",\n \"document.nodes[].media\",\n \"document.nodes[].headerAction\",\n \"document.nodes[].interaction\",\n \"document.nodes[].accessibility\",\n \"document.nodes[].fields\",\n \"document.nodes[].items[]\",\n \"document.nodes[].header\",\n \"document.nodes[].body\",\n \"document.nodes[].footer\",\n \"document.nodes[].aside\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"block.remove\",\n \"title\": \"Remove rich content block\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"replacementBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"remove-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"block-exists\",\n \"destructive-removal-confirmed\",\n \"document-not-empty-when-required\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"block.order.set\",\n \"title\": \"Reorder rich content blocks\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"blockId\"\n ],\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"reorder-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"block-order-deterministic\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"text.update\",\n \"title\": \"Update rich content text\",\n \"scope\": \"templating\",\n \"targetKind\": \"text\",\n \"target\": {\n \"kind\": \"text\",\n \"resolver\": \"rich-text-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n },\n \"textExpr\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"relationLabel\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"ctaLabel\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n },\n \"errorText\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"text-target-supports-field\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].text\",\n \"document.nodes[].textExpr\",\n \"document.nodes[].label\",\n \"document.nodes[].labelExpr\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\",\n \"document.nodes[].relationLabel\",\n \"document.nodes[].message\",\n \"document.nodes[].summary\",\n \"document.nodes[].description\",\n \"document.nodes[].ctaLabel\",\n \"document.nodes[].emptyText\",\n \"document.nodes[].errorText\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"link.add\",\n \"title\": \"Add link block\",\n \"scope\": \"templating\",\n \"targetKind\": \"link\",\n \"target\": {\n \"kind\": \"link\",\n \"resolver\": \"document-nodes-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"label\",\n \"href\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"href\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"enum\": [\n \"_self\",\n \"_blank\"\n ]\n },\n \"rel\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"link-url-safe\",\n \"link-policy-explicit\",\n \"node-types-supported\",\n \"block-id-unique\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].href\",\n \"document.nodes[].target\",\n \"document.nodes[].rel\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"link.remove\",\n \"title\": \"Remove link from rich content\",\n \"scope\": \"templating\",\n \"targetKind\": \"link\",\n \"target\": {\n \"kind\": \"link\",\n \"resolver\": \"rich-link-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"linkId\": {\n \"type\": \"string\"\n },\n \"preserveLabelAsText\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-link-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\",\n \"document.nodes[].label\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"linkId\": {\n \"type\": \"string\"\n },\n \"preserveLabelAsText\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"link-not-found\",\n \"ambiguous-link-target\",\n \"replacement-text-invalid\"\n ],\n \"description\": \"Removes a link node by stable id or path and optionally replaces it with a text node containing the prior link label.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"link-target-exists\",\n \"destructive-removal-confirmed\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-link-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"preset.apply\",\n \"title\": \"Apply rich block preset\",\n \"scope\": \"templating\",\n \"targetKind\": \"preset\",\n \"target\": {\n \"kind\": \"preset\",\n \"resolver\": \"rich-block-preset-ref\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"ref\"\n ],\n \"properties\": {\n \"ref\": {\n \"type\": \"object\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"replaceBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-preset-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_RICH_BLOCK_PRESETS\",\n \"hostCapabilities.resolvePreset\",\n \"document.nodes[]\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"ref.kind\",\n \"ref.namespace\",\n \"ref.presetId\",\n \"ref.version\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"ref\"\n ],\n \"properties\": {\n \"ref\": {\n \"type\": \"object\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"replaceBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"preset-not-found\",\n \"preset-kind-invalid\",\n \"preset-document-invalid\",\n \"preset-cycle-detected\"\n ],\n \"description\": \"Resolves a rich-block preset through the governed registry/host mediation and inserts or replaces a preset reference without serializing functions.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"preset-ref-valid\",\n \"preset-exists-or-host-mediated\",\n \"host-capabilities-serializable\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].ref\",\n \"document.nodes[].inputs\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"metadata.update\",\n \"title\": \"Update rich block metadata\",\n \"scope\": \"templating\",\n \"targetKind\": \"metadata\",\n \"target\": {\n \"kind\": \"metadata\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"testId\": {\n \"type\": \"string\"\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"visibleWhen\": {\n \"type\": \"object\"\n },\n \"disabledWhen\": {\n \"type\": \"object\"\n },\n \"loadWhen\": {\n \"type\": \"object\"\n },\n \"classWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"styleWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"requiresCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"capabilityMode\": {\n \"enum\": [\n \"all\",\n \"any\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"class-name-safe\",\n \"visible-when-json-logic\",\n \"unsafe-style-rejected\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].testId\",\n \"document.nodes[].className\",\n \"document.nodes[].visibleWhen\",\n \"document.nodes[].disabledWhen\",\n \"document.nodes[].loadWhen\",\n \"document.nodes[].classWhen\",\n \"document.nodes[].styleWhen\",\n \"document.nodes[].style\",\n \"document.nodes[].requiresCapabilities\",\n \"document.nodes[].capabilityMode\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"mediaBlock.update\",\n \"title\": \"Update media block fields\",\n \"scope\": \"templating\",\n \"targetKind\": \"media\",\n \"target\": {\n \"kind\": \"media\",\n \"resolver\": \"rich-media-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"avatarName\": {\n \"type\": \"string\"\n },\n \"avatarImageSrc\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-media-block-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\"\n ],\n \"writes\": [\n \"document.nodes[].avatar\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"avatarName\": {\n \"type\": \"string\"\n },\n \"avatarImageSrc\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"media-block-not-found\",\n \"target-not-media-block\",\n \"unsafe-url\",\n \"invalid-text-node\"\n ],\n \"description\": \"Updates the structured mediaBlock avatar/title/subtitle fields while preserving meta and trailing content for advanced JSON authoring.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"media-block-target-valid\",\n \"unsafe-url-rejected\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].avatar\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.node.update\",\n \"title\": \"Update timeline display settings\",\n \"scope\": \"templating\",\n \"targetKind\": \"timeline\",\n \"target\": {\n \"kind\": \"timeline\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"minProperties\": 2,\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"orientation\": {\n \"enum\": [\n \"vertical\",\n \"horizontal\"\n ]\n },\n \"order\": {},\n \"position\": {},\n \"connectorVariant\": {},\n \"connectorColor\": {},\n \"markerVariant\": {},\n \"markerColor\": {},\n \"markerStyle\": {},\n \"emphasis\": {},\n \"density\": {\n \"enum\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n },\n \"textAppearance\": {},\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-node-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\"\n ],\n \"writes\": [\n \"document.nodes[].orientation\",\n \"document.nodes[].order\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].emphasis\",\n \"document.nodes[].density\",\n \"document.nodes[].textAppearance\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].emptyText\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"failureModes\": [\n \"timeline-not-found\",\n \"unsupported-timeline-setting\",\n \"invalid-timeline-setting\"\n ],\n \"description\": \"Updates timeline node display and semantic appearance settings while preserving timeline items and the canonical RichTimelineNode shape.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-setting-supported\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].orientation\",\n \"document.nodes[].order\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].emphasis\",\n \"document.nodes[].density\",\n \"document.nodes[].textAppearance\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].emptyText\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.add\",\n \"title\": \"Add timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\",\n \"item\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"item\": {},\n \"afterItemId\": {\n \"type\": \"string\"\n },\n \"beforeItemId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-add\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\",\n \"item\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"afterItemId\": {\n \"type\": \"string\"\n },\n \"beforeItemId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"timeline-not-found\",\n \"duplicate-timeline-item-id\",\n \"invalid-timeline-item\"\n ],\n \"description\": \"Adds a timeline item to a timeline node using stable timeline and item ids when present; array index is a resolver fallback only.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-item-valid\",\n \"timeline-item-id-unique\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.update\",\n \"title\": \"Update timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"minProperties\": 2,\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n },\n \"field\": {\n \"enum\": [\n [\n \"title\",\n \"titleExpr\",\n \"subtitle\",\n \"subtitleExpr\",\n \"meta\",\n \"metaExpr\",\n \"opposite\",\n \"oppositeExpr\",\n \"icon\",\n \"iconExpr\",\n \"badge\",\n \"badgeExpr\"\n ],\n \"markerColor\",\n \"markerStyle\",\n \"connectorColor\",\n \"connectorVariant\"\n ]\n },\n \"value\": {\n \"type\": \"string\"\n },\n \"patch\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n },\n \"meta\": {\n \"type\": \"string\"\n },\n \"metaExpr\": {\n \"type\": \"string\"\n },\n \"opposite\": {\n \"type\": \"string\"\n },\n \"oppositeExpr\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"iconExpr\": {\n \"type\": \"string\"\n },\n \"badge\": {\n \"type\": \"string\"\n },\n \"badgeExpr\": {\n \"type\": \"string\"\n },\n \"markerColor\": {},\n \"markerStyle\": {},\n \"connectorColor\": {},\n \"connectorVariant\": {}\n }\n }\n },\n \"anyOf\": [\n {\n \"required\": [\n \"field\",\n \"value\"\n ]\n },\n {\n \"required\": [\n \"patch\"\n ]\n }\n ],\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"enum\": [\n \"markerColor\",\n \"connectorColor\"\n ]\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"const\": \"markerStyle\"\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"const\": \"connectorVariant\"\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {}\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"failureModes\": [\n \"timeline-not-found\",\n \"timeline-item-not-found\",\n \"unsupported-timeline-field\",\n \"invalid-timeline-item\"\n ],\n \"description\": \"Updates a timeline item by stable item id when available, preserving the item object shape accepted by RichTimelineItem.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-item-exists\",\n \"timeline-item-field-supported\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[].title\",\n \"document.nodes[].items[].titleExpr\",\n \"document.nodes[].items[].subtitle\",\n \"document.nodes[].items[].subtitleExpr\",\n \"document.nodes[].items[].meta\",\n \"document.nodes[].items[].metaExpr\",\n \"document.nodes[].items[].opposite\",\n \"document.nodes[].items[].oppositeExpr\",\n \"document.nodes[].items[].icon\",\n \"document.nodes[].items[].iconExpr\",\n \"document.nodes[].items[].badge\",\n \"document.nodes[].items[].badgeExpr\",\n \"document.nodes[].items[].markerColor\",\n \"document.nodes[].items[].markerStyle\",\n \"document.nodes[].items[].connectorColor\",\n \"document.nodes[].items[].connectorVariant\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\",\n \"target-timeline-item-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.remove\",\n \"title\": \"Remove timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"timeline-not-found\",\n \"timeline-item-not-found\",\n \"ambiguous-timeline-item\"\n ],\n \"description\": \"Removes a timeline item from a timeline node after explicit confirmation; stable item id is preferred over index.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"timeline-target-valid\",\n \"timeline-item-exists\",\n \"destructive-removal-confirmed\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-timeline-item-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"sanitizationPolicy.set\",\n \"title\": \"Set rich content sanitization policy\",\n \"scope\": \"global\",\n \"targetKind\": \"sanitizationPolicy\",\n \"target\": {\n \"kind\": \"sanitizationPolicy\",\n \"resolver\": \"rich-content-validation-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"allowHtml\": {\n \"const\": false\n },\n \"allowedUrlProtocols\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allowImageDataUrls\": {\n \"type\": \"boolean\"\n },\n \"maxNodeDepth\": {\n \"type\": \"number\"\n },\n \"maxNodeCount\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-sanitization-policy\",\n \"handlerContract\": {\n \"reads\": [\n \"document\",\n \"validateRichContentDocument\"\n ],\n \"writes\": [\n \"document\"\n ],\n \"identityKeys\": [\n \"document.kind\",\n \"document.version\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"allowHtml\": {\n \"const\": false\n },\n \"allowedUrlProtocols\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allowImageDataUrls\": {\n \"type\": \"boolean\"\n },\n \"maxNodeDepth\": {\n \"type\": \"number\"\n },\n \"maxNodeCount\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"html-not-supported\",\n \"unsafe-protocol\",\n \"max-depth-too-high\",\n \"max-node-count-too-high\"\n ],\n \"description\": \"Validates requested policy against the fixed validator guardrails; rich-content authoring remains structured JSON and does not allow arbitrary HTML.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"sanitization-policy-explicit\",\n \"unsafe-html-rejected\",\n \"unsafe-url-rejected\",\n \"security-change-confirmed\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"display.mode.set\",\n \"title\": \"Set rich content display mode\",\n \"scope\": \"global\",\n \"targetKind\": \"display\",\n \"target\": {\n \"kind\": \"display\",\n \"resolver\": \"rich-content-layout-and-root-class\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"rootClassName\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"layout\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"rootClassName\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"layout-valid\",\n \"root-class-safe\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"layout\",\n \"rootClassName\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"document-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"PRC001\",\n \"description\": \"Documents must satisfy RichContentDocument with kind praxis.rich-content, version 1.0.0 and a nodes array.\"\n },\n {\n \"validatorId\": \"document-version-supported\",\n \"level\": \"error\",\n \"code\": \"PRC002\",\n \"description\": \"Only document version 1.0.0 is supported.\"\n },\n {\n \"validatorId\": \"node-types-supported\",\n \"level\": \"error\",\n \"code\": \"PRC003\",\n \"description\": \"Nodes must use supported rich-content node types, including link as a structured node rather than arbitrary HTML.\"\n },\n {\n \"validatorId\": \"block-id-unique\",\n \"level\": \"warning\",\n \"code\": \"PRC004\",\n \"description\": \"Stable block ids should be unique when present; operations should prefer ids over array indexes.\"\n },\n {\n \"validatorId\": \"block-exists\",\n \"level\": \"error\",\n \"code\": \"PRC005\",\n \"description\": \"Target block must exist before patching, reordering or removing it.\"\n },\n {\n \"validatorId\": \"block-order-deterministic\",\n \"level\": \"error\",\n \"code\": \"PRC006\",\n \"description\": \"Block ordering must use stable ids or explicit before/after placement and not rely on transient generated indexes.\"\n },\n {\n \"validatorId\": \"destructive-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PRC007\",\n \"description\": \"Block and link removal are destructive and require confirmation.\"\n },\n {\n \"validatorId\": \"document-not-empty-when-required\",\n \"level\": \"warning\",\n \"code\": \"PRC008\",\n \"description\": \"Removal should not leave an empty document unless the user explicitly requested an empty rich content document.\"\n },\n {\n \"validatorId\": \"text-target-supports-field\",\n \"level\": \"error\",\n \"code\": \"PRC009\",\n \"description\": \"Text updates may only target fields supported by the selected node type.\"\n },\n {\n \"validatorId\": \"expression-path-safe\",\n \"level\": \"warning\",\n \"code\": \"PRC010\",\n \"description\": \"Expression paths must remain simple context paths or Json Logic expressions, not string DSL code.\"\n },\n {\n \"validatorId\": \"link-url-safe\",\n \"level\": \"error\",\n \"code\": \"PRC011\",\n \"description\": \"Link href values must reject javascript:, vbscript:, file: and unsafe data URLs.\"\n },\n {\n \"validatorId\": \"link-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"PRC012\",\n \"description\": \"Links must declare safe target/rel behavior; _blank links default to noopener noreferrer.\"\n },\n {\n \"validatorId\": \"link-target-exists\",\n \"level\": \"error\",\n \"code\": \"PRC013\",\n \"description\": \"Link removal must resolve an existing link node by stable id or path.\"\n },\n {\n \"validatorId\": \"unsafe-url-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC014\",\n \"description\": \"Image, avatar and link URL fields must reject unsafe protocols and null bytes.\"\n },\n {\n \"validatorId\": \"unsafe-style-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC015\",\n \"description\": \"Inline style values must reject script, import, binding and data URL expressions.\"\n },\n {\n \"validatorId\": \"unsafe-html-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC016\",\n \"description\": \"Rich-content authoring must remain structured document JSON and must not accept arbitrary HTML/script patches.\"\n },\n {\n \"validatorId\": \"sanitization-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"PRC017\",\n \"description\": \"Security policy requests must keep HTML disabled and URL/style guardrails explicit.\"\n },\n {\n \"validatorId\": \"security-change-confirmed\",\n \"level\": \"error\",\n \"code\": \"PRC018\",\n \"description\": \"Sanitization policy changes require explicit confirmation.\"\n },\n {\n \"validatorId\": \"preset-ref-valid\",\n \"level\": \"error\",\n \"code\": \"PRC019\",\n \"description\": \"Preset refs must use kind rich-block plus namespace, presetId and optional version.\"\n },\n {\n \"validatorId\": \"preset-exists-or-host-mediated\",\n \"level\": \"error\",\n \"code\": \"PRC020\",\n \"description\": \"Preset application must resolve through PRAXIS_RICH_BLOCK_PRESETS or a host-mediated resolver.\"\n },\n {\n \"validatorId\": \"host-capabilities-serializable\",\n \"level\": \"error\",\n \"code\": \"PRC021\",\n \"description\": \"Public contracts must not serialize host capability functions; only refs and inputs are persisted.\"\n },\n {\n \"validatorId\": \"layout-valid\",\n \"level\": \"error\",\n \"code\": \"PRC022\",\n \"description\": \"Layout must be block or inline.\"\n },\n {\n \"validatorId\": \"root-class-safe\",\n \"level\": \"warning\",\n \"code\": \"PRC023\",\n \"description\": \"rootClassName must contain safe CSS class tokens.\"\n },\n {\n \"validatorId\": \"editor-runtime-round-trip\",\n \"level\": \"error\",\n \"code\": \"PRC024\",\n \"description\": \"Config editor, Settings Panel payload and runtime renderer must preserve document structure, layout and rootClassName.\"\n },\n {\n \"validatorId\": \"class-name-safe\",\n \"level\": \"error\",\n \"code\": \"PRC025\",\n \"description\": \"Node className values must contain safe CSS class tokens.\"\n },\n {\n \"validatorId\": \"visible-when-json-logic\",\n \"level\": \"error\",\n \"code\": \"PRC026\",\n \"description\": \"visibleWhen must be a Json Logic expression object and not a string DSL.\"\n },\n {\n \"validatorId\": \"media-block-target-valid\",\n \"level\": \"error\",\n \"code\": \"PRC027\",\n \"description\": \"Media operations must target a mediaBlock node and preserve structured avatar/text child nodes.\"\n },\n {\n \"validatorId\": \"timeline-target-valid\",\n \"level\": \"error\",\n \"code\": \"PRC028\",\n \"description\": \"Timeline item operations must target a timeline node with an items array.\"\n },\n {\n \"validatorId\": \"timeline-item-valid\",\n \"level\": \"error\",\n \"code\": \"PRC029\",\n \"description\": \"Timeline items must be objects matching RichTimelineItem fields.\"\n },\n {\n \"validatorId\": \"timeline-item-id-unique\",\n \"level\": \"warning\",\n \"code\": \"PRC030\",\n \"description\": \"Timeline item ids should be unique inside a timeline node when present.\"\n },\n {\n \"validatorId\": \"timeline-item-exists\",\n \"level\": \"error\",\n \"code\": \"PRC031\",\n \"description\": \"Timeline item updates and removals must resolve an existing item by stable id or explicit fallback index.\"\n },\n {\n \"validatorId\": \"timeline-item-field-supported\",\n \"level\": \"error\",\n \"code\": \"PRC032\",\n \"description\": \"Timeline item updates may only target supported RichTimelineItem fields.\"\n },\n {\n \"validatorId\": \"timeline-setting-supported\",\n \"level\": \"error\",\n \"code\": \"PRC033\",\n \"description\": \"Timeline display settings must use supported position, connector, marker, emphasis, density and text appearance enum values.\"\n }\n ],\n \"roundTripRequirements\": [\n \"The editor must produce the same widget input envelope consumed by page-builder: inputs.document, inputs.layout and inputs.rootClassName.\",\n \"Rich content must remain structured RichContentDocument JSON; arbitrary HTML and script URL patches are rejected before persistence.\",\n \"Block identity should prefer document.nodes[].id; array index is a resolver fallback only and cannot be the canonical identity for generated patches.\",\n \"Link authoring uses canonical link nodes with safe href/target/rel instead of markdown or raw HTML embedded in text nodes.\",\n \"MediaBlock, timeline node appearance, timeline item, metadata, visibleWhen and safe style authoring use the same structured paths exposed by the visual config editor.\",\n \"Preset authoring persists only rich-block refs and inputs; host capability functions remain runtime-mediated and are not serialized.\"\n ],\n \"examples\": [\n {\n \"id\": \"set-empty-document\",\n \"request\": \"Start with an empty rich content document.\",\n \"operationId\": \"document.set\",\n \"params\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": []\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-text-block\",\n \"request\": \"Add a text block saying Welcome.\",\n \"operationId\": \"block.add\",\n \"params\": {\n \"type\": \"text\",\n \"node\": {\n \"id\": \"welcome\",\n \"type\": \"text\",\n \"text\": \"Welcome\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-obsolete-block\",\n \"request\": \"Remove the obsolete block.\",\n \"operationId\": \"block.remove\",\n \"target\": \"obsolete\",\n \"params\": {\n \"blockId\": \"obsolete\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-summary-before-details\",\n \"request\": \"Move summary before details.\",\n \"operationId\": \"block.order.set\",\n \"target\": \"summary\",\n \"params\": {\n \"blockId\": \"summary\",\n \"beforeBlockId\": \"details\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"update-title-text\",\n \"request\": \"Change the hero title to Customer overview.\",\n \"operationId\": \"text.update\",\n \"target\": \"hero-title\",\n \"params\": {\n \"text\": \"Customer overview\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-docs-link\",\n \"request\": \"Add a link to the documentation.\",\n \"operationId\": \"link.add\",\n \"params\": {\n \"id\": \"docs-link\",\n \"label\": \"Documentation\",\n \"href\": \"/docs\",\n \"target\": \"_self\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-script-link\",\n \"request\": \"Add a link to javascript:alert(1).\",\n \"operationId\": \"link.add\",\n \"params\": {\n \"label\": \"Bad link\",\n \"href\": \"javascript:alert(1)\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"remove-docs-link\",\n \"request\": \"Remove the documentation link but keep its label as text.\",\n \"operationId\": \"link.remove\",\n \"target\": \"docs-link\",\n \"params\": {\n \"linkId\": \"docs-link\",\n \"preserveLabelAsText\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-profile-preset\",\n \"request\": \"Apply the profile summary rich-block preset.\",\n \"operationId\": \"preset.apply\",\n \"params\": {\n \"ref\": {\n \"kind\": \"rich-block\",\n \"namespace\": \"praxis.rich-content\",\n \"presetId\": \"profile-summary\",\n \"version\": \"1.0.0\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"show-only-active-row\",\n \"request\": \"Show the status block only when row.active is true.\",\n \"operationId\": \"metadata.update\",\n \"target\": \"status\",\n \"params\": {\n \"blockId\": \"status\",\n \"visibleWhen\": {\n \"===\": [\n {\n \"var\": \"row.active\"\n },\n true\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"update-media-title\",\n \"request\": \"Update the profile media block title and avatar name.\",\n \"operationId\": \"mediaBlock.update\",\n \"target\": \"profile-media\",\n \"params\": {\n \"blockId\": \"profile-media\",\n \"avatarName\": \"Ana Silva\",\n \"title\": \"Profile summary\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"make-timeline-prominent\",\n \"request\": \"Make the activity timeline read as a prominent hero process.\",\n \"operationId\": \"timeline.node.update\",\n \"target\": \"activity\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"emphasis\": \"hero\",\n \"density\": \"comfortable\",\n \"textAppearance\": \"prominent\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-created-timeline-item\",\n \"request\": \"Add a Created item to the activity timeline.\",\n \"operationId\": \"timeline.item.add\",\n \"target\": \"activity\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"item\": {\n \"id\": \"created\",\n \"title\": \"Created\",\n \"badge\": \"Done\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unknown-timeline-field\",\n \"request\": \"Set a custom script field on a timeline item.\",\n \"operationId\": \"timeline.item.update\",\n \"target\": \"activity.created\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"itemId\": \"created\",\n \"field\": \"script\",\n \"value\": \"alert(1)\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-html-policy\",\n \"request\": \"Allow arbitrary HTML in this rich content document.\",\n \"operationId\": \"sanitizationPolicy.set\",\n \"params\": {\n \"allowHtml\": true\n },\n \"isPositive\": false\n },\n {\n \"id\": \"compact-inline-layout\",\n \"request\": \"Render this rich content inline with root class status-line.\",\n \"operationId\": \"display.mode.set\",\n \"params\": {\n \"layout\": \"inline\",\n \"rootClassName\": \"status-line\"\n },\n \"isPositive\": true\n }\n ]\n}",
6539
- "sourcePointer": "praxis-ui-angular/projects/praxis-rich-content/src/lib/ai/praxis-rich-content-authoring-manifest.ts",
6540
- "contentHash": "2f86c98914af1e3c379b5761e770b008a1d2533afeac3002c8e9b06d04e96783",
6569
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-rich-content\",\n \"ownerPackage\": \"@praxisui/rich-content\",\n \"configSchemaId\": \"RichContentDocument\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"document\",\n \"type\": \"RichContentDocument | null\",\n \"description\": \"Canonical praxis.rich-content document rendered by the component.\"\n },\n {\n \"name\": \"nodes\",\n \"type\": \"RichBlockNode[] | null\",\n \"description\": \"Direct node list used only when the host controls the document envelope.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"JsonLogicDataRecord | null\",\n \"description\": \"External context used by expression paths and Json Logic rules.\"\n },\n {\n \"name\": \"hostCapabilities\",\n \"type\": \"RichBlockHostCapabilities | null\",\n \"description\": \"Host-mediated preset, action, action confirmation, data and embed capabilities; functions are not serialized in public contracts.\"\n },\n {\n \"name\": \"layout\",\n \"type\": \"'block' | 'inline'\",\n \"allowedValues\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Renderer layout mode.\"\n },\n {\n \"name\": \"rootClassName\",\n \"type\": \"string\",\n \"description\": \"CSS class applied to the renderer root.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"document\",\n \"resolver\": \"rich-content-document-root\",\n \"description\": \"The canonical RichContentDocument input envelope.\"\n },\n {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"description\": \"A top-level document.nodes[] block with stable id preferred over index.\"\n },\n {\n \"kind\": \"text\",\n \"resolver\": \"rich-text-node-by-id-or-path\",\n \"description\": \"Text-bearing nodes, including text, badge, metric, progress, card and timeline labels.\"\n },\n {\n \"kind\": \"link\",\n \"resolver\": \"rich-link-node-by-id-or-path\",\n \"description\": \"Canonical link node with label, href, target and rel.\"\n },\n {\n \"kind\": \"media\",\n \"resolver\": \"rich-media-node-by-id-or-path\",\n \"description\": \"Image, avatar image and mediaBlock child nodes.\"\n },\n {\n \"kind\": \"timeline\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"description\": \"Timeline nodes with visual placement, connector, marker and semantic appearance settings.\"\n },\n {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"description\": \"Timeline items nested inside timeline nodes; stable item id is preferred over index.\"\n },\n {\n \"kind\": \"metadata\",\n \"resolver\": \"rich-block-common-metadata\",\n \"description\": \"Common node metadata such as testId, className, visibleWhen and safe style.\"\n },\n {\n \"kind\": \"preset\",\n \"resolver\": \"rich-block-preset-ref\",\n \"description\": \"Preset nodes resolved through PRAXIS_RICH_BLOCK_PRESETS or hostCapabilities.resolvePreset.\"\n },\n {\n \"kind\": \"sanitizationPolicy\",\n \"resolver\": \"rich-content-validation-policy\",\n \"description\": \"Document validation policy enforced by validateRichContentDocument.\"\n },\n {\n \"kind\": \"display\",\n \"resolver\": \"rich-content-layout-and-root-class\",\n \"description\": \"Layout and rootClassName runtime inputs.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"document.set\",\n \"title\": \"Set rich content document\",\n \"scope\": \"global\",\n \"targetKind\": \"document\",\n \"target\": {\n \"kind\": \"document\",\n \"resolver\": \"rich-content-document-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"version\",\n \"nodes\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"praxis.rich-content\"\n },\n \"version\": {\n \"const\": \"1.0.0\"\n },\n \"context\": {\n \"type\": \"object\"\n },\n \"nodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"document\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"document-shape-canonical\",\n \"document-version-supported\",\n \"node-types-supported\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"block.add\",\n \"title\": \"Add rich content block\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"document-nodes-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"text\",\n \"icon\",\n \"image\",\n \"link\",\n \"badge\",\n \"avatar\",\n \"metric\",\n \"progress\",\n \"actionButton\",\n \"compose\",\n \"card\",\n \"callout\",\n \"ctaGroup\",\n \"keyValueList\",\n \"emptyState\",\n \"propertySheet\",\n \"statGroup\",\n \"tabs\",\n \"recordSummary\",\n \"lookupResult\",\n \"lookupCard\",\n \"relatedRecord\",\n \"actionCard\",\n \"decisionPackage\",\n \"collapsibleCard\",\n \"disclosure\",\n \"accordion\",\n \"formLauncher\",\n \"mediaBlock\",\n \"timeline\",\n \"preset\"\n ]\n },\n \"node\": {\n \"type\": \"object\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-block-add\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"type\"\n ],\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"text\",\n \"icon\",\n \"image\",\n \"link\",\n \"badge\",\n \"avatar\",\n \"metric\",\n \"progress\",\n \"actionButton\",\n \"compose\",\n \"card\",\n \"callout\",\n \"ctaGroup\",\n \"keyValueList\",\n \"emptyState\",\n \"propertySheet\",\n \"statGroup\",\n \"tabs\",\n \"recordSummary\",\n \"lookupResult\",\n \"lookupCard\",\n \"relatedRecord\",\n \"actionCard\",\n \"decisionPackage\",\n \"collapsibleCard\",\n \"disclosure\",\n \"accordion\",\n \"formLauncher\",\n \"mediaBlock\",\n \"timeline\",\n \"preset\"\n ]\n },\n \"node\": {\n \"type\": \"object\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"unsupported-node-type\",\n \"duplicate-node-id\",\n \"invalid-node-shape\",\n \"unsafe-url\",\n \"unsafe-style\"\n ],\n \"description\": \"Creates a supported RichBlockNode, validates it with validateRichContentDocument semantics and inserts it by stable neighbor id when provided.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"node-types-supported\",\n \"block-id-unique\",\n \"document-shape-canonical\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"block.update\",\n \"title\": \"Update rich content block fields\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"testId\": {\n \"type\": \"string\"\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"visibleWhen\": {\n \"type\": \"object\"\n },\n \"disabledWhen\": {\n \"type\": \"object\"\n },\n \"loadWhen\": {\n \"type\": \"object\"\n },\n \"classWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"styleWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"requiresCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"capabilityMode\": {\n \"enum\": [\n \"all\",\n \"any\"\n ]\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"textExpr\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"href\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"enum\": [\n \"_self\",\n \"_blank\"\n ]\n },\n \"rel\": {\n \"type\": \"string\"\n },\n \"src\": {\n \"type\": \"string\"\n },\n \"alt\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n },\n \"relationLabel\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"summaryExpr\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"ctaLabel\": {\n \"type\": \"string\"\n },\n \"caption\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n },\n \"errorText\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"idle\",\n \"resolved\",\n \"empty\",\n \"error\",\n \"draft\",\n \"simulated\",\n \"approved\",\n \"published\",\n \"superseded\",\n \"reverted\"\n ]\n },\n \"statusExpr\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"ownerExpr\": {\n \"type\": \"string\"\n },\n \"policySource\": {\n \"type\": \"string\"\n },\n \"policySourceExpr\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"versionExpr\": {\n \"type\": \"string\"\n },\n \"confidence\": {\n \"type\": \"number\"\n },\n \"confidenceExpr\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ]\n },\n \"riskExpr\": {\n \"type\": \"string\"\n },\n \"lastReviewed\": {\n \"type\": \"string\"\n },\n \"lastReviewedExpr\": {\n \"type\": \"string\"\n },\n \"supersedes\": {\n \"type\": \"string\"\n },\n \"supersedesExpr\": {\n \"type\": \"string\"\n },\n \"evidence\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"appearance\": {\n \"enum\": [\n \"plain\",\n \"card\",\n \"underline\",\n \"pills\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"basic\",\n \"raised\",\n \"stroked\",\n \"flat\",\n \"plain\",\n \"outlined\",\n \"elevated\",\n \"filled\",\n \"transparent\"\n ]\n },\n \"tone\": {\n \"enum\": [\n \"neutral\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\"\n ]\n },\n \"size\": {\n \"enum\": [\n \"sm\",\n \"md\",\n \"lg\"\n ]\n },\n \"density\": {},\n \"orientation\": {},\n \"loading\": {\n \"type\": \"boolean\"\n },\n \"loadingExpr\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"activeExpr\": {\n \"type\": \"string\"\n },\n \"defaultTabId\": {\n \"type\": \"string\"\n },\n \"order\": {\n \"enum\": [\n \"normal\",\n \"reverse\"\n ]\n },\n \"position\": {\n \"enum\": [\n \"left\",\n \"right\",\n \"alternate\",\n \"alternate-reverse\"\n ]\n },\n \"connectorVariant\": {\n \"enum\": [\n \"solid\",\n \"dashed\",\n \"none\"\n ]\n },\n \"connectorColor\": {\n \"enum\": [\n \"primary\",\n \"secondary\",\n \"tertiary\",\n \"success\",\n \"warning\",\n \"error\",\n \"info\",\n \"neutral\"\n ]\n },\n \"markerVariant\": {\n \"enum\": [\n \"dot\",\n \"icon\",\n \"number\"\n ]\n },\n \"markerColor\": {},\n \"markerStyle\": {\n \"enum\": [\n \"filled\",\n \"outlined\"\n ]\n },\n \"emphasis\": {\n \"enum\": [\n \"subtle\",\n \"standard\",\n \"strong\",\n \"hero\"\n ]\n },\n \"textAppearance\": {\n \"enum\": [\n \"default\",\n \"prominent\",\n \"eyebrow\",\n \"label\"\n ]\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"columns\": {\n \"enum\": [\n 1,\n 2\n ]\n },\n \"layout\": {\n \"enum\": [\n \"stacked\",\n \"inline\",\n \"split\",\n \"grid\"\n ]\n },\n \"action\": {\n \"type\": \"object\"\n },\n \"actions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"primaryAction\": {\n \"type\": \"object\"\n },\n \"secondaryActions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"media\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"image\",\n \"video\",\n \"icon\",\n \"avatar\"\n ]\n },\n \"src\": {\n \"type\": \"string\"\n },\n \"srcExpr\": {\n \"type\": \"string\"\n },\n \"alt\": {\n \"type\": \"string\"\n },\n \"altExpr\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"placement\": {\n \"enum\": [\n \"top\",\n \"leading\",\n \"trailing\",\n \"background\"\n ]\n },\n \"aspectRatio\": {\n \"type\": \"string\"\n }\n }\n },\n \"headerAction\": {\n \"type\": \"object\"\n },\n \"interaction\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"none\",\n \"action\",\n \"selectable\"\n ]\n },\n \"action\": {\n \"type\": \"object\"\n },\n \"selected\": {\n \"type\": \"boolean\"\n },\n \"selectedExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"accessibility\": {\n \"type\": \"object\",\n \"properties\": {\n \"role\": {\n \"enum\": [\n \"article\",\n \"group\",\n \"button\"\n ]\n },\n \"ariaLabel\": {\n \"type\": \"string\"\n },\n \"ariaLabelExpr\": {\n \"type\": \"string\"\n },\n \"ariaLabelledBy\": {\n \"type\": \"string\"\n },\n \"ariaDescribedBy\": {\n \"type\": \"string\"\n }\n }\n },\n \"fields\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"header\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"body\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"footer\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"aside\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"node-types-supported\",\n \"unsafe-url-rejected\",\n \"unsafe-style-rejected\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].testId\",\n \"document.nodes[].className\",\n \"document.nodes[].style\",\n \"document.nodes[].visibleWhen\",\n \"document.nodes[].disabledWhen\",\n \"document.nodes[].loadWhen\",\n \"document.nodes[].classWhen\",\n \"document.nodes[].styleWhen\",\n \"document.nodes[].requiresCapabilities\",\n \"document.nodes[].capabilityMode\",\n \"document.nodes[].text\",\n \"document.nodes[].textExpr\",\n \"document.nodes[].label\",\n \"document.nodes[].labelExpr\",\n \"document.nodes[].href\",\n \"document.nodes[].target\",\n \"document.nodes[].rel\",\n \"document.nodes[].src\",\n \"document.nodes[].alt\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].subtitle\",\n \"document.nodes[].subtitleExpr\",\n \"document.nodes[].relationLabel\",\n \"document.nodes[].message\",\n \"document.nodes[].summary\",\n \"document.nodes[].summaryExpr\",\n \"document.nodes[].description\",\n \"document.nodes[].ctaLabel\",\n \"document.nodes[].caption\",\n \"document.nodes[].emptyText\",\n \"document.nodes[].errorText\",\n \"document.nodes[].status\",\n \"document.nodes[].statusExpr\",\n \"document.nodes[].owner\",\n \"document.nodes[].ownerExpr\",\n \"document.nodes[].policySource\",\n \"document.nodes[].policySourceExpr\",\n \"document.nodes[].version\",\n \"document.nodes[].versionExpr\",\n \"document.nodes[].confidence\",\n \"document.nodes[].confidenceExpr\",\n \"document.nodes[].risk\",\n \"document.nodes[].riskExpr\",\n \"document.nodes[].lastReviewed\",\n \"document.nodes[].lastReviewedExpr\",\n \"document.nodes[].supersedes\",\n \"document.nodes[].supersedesExpr\",\n \"document.nodes[].evidence\",\n \"document.nodes[].appearance\",\n \"document.nodes[].variant\",\n \"document.nodes[].tone\",\n \"document.nodes[].size\",\n \"document.nodes[].density\",\n \"document.nodes[].orientation\",\n \"document.nodes[].loading\",\n \"document.nodes[].loadingExpr\",\n \"document.nodes[].active\",\n \"document.nodes[].activeExpr\",\n \"document.nodes[].defaultTabId\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].icon\",\n \"document.nodes[].formId\",\n \"document.nodes[].columns\",\n \"document.nodes[].layout\",\n \"document.nodes[].action\",\n \"document.nodes[].actions\",\n \"document.nodes[].primaryAction\",\n \"document.nodes[].secondaryActions\",\n \"document.nodes[].media\",\n \"document.nodes[].headerAction\",\n \"document.nodes[].interaction\",\n \"document.nodes[].accessibility\",\n \"document.nodes[].fields\",\n \"document.nodes[].items[]\",\n \"document.nodes[].header\",\n \"document.nodes[].body\",\n \"document.nodes[].footer\",\n \"document.nodes[].aside\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"block.remove\",\n \"title\": \"Remove rich content block\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"replacementBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"remove-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"block-exists\",\n \"destructive-removal-confirmed\",\n \"document-not-empty-when-required\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"block.order.set\",\n \"title\": \"Reorder rich content blocks\",\n \"scope\": \"templating\",\n \"targetKind\": \"block\",\n \"target\": {\n \"kind\": \"block\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"blockId\"\n ],\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"beforeBlockId\": {\n \"type\": \"string\"\n },\n \"afterBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"reorder-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"block-order-deterministic\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"text.update\",\n \"title\": \"Update rich content text\",\n \"scope\": \"templating\",\n \"targetKind\": \"text\",\n \"target\": {\n \"kind\": \"text\",\n \"resolver\": \"rich-text-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n },\n \"textExpr\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"relationLabel\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"ctaLabel\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n },\n \"errorText\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"text-target-supports-field\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].text\",\n \"document.nodes[].textExpr\",\n \"document.nodes[].label\",\n \"document.nodes[].labelExpr\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\",\n \"document.nodes[].relationLabel\",\n \"document.nodes[].message\",\n \"document.nodes[].summary\",\n \"document.nodes[].description\",\n \"document.nodes[].ctaLabel\",\n \"document.nodes[].emptyText\",\n \"document.nodes[].errorText\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"link.add\",\n \"title\": \"Add link block\",\n \"scope\": \"templating\",\n \"targetKind\": \"link\",\n \"target\": {\n \"kind\": \"link\",\n \"resolver\": \"document-nodes-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"label\",\n \"href\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"labelExpr\": {\n \"type\": \"string\"\n },\n \"href\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"enum\": [\n \"_self\",\n \"_blank\"\n ]\n },\n \"rel\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"link-url-safe\",\n \"link-policy-explicit\",\n \"node-types-supported\",\n \"block-id-unique\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].href\",\n \"document.nodes[].target\",\n \"document.nodes[].rel\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"link.remove\",\n \"title\": \"Remove link from rich content\",\n \"scope\": \"templating\",\n \"targetKind\": \"link\",\n \"target\": {\n \"kind\": \"link\",\n \"resolver\": \"rich-link-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"linkId\": {\n \"type\": \"string\"\n },\n \"preserveLabelAsText\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-link-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\",\n \"document.nodes[].label\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"linkId\": {\n \"type\": \"string\"\n },\n \"preserveLabelAsText\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"link-not-found\",\n \"ambiguous-link-target\",\n \"replacement-text-invalid\"\n ],\n \"description\": \"Removes a link node by stable id or path and optionally replaces it with a text node containing the prior link label.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"link-target-exists\",\n \"destructive-removal-confirmed\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-link-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"preset.apply\",\n \"title\": \"Apply rich block preset\",\n \"scope\": \"templating\",\n \"targetKind\": \"preset\",\n \"target\": {\n \"kind\": \"preset\",\n \"resolver\": \"rich-block-preset-ref\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"ref\"\n ],\n \"properties\": {\n \"ref\": {\n \"type\": \"object\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"replaceBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-preset-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_RICH_BLOCK_PRESETS\",\n \"hostCapabilities.resolvePreset\",\n \"document.nodes[]\"\n ],\n \"writes\": [\n \"document.nodes[]\"\n ],\n \"identityKeys\": [\n \"ref.kind\",\n \"ref.namespace\",\n \"ref.presetId\",\n \"ref.version\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"ref\"\n ],\n \"properties\": {\n \"ref\": {\n \"type\": \"object\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"replaceBlockId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"preset-not-found\",\n \"preset-kind-invalid\",\n \"preset-document-invalid\",\n \"preset-cycle-detected\"\n ],\n \"description\": \"Resolves a rich-block preset through the governed registry/host mediation and inserts or replaces a preset reference without serializing functions.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"preset-ref-valid\",\n \"preset-exists-or-host-mediated\",\n \"host-capabilities-serializable\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[]\",\n \"document.nodes[].ref\",\n \"document.nodes[].inputs\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"metadata.update\",\n \"title\": \"Update rich block metadata\",\n \"scope\": \"templating\",\n \"targetKind\": \"metadata\",\n \"target\": {\n \"kind\": \"metadata\",\n \"resolver\": \"rich-block-by-id-or-index\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"testId\": {\n \"type\": \"string\"\n },\n \"className\": {\n \"type\": \"string\"\n },\n \"visibleWhen\": {\n \"type\": \"object\"\n },\n \"disabledWhen\": {\n \"type\": \"object\"\n },\n \"loadWhen\": {\n \"type\": \"object\"\n },\n \"classWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"styleWhen\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"style\": {\n \"type\": \"object\"\n },\n \"requiresCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"capabilityMode\": {\n \"enum\": [\n \"all\",\n \"any\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"document.nodes[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"class-name-safe\",\n \"visible-when-json-logic\",\n \"unsafe-style-rejected\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].testId\",\n \"document.nodes[].className\",\n \"document.nodes[].visibleWhen\",\n \"document.nodes[].disabledWhen\",\n \"document.nodes[].loadWhen\",\n \"document.nodes[].classWhen\",\n \"document.nodes[].styleWhen\",\n \"document.nodes[].style\",\n \"document.nodes[].requiresCapabilities\",\n \"document.nodes[].capabilityMode\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"mediaBlock.update\",\n \"title\": \"Update media block fields\",\n \"scope\": \"templating\",\n \"targetKind\": \"media\",\n \"target\": {\n \"kind\": \"media\",\n \"resolver\": \"rich-media-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"avatarName\": {\n \"type\": \"string\"\n },\n \"avatarImageSrc\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-media-block-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\"\n ],\n \"writes\": [\n \"document.nodes[].avatar\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"avatarName\": {\n \"type\": \"string\"\n },\n \"avatarImageSrc\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"media-block-not-found\",\n \"target-not-media-block\",\n \"unsafe-url\",\n \"invalid-text-node\"\n ],\n \"description\": \"Updates the structured mediaBlock avatar/title/subtitle fields while preserving meta and trailing content for advanced JSON authoring.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"media-block-target-valid\",\n \"unsafe-url-rejected\",\n \"expression-path-safe\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].avatar\",\n \"document.nodes[].title\",\n \"document.nodes[].subtitle\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.node.update\",\n \"title\": \"Update timeline display settings\",\n \"scope\": \"templating\",\n \"targetKind\": \"timeline\",\n \"target\": {\n \"kind\": \"timeline\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"minProperties\": 2,\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"orientation\": {\n \"enum\": [\n \"vertical\",\n \"horizontal\"\n ]\n },\n \"order\": {},\n \"position\": {},\n \"connectorVariant\": {},\n \"connectorColor\": {},\n \"markerVariant\": {},\n \"markerColor\": {},\n \"markerStyle\": {},\n \"emphasis\": {},\n \"density\": {\n \"enum\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n },\n \"textAppearance\": {},\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"emptyText\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-node-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].id\",\n \"document.nodes[].type\"\n ],\n \"writes\": [\n \"document.nodes[].orientation\",\n \"document.nodes[].order\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].emphasis\",\n \"document.nodes[].density\",\n \"document.nodes[].textAppearance\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].emptyText\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\"\n ],\n \"failureModes\": [\n \"timeline-not-found\",\n \"unsupported-timeline-setting\",\n \"invalid-timeline-setting\"\n ],\n \"description\": \"Updates timeline node display and semantic appearance settings while preserving timeline items and the canonical RichTimelineNode shape.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-setting-supported\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].orientation\",\n \"document.nodes[].order\",\n \"document.nodes[].position\",\n \"document.nodes[].connectorVariant\",\n \"document.nodes[].connectorColor\",\n \"document.nodes[].markerVariant\",\n \"document.nodes[].markerColor\",\n \"document.nodes[].markerStyle\",\n \"document.nodes[].emphasis\",\n \"document.nodes[].density\",\n \"document.nodes[].textAppearance\",\n \"document.nodes[].title\",\n \"document.nodes[].titleExpr\",\n \"document.nodes[].emptyText\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.add\",\n \"title\": \"Add timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-node-by-id-or-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\",\n \"item\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"item\": {},\n \"afterItemId\": {\n \"type\": \"string\"\n },\n \"beforeItemId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-add\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\",\n \"item\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"afterItemId\": {\n \"type\": \"string\"\n },\n \"beforeItemId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"timeline-not-found\",\n \"duplicate-timeline-item-id\",\n \"invalid-timeline-item\"\n ],\n \"description\": \"Adds a timeline item to a timeline node using stable timeline and item ids when present; array index is a resolver fallback only.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-item-valid\",\n \"timeline-item-id-unique\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.update\",\n \"title\": \"Update timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"minProperties\": 2,\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n },\n \"field\": {\n \"enum\": [\n \"title\",\n \"titleExpr\",\n \"subtitle\",\n \"subtitleExpr\",\n \"meta\",\n \"metaExpr\",\n \"opposite\",\n \"oppositeExpr\",\n \"icon\",\n \"iconExpr\",\n \"badge\",\n \"badgeExpr\",\n \"markerColor\",\n \"markerStyle\",\n \"connectorColor\",\n \"connectorVariant\"\n ]\n },\n \"value\": {\n \"type\": \"string\"\n },\n \"patch\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleExpr\": {\n \"type\": \"string\"\n },\n \"subtitle\": {\n \"type\": \"string\"\n },\n \"subtitleExpr\": {\n \"type\": \"string\"\n },\n \"meta\": {\n \"type\": \"string\"\n },\n \"metaExpr\": {\n \"type\": \"string\"\n },\n \"opposite\": {\n \"type\": \"string\"\n },\n \"oppositeExpr\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"type\": \"string\"\n },\n \"iconExpr\": {\n \"type\": \"string\"\n },\n \"badge\": {\n \"type\": \"string\"\n },\n \"badgeExpr\": {\n \"type\": \"string\"\n },\n \"markerColor\": {},\n \"markerStyle\": {},\n \"connectorColor\": {},\n \"connectorVariant\": {}\n }\n }\n },\n \"anyOf\": [\n {\n \"required\": [\n \"field\",\n \"value\"\n ]\n },\n {\n \"required\": [\n \"patch\"\n ]\n }\n ],\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"enum\": [\n \"markerColor\",\n \"connectorColor\"\n ]\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"const\": \"markerStyle\"\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {\n \"const\": \"connectorVariant\"\n }\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {}\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"field\": {}\n },\n \"required\": [\n \"field\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"value\": {\n \"type\": \"string\"\n }\n }\n }\n }\n ]\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-update\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"failureModes\": [\n \"timeline-not-found\",\n \"timeline-item-not-found\",\n \"unsupported-timeline-field\",\n \"invalid-timeline-item\"\n ],\n \"description\": \"Updates a timeline item by stable item id when available, preserving the item object shape accepted by RichTimelineItem.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"block-exists\",\n \"timeline-target-valid\",\n \"timeline-item-exists\",\n \"timeline-item-field-supported\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[].title\",\n \"document.nodes[].items[].titleExpr\",\n \"document.nodes[].items[].subtitle\",\n \"document.nodes[].items[].subtitleExpr\",\n \"document.nodes[].items[].meta\",\n \"document.nodes[].items[].metaExpr\",\n \"document.nodes[].items[].opposite\",\n \"document.nodes[].items[].oppositeExpr\",\n \"document.nodes[].items[].icon\",\n \"document.nodes[].items[].iconExpr\",\n \"document.nodes[].items[].badge\",\n \"document.nodes[].items[].badgeExpr\",\n \"document.nodes[].items[].markerColor\",\n \"document.nodes[].items[].markerStyle\",\n \"document.nodes[].items[].connectorColor\",\n \"document.nodes[].items[].connectorVariant\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-block-exists\",\n \"target-timeline-item-exists\"\n ]\n },\n {\n \"operationId\": \"timeline.item.remove\",\n \"title\": \"Remove timeline item\",\n \"scope\": \"templating\",\n \"targetKind\": \"timelineItem\",\n \"target\": {\n \"kind\": \"timelineItem\",\n \"resolver\": \"rich-timeline-item-by-block-id-and-item-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-timeline-item-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"document.nodes[]\",\n \"document.nodes[].items[]\"\n ],\n \"writes\": [\n \"document.nodes[].items[]\"\n ],\n \"identityKeys\": [\n \"document.nodes[].id\",\n \"document.nodes[].items[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"timelineBlockId\"\n ],\n \"properties\": {\n \"timelineBlockId\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"itemIndex\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"timeline-not-found\",\n \"timeline-item-not-found\",\n \"ambiguous-timeline-item\"\n ],\n \"description\": \"Removes a timeline item from a timeline node after explicit confirmation; stable item id is preferred over index.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"timeline-target-valid\",\n \"timeline-item-exists\",\n \"destructive-removal-confirmed\",\n \"document-shape-canonical\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document.nodes[].items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-timeline-item-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"sanitizationPolicy.set\",\n \"title\": \"Set rich content sanitization policy\",\n \"scope\": \"global\",\n \"targetKind\": \"sanitizationPolicy\",\n \"target\": {\n \"kind\": \"sanitizationPolicy\",\n \"resolver\": \"rich-content-validation-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"allowHtml\": {\n \"const\": false\n },\n \"allowedUrlProtocols\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allowImageDataUrls\": {\n \"type\": \"boolean\"\n },\n \"maxNodeDepth\": {\n \"type\": \"number\"\n },\n \"maxNodeCount\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"rich-content-sanitization-policy\",\n \"handlerContract\": {\n \"reads\": [\n \"document\",\n \"validateRichContentDocument\"\n ],\n \"writes\": [\n \"document\"\n ],\n \"identityKeys\": [\n \"document.kind\",\n \"document.version\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"allowHtml\": {\n \"const\": false\n },\n \"allowedUrlProtocols\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allowImageDataUrls\": {\n \"type\": \"boolean\"\n },\n \"maxNodeDepth\": {\n \"type\": \"number\"\n },\n \"maxNodeCount\": {\n \"type\": \"number\"\n }\n }\n },\n \"failureModes\": [\n \"html-not-supported\",\n \"unsafe-protocol\",\n \"max-depth-too-high\",\n \"max-node-count-too-high\"\n ],\n \"description\": \"Validates requested policy against the fixed validator guardrails; rich-content authoring remains structured JSON and does not allow arbitrary HTML.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"sanitization-policy-explicit\",\n \"unsafe-html-rejected\",\n \"unsafe-url-rejected\",\n \"security-change-confirmed\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"document\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"display.mode.set\",\n \"title\": \"Set rich content display mode\",\n \"scope\": \"global\",\n \"targetKind\": \"display\",\n \"target\": {\n \"kind\": \"display\",\n \"resolver\": \"rich-content-layout-and-root-class\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"layout\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ]\n },\n \"rootClassName\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"layout\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"rootClassName\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"layout-valid\",\n \"root-class-safe\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"layout\",\n \"rootClassName\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"document-shape-canonical\",\n \"level\": \"error\",\n \"code\": \"PRC001\",\n \"description\": \"Documents must satisfy RichContentDocument with kind praxis.rich-content, version 1.0.0 and a nodes array.\"\n },\n {\n \"validatorId\": \"document-version-supported\",\n \"level\": \"error\",\n \"code\": \"PRC002\",\n \"description\": \"Only document version 1.0.0 is supported.\"\n },\n {\n \"validatorId\": \"node-types-supported\",\n \"level\": \"error\",\n \"code\": \"PRC003\",\n \"description\": \"Nodes must use supported rich-content node types, including link as a structured node rather than arbitrary HTML.\"\n },\n {\n \"validatorId\": \"block-id-unique\",\n \"level\": \"warning\",\n \"code\": \"PRC004\",\n \"description\": \"Stable block ids should be unique when present; operations should prefer ids over array indexes.\"\n },\n {\n \"validatorId\": \"block-exists\",\n \"level\": \"error\",\n \"code\": \"PRC005\",\n \"description\": \"Target block must exist before patching, reordering or removing it.\"\n },\n {\n \"validatorId\": \"block-order-deterministic\",\n \"level\": \"error\",\n \"code\": \"PRC006\",\n \"description\": \"Block ordering must use stable ids or explicit before/after placement and not rely on transient generated indexes.\"\n },\n {\n \"validatorId\": \"destructive-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PRC007\",\n \"description\": \"Block and link removal are destructive and require confirmation.\"\n },\n {\n \"validatorId\": \"document-not-empty-when-required\",\n \"level\": \"warning\",\n \"code\": \"PRC008\",\n \"description\": \"Removal should not leave an empty document unless the user explicitly requested an empty rich content document.\"\n },\n {\n \"validatorId\": \"text-target-supports-field\",\n \"level\": \"error\",\n \"code\": \"PRC009\",\n \"description\": \"Text updates may only target fields supported by the selected node type.\"\n },\n {\n \"validatorId\": \"expression-path-safe\",\n \"level\": \"warning\",\n \"code\": \"PRC010\",\n \"description\": \"Expression paths must remain simple context paths or Json Logic expressions, not string DSL code.\"\n },\n {\n \"validatorId\": \"link-url-safe\",\n \"level\": \"error\",\n \"code\": \"PRC011\",\n \"description\": \"Link href values must reject javascript:, vbscript:, file: and unsafe data URLs.\"\n },\n {\n \"validatorId\": \"link-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"PRC012\",\n \"description\": \"Links must declare safe target/rel behavior; _blank links default to noopener noreferrer.\"\n },\n {\n \"validatorId\": \"link-target-exists\",\n \"level\": \"error\",\n \"code\": \"PRC013\",\n \"description\": \"Link removal must resolve an existing link node by stable id or path.\"\n },\n {\n \"validatorId\": \"unsafe-url-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC014\",\n \"description\": \"Image, avatar and link URL fields must reject unsafe protocols and null bytes.\"\n },\n {\n \"validatorId\": \"unsafe-style-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC015\",\n \"description\": \"Inline style values must reject script, import, binding and data URL expressions.\"\n },\n {\n \"validatorId\": \"unsafe-html-rejected\",\n \"level\": \"error\",\n \"code\": \"PRC016\",\n \"description\": \"Rich-content authoring must remain structured document JSON and must not accept arbitrary HTML/script patches.\"\n },\n {\n \"validatorId\": \"sanitization-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"PRC017\",\n \"description\": \"Security policy requests must keep HTML disabled and URL/style guardrails explicit.\"\n },\n {\n \"validatorId\": \"security-change-confirmed\",\n \"level\": \"error\",\n \"code\": \"PRC018\",\n \"description\": \"Sanitization policy changes require explicit confirmation.\"\n },\n {\n \"validatorId\": \"preset-ref-valid\",\n \"level\": \"error\",\n \"code\": \"PRC019\",\n \"description\": \"Preset refs must use kind rich-block plus namespace, presetId and optional version.\"\n },\n {\n \"validatorId\": \"preset-exists-or-host-mediated\",\n \"level\": \"error\",\n \"code\": \"PRC020\",\n \"description\": \"Preset application must resolve through PRAXIS_RICH_BLOCK_PRESETS or a host-mediated resolver.\"\n },\n {\n \"validatorId\": \"host-capabilities-serializable\",\n \"level\": \"error\",\n \"code\": \"PRC021\",\n \"description\": \"Public contracts must not serialize host capability functions; only refs and inputs are persisted.\"\n },\n {\n \"validatorId\": \"layout-valid\",\n \"level\": \"error\",\n \"code\": \"PRC022\",\n \"description\": \"Layout must be block or inline.\"\n },\n {\n \"validatorId\": \"root-class-safe\",\n \"level\": \"warning\",\n \"code\": \"PRC023\",\n \"description\": \"rootClassName must contain safe CSS class tokens.\"\n },\n {\n \"validatorId\": \"editor-runtime-round-trip\",\n \"level\": \"error\",\n \"code\": \"PRC024\",\n \"description\": \"Config editor, Settings Panel payload and runtime renderer must preserve document structure, layout and rootClassName.\"\n },\n {\n \"validatorId\": \"class-name-safe\",\n \"level\": \"error\",\n \"code\": \"PRC025\",\n \"description\": \"Node className values must contain safe CSS class tokens.\"\n },\n {\n \"validatorId\": \"visible-when-json-logic\",\n \"level\": \"error\",\n \"code\": \"PRC026\",\n \"description\": \"visibleWhen must be a Json Logic expression object and not a string DSL.\"\n },\n {\n \"validatorId\": \"media-block-target-valid\",\n \"level\": \"error\",\n \"code\": \"PRC027\",\n \"description\": \"Media operations must target a mediaBlock node and preserve structured avatar/text child nodes.\"\n },\n {\n \"validatorId\": \"timeline-target-valid\",\n \"level\": \"error\",\n \"code\": \"PRC028\",\n \"description\": \"Timeline item operations must target a timeline node with an items array.\"\n },\n {\n \"validatorId\": \"timeline-item-valid\",\n \"level\": \"error\",\n \"code\": \"PRC029\",\n \"description\": \"Timeline items must be objects matching RichTimelineItem fields.\"\n },\n {\n \"validatorId\": \"timeline-item-id-unique\",\n \"level\": \"warning\",\n \"code\": \"PRC030\",\n \"description\": \"Timeline item ids should be unique inside a timeline node when present.\"\n },\n {\n \"validatorId\": \"timeline-item-exists\",\n \"level\": \"error\",\n \"code\": \"PRC031\",\n \"description\": \"Timeline item updates and removals must resolve an existing item by stable id or explicit fallback index.\"\n },\n {\n \"validatorId\": \"timeline-item-field-supported\",\n \"level\": \"error\",\n \"code\": \"PRC032\",\n \"description\": \"Timeline item updates may only target supported RichTimelineItem fields.\"\n },\n {\n \"validatorId\": \"timeline-setting-supported\",\n \"level\": \"error\",\n \"code\": \"PRC033\",\n \"description\": \"Timeline display settings must use supported position, connector, marker, emphasis, density and text appearance enum values.\"\n }\n ],\n \"roundTripRequirements\": [\n \"The editor must produce the same widget input envelope consumed by page-builder: inputs.document, inputs.layout and inputs.rootClassName.\",\n \"Rich content must remain structured RichContentDocument JSON; arbitrary HTML and script URL patches are rejected before persistence.\",\n \"Block identity should prefer document.nodes[].id; array index is a resolver fallback only and cannot be the canonical identity for generated patches.\",\n \"Link authoring uses canonical link nodes with safe href/target/rel instead of markdown or raw HTML embedded in text nodes.\",\n \"MediaBlock, timeline node appearance, timeline item, metadata, visibleWhen and safe style authoring use the same structured paths exposed by the visual config editor.\",\n \"Preset authoring persists only rich-block refs and inputs; host capability functions remain runtime-mediated and are not serialized.\"\n ],\n \"examples\": [\n {\n \"id\": \"set-empty-document\",\n \"request\": \"Start with an empty rich content document.\",\n \"operationId\": \"document.set\",\n \"params\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": []\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-text-block\",\n \"request\": \"Add a text block saying Welcome.\",\n \"operationId\": \"block.add\",\n \"params\": {\n \"type\": \"text\",\n \"node\": {\n \"id\": \"welcome\",\n \"type\": \"text\",\n \"text\": \"Welcome\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-obsolete-block\",\n \"request\": \"Remove the obsolete block.\",\n \"operationId\": \"block.remove\",\n \"target\": \"obsolete\",\n \"params\": {\n \"blockId\": \"obsolete\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-summary-before-details\",\n \"request\": \"Move summary before details.\",\n \"operationId\": \"block.order.set\",\n \"target\": \"summary\",\n \"params\": {\n \"blockId\": \"summary\",\n \"beforeBlockId\": \"details\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"update-title-text\",\n \"request\": \"Change the hero title to Customer overview.\",\n \"operationId\": \"text.update\",\n \"target\": \"hero-title\",\n \"params\": {\n \"text\": \"Customer overview\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-docs-link\",\n \"request\": \"Add a link to the documentation.\",\n \"operationId\": \"link.add\",\n \"params\": {\n \"id\": \"docs-link\",\n \"label\": \"Documentation\",\n \"href\": \"/docs\",\n \"target\": \"_self\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-script-link\",\n \"request\": \"Add a link to javascript:alert(1).\",\n \"operationId\": \"link.add\",\n \"params\": {\n \"label\": \"Bad link\",\n \"href\": \"javascript:alert(1)\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"remove-docs-link\",\n \"request\": \"Remove the documentation link but keep its label as text.\",\n \"operationId\": \"link.remove\",\n \"target\": \"docs-link\",\n \"params\": {\n \"linkId\": \"docs-link\",\n \"preserveLabelAsText\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-profile-preset\",\n \"request\": \"Apply the profile summary rich-block preset.\",\n \"operationId\": \"preset.apply\",\n \"params\": {\n \"ref\": {\n \"kind\": \"rich-block\",\n \"namespace\": \"praxis.rich-content\",\n \"presetId\": \"profile-summary\",\n \"version\": \"1.0.0\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"show-only-active-row\",\n \"request\": \"Show the status block only when row.active is true.\",\n \"operationId\": \"metadata.update\",\n \"target\": \"status\",\n \"params\": {\n \"blockId\": \"status\",\n \"visibleWhen\": {\n \"===\": [\n {\n \"var\": \"row.active\"\n },\n true\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"update-media-title\",\n \"request\": \"Update the profile media block title and avatar name.\",\n \"operationId\": \"mediaBlock.update\",\n \"target\": \"profile-media\",\n \"params\": {\n \"blockId\": \"profile-media\",\n \"avatarName\": \"Ana Silva\",\n \"title\": \"Profile summary\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"make-timeline-prominent\",\n \"request\": \"Make the activity timeline read as a prominent hero process.\",\n \"operationId\": \"timeline.node.update\",\n \"target\": \"activity\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"emphasis\": \"hero\",\n \"density\": \"comfortable\",\n \"textAppearance\": \"prominent\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-created-timeline-item\",\n \"request\": \"Add a Created item to the activity timeline.\",\n \"operationId\": \"timeline.item.add\",\n \"target\": \"activity\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"item\": {\n \"id\": \"created\",\n \"title\": \"Created\",\n \"badge\": \"Done\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unknown-timeline-field\",\n \"request\": \"Set a custom script field on a timeline item.\",\n \"operationId\": \"timeline.item.update\",\n \"target\": \"activity.created\",\n \"params\": {\n \"timelineBlockId\": \"activity\",\n \"itemId\": \"created\",\n \"field\": \"script\",\n \"value\": \"alert(1)\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-html-policy\",\n \"request\": \"Allow arbitrary HTML in this rich content document.\",\n \"operationId\": \"sanitizationPolicy.set\",\n \"params\": {\n \"allowHtml\": true\n },\n \"isPositive\": false\n },\n {\n \"id\": \"compact-inline-layout\",\n \"request\": \"Render this rich content inline with root class status-line.\",\n \"operationId\": \"display.mode.set\",\n \"params\": {\n \"layout\": \"inline\",\n \"rootClassName\": \"status-line\"\n },\n \"isPositive\": true\n }\n ]\n}",
6570
+ "sourcePointer": "projects/praxis-rich-content/src/lib/ai/praxis-rich-content-authoring-manifest.ts",
6571
+ "contentHash": "2c9605fbd0a123dc454d35340939348283c44e6a0eaf676c0c8002c3305c01e9",
6541
6572
  "sourceKind": "component_definition",
6542
6573
  "sourceId": "praxis-rich-content",
6543
6574
  "corpusVersion": "1.0.0"
@@ -6546,7 +6577,7 @@
6546
6577
  "chunkIndex": 2,
6547
6578
  "chunkKind": "recipe",
6548
6579
  "content": "{\n \"_comment\": \"Recipe for @praxisui/rich-content. Use RichContentDocument for governed presentation, policy notes, operational summaries, host-mediated action cards, timelines and AI-readable explanations.\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-rich-content\",\n \"variantId\": \"knowledge-surface\",\n \"description\": \"Cria superfícies editoriais portáveis com RichContentDocument, incluindo blocos governados como actionCard, lookupCard e formLauncher.\",\n \"useWhen\": \"Create reusable rich presentation surfaces and governed editorial action surfaces that can be embedded in Dynamic Page, Tabs, Dialog, Stepper, List expansion or Page Builder.\",\n \"examplePrompts\": [\n \"create a rich content policy card\",\n \"show operational notes with metrics and timeline\",\n \"generate a reusable knowledge surface for agents\",\n \"create a governed action card for a host-mediated workflow\",\n \"show a related record summary with governed action\"\n ]\n },\n \"authoringGuidance\": [\n \"Use document.kind \\\"praxis.rich-content\\\" and version \\\"1.0.0\\\".\",\n \"Use document.nodes for block layout surfaces and nodes for inline compact status surfaces.\",\n \"Use context plus *Expr properties when text, badges, metrics or progress should resolve from host state.\",\n \"Use actionButton, lookupCard, relatedRecord, formLauncher or actionCard when the host must mediate an action instead of embedding handlers in the document.\",\n \"Use action.confirmMessage when the workflow requires confirmation; the host must provide hostCapabilities.confirmAction and the runtime fails closed without dispatch if confirmation is rejected or unavailable.\",\n \"Use card variant/tone/size/orientation/media/interaction when the authoring intent is a semantic surface, not a host-authored wrapper.\",\n \"Use rich-content for presentation and explanation only; use table, list or dynamic-form for editable business data.\",\n \"Prefer portable nodes such as card, callout, recordSummary, relatedRecord, actionCard, compose, text, icon, badge, metric, progress, mediaBlock, avatar and timeline.\"\n ],\n \"inputs\": {\n \"layout\": \"block\",\n \"rootClassName\": \"mission-knowledge-surface\",\n \"context\": {\n \"mission\": {\n \"name\": \"Operation Dawn Gate\",\n \"owner\": \"Ariadne Ops\",\n \"readiness\": 82,\n \"risk\": \"Elevated\",\n \"region\": \"South Atlantic\"\n },\n \"policy\": {\n \"owner\": \"Platform Governance\",\n \"version\": \"2026.04\",\n \"source\": \"Quickstart reference contract\"\n }\n },\n \"document\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"card\",\n \"titleExpr\": \"${mission.name}\",\n \"subtitleExpr\": \"${policy.source}\",\n \"variant\": \"elevated\",\n \"tone\": \"info\",\n \"size\": \"lg\",\n \"orientation\": \"horizontal\",\n \"media\": {\n \"kind\": \"icon\",\n \"icon\": \"psychology\",\n \"label\": \"AI-authored semantic decision surface\",\n \"placement\": \"leading\"\n },\n \"accessibility\": {\n \"role\": \"article\",\n \"ariaLabel\": \"Mission knowledge surface\"\n },\n \"content\": [\n {\n \"type\": \"compose\",\n \"wrap\": true,\n \"gap\": \"sm\",\n \"items\": [\n { \"type\": \"badge\", \"labelExpr\": \"${mission.region}\" },\n { \"type\": \"badge\", \"labelExpr\": \"${mission.risk}\" },\n { \"type\": \"badge\", \"labelExpr\": \"${policy.version}\" }\n ]\n },\n {\n \"type\": \"text\",\n \"text\": \"Use rich content when the page needs governed explanation, operational notes or agent-readable context without inventing a one-off Angular template.\"\n },\n {\n \"type\": \"compose\",\n \"wrap\": true,\n \"gap\": \"lg\",\n \"items\": [\n {\n \"type\": \"metric\",\n \"label\": \"Readiness\",\n \"valueExpr\": \"${mission.readiness}\",\n \"captionExpr\": \"${mission.owner}\"\n },\n {\n \"type\": \"progress\",\n \"label\": \"Execution confidence\",\n \"valueExpr\": \"${mission.readiness}\",\n \"max\": 100\n }\n ]\n }\n ]\n },\n {\n \"type\": \"mediaBlock\",\n \"avatar\": { \"type\": \"avatar\", \"initials\": \"AI\", \"name\": \"AI recipe\" },\n \"title\": { \"type\": \"text\", \"text\": \"Agent authoring note\" },\n \"subtitle\": {\n \"type\": \"text\",\n \"text\": \"Rich content is presentation metadata. Use it for policy, summaries, timelines and explanations; use forms and tables for editable business data.\"\n },\n \"meta\": { \"type\": \"badge\", \"label\": \"copyable JSON\" },\n \"trailing\": [\n { \"type\": \"icon\", \"icon\": \"psychology\", \"ariaLabel\": \"AI ready\" }\n ]\n },\n {\n \"type\": \"relatedRecord\",\n \"title\": \"Related approval owner\",\n \"subtitleExpr\": \"${policy.owner}\",\n \"relationLabel\": \"Policy owner\",\n \"metaExpr\": \"${policy.version}\",\n \"ctaLabel\": \"Open related owner\",\n \"variant\": \"raised\",\n \"color\": \"primary\",\n \"action\": {\n \"actionId\": \"briefing.inspect\",\n \"confirmMessage\": \"Confirm opening the governed briefing package?\"\n },\n \"fields\": [\n {\n \"label\": \"Source\",\n \"valueExpr\": \"${policy.source}\",\n \"hint\": \"Resolved from the same portable document context.\"\n }\n ],\n \"secondaryActions\": [\n {\n \"type\": \"actionButton\",\n \"label\": \"Escalate owner review\",\n \"variant\": \"stroked\",\n \"action\": {\n \"actionId\": \"briefing.escalate\"\n }\n }\n ]\n },\n {\n \"type\": \"actionCard\",\n \"title\": \"Open governed briefing\",\n \"subtitleExpr\": \"${policy.owner}\",\n \"message\": \"Use actionCard when the host must run a governed workflow from a portable editorial document.\",\n \"metaExpr\": \"${policy.version}\",\n \"ctaLabel\": \"Inspect briefing\",\n \"variant\": \"raised\",\n \"color\": \"primary\",\n \"action\": {\n \"actionId\": \"briefing.inspect\",\n \"confirmMessage\": \"Confirm opening the governed briefing package?\"\n },\n \"secondaryActions\": [\n {\n \"type\": \"actionButton\",\n \"label\": \"Escalate review\",\n \"variant\": \"stroked\",\n \"action\": {\n \"actionId\": \"briefing.escalate\"\n }\n }\n ]\n },\n {\n \"type\": \"timeline\",\n \"title\": \"Knowledge lifecycle\",\n \"orientation\": \"horizontal\",\n \"order\": \"reverse\",\n \"position\": \"alternate\",\n \"connectorVariant\": \"dashed\",\n \"markerVariant\": \"number\",\n \"items\": [\n {\n \"icon\": \"schema\",\n \"title\": \"Contract discovered\",\n \"subtitle\": \"Read source metadata and decide whether the surface is data, action or explanation.\",\n \"meta\": \"schemas.filtered + recipes\",\n \"opposite\": \"1. Discover\",\n \"badge\": \"source\"\n },\n {\n \"icon\": \"article\",\n \"title\": \"Briefing authored\",\n \"subtitle\": \"Render cards, metrics, progress and guidance with one RichContentDocument.\",\n \"meta\": \"praxis-rich-content\",\n \"opposite\": \"2. Author\",\n \"badge\": \"runtime\"\n },\n {\n \"icon\": \"open_in_new\",\n \"title\": \"Surface reused\",\n \"subtitle\": \"Embed the same document in a tab, dialog, stepper, list expansion or dashboard cell.\",\n \"meta\": \"Dynamic Page composition\",\n \"opposite\": \"3. Reuse\",\n \"badge\": \"portable\"\n }\n ]\n }\n ]\n }\n },\n \"inlineExample\": {\n \"layout\": \"inline\",\n \"context\": {\n \"status\": {\n \"label\": \"Governed knowledge surface\",\n \"phase\": \"Reusable\"\n }\n },\n \"nodes\": [\n { \"type\": \"icon\", \"icon\": \"verified\", \"ariaLabel\": \"Verified\" },\n { \"type\": \"text\", \"textExpr\": \"${status.label}\" },\n { \"type\": \"badge\", \"labelExpr\": \"${status.phase}\" }\n ]\n }\n}\n",
6549
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-rich-content.json",
6580
+ "sourcePointer": "examples/ai-recipes/praxis-rich-content.json",
6550
6581
  "contentHash": "ada8ceb4fcf92092237c4fc660f93da19367608505d7ba304d1044a8d021ad64",
6551
6582
  "sourceKind": "component_definition",
6552
6583
  "sourceId": "praxis-rich-content",
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@praxisui/rich-content",
3
- "version": "9.0.0-beta.71",
3
+ "version": "9.0.0-beta.73",
4
4
  "description": "Rich content rendering and authoring primitives for Praxis UI surfaces, including semantic blocks and page-builder integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
- "@praxisui/core": "^9.0.0-beta.71",
8
+ "@praxisui/core": "^9.0.0-beta.73",
9
9
  "@angular/forms": "^21.0.0",
10
10
  "rxjs": "~7.8.0"
11
11
  },