@praxisui/page-builder 9.0.53 → 9.0.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,7 +44,7 @@ import { WidgetPageDefinition } from '@praxisui/core';
44
44
  <praxis-dynamic-page-builder
45
45
  [page]="page"
46
46
  [enableCustomization]="true"
47
- (pageChange)="page = $event"
47
+ (pageAuthoringChange)="page = $event"
48
48
  (pageSaveRequested)="save($event)">
49
49
  </praxis-dynamic-page-builder>
50
50
  `,
@@ -122,7 +122,8 @@ Bind the grant with `[authoringCapabilities]="presentationAuthoring"`. Use
122
122
 
123
123
  It emits:
124
124
 
125
- - `pageChange`: updated `WidgetPageDefinition`
125
+ - `pageChange`: every canonical `WidgetPageDefinition` update, including persistent runtime state
126
+ - `pageAuthoringChange`: explicit visual authoring updates only; use this when the host keeps source/draft separate from runtime state
126
127
  - `widgetEvent`: runtime widget event envelope
127
128
  - `pageSaveRequested`: save intent for the current page
128
129
  - `agenticAuthoringApplied`: AI preview/apply result
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-31T21:15:24.814Z",
3
+ "generatedAt": "2026-09-01T04:06:31.245Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.53",
5
+ "packageVersion": "9.0.55",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -19,6 +19,12 @@
19
19
  "required": false,
20
20
  "description": "Emits the governed page definition after runtime or builder edits."
21
21
  },
22
+ {
23
+ "name": "pageAuthoringChange",
24
+ "type": "WidgetPageDefinition",
25
+ "required": false,
26
+ "description": "Emits the governed page definition only after explicit visual authoring operations."
27
+ },
22
28
  {
23
29
  "name": "widgetEvent",
24
30
  "type": "WidgetEventEnvelope",
@@ -1484,7 +1490,7 @@
1484
1490
  "componentId": "praxis-page-builder",
1485
1491
  "ownerPackage": "@praxisui/page-builder",
1486
1492
  "configSchemaId": "WidgetPageDefinition",
1487
- "manifestVersion": "1.3.0",
1493
+ "manifestVersion": "1.4.0",
1488
1494
  "runtimeInputs": [
1489
1495
  {
1490
1496
  "name": "page",
@@ -1516,6 +1522,11 @@
1516
1522
  "type": "WidgetPageDefinition",
1517
1523
  "description": "Emitted after local apply/preview produces a renderable page."
1518
1524
  },
1525
+ {
1526
+ "name": "pageAuthoringChange",
1527
+ "type": "WidgetPageDefinition",
1528
+ "description": "Emitted only after explicit visual authoring operations so hosts can keep authored source separate from runtime state."
1529
+ },
1519
1530
  {
1520
1531
  "name": "agenticAuthoringEnableStreaming",
1521
1532
  "type": "boolean",
@@ -3648,9 +3659,9 @@
3648
3659
  {
3649
3660
  "chunkIndex": 0,
3650
3661
  "chunkKind": "summary",
3651
- "content": "Component ID: praxis-page-builder\nSelector: praxis-dynamic-page-builder\nFriendly Name: Praxis Page Builder\nDescription: Page builder using the canonical praxis-dynamic-page runtime.\nCategory: page\nLib/Package: @praxisui/page-builder\nTags: widget, page-builder, configurable\nOutputs:\n - pageChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - pageSaveRequested (WidgetPageDefinition)\n - agenticAuthoringApplied (PageBuilderApplyResult)\n - agenticAuthoringSharedRuleHandoff (PageBuilderAgenticAuthoringSharedRuleHandoff)\n - pageRestart (void)\n - savedPageDeleteRequested (void)\n",
3662
+ "content": "Component ID: praxis-page-builder\nSelector: praxis-dynamic-page-builder\nFriendly Name: Praxis Page Builder\nDescription: Page builder using the canonical praxis-dynamic-page runtime.\nCategory: page\nLib/Package: @praxisui/page-builder\nTags: widget, page-builder, configurable\nOutputs:\n - pageChange (WidgetPageDefinition)\n - pageAuthoringChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - pageSaveRequested (WidgetPageDefinition)\n - agenticAuthoringApplied (PageBuilderApplyResult)\n - agenticAuthoringSharedRuleHandoff (PageBuilderAgenticAuthoringSharedRuleHandoff)\n - pageRestart (void)\n - savedPageDeleteRequested (void)\n",
3652
3663
  "sourcePointer": "projects/praxis-page-builder/src/lib/praxis-page-builder.metadata.ts",
3653
- "contentHash": "3d0b5965e3c48d62afbc44f4cf7f98b7b89251cbca472efefa0d525e22531958",
3664
+ "contentHash": "55298e92120f110442c3f4c85e26ef0abd4f3032c0d467b60631956a3806c53e",
3654
3665
  "sourceKind": "component_definition",
3655
3666
  "sourceId": "praxis-page-builder",
3656
3667
  "corpusVersion": "1.0.0"
@@ -3698,9 +3709,9 @@
3698
3709
  {
3699
3710
  "chunkIndex": 5,
3700
3711
  "chunkKind": "authoring_manifest",
3701
- "content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page metadata Effects: compile-domain-patch. Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"scope\":\"global\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"semanticTerms\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
3712
+ "content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page metadata Effects: compile-domain-patch. Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"scope\":\"global\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"semanticTerms\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
3702
3713
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3703
- "contentHash": "181f2afb40e694a95549778f1942d31cc2a78a22e279417781f5285be6f5e516",
3714
+ "contentHash": "672a81438cb7b8abaef001089a3de428b3f61bdea99a8ed9fe439faddfc7ef71",
3704
3715
  "sourceKind": "component_definition",
3705
3716
  "sourceId": "praxis-page-builder",
3706
3717
  "corpusVersion": "1.0.0"
@@ -3708,9 +3719,9 @@
3708
3719
  {
3709
3720
  "chunkIndex": 6,
3710
3721
  "chunkKind": "authoring_manifest",
3711
- "content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page canvas Effects: compile-domain-patch. Use a 12 column dashboard grid with compact gaps.\",\"scope\":\"layout\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"columns\",\"rowUnit\",\"gap\",\"items\"],\"semanticTerms\":[\"columns\",\"rowUnit\",\"gap\",\"items\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"validators\":[{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true}],\"negativeExamples\":[]}",
3722
+ "content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page canvas Effects: compile-domain-patch. Use a 12 column dashboard grid with compact gaps.\",\"scope\":\"layout\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"columns\",\"rowUnit\",\"gap\",\"items\"],\"semanticTerms\":[\"columns\",\"rowUnit\",\"gap\",\"items\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"validators\":[{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true}],\"negativeExamples\":[]}",
3712
3723
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3713
- "contentHash": "67165049c1dc66a66b8f0a73bdeb240cfd157cd7122bf0396dad33ec1f971d0c",
3724
+ "contentHash": "2335e32ff2024c5f13f8065cedf66fb9e825f267f6bc0999972e8982233f9e2a",
3714
3725
  "sourceKind": "component_definition",
3715
3726
  "sourceId": "praxis-page-builder",
3716
3727
  "corpusVersion": "1.0.0"
@@ -3718,9 +3729,9 @@
3718
3729
  {
3719
3730
  "chunkIndex": 7,
3720
3731
  "chunkKind": "authoring_manifest",
3721
- "content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add widget to page Effects: compile-domain-patch. Add an employees table widget to the left half of the first row.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"componentId\"],\"properties\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"}],\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true}],\"negativeExamples\":[]}",
3732
+ "content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add widget to page Effects: compile-domain-patch. Add an employees table widget to the left half of the first row.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"componentId\"],\"properties\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"}],\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true}],\"negativeExamples\":[]}",
3722
3733
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3723
- "contentHash": "efd0bed2361509e031aa83b5b6d44af8d779dc6273175de8f59daa8c98fffc5f",
3734
+ "contentHash": "d4f7f3199bc5ea9f7c998e7ab018cac0de3fcd732fce84085b2ec3cd5113c803",
3724
3735
  "sourceKind": "component_definition",
3725
3736
  "sourceId": "praxis-page-builder",
3726
3737
  "corpusVersion": "1.0.0"
@@ -3728,9 +3739,9 @@
3728
3739
  {
3729
3740
  "chunkIndex": 8,
3730
3741
  "chunkKind": "authoring_manifest",
3731
- "content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove widget from page Effects: compile-domain-patch. Remove the summary-card widget and its links.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"confirmed\"],\"semanticTerms\":[\"widgetKey\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
3742
+ "content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove widget from page Effects: compile-domain-patch. Remove the summary-card widget and its links.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"confirmed\"],\"semanticTerms\":[\"widgetKey\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
3732
3743
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3733
- "contentHash": "687d845096e17e476f9ed4da7cac24d4e4a700db123a003c44a1139fe7224a62",
3744
+ "contentHash": "22f76935254bb8746b12963cd2744bf5d6b2a89c2bcd2a786c344fcdec6c228e",
3734
3745
  "sourceKind": "component_definition",
3735
3746
  "sourceId": "praxis-page-builder",
3736
3747
  "corpusVersion": "1.0.0"
@@ -3738,9 +3749,9 @@
3738
3749
  {
3739
3750
  "chunkIndex": 9,
3740
3751
  "chunkKind": "authoring_manifest",
3741
- "content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Move or resize widget Effects: compile-domain-patch. Move payroll-chart to the right column and make it taller.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":[\"widgetKey\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true}],\"negativeExamples\":[]}",
3752
+ "content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Move or resize widget Effects: compile-domain-patch. Move payroll-chart to the right column and make it taller.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":[\"widgetKey\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true}],\"negativeExamples\":[]}",
3742
3753
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3743
- "contentHash": "cc470c12f4da401730531ff057ceeafa1d41f6ef888e84dbcf31e38ed00715d7",
3754
+ "contentHash": "d33af0ec6afb3c768528b8d898019f39745151582af5d79c772c13d4c8c56b31",
3744
3755
  "sourceKind": "component_definition",
3745
3756
  "sourceId": "praxis-page-builder",
3746
3757
  "corpusVersion": "1.0.0"
@@ -3748,9 +3759,9 @@
3748
3759
  {
3749
3760
  "chunkIndex": 10,
3750
3761
  "chunkKind": "authoring_manifest",
3751
- "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
3762
+ "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
3752
3763
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3753
- "contentHash": "e8cf7f8d27b02d2c5c5673072b929350d3e5796d4b728826b264bc26ca785d04",
3764
+ "contentHash": "c9db7318f9170000433bbc9c051f29e8b9dd16f6f0f06d79f0359b874a3bc2ce",
3754
3765
  "sourceKind": "component_definition",
3755
3766
  "sourceId": "praxis-page-builder",
3756
3767
  "corpusVersion": "1.0.0"
@@ -3758,9 +3769,9 @@
3758
3769
  {
3759
3770
  "chunkIndex": 11,
3760
3771
  "chunkKind": "authoring_manifest",
3761
- "content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add page composition link Effects: compile-domain-patch. When department-list selection changes, filter employees-table by department id. Create the widget link under the old connections collection.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"properties\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\"],\"semanticTerms\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\",\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\",\"from.kind\",\"from.ref\",\"to.kind\",\"to.ref\",\"component-port\",\"from.ref.widget\",\"from.ref.port\",\"from.ref.direction\",\"from.ref.bindingPath\",\"from.ref.nestedPath\",\"state\",\"from.ref.path\",\"from.ref.layer\",\"global-action\",\"from.ref.actionId\",\"to.ref.widget\",\"to.ref.port\",\"to.ref.direction\",\"to.ref.bindingPath\",\"to.ref.nestedPath\",\"to.ref.path\",\"to.ref.layer\",\"to.ref.actionId\",\"to.ref.payload\",\"to.ref.payloadExpr\",\"to.ref.meta\",\"input\",\"output\",\"values\",\"derived\",\"transient\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"}],\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
3772
+ "content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add page composition link Effects: compile-domain-patch. When department-list selection changes, filter employees-table by department id. Create the widget link under the old connections collection.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"properties\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\"],\"semanticTerms\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\",\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\",\"from.kind\",\"from.ref\",\"to.kind\",\"to.ref\",\"component-port\",\"from.ref.widget\",\"from.ref.port\",\"from.ref.direction\",\"from.ref.bindingPath\",\"from.ref.nestedPath\",\"state\",\"from.ref.path\",\"from.ref.layer\",\"global-action\",\"from.ref.actionId\",\"to.ref.widget\",\"to.ref.port\",\"to.ref.direction\",\"to.ref.bindingPath\",\"to.ref.nestedPath\",\"to.ref.path\",\"to.ref.layer\",\"to.ref.actionId\",\"to.ref.payload\",\"to.ref.payloadExpr\",\"to.ref.meta\",\"input\",\"output\",\"values\",\"derived\",\"transient\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"}],\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
3762
3773
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3763
- "contentHash": "75d7855950a00c8cc06c7cbab5d95aa6ccf07264afbaf9e08cfc32152d3931e2",
3774
+ "contentHash": "71f4783d751c26aaa7e325bffa36b185ae97a2464d9213744a95223a60542f10",
3764
3775
  "sourceKind": "component_definition",
3765
3776
  "sourceId": "praxis-page-builder",
3766
3777
  "corpusVersion": "1.0.0"
@@ -3768,9 +3779,9 @@
3768
3779
  {
3769
3780
  "chunkIndex": 12,
3770
3781
  "chunkKind": "authoring_manifest",
3771
- "content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove page composition link Effects: compile-domain-patch. Remove the old payroll-filter-link composition link.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"confirmed\"],\"semanticTerms\":[\"id\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"}],\"preconditions\":[\"page-loaded\",\"target-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
3782
+ "content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove page composition link Effects: compile-domain-patch. Remove the old payroll-filter-link composition link.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"confirmed\"],\"semanticTerms\":[\"id\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"}],\"preconditions\":[\"page-loaded\",\"target-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
3772
3783
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3773
- "contentHash": "9ef65dc8da4a62799a33f6e91ac826e719fcff7ac01ec3446fd68f2dbe1382a9",
3784
+ "contentHash": "ed27d3be5abf4448d0a6487d783a3da000fd6eabe9a7411f7e03f08720ccd5ba",
3774
3785
  "sourceKind": "component_definition",
3775
3786
  "sourceId": "praxis-page-builder",
3776
3787
  "corpusVersion": "1.0.0"
@@ -3778,9 +3789,9 @@
3778
3789
  {
3779
3790
  "chunkIndex": 13,
3780
3791
  "chunkKind": "authoring_manifest",
3781
- "content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Compile UI composition plan Effects: compile-domain-patch. Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"scope\":\"rules\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"uiCompositionPlan\"],\"properties\":[\"uiCompositionPlan\"],\"semanticTerms\":[\"uiCompositionPlan\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"validators\":[{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"none\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
3792
+ "content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Compile UI composition plan Effects: compile-domain-patch. Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"scope\":\"rules\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"uiCompositionPlan\"],\"properties\":[\"uiCompositionPlan\"],\"semanticTerms\":[\"uiCompositionPlan\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"validators\":[{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"none\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
3782
3793
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3783
- "contentHash": "2562a86454a0b1279a671132ca88e72ae49e271ed006b606cb2fa5660254d8d1",
3794
+ "contentHash": "a247a82c0dfbd92ccc30257e7b457ba1ead8296cdde5a78aee561ace07bd19b3",
3784
3795
  "sourceKind": "component_definition",
3785
3796
  "sourceId": "praxis-page-builder",
3786
3797
  "corpusVersion": "1.0.0"
@@ -3788,9 +3799,9 @@
3788
3799
  {
3789
3800
  "chunkIndex": 14,
3790
3801
  "chunkKind": "authoring_manifest",
3791
- "content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set page state value Effects: compile-domain-patch. Store selectedDepartmentId in page state for downstream links.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"required\":true},\"inputContract\":{\"required\":[\"path\",\"value\"],\"properties\":[\"path\",\"value\",\"layer\"],\"semanticTerms\":[\"path\",\"value\",\"layer\",\"page\",\"session\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"state\"],\"validators\":[{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3802
+ "content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set page state value Effects: compile-domain-patch. Store selectedDepartmentId in page state for downstream links.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"required\":true},\"inputContract\":{\"required\":[\"path\",\"value\"],\"properties\":[\"path\",\"value\",\"layer\"],\"semanticTerms\":[\"path\",\"value\",\"layer\",\"page\",\"session\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"state\"],\"validators\":[{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3792
3803
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3793
- "contentHash": "66cd0717073b052d342c1cbf71508ace2c15943a840b7bb9155879396721be8f",
3804
+ "contentHash": "a27ad960fe59dbfa764eb2682773e8865ddb092ba2702203cd363d5fa0888124",
3794
3805
  "sourceKind": "component_definition",
3795
3806
  "sourceId": "praxis-page-builder",
3796
3807
  "corpusVersion": "1.0.0"
@@ -3798,9 +3809,9 @@
3798
3809
  {
3799
3810
  "chunkIndex": 15,
3800
3811
  "chunkKind": "authoring_manifest",
3801
- "content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Apply agentic preview locally Effects: compile-domain-patch. Apply the current assistant preview to the local page.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"previewId\"],\"properties\":[\"previewId\",\"compiledFormPatch\"],\"semanticTerms\":[\"previewId\",\"compiledFormPatch\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"validators\":[{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"}],\"preconditions\":[\"agentic-preview-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3812
+ "content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Apply agentic preview locally Effects: compile-domain-patch. Apply the current assistant preview to the local page.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"previewId\"],\"properties\":[\"previewId\",\"compiledFormPatch\"],\"semanticTerms\":[\"previewId\",\"compiledFormPatch\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"validators\":[{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"}],\"preconditions\":[\"agentic-preview-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3802
3813
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3803
- "contentHash": "aae92afef1190192000d37acc7f4f12b1b4afd89a5797c54effea2ace7b56ff3",
3814
+ "contentHash": "5d5f70ea95ac04cf7622d7de34734b97ab86711e45388e15357ae9cfc31fb59c",
3804
3815
  "sourceKind": "component_definition",
3805
3816
  "sourceId": "praxis-page-builder",
3806
3817
  "corpusVersion": "1.0.0"
@@ -3808,9 +3819,9 @@
3808
3819
  {
3809
3820
  "chunkIndex": 16,
3810
3821
  "chunkKind": "authoring_manifest",
3811
- "content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Persist page through config API Effects: compile-domain-patch. Save this page configuration using the current ETag.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"required\":true},\"inputContract\":{\"required\":[\"pageIdentity\"],\"properties\":[\"pageIdentity\",\"page\",\"etag\"],\"semanticTerms\":[\"pageIdentity\",\"page\",\"etag\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"validators\":[{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"}],\"preconditions\":[\"page-loaded\",\"page-identity-known\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3822
+ "content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Persist page through config API Effects: compile-domain-patch. Save this page configuration using the current ETag.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"required\":true},\"inputContract\":{\"required\":[\"pageIdentity\"],\"properties\":[\"pageIdentity\",\"page\",\"etag\"],\"semanticTerms\":[\"pageIdentity\",\"page\",\"etag\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"validators\":[{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"}],\"preconditions\":[\"page-loaded\",\"page-identity-known\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3812
3823
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3813
- "contentHash": "8aa0bcdf58a0d8d096a0471ca628ea12cec3ed44e7bd27e362839a2eed8f3579",
3824
+ "contentHash": "010bd76cf5334df54f358592d2d4ef53595d63403ce43cfe4ffcf221ee0f0478",
3814
3825
  "sourceKind": "component_definition",
3815
3826
  "sourceId": "praxis-page-builder",
3816
3827
  "corpusVersion": "1.0.0"
@@ -3818,9 +3829,9 @@
3818
3829
  {
3819
3830
  "chunkIndex": 17,
3820
3831
  "chunkKind": "authoring_manifest",
3821
- "content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Delegate widget child operation Effects: compile-domain-patch. Add a salary column to the employees table widget. Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"scope\":\"global\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"required\":false},\"inputContract\":{\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"],\"semanticTerms\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"},{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false}]}",
3832
+ "content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Delegate widget child operation Effects: compile-domain-patch. Add a salary column to the employees table widget. Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"scope\":\"global\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"required\":false},\"inputContract\":{\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"],\"semanticTerms\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"},{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false}]}",
3822
3833
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3823
- "contentHash": "eab0dd6127e2ddf473b007a9d727e123d4bdda25d7e68ee3b6cf038ba8fba17e",
3834
+ "contentHash": "81d2fc64c5075794afacdf59f2b16217c955d4af63e7cf3e3a4e79e2d171d21c",
3824
3835
  "sourceKind": "component_definition",
3825
3836
  "sourceId": "praxis-page-builder",
3826
3837
  "corpusVersion": "1.0.0"
@@ -3828,9 +3839,9 @@
3828
3839
  {
3829
3840
  "chunkIndex": 18,
3830
3841
  "chunkKind": "authoring_manifest",
3831
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"identity\"}",
3842
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"identity\"}",
3832
3843
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3833
- "contentHash": "50c1eadebff309db17e3cb09c64d7cef426c4482355b78a6240ca0593b72a24f",
3844
+ "contentHash": "be4023f0d729cdc18ce0364b224935c6df6916dece54ebfbf5bd7496c94c6b25",
3834
3845
  "sourceKind": "component_definition",
3835
3846
  "sourceId": "praxis-page-builder",
3836
3847
  "corpusVersion": "1.0.0"
@@ -3838,9 +3849,9 @@
3838
3849
  {
3839
3850
  "chunkIndex": 19,
3840
3851
  "chunkKind": "authoring_manifest",
3841
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"page\",\"type\":\"WidgetPageDefinition\",\"description\":\"Canonical renderable page document consumed by praxis-dynamic-page.\"},{\"name\":\"pageIdentity\",\"type\":\"PageIdentity | null\",\"description\":\"Persistence identity for ui_user_config save/apply flows; not persisted inside page.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables page-builder authoring chrome around the runtime page.\"},{\"name\":\"authoringCapabilities\",\"type\":\"PageBuilderAuthoringCapabilities | null\",\"description\":\"Host-only grant that limits visible authoring operations without changing WidgetPageDefinition and without granting AI edit authority; omitted capabilities preserve full authoring.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Opaque host context passed to catalog resolution and agentic authoring.\"},{\"name\":\"pageChange\",\"type\":\"WidgetPageDefinition\",\"description\":\"Emitted after local apply/preview produces a renderable page.\"},{\"name\":\"agenticAuthoringEnableStreaming\",\"type\":\"boolean\",\"description\":\"Opt-in flag for the canonical streaming turn endpoints.\"},{\"name\":\"agenticAuthoringIncludeLlmDiagnostics\",\"type\":\"boolean\",\"description\":\"Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.\"},{\"name\":\"agenticAuthoringContextHints\",\"type\":\"Record<string, unknown>\",\"description\":\"Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.\"}]}",
3852
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"page\",\"type\":\"WidgetPageDefinition\",\"description\":\"Canonical renderable page document consumed by praxis-dynamic-page.\"},{\"name\":\"pageIdentity\",\"type\":\"PageIdentity | null\",\"description\":\"Persistence identity for ui_user_config save/apply flows; not persisted inside page.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables page-builder authoring chrome around the runtime page.\"},{\"name\":\"authoringCapabilities\",\"type\":\"PageBuilderAuthoringCapabilities | null\",\"description\":\"Host-only grant that limits visible authoring operations without changing WidgetPageDefinition and without granting AI edit authority; omitted capabilities preserve full authoring.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Opaque host context passed to catalog resolution and agentic authoring.\"},{\"name\":\"pageChange\",\"type\":\"WidgetPageDefinition\",\"description\":\"Emitted after local apply/preview produces a renderable page.\"},{\"name\":\"pageAuthoringChange\",\"type\":\"WidgetPageDefinition\",\"description\":\"Emitted only after explicit visual authoring operations so hosts can keep authored source separate from runtime state.\"},{\"name\":\"agenticAuthoringEnableStreaming\",\"type\":\"boolean\",\"description\":\"Opt-in flag for the canonical streaming turn endpoints.\"},{\"name\":\"agenticAuthoringIncludeLlmDiagnostics\",\"type\":\"boolean\",\"description\":\"Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.\"},{\"name\":\"agenticAuthoringContextHints\",\"type\":\"Record<string, unknown>\",\"description\":\"Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.\"}]}",
3842
3853
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3843
- "contentHash": "354c3dfddff8c5bee5b47fe5f964bc073c778ca0c8fc3ed250782783cecfbbdd",
3854
+ "contentHash": "308503ec5be75fe2f3cf7d9e890fdb8faa34383efebfa3dbff2e93dcdffbcd5f",
3844
3855
  "sourceKind": "component_definition",
3845
3856
  "sourceId": "praxis-page-builder",
3846
3857
  "corpusVersion": "1.0.0"
@@ -3848,9 +3859,9 @@
3848
3859
  {
3849
3860
  "chunkIndex": 20,
3850
3861
  "chunkKind": "authoring_manifest",
3851
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"description\":\"Root WidgetPageDefinition document: title, metadata, context and renderable page envelope.\"},{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"description\":\"Canvas geometry and item placement for top-level widgets.\"},{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"description\":\"Widget definitions addressed by stable widgetKey, never by array index.\"},{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"description\":\"Dashboard-card shell metadata such as title, action chrome and visual preset.\"},{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"description\":\"Declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"},{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"description\":\"Page-level state entries referenced by composition links.\"},{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"description\":\"ui_user_config identity, scope and ETag used by applyPage/save.\"},{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"description\":\"Compiled backend preview envelope whose patch.page is applied locally.\"},{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"description\":\"Delegated operation owned by the child widget component manifest or configEditor.\"}]}",
3862
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"description\":\"Root WidgetPageDefinition document: title, metadata, context and renderable page envelope.\"},{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"description\":\"Canvas geometry and item placement for top-level widgets.\"},{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"description\":\"Widget definitions addressed by stable widgetKey, never by array index.\"},{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"description\":\"Dashboard-card shell metadata such as title, action chrome and visual preset.\"},{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"description\":\"Declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"},{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"description\":\"Page-level state entries referenced by composition links.\"},{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"description\":\"ui_user_config identity, scope and ETag used by applyPage/save.\"},{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"description\":\"Compiled backend preview envelope whose patch.page is applied locally.\"},{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"description\":\"Delegated operation owned by the child widget component manifest or configEditor.\"}]}",
3852
3863
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3853
- "contentHash": "4dffab189d17147070ca0f659ee23eeb7d0676a2e12f4b78dab0e3ea783db93e",
3864
+ "contentHash": "9325b978e89d1a42e519ffd941398c85b6e789d25df7cc328d944a1ab968ab2d",
3854
3865
  "sourceKind": "component_definition",
3855
3866
  "sourceId": "praxis-page-builder",
3856
3867
  "corpusVersion": "1.0.0"
@@ -3858,9 +3869,9 @@
3858
3869
  {
3859
3870
  "chunkIndex": 21,
3860
3871
  "chunkKind": "authoring_manifest",
3861
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"page.configure\",\"title\":\"Configure page metadata\",\"scope\":\"global\",\"targetKind\":\"page\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition\",\"DynamicPageConfigEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.title\",\"page.layoutPreset\",\"page.themePreset\",\"page.context\",\"page.metadata\"],\"identityKeys\":[\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"page-not-loaded\",\"context-not-json\",\"settings-panel-bridge-missing\"],\"description\":\"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"}}],\"validators\":[\"widget-page-definition-valid\",\"no-legacy-grid-page-definition\",\"page-context-json-valid\",\"settings-panel-round-trip-valid\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"canvas.configure\",\"title\":\"Configure page canvas\",\"scope\":\"layout\",\"targetKind\":\"canvas\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-canvas-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas\",\"DynamicPageBuilderComponent\"],\"writes\":[\"page.canvas.columns\",\"page.canvas.rowUnit\",\"page.canvas.gap\",\"page.canvas.items\"],\"identityKeys\":[\"canvas\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"failureModes\":[\"canvas-missing\",\"canvas-item-references-missing-widget\",\"invalid-grid-geometry\"],\"description\":\"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"}}],\"validators\":[\"canvas-columns-integer\",\"canvas-row-unit-valid\",\"canvas-gap-valid\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"widget.add\",\"title\":\"Add widget to page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas\",\"ComponentDocRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-key-duplicate\",\"component-not-registered\",\"canvas-item-invalid\",\"child-input-contract-unknown\"],\"description\":\"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"}}],\"validators\":[\"widget-key-unique\",\"component-registered\",\"canvas-item-valid\",\"child-inputs-delegated\",\"widget-key-not-array-index\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"widget.remove\",\"title\":\"Remove widget from page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\",\"page.composition.links[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"destructive-removal-not-confirmed\",\"dangling-composition-link\"],\"description\":\"Removes a widget and cleans canvas items and composition links that reference it.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"widget-exists\",\"destructive-removal-confirmed\",\"composition-links-cleaned\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.moveResize\",\"title\":\"Move or resize widget\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-move-resize\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.widgets\"],\"writes\":[\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"canvas-item-invalid\",\"canvas-overlap-invalid\"],\"description\":\"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"}}],\"validators\":[\"widget-exists\",\"canvas-item-valid\",\"canvas-item-targets-existing-widget\",\"canvas-overlap-policy-valid\"],\"affectedPaths\":[\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.shell.configure\",\"title\":\"Configure widget shell\",\"scope\":\"templating\",\"targetKind\":\"widgetShell\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"shell\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-shell-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetShellEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.widgets[].shell\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"settings-panel-bridge-missing\",\"shell-config-invalid\"],\"description\":\"Updates the page-builder-owned widget shell without editing child component inputs.\"}}],\"validators\":[\"widget-exists\",\"widget-shell-shape-valid\",\"settings-panel-bridge-available\",\"child-inputs-not-mutated\"],\"affectedPaths\":[\"widgets[].shell\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]}]}",
3872
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"page.configure\",\"title\":\"Configure page metadata\",\"scope\":\"global\",\"targetKind\":\"page\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition\",\"DynamicPageConfigEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.title\",\"page.layoutPreset\",\"page.themePreset\",\"page.context\",\"page.metadata\"],\"identityKeys\":[\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"page-not-loaded\",\"context-not-json\",\"settings-panel-bridge-missing\"],\"description\":\"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"}}],\"validators\":[\"widget-page-definition-valid\",\"no-legacy-grid-page-definition\",\"page-context-json-valid\",\"settings-panel-round-trip-valid\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"canvas.configure\",\"title\":\"Configure page canvas\",\"scope\":\"layout\",\"targetKind\":\"canvas\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-canvas-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas\",\"DynamicPageBuilderComponent\"],\"writes\":[\"page.canvas.columns\",\"page.canvas.rowUnit\",\"page.canvas.gap\",\"page.canvas.items\"],\"identityKeys\":[\"canvas\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"failureModes\":[\"canvas-missing\",\"canvas-item-references-missing-widget\",\"invalid-grid-geometry\"],\"description\":\"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"}}],\"validators\":[\"canvas-columns-integer\",\"canvas-row-unit-valid\",\"canvas-gap-valid\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"widget.add\",\"title\":\"Add widget to page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas\",\"ComponentDocRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-key-duplicate\",\"component-not-registered\",\"canvas-item-invalid\",\"child-input-contract-unknown\"],\"description\":\"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"}}],\"validators\":[\"widget-key-unique\",\"component-registered\",\"canvas-item-valid\",\"child-inputs-delegated\",\"widget-key-not-array-index\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"widget.remove\",\"title\":\"Remove widget from page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\",\"page.composition.links[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"destructive-removal-not-confirmed\",\"dangling-composition-link\"],\"description\":\"Removes a widget and cleans canvas items and composition links that reference it.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"widget-exists\",\"destructive-removal-confirmed\",\"composition-links-cleaned\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.moveResize\",\"title\":\"Move or resize widget\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-move-resize\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.widgets\"],\"writes\":[\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"canvas-item-invalid\",\"canvas-overlap-invalid\"],\"description\":\"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"}}],\"validators\":[\"widget-exists\",\"canvas-item-valid\",\"canvas-item-targets-existing-widget\",\"canvas-overlap-policy-valid\"],\"affectedPaths\":[\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.shell.configure\",\"title\":\"Configure widget shell\",\"scope\":\"templating\",\"targetKind\":\"widgetShell\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"shell\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-shell-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetShellEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.widgets[].shell\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"settings-panel-bridge-missing\",\"shell-config-invalid\"],\"description\":\"Updates the page-builder-owned widget shell without editing child component inputs.\"}}],\"validators\":[\"widget-exists\",\"widget-shell-shape-valid\",\"settings-panel-bridge-available\",\"child-inputs-not-mutated\"],\"affectedPaths\":[\"widgets[].shell\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]}]}",
3862
3873
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3863
- "contentHash": "eb05b132b535c0b125652a0572902b2791344b05374ee1e9475408706be0b1a8",
3874
+ "contentHash": "12cf06bb611bda6c84bd1ea1d1833db2d7f77fa35ed71a7f4e44da130393ed5a",
3864
3875
  "sourceKind": "component_definition",
3865
3876
  "sourceId": "praxis-page-builder",
3866
3877
  "corpusVersion": "1.0.0"
@@ -3868,9 +3879,9 @@
3868
3879
  {
3869
3880
  "chunkIndex": 22,
3870
3881
  "chunkKind": "authoring_manifest",
3871
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]},{\"operationId\":\"composition.link.remove\",\"title\":\"Remove page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"failureModes\":[\"composition-link-not-found\",\"destructive-removal-not-confirmed\"],\"description\":\"Removes a canonical composition link by stable id.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"composition-link-exists\",\"destructive-removal-confirmed\",\"composition-links-still-valid\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-link-exists\"]}]}",
3882
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]},{\"operationId\":\"composition.link.remove\",\"title\":\"Remove page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"failureModes\":[\"composition-link-not-found\",\"destructive-removal-not-confirmed\"],\"description\":\"Removes a canonical composition link by stable id.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"composition-link-exists\",\"destructive-removal-confirmed\",\"composition-links-still-valid\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-link-exists\"]}]}",
3872
3883
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3873
- "contentHash": "c671d796276bccb47cfaed20572d397a176761079ecc80210e77aa7eb8e1bc53",
3884
+ "contentHash": "df135fb44eb5dbd013d899eca5ca051ec5900c3c06821eb2c787ec0b10397769",
3874
3885
  "sourceKind": "component_definition",
3875
3886
  "sourceId": "praxis-page-builder",
3876
3887
  "corpusVersion": "1.0.0"
@@ -3878,9 +3889,9 @@
3878
3889
  {
3879
3890
  "chunkIndex": 23,
3880
3891
  "chunkKind": "authoring_manifest",
3881
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.plan.compile\",\"title\":\"Compile UI composition plan\",\"scope\":\"rules\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"uiCompositionPlan\"],\"properties\":{\"uiCompositionPlan\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-ui-composition-plan-compile\",\"handlerContract\":{\"reads\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]},{\"operationId\":\"childOperation.delegate\",\"title\":\"Delegate widget child operation\",\"scope\":\"global\",\"targetKind\":\"childOperation\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-child-operation-delegate\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"ComponentDocMeta.configEditor\",\"child ComponentAuthoringManifest\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[].definition.inputs\"],\"identityKeys\":[\"widgetKey\",\"childComponentId\",\"childOperationId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-not-found\",\"child-manifest-missing\",\"child-operation-unknown\",\"local-child-input-write-attempted\"],\"description\":\"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"}}],\"validators\":[\"widget-exists\",\"child-manifest-available\",\"child-operation-known\",\"component-config-editor-respected\",\"no-local-child-input-write\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"]}]}",
3892
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.plan.compile\",\"title\":\"Compile UI composition plan\",\"scope\":\"rules\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"uiCompositionPlan\"],\"properties\":{\"uiCompositionPlan\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-ui-composition-plan-compile\",\"handlerContract\":{\"reads\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]},{\"operationId\":\"childOperation.delegate\",\"title\":\"Delegate widget child operation\",\"scope\":\"global\",\"targetKind\":\"childOperation\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-child-operation-delegate\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"ComponentDocMeta.configEditor\",\"child ComponentAuthoringManifest\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[].definition.inputs\"],\"identityKeys\":[\"widgetKey\",\"childComponentId\",\"childOperationId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-not-found\",\"child-manifest-missing\",\"child-operation-unknown\",\"local-child-input-write-attempted\"],\"description\":\"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"}}],\"validators\":[\"widget-exists\",\"child-manifest-available\",\"child-operation-known\",\"component-config-editor-respected\",\"no-local-child-input-write\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"]}]}",
3882
3893
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3883
- "contentHash": "99eadb172b4b4c03d6c692c9bb6c83eb7021009cdb1e7fa45075fb20cac7f637",
3894
+ "contentHash": "99cb49cd4a01cf90da9f327d13a7784766609ba4fe8eab23b86849fcb8a8e8d1",
3884
3895
  "sourceKind": "component_definition",
3885
3896
  "sourceId": "praxis-page-builder",
3886
3897
  "corpusVersion": "1.0.0"
@@ -3888,9 +3899,9 @@
3888
3899
  {
3889
3900
  "chunkIndex": 24,
3890
3901
  "chunkKind": "authoring_manifest",
3891
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"},{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"},{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"},{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"},{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"},{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"},{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"},{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"}]}",
3902
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"},{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"},{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"},{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"},{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"},{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"},{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"},{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"}]}",
3892
3903
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3893
- "contentHash": "2d81806c5095d5c46695b0f9a029e407af28812b59136a1465211cc645783f01",
3904
+ "contentHash": "15318f63c0ee1ac6dbac993e14bacd69b6a1fd7b75d5b82ee1df2bad8c5c0cf4",
3894
3905
  "sourceKind": "component_definition",
3895
3906
  "sourceId": "praxis-page-builder",
3896
3907
  "corpusVersion": "1.0.0"
@@ -3898,9 +3909,9 @@
3898
3909
  {
3899
3910
  "chunkIndex": 25,
3900
3911
  "chunkKind": "authoring_manifest",
3901
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}]}",
3912
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}]}",
3902
3913
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3903
- "contentHash": "562c9bff735ffd8e31f349ae0130e3cbb47ded981bbb0ad02fe6a9a2fd88edf8",
3914
+ "contentHash": "bbe5f7be2f5a58bca411874ee48ab1c72615a4345b30934884a47be01ce66484",
3904
3915
  "sourceKind": "component_definition",
3905
3916
  "sourceId": "praxis-page-builder",
3906
3917
  "corpusVersion": "1.0.0"
@@ -3908,9 +3919,9 @@
3908
3919
  {
3909
3920
  "chunkIndex": 26,
3910
3921
  "chunkKind": "authoring_manifest",
3911
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.\",\"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.\",\"UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.\",\"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.\",\"UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.\",\"UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.\",\"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\"Persisted wiring uses page.composition.links and must not write legacy connections.\",\"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\"Agentic preview preflights UiCompositionPlan against the target registry and applies the attested WidgetPageDefinition; persistence rebuilds patch.page from that page while the surrounding envelope remains diagnostics/audit data.\",\"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"]}",
3922
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.\",\"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.\",\"UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.\",\"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.\",\"UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.\",\"UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.\",\"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\"Persisted wiring uses page.composition.links and must not write legacy connections.\",\"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\"Agentic preview preflights UiCompositionPlan against the target registry and applies the attested WidgetPageDefinition; persistence rebuilds patch.page from that page while the surrounding envelope remains diagnostics/audit data.\",\"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"]}",
3912
3923
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3913
- "contentHash": "004874300292e5f7c05de8600587c5db5f2a5b0fd827cb519b036ab947b88d8d",
3924
+ "contentHash": "faf63deac213466b9b7acdd7415852228d0d32c0695538ccddab1a659fad0be3",
3914
3925
  "sourceKind": "component_definition",
3915
3926
  "sourceId": "praxis-page-builder",
3916
3927
  "corpusVersion": "1.0.0"
@@ -3918,9 +3929,9 @@
3918
3929
  {
3919
3930
  "chunkIndex": 27,
3920
3931
  "chunkKind": "authoring_manifest",
3921
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.3.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true},{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true},{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true},{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true},{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true},{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true},{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true},{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true},{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true},{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true},{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true},{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false},{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
3932
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true},{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true},{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true},{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true},{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true},{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true},{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true},{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true},{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true},{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true},{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true},{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false},{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
3922
3933
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3923
- "contentHash": "0cd5e37f4c0739f7f92b8787a79ca5713cbca1e25be6da35d18a68653d0718c8",
3934
+ "contentHash": "81e84b810812322568692002c1a25581d7442e943954db43a347f359ce2f8ecf",
3924
3935
  "sourceKind": "component_definition",
3925
3936
  "sourceId": "praxis-page-builder",
3926
3937
  "corpusVersion": "1.0.0"
@@ -14195,7 +14195,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
14195
14195
  componentId: 'praxis-page-builder',
14196
14196
  ownerPackage: '@praxisui/page-builder',
14197
14197
  configSchemaId: 'WidgetPageDefinition',
14198
- manifestVersion: '1.3.0',
14198
+ manifestVersion: '1.4.0',
14199
14199
  runtimeInputs: [
14200
14200
  { name: 'page', type: 'WidgetPageDefinition', description: 'Canonical renderable page document consumed by praxis-dynamic-page.' },
14201
14201
  { name: 'pageIdentity', type: 'PageIdentity | null', description: 'Persistence identity for ui_user_config save/apply flows; not persisted inside page.' },
@@ -14203,6 +14203,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
14203
14203
  { name: 'authoringCapabilities', type: 'PageBuilderAuthoringCapabilities | null', description: 'Host-only grant that limits visible authoring operations without changing WidgetPageDefinition and without granting AI edit authority; omitted capabilities preserve full authoring.' },
14204
14204
  { name: 'context', type: 'Record<string, unknown>', description: 'Opaque host context passed to catalog resolution and agentic authoring.' },
14205
14205
  { name: 'pageChange', type: 'WidgetPageDefinition', description: 'Emitted after local apply/preview produces a renderable page.' },
14206
+ { name: 'pageAuthoringChange', type: 'WidgetPageDefinition', description: 'Emitted only after explicit visual authoring operations so hosts can keep authored source separate from runtime state.' },
14206
14207
  { name: 'agenticAuthoringEnableStreaming', type: 'boolean', description: 'Opt-in flag for the canonical streaming turn endpoints.' },
14207
14208
  { name: 'agenticAuthoringIncludeLlmDiagnostics', type: 'boolean', description: 'Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.' },
14208
14209
  { name: 'agenticAuthoringContextHints', type: 'Record<string, unknown>', description: 'Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.' },
@@ -21733,7 +21734,7 @@ function projectKnowledgeTarget(changeSet, conceptKey) {
21733
21734
  };
21734
21735
  }
21735
21736
 
21736
- const AGENTIC_AUTHORING_TURN_INACTIVITY_TIMEOUT_MS = 180_000;
21737
+ const AGENTIC_AUTHORING_TURN_INACTIVITY_TIMEOUT_MS = 300_000;
21737
21738
  const AGENTIC_LOCAL_PREVIEW_HISTORY_LIMIT = 20;
21738
21739
  const DEFAULT_RUNTIME_AUTHORING_CAPABILITIES = Object.freeze({});
21739
21740
  const AGENTIC_PAGE_COMPOSITION_REQUEST_OUTPUT = 'agenticPageCompositionRequested';
@@ -21780,6 +21781,8 @@ class DynamicPageBuilderComponent {
21780
21781
  pageLifecycleBusy = false;
21781
21782
  pageLifecycleResetRevision = null;
21782
21783
  pageChange = new EventEmitter();
21784
+ /** Emits only explicit visual authoring operations, never runtime state changes. */
21785
+ pageAuthoringChange = output();
21783
21786
  widgetEvent = new EventEmitter();
21784
21787
  pageSaveRequested = new EventEmitter();
21785
21788
  agenticAuthoringApplied = new EventEmitter();
@@ -22000,6 +22003,12 @@ class DynamicPageBuilderComponent {
22000
22003
  this.clearSelectedWidgetIfMissing(canonical);
22001
22004
  this.pageChange.emit(canonical);
22002
22005
  }
22006
+ onRuntimePageAuthoringChange(next) {
22007
+ const canonical = this.toCanonicalPageFromRuntime(next);
22008
+ this.currentPage.set(canonical);
22009
+ this.clearSelectedWidgetIfMissing(canonical);
22010
+ this.pageAuthoringChange.emit(this.clonePage(canonical));
22011
+ }
22003
22012
  onRuntimeWidgetEvent(event) {
22004
22013
  this.widgetEvent.emit(event);
22005
22014
  if (event.output !== AGENTIC_PAGE_COMPOSITION_REQUEST_OUTPUT) {
@@ -22028,6 +22037,7 @@ class DynamicPageBuilderComponent {
22028
22037
  this.currentPage.set(cloned);
22029
22038
  this.clearSelectedWidgetIfMissing(cloned);
22030
22039
  this.pageChange.emit(cloned);
22040
+ this.pageAuthoringChange.emit(this.clonePage(cloned));
22031
22041
  }
22032
22042
  onRuntimeWidgetSelectionChange(widgetKey) {
22033
22043
  this.selectedWidgetKey.set(widgetKey);
@@ -22162,6 +22172,7 @@ class DynamicPageBuilderComponent {
22162
22172
  this.currentPage.set(next);
22163
22173
  this.selectInsertedWidget(key, widgets.length);
22164
22174
  this.pageChange.emit(this.clonePage(next));
22175
+ this.pageAuthoringChange.emit(this.clonePage(next));
22165
22176
  }
22166
22177
  layoutHintsFor(componentId) {
22167
22178
  const metadataHints = this.componentMetadata.get(componentId)?.layoutHints;
@@ -22385,6 +22396,7 @@ class DynamicPageBuilderComponent {
22385
22396
  const cloned = this.clonePage(config.page);
22386
22397
  this.currentPage.set(cloned);
22387
22398
  this.pageChange.emit(cloned);
22399
+ this.pageAuthoringChange.emit(this.clonePage(cloned));
22388
22400
  }
22389
22401
  createAdapterHost() {
22390
22402
  return {
@@ -25541,7 +25553,7 @@ class DynamicPageBuilderComponent {
25541
25553
  return resolvePraxisPageBuilderText(this.i18n, key, fallback);
25542
25554
  }
25543
25555
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, deps: [{ token: i1.MatDialog }, { token: SETTINGS_PANEL_BRIDGE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
25544
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { pageChange: "pageChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested" }, providers: [
25556
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { pageChange: "pageChange", pageAuthoringChange: "pageAuthoringChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested" }, providers: [
25545
25557
  providePraxisPageBuilderI18n(),
25546
25558
  { provide: DYNAMIC_PAGE_SHELL_EDITOR, useValue: WidgetShellEditorComponent },
25547
25559
  ], viewQueries: [{ propertyName: "runtime", first: true, predicate: ["runtime"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
@@ -25605,6 +25617,7 @@ class DynamicPageBuilderComponent {
25605
25617
  [pageEditorComponent]="pageEditorComponent"
25606
25618
  [showWidgetAssistantButton]="canUseAgenticAuthoring()"
25607
25619
  (pageChange)="onRuntimePageChange($event)"
25620
+ (pageAuthoringChange)="onRuntimePageAuthoringChange($event)"
25608
25621
  (widgetEvent)="onRuntimeWidgetEvent($event)"
25609
25622
  (widgetSelectionChange)="onRuntimeWidgetSelectionChange($event)"
25610
25623
  (widgetAssistantRequested)="openAgenticAuthoringForWidget($event)"
@@ -26092,7 +26105,7 @@ class DynamicPageBuilderComponent {
26092
26105
  }
26093
26106
  </praxis-floating-toolbar>
26094
26107
  </div>
26095
- `, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
26108
+ `, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "pageAuthoringChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
26096
26109
  }
26097
26110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, decorators: [{
26098
26111
  type: Component,
@@ -26169,6 +26182,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
26169
26182
  [pageEditorComponent]="pageEditorComponent"
26170
26183
  [showWidgetAssistantButton]="canUseAgenticAuthoring()"
26171
26184
  (pageChange)="onRuntimePageChange($event)"
26185
+ (pageAuthoringChange)="onRuntimePageAuthoringChange($event)"
26172
26186
  (widgetEvent)="onRuntimeWidgetEvent($event)"
26173
26187
  (widgetSelectionChange)="onRuntimeWidgetSelectionChange($event)"
26174
26188
  (widgetAssistantRequested)="openAgenticAuthoringForWidget($event)"
@@ -26723,7 +26737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
26723
26737
  type: Input
26724
26738
  }], pageChange: [{
26725
26739
  type: Output
26726
- }], widgetEvent: [{
26740
+ }], pageAuthoringChange: [{ type: i0.Output, args: ["pageAuthoringChange"] }], widgetEvent: [{
26727
26741
  type: Output
26728
26742
  }], pageSaveRequested: [{
26729
26743
  type: Output
@@ -26752,6 +26766,11 @@ const PRAXIS_PAGE_BUILDER_COMPONENT_METADATA = {
26752
26766
  type: 'WidgetPageDefinition',
26753
26767
  description: 'Emits the governed page definition after runtime or builder edits.',
26754
26768
  },
26769
+ {
26770
+ name: 'pageAuthoringChange',
26771
+ type: 'WidgetPageDefinition',
26772
+ description: 'Emits the governed page definition only after explicit visual authoring operations.',
26773
+ },
26755
26774
  {
26756
26775
  name: 'widgetEvent',
26757
26776
  type: 'WidgetEventEnvelope',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/page-builder",
3
- "version": "9.0.53",
3
+ "version": "9.0.55",
4
4
  "description": "Page and widget builder utilities for Praxis UI (grid, dynamic widgets, editors).",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -8,9 +8,9 @@
8
8
  "@angular/forms": "^21.0.0",
9
9
  "@angular/cdk": "^21.0.0",
10
10
  "@angular/material": "^21.0.0",
11
- "@praxisui/ai": "^9.0.53",
12
- "@praxisui/core": "^9.0.53",
13
- "@praxisui/settings-panel": "^9.0.53",
11
+ "@praxisui/ai": "^9.0.55",
12
+ "@praxisui/core": "^9.0.55",
13
+ "@praxisui/settings-panel": "^9.0.55",
14
14
  "rxjs": "~7.8.0"
15
15
  },
16
16
  "dependencies": {
@@ -1935,6 +1935,8 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
1935
1935
  pageLifecycleBusy: boolean;
1936
1936
  pageLifecycleResetRevision: number | string | null;
1937
1937
  pageChange: EventEmitter<WidgetPageDefinition>;
1938
+ /** Emits only explicit visual authoring operations, never runtime state changes. */
1939
+ readonly pageAuthoringChange: _angular_core.OutputEmitterRef<WidgetPageDefinition>;
1938
1940
  widgetEvent: EventEmitter<WidgetEventEnvelope>;
1939
1941
  pageSaveRequested: EventEmitter<WidgetPageDefinition>;
1940
1942
  agenticAuthoringApplied: EventEmitter<PageBuilderApplyResult>;
@@ -2016,6 +2018,7 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2016
2018
  runtimeAuthoringCapabilities(): PageBuilderAuthoringCapabilities;
2017
2019
  builderModeLabel(): string;
2018
2020
  onRuntimePageChange(next: WidgetPageDefinition): void;
2021
+ onRuntimePageAuthoringChange(next: WidgetPageDefinition): void;
2019
2022
  onRuntimeWidgetEvent(event: WidgetEventEnvelope): void;
2020
2023
  onConnectionEditorPageChange(next: WidgetPageDefinition): void;
2021
2024
  onRuntimeWidgetSelectionChange(widgetKey: string | null): void;
@@ -2266,7 +2269,7 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2266
2269
  private cloneValue;
2267
2270
  tx(key: string, fallback: string): string;
2268
2271
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicPageBuilderComponent, [null, { optional: true; }]>;
2269
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicPageBuilderComponent, "praxis-dynamic-page-builder", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoPersist": { "alias": "autoPersist"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapabilities": { "alias": "authoringCapabilities"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; "componentPaletteAllowedWidgetIds": { "alias": "componentPaletteAllowedWidgetIds"; "required": false; }; "componentPaletteAllowedWidgetTags": { "alias": "componentPaletteAllowedWidgetTags"; "required": false; }; "componentPaletteAllowedPresetIds": { "alias": "componentPaletteAllowedPresetIds"; "required": false; }; "enableAgenticAuthoring": { "alias": "enableAgenticAuthoring"; "required": false; }; "agenticAuthoringProvider": { "alias": "agenticAuthoringProvider"; "required": false; }; "agenticAuthoringModel": { "alias": "agenticAuthoringModel"; "required": false; }; "agenticAuthoringApiKey": { "alias": "agenticAuthoringApiKey"; "required": false; }; "agenticAuthoringComponentId": { "alias": "agenticAuthoringComponentId"; "required": false; }; "agenticAuthoringScope": { "alias": "agenticAuthoringScope"; "required": false; }; "agenticAuthoringEtag": { "alias": "agenticAuthoringEtag"; "required": false; }; "agenticAuthoringIncludeLlmDiagnostics": { "alias": "agenticAuthoringIncludeLlmDiagnostics"; "required": false; }; "agenticAuthoringEnableStreaming": { "alias": "agenticAuthoringEnableStreaming"; "required": false; }; "agenticAuthoringVoiceInputMode": { "alias": "agenticAuthoringVoiceInputMode"; "required": false; }; "agenticAuthoringContextHints": { "alias": "agenticAuthoringContextHints"; "required": false; }; "showPageLifecycleActions": { "alias": "showPageLifecycleActions"; "required": false; }; "canDeleteSavedPage": { "alias": "canDeleteSavedPage"; "required": false; }; "pageLifecycleBusy": { "alias": "pageLifecycleBusy"; "required": false; }; "pageLifecycleResetRevision": { "alias": "pageLifecycleResetRevision"; "required": false; }; }, { "pageChange": "pageChange"; "widgetEvent": "widgetEvent"; "pageSaveRequested": "pageSaveRequested"; "agenticAuthoringApplied": "agenticAuthoringApplied"; "agenticAuthoringSharedRuleHandoff": "agenticAuthoringSharedRuleHandoff"; "pageRestart": "pageRestart"; "savedPageDeleteRequested": "savedPageDeleteRequested"; }, never, never, true, never>;
2272
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicPageBuilderComponent, "praxis-dynamic-page-builder", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoPersist": { "alias": "autoPersist"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapabilities": { "alias": "authoringCapabilities"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; "componentPaletteAllowedWidgetIds": { "alias": "componentPaletteAllowedWidgetIds"; "required": false; }; "componentPaletteAllowedWidgetTags": { "alias": "componentPaletteAllowedWidgetTags"; "required": false; }; "componentPaletteAllowedPresetIds": { "alias": "componentPaletteAllowedPresetIds"; "required": false; }; "enableAgenticAuthoring": { "alias": "enableAgenticAuthoring"; "required": false; }; "agenticAuthoringProvider": { "alias": "agenticAuthoringProvider"; "required": false; }; "agenticAuthoringModel": { "alias": "agenticAuthoringModel"; "required": false; }; "agenticAuthoringApiKey": { "alias": "agenticAuthoringApiKey"; "required": false; }; "agenticAuthoringComponentId": { "alias": "agenticAuthoringComponentId"; "required": false; }; "agenticAuthoringScope": { "alias": "agenticAuthoringScope"; "required": false; }; "agenticAuthoringEtag": { "alias": "agenticAuthoringEtag"; "required": false; }; "agenticAuthoringIncludeLlmDiagnostics": { "alias": "agenticAuthoringIncludeLlmDiagnostics"; "required": false; }; "agenticAuthoringEnableStreaming": { "alias": "agenticAuthoringEnableStreaming"; "required": false; }; "agenticAuthoringVoiceInputMode": { "alias": "agenticAuthoringVoiceInputMode"; "required": false; }; "agenticAuthoringContextHints": { "alias": "agenticAuthoringContextHints"; "required": false; }; "showPageLifecycleActions": { "alias": "showPageLifecycleActions"; "required": false; }; "canDeleteSavedPage": { "alias": "canDeleteSavedPage"; "required": false; }; "pageLifecycleBusy": { "alias": "pageLifecycleBusy"; "required": false; }; "pageLifecycleResetRevision": { "alias": "pageLifecycleResetRevision"; "required": false; }; }, { "pageChange": "pageChange"; "pageAuthoringChange": "pageAuthoringChange"; "widgetEvent": "widgetEvent"; "pageSaveRequested": "pageSaveRequested"; "agenticAuthoringApplied": "agenticAuthoringApplied"; "agenticAuthoringSharedRuleHandoff": "agenticAuthoringSharedRuleHandoff"; "pageRestart": "pageRestart"; "savedPageDeleteRequested": "savedPageDeleteRequested"; }, never, never, true, never>;
2270
2273
  }
2271
2274
 
2272
2275
  /** Metadata for Praxis Page Builder component */