@praxisui/page-builder 9.0.0-beta.17 → 9.0.0-beta.19

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
@@ -147,6 +147,15 @@ providers: [
147
147
 
148
148
  Component input editors belong to the component owner. Page Builder discovers `ComponentDocMeta.configEditor` and hosts the published editor instead of redefining table, form, chart, list, upload, stepper, tab, expansion, CRUD, or rich-content configuration locally.
149
149
 
150
+ ## Page Settings Presets
151
+
152
+ Page settings expose the canonical layout and theme preset catalogs from `@praxisui/core`.
153
+
154
+ - `layoutPreset` selects the structural page template, including default grouping, slot expectations, responsive policy, and a recommended theme.
155
+ - `themePreset` is optional. When omitted, the runtime inherits the selected layout preset's `defaultThemePreset`.
156
+ - Pin `themePreset` only when the page must intentionally diverge from future layout-preset defaults or when governance requires an explicit visual decision in the saved document.
157
+ - Canvas item positions remain explicit page state. Presets guide layout, grouping, slot intent, and theme inheritance; they do not silently rewrite existing widget geometry.
158
+
150
159
  ## AI Authoring
151
160
 
152
161
  Register widget capability catalogs so the assistant can reason about component inputs and supported operations.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-06-24T15:54:00.036Z",
3
+ "generatedAt": "2026-06-24T23:02:12.024Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.0-beta.17",
5
+ "packageVersion": "9.0.0-beta.19",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -1514,6 +1514,9 @@
1514
1514
  "layoutPreset": {
1515
1515
  "type": "string"
1516
1516
  },
1517
+ "themePreset": {
1518
+ "type": "string"
1519
+ },
1517
1520
  "context": {
1518
1521
  "type": "object"
1519
1522
  },
@@ -1535,6 +1538,7 @@
1535
1538
  "writes": [
1536
1539
  "page.title",
1537
1540
  "page.layoutPreset",
1541
+ "page.themePreset",
1538
1542
  "page.context",
1539
1543
  "page.metadata"
1540
1544
  ],
@@ -1560,6 +1564,7 @@
1560
1564
  "affectedPaths": [
1561
1565
  "title",
1562
1566
  "layoutPreset",
1567
+ "themePreset",
1563
1568
  "context",
1564
1569
  "metadata"
1565
1570
  ],
@@ -3076,9 +3081,9 @@
3076
3081
  {
3077
3082
  "chunkIndex": 2,
3078
3083
  "chunkKind": "authoring_manifest",
3079
- "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-page-builder\",\n \"ownerPackage\": \"@praxisui/page-builder\",\n \"configSchemaId\": \"WidgetPageDefinition\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"page\",\n \"type\": \"WidgetPageDefinition\",\n \"description\": \"Canonical renderable page document consumed by praxis-dynamic-page.\"\n },\n {\n \"name\": \"pageIdentity\",\n \"type\": \"PageIdentity | null\",\n \"description\": \"Persistence identity for ui_user_config save/apply flows; not persisted inside page.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables page-builder authoring chrome around the runtime page.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context passed to catalog resolution and agentic authoring.\"\n },\n {\n \"name\": \"pageChange\",\n \"type\": \"WidgetPageDefinition\",\n \"description\": \"Emitted after local apply/preview produces a renderable page.\"\n },\n {\n \"name\": \"agenticAuthoringEnableStreaming\",\n \"type\": \"boolean\",\n \"description\": \"Opt-in flag for the canonical streaming turn endpoints.\"\n },\n {\n \"name\": \"agenticAuthoringIncludeLlmDiagnostics\",\n \"type\": \"boolean\",\n \"description\": \"Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.\"\n },\n {\n \"name\": \"agenticAuthoringContextHints\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"page\",\n \"resolver\": \"widget-page-definition-root\",\n \"description\": \"Root WidgetPageDefinition document: title, metadata, context and renderable page envelope.\"\n },\n {\n \"kind\": \"canvas\",\n \"resolver\": \"widget-page-canvas\",\n \"description\": \"Canvas geometry and item placement for top-level widgets.\"\n },\n {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"description\": \"Widget definitions addressed by stable widgetKey, never by array index.\"\n },\n {\n \"kind\": \"widgetShell\",\n \"resolver\": \"widget-shell-by-widget-key\",\n \"description\": \"Dashboard-card shell metadata such as title, action chrome and visual preset.\"\n },\n {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"description\": \"Declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"\n },\n {\n \"kind\": \"state\",\n \"resolver\": \"page-state-path\",\n \"description\": \"Page-level state entries referenced by composition links.\"\n },\n {\n \"kind\": \"pageIdentity\",\n \"resolver\": \"page-builder-persistence-identity\",\n \"description\": \"ui_user_config identity, scope and ETag used by applyPage/save.\"\n },\n {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"description\": \"Compiled backend preview envelope whose patch.page is applied locally.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"widget-child-authoring-manifest-operation\",\n \"description\": \"Delegated operation owned by the child widget component manifest or configEditor.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"page.configure\",\n \"title\": \"Configure page metadata\",\n \"scope\": \"global\",\n \"targetKind\": \"page\",\n \"target\": {\n \"kind\": \"page\",\n \"resolver\": \"widget-page-definition-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\"\n },\n \"layoutPreset\": {\n \"type\": \"string\"\n },\n \"context\": {\n \"type\": \"object\"\n },\n \"metadata\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-page-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition\",\n \"DynamicPageConfigEditorComponent\",\n \"SettingsPanelBridge\"\n ],\n \"writes\": [\n \"page.title\",\n \"page.layoutPreset\",\n \"page.context\",\n \"page.metadata\"\n ],\n \"identityKeys\": [\n \"pageIdentity.componentId\",\n \"pageIdentity.scope\"\n ],\n \"failureModes\": [\n \"page-not-loaded\",\n \"context-not-json\",\n \"settings-panel-bridge-missing\"\n ],\n \"description\": \"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"\n }\n }\n ],\n \"validators\": [\n \"widget-page-definition-valid\",\n \"no-legacy-grid-page-definition\",\n \"page-context-json-valid\",\n \"settings-panel-round-trip-valid\"\n ],\n \"affectedPaths\": [\n \"title\",\n \"layoutPreset\",\n \"context\",\n \"metadata\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"canvas.configure\",\n \"title\": \"Configure page canvas\",\n \"scope\": \"layout\",\n \"targetKind\": \"canvas\",\n \"target\": {\n \"kind\": \"canvas\",\n \"resolver\": \"widget-page-canvas\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"columns\": {\n \"type\": \"number\"\n },\n \"rowUnit\": {\n \"type\": \"number\"\n },\n \"gap\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-canvas-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.canvas\",\n \"DynamicPageBuilderComponent\"\n ],\n \"writes\": [\n \"page.canvas.columns\",\n \"page.canvas.rowUnit\",\n \"page.canvas.gap\",\n \"page.canvas.items\"\n ],\n \"identityKeys\": [\n \"canvas\"\n ],\n \"failureModes\": [\n \"canvas-missing\",\n \"canvas-item-references-missing-widget\",\n \"invalid-grid-geometry\"\n ],\n \"description\": \"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"\n }\n }\n ],\n \"validators\": [\n \"canvas-columns-integer\",\n \"canvas-row-unit-valid\",\n \"canvas-gap-valid\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"canvas.columns\",\n \"canvas.rowUnit\",\n \"canvas.gap\",\n \"canvas.items\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"widget.add\",\n \"title\": \"Add widget to page\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"componentId\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"componentId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"canvasItem\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-add\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetPageDefinition.canvas\",\n \"ComponentDocRegistry\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\"\n ],\n \"writes\": [\n \"page.widgets[]\",\n \"page.canvas.items[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-key-duplicate\",\n \"component-not-registered\",\n \"canvas-item-invalid\",\n \"child-input-contract-unknown\"\n ],\n \"description\": \"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"\n }\n }\n ],\n \"validators\": [\n \"widget-key-unique\",\n \"component-registered\",\n \"canvas-item-valid\",\n \"child-inputs-delegated\",\n \"widget-key-not-array-index\"\n ],\n \"affectedPaths\": [\n \"widgets[]\",\n \"canvas.items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"component-catalog-loaded\"\n ]\n },\n {\n \"operationId\": \"widget.remove\",\n \"title\": \"Remove widget from page\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"confirmed\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetPageDefinition.canvas.items\",\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.widgets[]\",\n \"page.canvas.items[]\",\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"destructive-removal-not-confirmed\",\n \"dangling-composition-link\"\n ],\n \"description\": \"Removes a widget and cleans canvas items and composition links that reference it.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"widget-exists\",\n \"destructive-removal-confirmed\",\n \"composition-links-cleaned\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"widgets[]\",\n \"canvas.items[]\",\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"widget.moveResize\",\n \"title\": \"Move or resize widget\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"canvasItem\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"canvasItem\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-move-resize\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.canvas.items\",\n \"WidgetPageDefinition.widgets\"\n ],\n \"writes\": [\n \"page.canvas.items[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"canvas-item-invalid\",\n \"canvas-overlap-invalid\"\n ],\n \"description\": \"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"canvas-item-valid\",\n \"canvas-item-targets-existing-widget\",\n \"canvas-overlap-policy-valid\"\n ],\n \"affectedPaths\": [\n \"canvas.items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"widget.shell.configure\",\n \"title\": \"Configure widget shell\",\n \"scope\": \"templating\",\n \"targetKind\": \"widgetShell\",\n \"target\": {\n \"kind\": \"widgetShell\",\n \"resolver\": \"widget-shell-by-widget-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"shell\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-shell-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetShellEditorComponent\",\n \"SettingsPanelBridge\"\n ],\n \"writes\": [\n \"page.widgets[].shell\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"settings-panel-bridge-missing\",\n \"shell-config-invalid\"\n ],\n \"description\": \"Updates the page-builder-owned widget shell without editing child component inputs.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"widget-shell-shape-valid\",\n \"settings-panel-bridge-available\",\n \"child-inputs-not-mutated\"\n ],\n \"affectedPaths\": [\n \"widgets[].shell\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"composition.link.add\",\n \"title\": \"Add page composition link\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"compositionLink\",\n \"target\": {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"from\",\n \"to\",\n \"intent\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"from\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"component-port\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"widget\",\n \"port\",\n \"direction\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"widget\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"string\"\n },\n \"direction\": {\n \"enum\": [\n \"input\",\n \"output\"\n ]\n },\n \"bindingPath\": {\n \"type\": \"string\"\n },\n \"nestedPath\": {\n \"type\": \"array\"\n }\n }\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"state\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"path\": {\n \"type\": \"string\"\n },\n \"layer\": {\n \"enum\": [\n \"values\",\n \"derived\",\n \"transient\"\n ]\n }\n }\n }\n }\n }\n ]\n },\n \"to\": {\n \"oneOf\": [\n null,\n null,\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"global-action\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"actionId\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"type\": \"object\"\n },\n \"payloadExpr\": {\n \"type\": \"string\"\n },\n \"meta\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n ]\n },\n \"intent\": {\n \"enum\": [\n \"event-propagation\",\n \"state-write\",\n \"state-read\",\n \"command-dispatch\",\n \"selection-sync\",\n \"data-projection\",\n \"status-propagation\"\n ]\n },\n \"condition\": {\n \"type\": \"object\"\n },\n \"transform\": {\n \"type\": \"object\"\n },\n \"policy\": {\n \"type\": \"object\"\n },\n \"metadata\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-composition-link-add\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.composition.links\",\n \"WidgetPageDefinition.widgets\",\n \"PAGE_BUILDER_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"id\"\n ],\n \"failureModes\": [\n \"link-id-duplicate\",\n \"endpoint-not-found\",\n \"nested-path-invalid\",\n \"json-logic-invalid\"\n ],\n \"description\": \"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"\n }\n }\n ],\n \"validators\": [\n \"composition-link-id-unique\",\n \"composition-endpoints-resolve\",\n \"nested-path-terminal-widget-key-required\",\n \"json-logic-condition-valid\",\n \"no-legacy-connections-write\"\n ],\n \"affectedPaths\": [\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"widgets-resolvable\"\n ]\n },\n {\n \"operationId\": \"composition.link.remove\",\n \"title\": \"Remove page composition link\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"compositionLink\",\n \"target\": {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"confirmed\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-composition-link-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"id\"\n ],\n \"failureModes\": [\n \"composition-link-not-found\",\n \"destructive-removal-not-confirmed\"\n ],\n \"description\": \"Removes a canonical composition link by stable id.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"composition-link-exists\",\n \"destructive-removal-confirmed\",\n \"composition-links-still-valid\"\n ],\n \"affectedPaths\": [\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-link-exists\"\n ]\n },\n {\n \"operationId\": \"composition.plan.compile\",\n \"title\": \"Compile UI composition plan\",\n \"scope\": \"rules\",\n \"targetKind\": \"agenticPreview\",\n \"target\": {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"uiCompositionPlan\"\n ],\n \"properties\": {\n \"uiCompositionPlan\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-ui-composition-plan-compile\",\n \"handlerContract\": {\n \"reads\": [\n \"UiCompositionPlan\",\n \"compileUiCompositionPlan\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\n \"ComponentDocMeta.configEditor\"\n ],\n \"writes\": [\n \"compiledFormPatch.patch.page\"\n ],\n \"identityKeys\": [\n \"uiCompositionPlan.id\",\n \"widgetKey\",\n \"uiCompositionPlan.bindings[].id\"\n ],\n \"failureModes\": [\n \"ui-composition-plan-invalid\",\n \"widget-catalog-missing\",\n \"compiled-page-invalid\",\n \"child-config-editor-missing\"\n ],\n \"description\": \"Compiles the agentic intermediate UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"\n }\n }\n ],\n \"validators\": [\n \"ui-composition-plan-valid\",\n \"compiled-page-valid\",\n \"widget-keys-unique\",\n \"composition-endpoints-resolve\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"uiCompositionPlan\",\n \"compiledFormPatch.patch.page\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"agentic-preview-loaded\",\n \"component-catalog-loaded\"\n ]\n },\n {\n \"operationId\": \"state.set\",\n \"title\": \"Set page state value\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"state\",\n \"target\": {\n \"kind\": \"state\",\n \"resolver\": \"page-state-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"path\",\n \"value\"\n ],\n \"properties\": {\n \"path\": {\n \"type\": \"string\"\n },\n \"value\": {},\n \"layer\": {\n \"enum\": [\n \"page\",\n \"session\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-state-set\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.state\",\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.state\"\n ],\n \"identityKeys\": [\n \"path\"\n ],\n \"failureModes\": [\n \"state-path-invalid\",\n \"state-json-invalid\",\n \"composition-state-link-invalid\"\n ],\n \"description\": \"Sets canonical page state used by composition links without creating host-only binding paths.\"\n }\n }\n ],\n \"validators\": [\n \"state-path-valid\",\n \"state-layer-valid\",\n \"state-json-valid\",\n \"composition-state-links-still-valid\"\n ],\n \"affectedPaths\": [\n \"state\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"page.preview.apply\",\n \"title\": \"Apply agentic preview locally\",\n \"scope\": \"interaction\",\n \"targetKind\": \"agenticPreview\",\n \"target\": {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"previewId\"\n ],\n \"properties\": {\n \"previewId\": {\n \"type\": \"string\"\n },\n \"compiledFormPatch\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-preview-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"PageBuilderAiAdapter.applyCompiledFormPatch\",\n \"compiledFormPatch.patch.page\",\n \"PraxisAssistantTurnViewState\"\n ],\n \"writes\": [\n \"DynamicPageBuilderComponent.page\",\n \"pageChange\"\n ],\n \"identityKeys\": [\n \"previewId\"\n ],\n \"failureModes\": [\n \"preview-result-invalid\",\n \"patch-page-missing\",\n \"runtime-page-invalid\",\n \"patch-envelope-persistence-attempted\"\n ],\n \"description\": \"Applies only compiledFormPatch.patch.page to the local runtime page; the backend envelope remains diagnostic data.\"\n }\n }\n ],\n \"validators\": [\n \"preview-result-valid\",\n \"compiled-page-patch-present\",\n \"no-envelope-runtime-persistence\",\n \"runtime-page-valid\"\n ],\n \"affectedPaths\": [\n \"compiledFormPatch.patch.page\",\n \"page\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"agentic-preview-loaded\"\n ]\n },\n {\n \"operationId\": \"page.persist.save\",\n \"title\": \"Persist page through config API\",\n \"scope\": \"interaction\",\n \"targetKind\": \"pageIdentity\",\n \"target\": {\n \"kind\": \"pageIdentity\",\n \"resolver\": \"page-builder-persistence-identity\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"pageIdentity\"\n ],\n \"properties\": {\n \"pageIdentity\": {\n \"type\": \"object\"\n },\n \"page\": {\n \"type\": \"object\"\n },\n \"etag\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-page-persist-save\",\n \"handlerContract\": {\n \"reads\": [\n \"pageIdentity\",\n \"WidgetPageDefinition\",\n \"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\n \"ui_user_config ETag\"\n ],\n \"writes\": [\n \"POST/PUT /api/praxis/config/ui-user-config\",\n \"If-Match\"\n ],\n \"identityKeys\": [\n \"pageIdentity.componentType\",\n \"pageIdentity.componentId\",\n \"pageIdentity.scope\"\n ],\n \"failureModes\": [\n \"page-identity-incomplete\",\n \"etag-conflict\",\n \"runtime-page-invalid\",\n \"patch-envelope-persistence-attempted\"\n ],\n \"description\": \"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"\n }\n }\n ],\n \"validators\": [\n \"page-identity-complete\",\n \"etag-policy-valid\",\n \"runtime-page-valid\",\n \"no-envelope-runtime-persistence\"\n ],\n \"affectedPaths\": [\n \"page\",\n \"pageIdentity\",\n \"etag\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"page-identity-known\"\n ]\n },\n {\n \"operationId\": \"childOperation.delegate\",\n \"title\": \"Delegate widget child operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"widget-child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"childComponentId\": {\n \"type\": \"string\"\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"ComponentDocMeta.configEditor\",\n \"child ComponentAuthoringManifest\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\"\n ],\n \"writes\": [\n \"page.widgets[].definition.inputs\"\n ],\n \"identityKeys\": [\n \"widgetKey\",\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"child-manifest-missing\",\n \"child-operation-unknown\",\n \"local-child-input-write-attempted\"\n ],\n \"description\": \"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"child-manifest-available\",\n \"child-operation-known\",\n \"component-config-editor-respected\",\n \"no-local-child-input-write\"\n ],\n \"affectedPaths\": [\n \"widgets[].definition.inputs\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\",\n \"child-authoring-contract-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"widget-page-definition-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PAGE_VALID\",\n \"description\": \"The document must remain a renderable WidgetPageDefinition.\"\n },\n {\n \"validatorId\": \"no-legacy-grid-page-definition\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_GRID_PAGE\",\n \"description\": \"Legacy GridPageDefinition semantics cannot be reintroduced.\"\n },\n {\n \"validatorId\": \"page-context-json-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CONTEXT_JSON\",\n \"description\": \"Page context must stay JSON-serializable.\"\n },\n {\n \"validatorId\": \"settings-panel-round-trip-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\n \"description\": \"Settings panel apply/save/reset/reopen must preserve the same page shape.\"\n },\n {\n \"validatorId\": \"canvas-columns-integer\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_COLUMNS\",\n \"description\": \"Canvas columns must be an integer grid count.\"\n },\n {\n \"validatorId\": \"canvas-row-unit-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ROW_UNIT\",\n \"description\": \"Canvas row unit must be a positive layout unit.\"\n },\n {\n \"validatorId\": \"canvas-gap-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_GAP\",\n \"description\": \"Canvas gap must be a valid non-negative spacing value.\"\n },\n {\n \"validatorId\": \"canvas-items-reference-existing-widgets\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\n \"description\": \"Every canvas item must reference an existing widgetKey.\"\n },\n {\n \"validatorId\": \"widget-key-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\n \"description\": \"Widget keys must be unique.\"\n },\n {\n \"validatorId\": \"component-registered\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_COMPONENT_REGISTERED\",\n \"description\": \"Widget component id must exist in the component registry/catalog.\"\n },\n {\n \"validatorId\": \"canvas-item-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ITEM\",\n \"description\": \"Canvas item geometry must be valid.\"\n },\n {\n \"validatorId\": \"child-inputs-delegated\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\n \"description\": \"Child component input edits must delegate to the child owner.\"\n },\n {\n \"validatorId\": \"widget-key-not-array-index\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEY_INDEX\",\n \"description\": \"Array index is not a stable widget identity.\"\n },\n {\n \"validatorId\": \"widget-exists\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_EXISTS\",\n \"description\": \"Target widget must exist.\"\n },\n {\n \"validatorId\": \"destructive-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\n \"description\": \"Destructive removals require explicit confirmation.\"\n },\n {\n \"validatorId\": \"composition-links-cleaned\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINKS_CLEANED\",\n \"description\": \"Removing a widget must remove dangling composition links.\"\n },\n {\n \"validatorId\": \"canvas-item-targets-existing-widget\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\n \"description\": \"Moved canvas item must target an existing widget.\"\n },\n {\n \"validatorId\": \"canvas-overlap-policy-valid\",\n \"level\": \"warning\",\n \"code\": \"PAGE_BUILDER_CANVAS_OVERLAP\",\n \"description\": \"Canvas overlap policy must be respected.\"\n },\n {\n \"validatorId\": \"widget-shell-shape-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SHELL_SHAPE\",\n \"description\": \"Widget shell config must match the shell editor contract.\"\n },\n {\n \"validatorId\": \"settings-panel-bridge-available\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SETTINGS_BRIDGE\",\n \"description\": \"Settings panel bridge must be available for shell/page editors.\"\n },\n {\n \"validatorId\": \"child-inputs-not-mutated\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\n \"description\": \"Shell edits cannot mutate child inputs.\"\n },\n {\n \"validatorId\": \"composition-link-id-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_ID_UNIQUE\",\n \"description\": \"Composition link ids must be unique.\"\n },\n {\n \"validatorId\": \"composition-endpoints-resolve\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_ENDPOINTS\",\n \"description\": \"Composition endpoints must resolve to known widgets, ports and nested paths.\"\n },\n {\n \"validatorId\": \"nested-path-terminal-widget-key-required\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\n \"description\": \"Nested component-port paths must terminate at a stable widget key.\"\n },\n {\n \"validatorId\": \"json-logic-condition-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_JSON_LOGIC\",\n \"description\": \"Composition link condition must be valid Json Logic.\"\n },\n {\n \"validatorId\": \"no-legacy-connections-write\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\n \"description\": \"Operations must write page.composition.links, not legacy connections.\"\n },\n {\n \"validatorId\": \"composition-link-exists\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_EXISTS\",\n \"description\": \"Target composition link must exist.\"\n },\n {\n \"validatorId\": \"composition-links-still-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINKS_STILL_VALID\",\n \"description\": \"Remaining composition links must still validate after the operation.\"\n },\n {\n \"validatorId\": \"ui-composition-plan-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_UI_PLAN_VALID\",\n \"description\": \"UiCompositionPlan must match the intermediate agentic plan contract.\"\n },\n {\n \"validatorId\": \"compiled-page-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_COMPILED_PAGE_VALID\",\n \"description\": \"Compiled output must be a valid WidgetPageDefinition.\"\n },\n {\n \"validatorId\": \"widget-keys-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\n \"description\": \"Compiled plan must produce unique widget keys.\"\n },\n {\n \"validatorId\": \"state-path-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_PATH\",\n \"description\": \"State paths must be valid page state paths.\"\n },\n {\n \"validatorId\": \"state-layer-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_LAYER\",\n \"description\": \"State layer must be page or session.\"\n },\n {\n \"validatorId\": \"state-json-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_JSON\",\n \"description\": \"State values must be JSON-serializable.\"\n },\n {\n \"validatorId\": \"composition-state-links-still-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_LINKS\",\n \"description\": \"State edits must not break composition links.\"\n },\n {\n \"validatorId\": \"preview-result-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PREVIEW_VALID\",\n \"description\": \"Agentic preview result must be structurally valid.\"\n },\n {\n \"validatorId\": \"compiled-page-patch-present\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\n \"description\": \"Preview envelope must include compiledFormPatch.patch.page.\"\n },\n {\n \"validatorId\": \"no-envelope-runtime-persistence\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\n \"description\": \"Runtime persistence cannot save the full preview envelope.\"\n },\n {\n \"validatorId\": \"runtime-page-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\n \"description\": \"Runtime page must remain renderable by praxis-dynamic-page.\"\n },\n {\n \"validatorId\": \"page-identity-complete\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PAGE_IDENTITY\",\n \"description\": \"Save requires component type, component id and scope identity.\"\n },\n {\n \"validatorId\": \"etag-policy-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_ETAG_POLICY\",\n \"description\": \"Save must respect backend ETag/If-Match policy.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child component must expose an authoring manifest or configEditor.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated child operation id must be known.\"\n },\n {\n \"validatorId\": \"component-config-editor-respected\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\n \"description\": \"ComponentDocMeta.configEditor must remain the source for child input editing.\"\n },\n {\n \"validatorId\": \"no-local-child-input-write\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\n \"description\": \"Page-builder must not define child component input semantics locally.\"\n }\n ],\n \"roundTripRequirements\": [\n \"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.\",\n \"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.\",\n \"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\n \"Persisted wiring uses page.composition.links and must not write legacy connections.\",\n \"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\n \"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\n \"Agentic preview applies only compiledFormPatch.patch.page to runtime; the full patch envelope is diagnostics/audit data.\",\n \"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\n \"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"\n ],\n \"examples\": [\n {\n \"id\": \"configure-dashboard-page\",\n \"request\": \"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\n \"operationId\": \"page.configure\",\n \"params\": {\n \"title\": \"Payroll Overview\",\n \"context\": {\n \"payrollPeriod\": \"current\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-canvas-grid\",\n \"request\": \"Use a 12 column dashboard grid with compact gaps.\",\n \"operationId\": \"canvas.configure\",\n \"target\": \"canvas\",\n \"params\": {\n \"columns\": 12,\n \"rowUnit\": 8,\n \"gap\": 8\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-employees-table-widget\",\n \"request\": \"Add an employees table widget to the left half of the first row.\",\n \"operationId\": \"widget.add\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"componentId\": \"praxis-table\",\n \"canvasItem\": {\n \"x\": 0,\n \"y\": 0,\n \"w\": 6,\n \"h\": 8\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-summary-card\",\n \"request\": \"Remove the summary-card widget and its links.\",\n \"operationId\": \"widget.remove\",\n \"target\": \"summary-card\",\n \"params\": {\n \"widgetKey\": \"summary-card\",\n \"confirmed\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-payroll-chart\",\n \"request\": \"Move payroll-chart to the right column and make it taller.\",\n \"operationId\": \"widget.moveResize\",\n \"target\": \"payroll-chart\",\n \"params\": {\n \"widgetKey\": \"payroll-chart\",\n \"canvasItem\": {\n \"x\": 6,\n \"y\": 0,\n \"w\": 6,\n \"h\": 10\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-widget-shell\",\n \"request\": \"Rename the employees widget card and enable the refresh shell action.\",\n \"operationId\": \"widget.shell.configure\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"shell\": {\n \"title\": \"Employees\",\n \"actions\": [\n {\n \"id\": \"refresh\"\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"link-department-selection-to-table\",\n \"request\": \"When department-list selection changes, filter employees-table by department id.\",\n \"operationId\": \"composition.link.add\",\n \"target\": \"department-selection-to-employees\",\n \"params\": {\n \"id\": \"department-selection-to-employees\",\n \"from\": {\n \"widget\": \"department-list\",\n \"port\": \"selection\"\n },\n \"to\": {\n \"widget\": \"employees-table\",\n \"port\": \"filter\"\n },\n \"intent\": \"selection-sync\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-obsolete-link\",\n \"request\": \"Remove the old payroll-filter-link composition link.\",\n \"operationId\": \"composition.link.remove\",\n \"target\": \"payroll-filter-link\",\n \"params\": {\n \"id\": \"payroll-filter-link\",\n \"confirmed\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"compile-resource-dashboard-plan\",\n \"request\": \"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\n \"operationId\": \"composition.plan.compile\",\n \"target\": \"preview-payroll-dashboard\",\n \"params\": {\n \"uiCompositionPlan\": {\n \"layoutPreset\": \"resource-dashboard\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-selected-department-state\",\n \"request\": \"Store selectedDepartmentId in page state for downstream links.\",\n \"operationId\": \"state.set\",\n \"target\": \"state.selectedDepartmentId\",\n \"params\": {\n \"path\": \"selectedDepartmentId\",\n \"value\": \"sales\",\n \"layer\": \"page\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-agentic-preview\",\n \"request\": \"Apply the current assistant preview to the local page.\",\n \"operationId\": \"page.preview.apply\",\n \"target\": \"preview-current\",\n \"params\": {\n \"previewId\": \"preview-current\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"persist-page\",\n \"request\": \"Save this page configuration using the current ETag.\",\n \"operationId\": \"page.persist.save\",\n \"target\": \"tenant-dashboard-page\",\n \"params\": {\n \"pageIdentity\": {\n \"componentType\": \"page-builder\",\n \"componentId\": \"tenant-dashboard\",\n \"scope\": \"tenant\"\n },\n \"etag\": \"\\\"v7\\\"\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"delegate-table-column-edit\",\n \"request\": \"Add a salary column to the employees table widget.\",\n \"operationId\": \"childOperation.delegate\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"TableConfig is owned by praxis-table.\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-direct-dynamic-form-field-write\",\n \"request\": \"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\n \"operationId\": \"childOperation.delegate\",\n \"target\": \"employee-form\",\n \"params\": {\n \"widgetKey\": \"employee-form\",\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Dynamic form fields are delegated.\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-legacy-connections\",\n \"request\": \"Create the widget link under the old connections collection.\",\n \"operationId\": \"composition.link.add\",\n \"target\": \"legacy-connection\",\n \"params\": {\n \"id\": \"legacy-connection\",\n \"collection\": \"connections\"\n },\n \"isPositive\": false\n }\n ]\n}",
3084
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-page-builder\",\n \"ownerPackage\": \"@praxisui/page-builder\",\n \"configSchemaId\": \"WidgetPageDefinition\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"page\",\n \"type\": \"WidgetPageDefinition\",\n \"description\": \"Canonical renderable page document consumed by praxis-dynamic-page.\"\n },\n {\n \"name\": \"pageIdentity\",\n \"type\": \"PageIdentity | null\",\n \"description\": \"Persistence identity for ui_user_config save/apply flows; not persisted inside page.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables page-builder authoring chrome around the runtime page.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context passed to catalog resolution and agentic authoring.\"\n },\n {\n \"name\": \"pageChange\",\n \"type\": \"WidgetPageDefinition\",\n \"description\": \"Emitted after local apply/preview produces a renderable page.\"\n },\n {\n \"name\": \"agenticAuthoringEnableStreaming\",\n \"type\": \"boolean\",\n \"description\": \"Opt-in flag for the canonical streaming turn endpoints.\"\n },\n {\n \"name\": \"agenticAuthoringIncludeLlmDiagnostics\",\n \"type\": \"boolean\",\n \"description\": \"Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.\"\n },\n {\n \"name\": \"agenticAuthoringContextHints\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"page\",\n \"resolver\": \"widget-page-definition-root\",\n \"description\": \"Root WidgetPageDefinition document: title, metadata, context and renderable page envelope.\"\n },\n {\n \"kind\": \"canvas\",\n \"resolver\": \"widget-page-canvas\",\n \"description\": \"Canvas geometry and item placement for top-level widgets.\"\n },\n {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"description\": \"Widget definitions addressed by stable widgetKey, never by array index.\"\n },\n {\n \"kind\": \"widgetShell\",\n \"resolver\": \"widget-shell-by-widget-key\",\n \"description\": \"Dashboard-card shell metadata such as title, action chrome and visual preset.\"\n },\n {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"description\": \"Declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"\n },\n {\n \"kind\": \"state\",\n \"resolver\": \"page-state-path\",\n \"description\": \"Page-level state entries referenced by composition links.\"\n },\n {\n \"kind\": \"pageIdentity\",\n \"resolver\": \"page-builder-persistence-identity\",\n \"description\": \"ui_user_config identity, scope and ETag used by applyPage/save.\"\n },\n {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"description\": \"Compiled backend preview envelope whose patch.page is applied locally.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"widget-child-authoring-manifest-operation\",\n \"description\": \"Delegated operation owned by the child widget component manifest or configEditor.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"page.configure\",\n \"title\": \"Configure page metadata\",\n \"scope\": \"global\",\n \"targetKind\": \"page\",\n \"target\": {\n \"kind\": \"page\",\n \"resolver\": \"widget-page-definition-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\"\n },\n \"layoutPreset\": {\n \"type\": \"string\"\n },\n \"themePreset\": {\n \"type\": \"string\"\n },\n \"context\": {\n \"type\": \"object\"\n },\n \"metadata\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-page-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition\",\n \"DynamicPageConfigEditorComponent\",\n \"SettingsPanelBridge\"\n ],\n \"writes\": [\n \"page.title\",\n \"page.layoutPreset\",\n \"page.themePreset\",\n \"page.context\",\n \"page.metadata\"\n ],\n \"identityKeys\": [\n \"pageIdentity.componentId\",\n \"pageIdentity.scope\"\n ],\n \"failureModes\": [\n \"page-not-loaded\",\n \"context-not-json\",\n \"settings-panel-bridge-missing\"\n ],\n \"description\": \"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"\n }\n }\n ],\n \"validators\": [\n \"widget-page-definition-valid\",\n \"no-legacy-grid-page-definition\",\n \"page-context-json-valid\",\n \"settings-panel-round-trip-valid\"\n ],\n \"affectedPaths\": [\n \"title\",\n \"layoutPreset\",\n \"themePreset\",\n \"context\",\n \"metadata\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"canvas.configure\",\n \"title\": \"Configure page canvas\",\n \"scope\": \"layout\",\n \"targetKind\": \"canvas\",\n \"target\": {\n \"kind\": \"canvas\",\n \"resolver\": \"widget-page-canvas\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"columns\": {\n \"type\": \"number\"\n },\n \"rowUnit\": {\n \"type\": \"number\"\n },\n \"gap\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"type\": \"array\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-canvas-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.canvas\",\n \"DynamicPageBuilderComponent\"\n ],\n \"writes\": [\n \"page.canvas.columns\",\n \"page.canvas.rowUnit\",\n \"page.canvas.gap\",\n \"page.canvas.items\"\n ],\n \"identityKeys\": [\n \"canvas\"\n ],\n \"failureModes\": [\n \"canvas-missing\",\n \"canvas-item-references-missing-widget\",\n \"invalid-grid-geometry\"\n ],\n \"description\": \"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"\n }\n }\n ],\n \"validators\": [\n \"canvas-columns-integer\",\n \"canvas-row-unit-valid\",\n \"canvas-gap-valid\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"canvas.columns\",\n \"canvas.rowUnit\",\n \"canvas.gap\",\n \"canvas.items\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"widget.add\",\n \"title\": \"Add widget to page\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"componentId\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"componentId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"canvasItem\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-add\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetPageDefinition.canvas\",\n \"ComponentDocRegistry\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\"\n ],\n \"writes\": [\n \"page.widgets[]\",\n \"page.canvas.items[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-key-duplicate\",\n \"component-not-registered\",\n \"canvas-item-invalid\",\n \"child-input-contract-unknown\"\n ],\n \"description\": \"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"\n }\n }\n ],\n \"validators\": [\n \"widget-key-unique\",\n \"component-registered\",\n \"canvas-item-valid\",\n \"child-inputs-delegated\",\n \"widget-key-not-array-index\"\n ],\n \"affectedPaths\": [\n \"widgets[]\",\n \"canvas.items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"component-catalog-loaded\"\n ]\n },\n {\n \"operationId\": \"widget.remove\",\n \"title\": \"Remove widget from page\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"confirmed\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetPageDefinition.canvas.items\",\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.widgets[]\",\n \"page.canvas.items[]\",\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"destructive-removal-not-confirmed\",\n \"dangling-composition-link\"\n ],\n \"description\": \"Removes a widget and cleans canvas items and composition links that reference it.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"widget-exists\",\n \"destructive-removal-confirmed\",\n \"composition-links-cleaned\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"widgets[]\",\n \"canvas.items[]\",\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"widget.moveResize\",\n \"title\": \"Move or resize widget\",\n \"scope\": \"layout\",\n \"targetKind\": \"widget\",\n \"target\": {\n \"kind\": \"widget\",\n \"resolver\": \"widget-by-stable-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"canvasItem\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"canvasItem\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-move-resize\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.canvas.items\",\n \"WidgetPageDefinition.widgets\"\n ],\n \"writes\": [\n \"page.canvas.items[]\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"canvas-item-invalid\",\n \"canvas-overlap-invalid\"\n ],\n \"description\": \"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"canvas-item-valid\",\n \"canvas-item-targets-existing-widget\",\n \"canvas-overlap-policy-valid\"\n ],\n \"affectedPaths\": [\n \"canvas.items[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"widget.shell.configure\",\n \"title\": \"Configure widget shell\",\n \"scope\": \"templating\",\n \"targetKind\": \"widgetShell\",\n \"target\": {\n \"kind\": \"widgetShell\",\n \"resolver\": \"widget-shell-by-widget-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"shell\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-widget-shell-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"WidgetShellEditorComponent\",\n \"SettingsPanelBridge\"\n ],\n \"writes\": [\n \"page.widgets[].shell\"\n ],\n \"identityKeys\": [\n \"widgetKey\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"settings-panel-bridge-missing\",\n \"shell-config-invalid\"\n ],\n \"description\": \"Updates the page-builder-owned widget shell without editing child component inputs.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"widget-shell-shape-valid\",\n \"settings-panel-bridge-available\",\n \"child-inputs-not-mutated\"\n ],\n \"affectedPaths\": [\n \"widgets[].shell\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\"\n ]\n },\n {\n \"operationId\": \"composition.link.add\",\n \"title\": \"Add page composition link\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"compositionLink\",\n \"target\": {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"from\",\n \"to\",\n \"intent\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"from\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"component-port\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"widget\",\n \"port\",\n \"direction\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"widget\": {\n \"type\": \"string\"\n },\n \"port\": {\n \"type\": \"string\"\n },\n \"direction\": {\n \"enum\": [\n \"input\",\n \"output\"\n ]\n },\n \"bindingPath\": {\n \"type\": \"string\"\n },\n \"nestedPath\": {\n \"type\": \"array\"\n }\n }\n }\n }\n },\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"state\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"path\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"path\": {\n \"type\": \"string\"\n },\n \"layer\": {\n \"enum\": [\n \"values\",\n \"derived\",\n \"transient\"\n ]\n }\n }\n }\n }\n }\n ]\n },\n \"to\": {\n \"oneOf\": [\n null,\n null,\n {\n \"type\": \"object\",\n \"required\": [\n \"kind\",\n \"ref\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"global-action\"\n ]\n },\n \"ref\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"actionId\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"type\": \"object\"\n },\n \"payloadExpr\": {\n \"type\": \"string\"\n },\n \"meta\": {\n \"type\": \"object\"\n }\n }\n }\n }\n }\n ]\n },\n \"intent\": {\n \"enum\": [\n \"event-propagation\",\n \"state-write\",\n \"state-read\",\n \"command-dispatch\",\n \"selection-sync\",\n \"data-projection\",\n \"status-propagation\"\n ]\n },\n \"condition\": {\n \"type\": \"object\"\n },\n \"transform\": {\n \"type\": \"object\"\n },\n \"policy\": {\n \"type\": \"object\"\n },\n \"metadata\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-composition-link-add\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.composition.links\",\n \"WidgetPageDefinition.widgets\",\n \"PAGE_BUILDER_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"id\"\n ],\n \"failureModes\": [\n \"link-id-duplicate\",\n \"endpoint-not-found\",\n \"nested-path-invalid\",\n \"json-logic-invalid\"\n ],\n \"description\": \"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"\n }\n }\n ],\n \"validators\": [\n \"composition-link-id-unique\",\n \"composition-endpoints-resolve\",\n \"nested-path-terminal-widget-key-required\",\n \"json-logic-condition-valid\",\n \"no-legacy-connections-write\"\n ],\n \"affectedPaths\": [\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"widgets-resolvable\"\n ]\n },\n {\n \"operationId\": \"composition.link.remove\",\n \"title\": \"Remove page composition link\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"compositionLink\",\n \"target\": {\n \"kind\": \"compositionLink\",\n \"resolver\": \"composition-link-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"confirmed\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-composition-link-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.composition.links[]\"\n ],\n \"identityKeys\": [\n \"id\"\n ],\n \"failureModes\": [\n \"composition-link-not-found\",\n \"destructive-removal-not-confirmed\"\n ],\n \"description\": \"Removes a canonical composition link by stable id.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"composition-link-exists\",\n \"destructive-removal-confirmed\",\n \"composition-links-still-valid\"\n ],\n \"affectedPaths\": [\n \"composition.links[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-link-exists\"\n ]\n },\n {\n \"operationId\": \"composition.plan.compile\",\n \"title\": \"Compile UI composition plan\",\n \"scope\": \"rules\",\n \"targetKind\": \"agenticPreview\",\n \"target\": {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"uiCompositionPlan\"\n ],\n \"properties\": {\n \"uiCompositionPlan\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-ui-composition-plan-compile\",\n \"handlerContract\": {\n \"reads\": [\n \"UiCompositionPlan\",\n \"compileUiCompositionPlan\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\n \"ComponentDocMeta.configEditor\"\n ],\n \"writes\": [\n \"compiledFormPatch.patch.page\"\n ],\n \"identityKeys\": [\n \"uiCompositionPlan.id\",\n \"widgetKey\",\n \"uiCompositionPlan.bindings[].id\"\n ],\n \"failureModes\": [\n \"ui-composition-plan-invalid\",\n \"widget-catalog-missing\",\n \"compiled-page-invalid\",\n \"child-config-editor-missing\"\n ],\n \"description\": \"Compiles the agentic intermediate UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"\n }\n }\n ],\n \"validators\": [\n \"ui-composition-plan-valid\",\n \"compiled-page-valid\",\n \"widget-keys-unique\",\n \"composition-endpoints-resolve\",\n \"canvas-items-reference-existing-widgets\"\n ],\n \"affectedPaths\": [\n \"uiCompositionPlan\",\n \"compiledFormPatch.patch.page\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"agentic-preview-loaded\",\n \"component-catalog-loaded\"\n ]\n },\n {\n \"operationId\": \"state.set\",\n \"title\": \"Set page state value\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"state\",\n \"target\": {\n \"kind\": \"state\",\n \"resolver\": \"page-state-path\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"path\",\n \"value\"\n ],\n \"properties\": {\n \"path\": {\n \"type\": \"string\"\n },\n \"value\": {},\n \"layer\": {\n \"enum\": [\n \"page\",\n \"session\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-state-set\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.state\",\n \"WidgetPageDefinition.composition.links\"\n ],\n \"writes\": [\n \"page.state\"\n ],\n \"identityKeys\": [\n \"path\"\n ],\n \"failureModes\": [\n \"state-path-invalid\",\n \"state-json-invalid\",\n \"composition-state-link-invalid\"\n ],\n \"description\": \"Sets canonical page state used by composition links without creating host-only binding paths.\"\n }\n }\n ],\n \"validators\": [\n \"state-path-valid\",\n \"state-layer-valid\",\n \"state-json-valid\",\n \"composition-state-links-still-valid\"\n ],\n \"affectedPaths\": [\n \"state\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\"\n ]\n },\n {\n \"operationId\": \"page.preview.apply\",\n \"title\": \"Apply agentic preview locally\",\n \"scope\": \"interaction\",\n \"targetKind\": \"agenticPreview\",\n \"target\": {\n \"kind\": \"agenticPreview\",\n \"resolver\": \"agentic-preview-result\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"previewId\"\n ],\n \"properties\": {\n \"previewId\": {\n \"type\": \"string\"\n },\n \"compiledFormPatch\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-preview-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"PageBuilderAiAdapter.applyCompiledFormPatch\",\n \"compiledFormPatch.patch.page\",\n \"PraxisAssistantTurnViewState\"\n ],\n \"writes\": [\n \"DynamicPageBuilderComponent.page\",\n \"pageChange\"\n ],\n \"identityKeys\": [\n \"previewId\"\n ],\n \"failureModes\": [\n \"preview-result-invalid\",\n \"patch-page-missing\",\n \"runtime-page-invalid\",\n \"patch-envelope-persistence-attempted\"\n ],\n \"description\": \"Applies only compiledFormPatch.patch.page to the local runtime page; the backend envelope remains diagnostic data.\"\n }\n }\n ],\n \"validators\": [\n \"preview-result-valid\",\n \"compiled-page-patch-present\",\n \"no-envelope-runtime-persistence\",\n \"runtime-page-valid\"\n ],\n \"affectedPaths\": [\n \"compiledFormPatch.patch.page\",\n \"page\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"agentic-preview-loaded\"\n ]\n },\n {\n \"operationId\": \"page.persist.save\",\n \"title\": \"Persist page through config API\",\n \"scope\": \"interaction\",\n \"targetKind\": \"pageIdentity\",\n \"target\": {\n \"kind\": \"pageIdentity\",\n \"resolver\": \"page-builder-persistence-identity\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"pageIdentity\"\n ],\n \"properties\": {\n \"pageIdentity\": {\n \"type\": \"object\"\n },\n \"page\": {\n \"type\": \"object\"\n },\n \"etag\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-page-persist-save\",\n \"handlerContract\": {\n \"reads\": [\n \"pageIdentity\",\n \"WidgetPageDefinition\",\n \"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\n \"ui_user_config ETag\"\n ],\n \"writes\": [\n \"POST/PUT /api/praxis/config/ui-user-config\",\n \"If-Match\"\n ],\n \"identityKeys\": [\n \"pageIdentity.componentType\",\n \"pageIdentity.componentId\",\n \"pageIdentity.scope\"\n ],\n \"failureModes\": [\n \"page-identity-incomplete\",\n \"etag-conflict\",\n \"runtime-page-invalid\",\n \"patch-envelope-persistence-attempted\"\n ],\n \"description\": \"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"\n }\n }\n ],\n \"validators\": [\n \"page-identity-complete\",\n \"etag-policy-valid\",\n \"runtime-page-valid\",\n \"no-envelope-runtime-persistence\"\n ],\n \"affectedPaths\": [\n \"page\",\n \"pageIdentity\",\n \"etag\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"page-identity-known\"\n ]\n },\n {\n \"operationId\": \"childOperation.delegate\",\n \"title\": \"Delegate widget child operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"widget-child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"widgetKey\",\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"widgetKey\": {\n \"type\": \"string\"\n },\n \"childComponentId\": {\n \"type\": \"string\"\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"page-builder-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"WidgetPageDefinition.widgets\",\n \"ComponentDocMeta.configEditor\",\n \"child ComponentAuthoringManifest\",\n \"PAGE_BUILDER_WIDGET_AI_CATALOGS\"\n ],\n \"writes\": [\n \"page.widgets[].definition.inputs\"\n ],\n \"identityKeys\": [\n \"widgetKey\",\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"widget-not-found\",\n \"child-manifest-missing\",\n \"child-operation-unknown\",\n \"local-child-input-write-attempted\"\n ],\n \"description\": \"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"\n }\n }\n ],\n \"validators\": [\n \"widget-exists\",\n \"child-manifest-available\",\n \"child-operation-known\",\n \"component-config-editor-respected\",\n \"no-local-child-input-write\"\n ],\n \"affectedPaths\": [\n \"widgets[].definition.inputs\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"page-loaded\",\n \"target-widget-exists\",\n \"child-authoring-contract-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"widget-page-definition-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PAGE_VALID\",\n \"description\": \"The document must remain a renderable WidgetPageDefinition.\"\n },\n {\n \"validatorId\": \"no-legacy-grid-page-definition\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_GRID_PAGE\",\n \"description\": \"Legacy GridPageDefinition semantics cannot be reintroduced.\"\n },\n {\n \"validatorId\": \"page-context-json-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CONTEXT_JSON\",\n \"description\": \"Page context must stay JSON-serializable.\"\n },\n {\n \"validatorId\": \"settings-panel-round-trip-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\n \"description\": \"Settings panel apply/save/reset/reopen must preserve the same page shape.\"\n },\n {\n \"validatorId\": \"canvas-columns-integer\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_COLUMNS\",\n \"description\": \"Canvas columns must be an integer grid count.\"\n },\n {\n \"validatorId\": \"canvas-row-unit-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ROW_UNIT\",\n \"description\": \"Canvas row unit must be a positive layout unit.\"\n },\n {\n \"validatorId\": \"canvas-gap-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_GAP\",\n \"description\": \"Canvas gap must be a valid non-negative spacing value.\"\n },\n {\n \"validatorId\": \"canvas-items-reference-existing-widgets\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\n \"description\": \"Every canvas item must reference an existing widgetKey.\"\n },\n {\n \"validatorId\": \"widget-key-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\n \"description\": \"Widget keys must be unique.\"\n },\n {\n \"validatorId\": \"component-registered\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_COMPONENT_REGISTERED\",\n \"description\": \"Widget component id must exist in the component registry/catalog.\"\n },\n {\n \"validatorId\": \"canvas-item-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ITEM\",\n \"description\": \"Canvas item geometry must be valid.\"\n },\n {\n \"validatorId\": \"child-inputs-delegated\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\n \"description\": \"Child component input edits must delegate to the child owner.\"\n },\n {\n \"validatorId\": \"widget-key-not-array-index\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEY_INDEX\",\n \"description\": \"Array index is not a stable widget identity.\"\n },\n {\n \"validatorId\": \"widget-exists\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_EXISTS\",\n \"description\": \"Target widget must exist.\"\n },\n {\n \"validatorId\": \"destructive-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\n \"description\": \"Destructive removals require explicit confirmation.\"\n },\n {\n \"validatorId\": \"composition-links-cleaned\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINKS_CLEANED\",\n \"description\": \"Removing a widget must remove dangling composition links.\"\n },\n {\n \"validatorId\": \"canvas-item-targets-existing-widget\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\n \"description\": \"Moved canvas item must target an existing widget.\"\n },\n {\n \"validatorId\": \"canvas-overlap-policy-valid\",\n \"level\": \"warning\",\n \"code\": \"PAGE_BUILDER_CANVAS_OVERLAP\",\n \"description\": \"Canvas overlap policy must be respected.\"\n },\n {\n \"validatorId\": \"widget-shell-shape-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SHELL_SHAPE\",\n \"description\": \"Widget shell config must match the shell editor contract.\"\n },\n {\n \"validatorId\": \"settings-panel-bridge-available\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_SETTINGS_BRIDGE\",\n \"description\": \"Settings panel bridge must be available for shell/page editors.\"\n },\n {\n \"validatorId\": \"child-inputs-not-mutated\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\n \"description\": \"Shell edits cannot mutate child inputs.\"\n },\n {\n \"validatorId\": \"composition-link-id-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_ID_UNIQUE\",\n \"description\": \"Composition link ids must be unique.\"\n },\n {\n \"validatorId\": \"composition-endpoints-resolve\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_ENDPOINTS\",\n \"description\": \"Composition endpoints must resolve to known widgets, ports and nested paths.\"\n },\n {\n \"validatorId\": \"nested-path-terminal-widget-key-required\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\n \"description\": \"Nested component-port paths must terminate at a stable widget key.\"\n },\n {\n \"validatorId\": \"json-logic-condition-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_JSON_LOGIC\",\n \"description\": \"Composition link condition must be valid Json Logic.\"\n },\n {\n \"validatorId\": \"no-legacy-connections-write\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\n \"description\": \"Operations must write page.composition.links, not legacy connections.\"\n },\n {\n \"validatorId\": \"composition-link-exists\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINK_EXISTS\",\n \"description\": \"Target composition link must exist.\"\n },\n {\n \"validatorId\": \"composition-links-still-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_LINKS_STILL_VALID\",\n \"description\": \"Remaining composition links must still validate after the operation.\"\n },\n {\n \"validatorId\": \"ui-composition-plan-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_UI_PLAN_VALID\",\n \"description\": \"UiCompositionPlan must match the intermediate agentic plan contract.\"\n },\n {\n \"validatorId\": \"compiled-page-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_COMPILED_PAGE_VALID\",\n \"description\": \"Compiled output must be a valid WidgetPageDefinition.\"\n },\n {\n \"validatorId\": \"widget-keys-unique\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\n \"description\": \"Compiled plan must produce unique widget keys.\"\n },\n {\n \"validatorId\": \"state-path-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_PATH\",\n \"description\": \"State paths must be valid page state paths.\"\n },\n {\n \"validatorId\": \"state-layer-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_LAYER\",\n \"description\": \"State layer must be page or session.\"\n },\n {\n \"validatorId\": \"state-json-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_JSON\",\n \"description\": \"State values must be JSON-serializable.\"\n },\n {\n \"validatorId\": \"composition-state-links-still-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_STATE_LINKS\",\n \"description\": \"State edits must not break composition links.\"\n },\n {\n \"validatorId\": \"preview-result-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PREVIEW_VALID\",\n \"description\": \"Agentic preview result must be structurally valid.\"\n },\n {\n \"validatorId\": \"compiled-page-patch-present\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\n \"description\": \"Preview envelope must include compiledFormPatch.patch.page.\"\n },\n {\n \"validatorId\": \"no-envelope-runtime-persistence\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\n \"description\": \"Runtime persistence cannot save the full preview envelope.\"\n },\n {\n \"validatorId\": \"runtime-page-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\n \"description\": \"Runtime page must remain renderable by praxis-dynamic-page.\"\n },\n {\n \"validatorId\": \"page-identity-complete\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_PAGE_IDENTITY\",\n \"description\": \"Save requires component type, component id and scope identity.\"\n },\n {\n \"validatorId\": \"etag-policy-valid\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_ETAG_POLICY\",\n \"description\": \"Save must respect backend ETag/If-Match policy.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child component must expose an authoring manifest or configEditor.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated child operation id must be known.\"\n },\n {\n \"validatorId\": \"component-config-editor-respected\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\n \"description\": \"ComponentDocMeta.configEditor must remain the source for child input editing.\"\n },\n {\n \"validatorId\": \"no-local-child-input-write\",\n \"level\": \"error\",\n \"code\": \"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\n \"description\": \"Page-builder must not define child component input semantics locally.\"\n }\n ],\n \"roundTripRequirements\": [\n \"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.\",\n \"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.\",\n \"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\n \"Persisted wiring uses page.composition.links and must not write legacy connections.\",\n \"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\n \"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\n \"Agentic preview applies only compiledFormPatch.patch.page to runtime; the full patch envelope is diagnostics/audit data.\",\n \"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\n \"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"\n ],\n \"examples\": [\n {\n \"id\": \"configure-dashboard-page\",\n \"request\": \"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\n \"operationId\": \"page.configure\",\n \"params\": {\n \"title\": \"Payroll Overview\",\n \"context\": {\n \"payrollPeriod\": \"current\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-canvas-grid\",\n \"request\": \"Use a 12 column dashboard grid with compact gaps.\",\n \"operationId\": \"canvas.configure\",\n \"target\": \"canvas\",\n \"params\": {\n \"columns\": 12,\n \"rowUnit\": 8,\n \"gap\": 8\n },\n \"isPositive\": true\n },\n {\n \"id\": \"add-employees-table-widget\",\n \"request\": \"Add an employees table widget to the left half of the first row.\",\n \"operationId\": \"widget.add\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"componentId\": \"praxis-table\",\n \"canvasItem\": {\n \"x\": 0,\n \"y\": 0,\n \"w\": 6,\n \"h\": 8\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-summary-card\",\n \"request\": \"Remove the summary-card widget and its links.\",\n \"operationId\": \"widget.remove\",\n \"target\": \"summary-card\",\n \"params\": {\n \"widgetKey\": \"summary-card\",\n \"confirmed\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-payroll-chart\",\n \"request\": \"Move payroll-chart to the right column and make it taller.\",\n \"operationId\": \"widget.moveResize\",\n \"target\": \"payroll-chart\",\n \"params\": {\n \"widgetKey\": \"payroll-chart\",\n \"canvasItem\": {\n \"x\": 6,\n \"y\": 0,\n \"w\": 6,\n \"h\": 10\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-widget-shell\",\n \"request\": \"Rename the employees widget card and enable the refresh shell action.\",\n \"operationId\": \"widget.shell.configure\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"shell\": {\n \"title\": \"Employees\",\n \"actions\": [\n {\n \"id\": \"refresh\"\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"link-department-selection-to-table\",\n \"request\": \"When department-list selection changes, filter employees-table by department id.\",\n \"operationId\": \"composition.link.add\",\n \"target\": \"department-selection-to-employees\",\n \"params\": {\n \"id\": \"department-selection-to-employees\",\n \"from\": {\n \"widget\": \"department-list\",\n \"port\": \"selection\"\n },\n \"to\": {\n \"widget\": \"employees-table\",\n \"port\": \"filter\"\n },\n \"intent\": \"selection-sync\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"remove-obsolete-link\",\n \"request\": \"Remove the old payroll-filter-link composition link.\",\n \"operationId\": \"composition.link.remove\",\n \"target\": \"payroll-filter-link\",\n \"params\": {\n \"id\": \"payroll-filter-link\",\n \"confirmed\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"compile-resource-dashboard-plan\",\n \"request\": \"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\n \"operationId\": \"composition.plan.compile\",\n \"target\": \"preview-payroll-dashboard\",\n \"params\": {\n \"uiCompositionPlan\": {\n \"layoutPreset\": \"resource-dashboard\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-selected-department-state\",\n \"request\": \"Store selectedDepartmentId in page state for downstream links.\",\n \"operationId\": \"state.set\",\n \"target\": \"state.selectedDepartmentId\",\n \"params\": {\n \"path\": \"selectedDepartmentId\",\n \"value\": \"sales\",\n \"layer\": \"page\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-agentic-preview\",\n \"request\": \"Apply the current assistant preview to the local page.\",\n \"operationId\": \"page.preview.apply\",\n \"target\": \"preview-current\",\n \"params\": {\n \"previewId\": \"preview-current\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"persist-page\",\n \"request\": \"Save this page configuration using the current ETag.\",\n \"operationId\": \"page.persist.save\",\n \"target\": \"tenant-dashboard-page\",\n \"params\": {\n \"pageIdentity\": {\n \"componentType\": \"page-builder\",\n \"componentId\": \"tenant-dashboard\",\n \"scope\": \"tenant\"\n },\n \"etag\": \"\\\"v7\\\"\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"delegate-table-column-edit\",\n \"request\": \"Add a salary column to the employees table widget.\",\n \"operationId\": \"childOperation.delegate\",\n \"target\": \"employees-table\",\n \"params\": {\n \"widgetKey\": \"employees-table\",\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"TableConfig is owned by praxis-table.\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-direct-dynamic-form-field-write\",\n \"request\": \"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\n \"operationId\": \"childOperation.delegate\",\n \"target\": \"employee-form\",\n \"params\": {\n \"widgetKey\": \"employee-form\",\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Dynamic form fields are delegated.\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-legacy-connections\",\n \"request\": \"Create the widget link under the old connections collection.\",\n \"operationId\": \"composition.link.add\",\n \"target\": \"legacy-connection\",\n \"params\": {\n \"id\": \"legacy-connection\",\n \"collection\": \"connections\"\n },\n \"isPositive\": false\n }\n ]\n}",
3080
3085
  "sourcePointer": "praxis-ui-angular/projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3081
- "contentHash": "b6ad872e46a8dc9727446be9844040ad0d242cb77eb3931dd44b5c4fb8c049b3",
3086
+ "contentHash": "12aaf2e26d9b1a18a957eb7ba0e059744c7a3a864209a754c19838a92bb352fc",
3082
3087
  "sourceKind": "component_definition",
3083
3088
  "sourceId": "praxis-page-builder",
3084
3089
  "corpusVersion": "1.0.0"