@praxisui/page-builder 9.0.5-rc.3 → 9.0.5-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-12T03:48:40.610Z",
3
+ "generatedAt": "2026-08-12T04:55:54.550Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.5-rc.3",
5
+ "packageVersion": "9.0.5-rc.4",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -90,7 +90,7 @@
90
90
  "path": "uiCompositionPlan.i18n",
91
91
  "category": "page",
92
92
  "valueKind": "object",
93
- "description": "Catalogo de textos de negocio da pagina, compilado para page.i18n sem criar copy no runtime."
93
+ "description": "Catalogo de textos de negocio da pagina, compilado para page.i18n. Descritores PraxisTextValue podem declarar apenas key quando a chave existir no dicionario do fallbackLocale; o compilador materializa text no documento executavel."
94
94
  },
95
95
  {
96
96
  "path": "uiCompositionPlan.context",
@@ -184,6 +184,36 @@
184
184
  "valueKind": "array",
185
185
  "description": "Ordem declarativa de binding, compilada para definition.bindingOrder."
186
186
  },
187
+ {
188
+ "path": "uiCompositionPlan.selectionSyncs",
189
+ "category": "connections",
190
+ "valueKind": "array",
191
+ "description": "Atalhos declarativos para projetar o mesmo contexto de selecao a partir de varias portas; sempre compilam para links canonicos explicitos."
192
+ },
193
+ {
194
+ "path": "uiCompositionPlan.contextScopes",
195
+ "category": "context",
196
+ "valueKind": "array",
197
+ "description": "Escopos de autoria que distribuem contexto explicito a widgets top-level ou nested; nao criam heranca ambiente no runtime."
198
+ },
199
+ {
200
+ "path": "uiCompositionPlan.contextScopes[].context",
201
+ "category": "context",
202
+ "valueKind": "object",
203
+ "description": "Mapa input -> constant ou state. Constant e state.initial viram inputs explicitos; state tambem gera link state-read canonico."
204
+ },
205
+ {
206
+ "path": "uiCompositionPlan.contextScopes[].context.<token>",
207
+ "category": "context",
208
+ "valueKind": "object",
209
+ "description": "Descritor constant ou state. Em state, initial aceita um valor JSON opcional materializado no input antes da primeira propagacao; nao cria um segundo state store."
210
+ },
211
+ {
212
+ "path": "uiCompositionPlan.contextScopes[].targets",
213
+ "category": "context",
214
+ "valueKind": "array",
215
+ "description": "Destinos explicitos do escopo, identificados por widget owner e nestedPath canonico opcional."
216
+ },
187
217
  {
188
218
  "path": "uiCompositionPlan.bindings",
189
219
  "category": "connections",
@@ -732,7 +762,7 @@
732
762
  "Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.",
733
763
  "Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.",
734
764
  "Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.",
735
- "UiCompositionPlan usa widgets[].componentId e bindings declarativos. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.",
765
+ "UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.",
736
766
  "Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.",
737
767
  "Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.",
738
768
  "Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.",
@@ -1414,9 +1444,9 @@
1414
1444
  },
1415
1445
  "hints": [
1416
1446
  "For agentic page creation, prefer returning uiCompositionPlan in the preview envelope and let the page-builder compiler emit WidgetPageDefinition.",
1417
- "Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; do not depend on host-only enrichment after compilation.",
1447
+ "Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; when a PraxisTextValue key exists in the fallbackLocale dictionary, omit repeated text and let the compiler materialize the executable fallback.",
1418
1448
  "Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.",
1419
- "Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; the compiler emits page.composition.links.",
1449
+ "Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; constant values and state.initial become explicit inputs, while state references compile to page.composition.links.",
1420
1450
  "For nested component ports, use component-port endpoints with nestedPath in uiCompositionPlan.bindings; keep widget as the top-level owner and put the real child port in port/direction.",
1421
1451
  "NestedPath must be relative to the owner widget and must end with a widget segment containing a stable key. Do not use index as the only identity.",
1422
1452
  "Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.",
@@ -1441,7 +1471,7 @@
1441
1471
  "componentId": "praxis-page-builder",
1442
1472
  "ownerPackage": "@praxisui/page-builder",
1443
1473
  "configSchemaId": "WidgetPageDefinition",
1444
- "manifestVersion": "1.0.0",
1474
+ "manifestVersion": "1.1.0",
1445
1475
  "runtimeInputs": [
1446
1476
  {
1447
1477
  "name": "page",
@@ -2645,12 +2675,16 @@
2645
2675
  "handler": "page-builder-ui-composition-plan-compile",
2646
2676
  "handlerContract": {
2647
2677
  "reads": [
2678
+ "UiCompositionPlanAuthoringInput",
2648
2679
  "UiCompositionPlan",
2680
+ "UiCompositionPlanTemplateReference",
2681
+ "UiCompositionPlanTemplateMaterialization",
2649
2682
  "UiCompositionPlan.i18n",
2650
2683
  "UiCompositionPlan.context",
2651
2684
  "UiCompositionPlan.layout",
2652
2685
  "UiCompositionPlan.selectionSyncs",
2653
2686
  "UiCompositionPlan.contextScopes",
2687
+ "resolveUiCompositionPlanTemplate",
2654
2688
  "compileUiCompositionPlan",
2655
2689
  "PAGE_BUILDER_WIDGET_AI_CATALOGS",
2656
2690
  "ComponentDocMeta.configEditor"
@@ -2667,11 +2701,15 @@
2667
2701
  ],
2668
2702
  "failureModes": [
2669
2703
  "ui-composition-plan-invalid",
2704
+ "ui-composition-template-reference-invalid",
2705
+ "ui-composition-template-not-found",
2706
+ "ui-composition-template-hash-mismatch",
2707
+ "ui-composition-template-overrides-unsupported",
2670
2708
  "widget-catalog-missing",
2671
2709
  "compiled-page-invalid",
2672
2710
  "child-config-editor-missing"
2673
2711
  ],
2674
- "description": "Compiles the agentic intermediate UiCompositionPlan into a renderable WidgetPageDefinition patch.page."
2712
+ "description": "Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page."
2675
2713
  }
2676
2714
  }
2677
2715
  ],
@@ -3293,9 +3331,9 @@
3293
3331
  "roundTripRequirements": [
3294
3332
  "WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.",
3295
3333
  "UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.",
3296
- "UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment.",
3334
+ "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.",
3297
3335
  "UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.",
3298
- "UiCompositionPlan.contextScopes compiles constant context into explicit widget inputs and state context into explicit page.composition.links; runtime inheritance is never ambient.",
3336
+ "UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.",
3299
3337
  "Widget keys and composition link ids are stable identities; array indexes are never canonical identities.",
3300
3338
  "Persisted wiring uses page.composition.links and must not write legacy connections.",
3301
3339
  "Nested component ports use component-port refs with nestedPath ending in a stable widget key.",
@@ -3523,9 +3561,9 @@
3523
3561
  {
3524
3562
  "chunkIndex": 1,
3525
3563
  "chunkKind": "capabilities",
3526
- "content": "Component Capability:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n\nComponent Capability:\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n\nComponent Capability:\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n\nComponent Capability:\n - Path: uiCompositionPlan.i18n\n Category: page\n Kind: object\n Description: Catalogo de textos de negocio da pagina, compilado para page.i18n sem criar copy no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.context\n Category: context\n Kind: object\n Description: Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria.\n\nComponent Capability:\n - Path: uiCompositionPlan.layout\n Category: layout\n Kind: object\n Description: Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n\nComponent Capability:\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n\nComponent Capability:\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n\nComponent Capability:\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n\nComponent Capability:\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].shell\n Category: widgets\n Kind: object\n Description: Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de origem no segmento nested, quando existir.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de origem para contexto visual/diagnostico; nao use como identidade primaria persistida.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem, usado como verificacao auxiliar, nao como identidade primaria.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de destino no segmento nested, quando existir.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de destino para contexto visual/diagnostico; nao use como identidade primaria persistida.",
3564
+ "content": "Component Capability:\n - Path: uiCompositionPlan\n Category: page\n Kind: object\n Description: Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.\n\nComponent Capability:\n - Path: uiCompositionPlan.version\n Category: page\n Kind: string\n Description: Versao do plano. Valor atual: 1.0.\n\nComponent Capability:\n - Path: uiCompositionPlan.kind\n Category: page\n Kind: string\n Description: Discriminador do plano. Valor atual: praxis.ui-composition-plan.\n\nComponent Capability:\n - Path: uiCompositionPlan.i18n\n Category: page\n Kind: object\n Description: Catalogo de textos de negocio da pagina, compilado para page.i18n. Descritores PraxisTextValue podem declarar apenas key quando a chave existir no dicionario do fallbackLocale; o compilador materializa text no documento executavel.\n\nComponent Capability:\n - Path: uiCompositionPlan.context\n Category: context\n Kind: object\n Description: Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria.\n\nComponent Capability:\n - Path: uiCompositionPlan.layout\n Category: layout\n Kind: object\n Description: Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPreset\n Category: layout\n Kind: string\n Description: Preset semantico opcional da composicao planejada.\n\nComponent Capability:\n - Path: uiCompositionPlan.layoutPresetOptions\n Category: layout\n Kind: object\n Description: Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.\n\nComponent Capability:\n - Path: uiCompositionPlan.grouping\n Category: layout\n Kind: array\n Description: Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.slotAssignments\n Category: layout\n Kind: object\n Description: Mapa opcional widgetKey -> slot semantico para alinhar widgets gerados a presets de layout sem depender de dominio.\n\nComponent Capability:\n - Path: uiCompositionPlan.deviceLayouts\n Category: layout\n Kind: object\n Description: Variantes responsivas opcionais para desktop, tablet e mobile, incluindo canvas, groupingOverrides e widgetOverrides.\n\nComponent Capability:\n - Path: uiCompositionPlan.themePreset\n Category: layout\n Kind: string\n Description: Preset visual opcional do runtime, por exemplo analytics-calm, workspace-balanced ou ops-monitoring.\n\nComponent Capability:\n - Path: uiCompositionPlan.state\n Category: state\n Kind: object\n Description: Estado inicial/declarativo que sera compilado para page.state.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets\n Category: widgets\n Kind: array\n Description: Widgets planejados antes da compilacao para page.widgets.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].key\n Category: widgets\n Kind: string\n Description: ID estavel do widget planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].componentId\n Category: widgets\n Kind: string\n Description: Componente registrado que sera compilado para definition.id.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].shell\n Category: widgets\n Kind: object\n Description: Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].inputs\n Category: widgets\n Kind: object\n Description: Inputs canonicos do componente, compilados para definition.inputs.\n\nComponent Capability:\n - Path: uiCompositionPlan.widgets[].bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem declarativa de binding, compilada para definition.bindingOrder.\n\nComponent Capability:\n - Path: uiCompositionPlan.selectionSyncs\n Category: connections\n Kind: array\n Description: Atalhos declarativos para projetar o mesmo contexto de selecao a partir de varias portas; sempre compilam para links canonicos explicitos.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes\n Category: context\n Kind: array\n Description: Escopos de autoria que distribuem contexto explicito a widgets top-level ou nested; nao criam heranca ambiente no runtime.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context\n Category: context\n Kind: object\n Description: Mapa input -> constant ou state. Constant e state.initial viram inputs explicitos; state tambem gera link state-read canonico.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].context.<token>\n Category: context\n Kind: object\n Description: Descritor constant ou state. Em state, initial aceita um valor JSON opcional materializado no input antes da primeira propagacao; nao cria um segundo state store.\n\nComponent Capability:\n - Path: uiCompositionPlan.contextScopes[].targets\n Category: context\n Kind: array\n Description: Destinos explicitos do escopo, identificados por widget owner e nestedPath canonico opcional.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings\n Category: connections\n Kind: array\n Description: Bindings declarativos que serao compilados para page.composition.links.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do binding planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem: component-port ou state.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino: component-port, state ou global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando uiCompositionPlan.bindings[].to.kind = global-action.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payload\n Category: connections\n Kind: object\n Description: Payload literal opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.payloadExpr\n Category: connections\n Kind: string\n Description: Path de payload opcional para destino global-action planejado.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de origem. Use apenas com endpoint component-port; o owner top-level continua em from.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath\n Category: connections\n Kind: array\n Description: Caminho estruturado para porta nested de destino. Use apenas com endpoint component-port; o owner top-level continua em to.widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de origem, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de origem no segmento nested, quando existir.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.",
3527
3565
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3528
- "contentHash": "1934dff5a13a9939eb2941e7f7d4cc029fcf772aa59b1418eda4ccc49374a527",
3566
+ "contentHash": "54be67c3bd08d78ff65b5948fc6036c8821297f6544a8e10f6f71b10fc765c3b",
3529
3567
  "sourceKind": "component_definition",
3530
3568
  "sourceId": "praxis-page-builder",
3531
3569
  "corpusVersion": "1.0.0"
@@ -3533,9 +3571,9 @@
3533
3571
  {
3534
3572
  "chunkIndex": 2,
3535
3573
  "chunkKind": "capabilities",
3536
- "content": "Component Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino, usado como verificacao auxiliar, nao como identidade primaria.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template ou constant.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n\nComponent Capability:\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n\nComponent Capability:\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n\nComponent Capability:\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n\nComponent Capability:\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n\nComponent Capability:\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n\nComponent Capability:\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n\nComponent Capability:\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n\nComponent Capability:\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n\nComponent Capability:\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n\nComponent Capability:\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n\nComponent Capability:\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n\nComponent Capability:\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n\nComponent Capability:\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n\nComponent Capability:\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n\nComponent Capability:\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n\nComponent Capability:\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n\nComponent Capability:\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n\nComponent Capability:\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n\nComponent Capability:\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n\nComponent Capability:\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n\nComponent Capability:\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n\nComponent Capability:\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n\nComponent Capability:\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.\n\nComponent Capability:\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n\nComponent Capability:\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n\nComponent Capability:\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n\nComponent Capability:\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n\nComponent Capability:\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n\nComponent Capability:\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n\nComponent Capability:\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n\nComponent Capability:\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.\n\nComponent Capability:\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor\n Category: widgets\n Kind: object\n Description: Editor canonico de inputs publicado pela lib dona do componente e aberto pelo settings-panel do host.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.title\n Category: widgets\n Kind: string\n Description: Titulo opcional usado pelo host ao abrir o editor de inputs do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.contextResolver\n Category: widgets\n Kind: object\n Description: Resolver canonico de contexto transiente para o editor; catálogos, schemas, capabilities, targets e diagnostics devem ser passados por context/contextDiagnostics e nao persistidos em definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef\n Category: widgets\n Kind: object\n Description: Referencia canonica para o manifesto executavel de authoring por IA publicado pela lib dona do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.",
3574
+ "content": "Component Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de origem para contexto visual/diagnostico; nao use como identidade primaria persistida.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].from.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de origem, usado como verificacao auxiliar, nao como identidade primaria.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].kind\n Category: connections\n Kind: string\n Description: Tipo do segmento nested de destino, como tab, nav, link, expansion, panel ou widget. O ultimo segmento deve ser widget.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].id\n Category: connections\n Kind: string\n Description: Identificador estrutural estavel do container de destino no segmento nested, quando existir.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].index\n Category: connections\n Kind: number\n Description: Indice auxiliar de destino para contexto visual/diagnostico; nao use como identidade primaria persistida.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].to.nestedPath[].componentType\n Category: connections\n Kind: string\n Description: Tipo do componente real do widget filho de destino, usado como verificacao auxiliar, nao como identidade primaria.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do binding.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].condition\n Category: connections\n Kind: expression\n Description: Guarda opcional em Json Logic.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform\n Category: connections\n Kind: object\n Description: Transform declarativo: pick-path, query-context, template ou constant.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].policy\n Category: connections\n Kind: object\n Description: Politica operacional opcional do binding.\n\nComponent Capability:\n - Path: page\n Category: page\n Kind: object\n Description: Definicao da pagina (WidgetPageDefinition).\n\nComponent Capability:\n - Path: context\n Category: context\n Kind: object\n Description: Contexto extra mesclado ao page.context.\n\nComponent Capability:\n - Path: enableCustomization\n Category: behavior\n Kind: boolean\n Description: Habilita modo de edicao.\n\nComponent Capability:\n - Path: showSettingsButton\n Category: behavior\n Kind: boolean\n Description: Exibe botao de settings.\n\nComponent Capability:\n - Path: strictValidation\n Category: behavior\n Kind: boolean\n Description: Validacao estrita do widget loader.\n\nComponent Capability:\n - Path: layoutOptions\n Category: layout\n Kind: object\n Description: Overrides residuais do host aceitos apenas para compatibilidade de migracao.\n\nComponent Capability:\n - Path: layoutOptions.cols\n Category: layout\n Kind: number\n Description: Compat: numero de colunas usado para derivar canvas padrao.\n\nComponent Capability:\n - Path: layoutOptions.rowHeight\n Category: layout\n Kind: number\n Description: Compat: altura de linha usada para derivar rowUnit do canvas.\n\nComponent Capability:\n - Path: layoutOptions.gap\n Category: layout\n Kind: number\n Description: Compat: espacamento usado para derivar gap do canvas.\n\nComponent Capability:\n - Path: pageIdentity\n Category: identity\n Kind: object\n Description: Identidade de persistencia da pagina.\n\nComponent Capability:\n - Path: pageIdentity.appId\n Category: identity\n Kind: string\n Description: App id (opcional).\n\nComponent Capability:\n - Path: pageIdentity.tenantId\n Category: identity\n Kind: string\n Description: Tenant id.\n\nComponent Capability:\n - Path: pageIdentity.userId\n Category: identity\n Kind: string\n Description: User id.\n\nComponent Capability:\n - Path: pageIdentity.routePath\n Category: identity\n Kind: string\n Description: Rota base da pagina.\n\nComponent Capability:\n - Path: pageIdentity.locale\n Category: identity\n Kind: string\n Description: Locale.\n\nComponent Capability:\n - Path: page.canvas\n Category: layout\n Kind: object\n Description: Canvas espacial canonico da pagina.\n\nComponent Capability:\n - Path: page.canvas.mode\n Category: layout\n Kind: string\n Description: Modo do canvas. O builder usa grid canonico.\n\nComponent Capability:\n - Path: page.canvas.columns\n Category: layout\n Kind: number\n Description: Numero de colunas do canvas.\n\nComponent Capability:\n - Path: page.canvas.rowUnit\n Category: layout\n Kind: string\n Description: Altura base das linhas do canvas (ex: 80px).\n\nComponent Capability:\n - Path: page.canvas.gap\n Category: layout\n Kind: string\n Description: Espacamento entre itens do canvas.\n\nComponent Capability:\n - Path: page.canvas.autoRows\n Category: layout\n Kind: string\n Description: Politica de auto rows do canvas.\n\nComponent Capability:\n - Path: page.canvas.items\n Category: layout\n Kind: object\n Description: Mapa canonico de posicionamento espacial por widget key.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.col\n Category: layout\n Kind: number\n Description: Coluna inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.row\n Category: layout\n Kind: number\n Description: Linha inicial (1-based).\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.colSpan\n Category: layout\n Kind: number\n Description: Colunas ocupadas.\n\nComponent Capability:\n - Path: page.canvas.items.<widgetKey>.rowSpan\n Category: layout\n Kind: number\n Description: Linhas ocupadas.\n\nComponent Capability:\n - Path: page.state\n Category: state\n Kind: object\n Description: Estado declarativo opcional da pagina.\n\nComponent Capability:\n - Path: page.state.values\n Category: state\n Kind: object\n Description: Valores primarios persistiveis do estado da pagina.\n\nComponent Capability:\n - Path: page.state.schema\n Category: state\n Kind: object\n Description: Descritores dos paths de estado primario.\n\nComponent Capability:\n - Path: page.state.derived\n Category: state\n Kind: object\n Description: Descritores de estado derivado recomputado pelo runtime.\n\nComponent Capability:\n - Path: page.widgets\n Category: widgets\n Kind: array\n Description: Widgets da pagina.\n\nComponent Capability:\n - Path: page.widgets[].key\n Category: widgets\n Kind: string\n Description: ID unico do widget.\n\nComponent Capability:\n - Path: page.widgets[].className\n Category: widgets\n Kind: string\n Description: Classe CSS do widget.\n\nComponent Capability:\n - Path: page.widgets[].definition\n Category: widgets\n Kind: object\n Description: Definicao do widget (WidgetDefinition).\n\nComponent Capability:\n - Path: page.widgets[].definition.id\n Category: widgets\n Kind: string\n Description: ID do componente registrado.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs\n Category: widgets\n Kind: object\n Description: Inputs do componente.\n\nComponent Capability:\n - Path: page.widgets[].definition.inputs.document\n Category: widgets\n Kind: object\n Description: RichContentDocument quando definition.id for praxis-rich-content.",
3537
3575
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3538
- "contentHash": "49dc4f938cc153ddc5db4f96845bbfc3741ead8f0e6092385e167445f1354da0",
3576
+ "contentHash": "eeedcedf9b18668ab9e9d250e09e77f4fa2a79a47b72993daaf821bd2244674f",
3539
3577
  "sourceKind": "component_definition",
3540
3578
  "sourceId": "praxis-page-builder",
3541
3579
  "corpusVersion": "1.0.0"
@@ -3543,19 +3581,19 @@
3543
3581
  {
3544
3582
  "chunkIndex": 3,
3545
3583
  "chunkKind": "capabilities",
3546
- "content": "Component Capability:\n - Path: ComponentDocMeta.authoringManifestRef.source\n Category: widgets\n Kind: string\n Description: Simbolo, modulo ou registry id estavel do manifesto usado para delegar edicoes governadas.\n\nComponent Capability:\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n\nComponent Capability:\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n\nComponent Capability:\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n\nComponent Capability:\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n\nComponent Capability:\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n\nComponent Capability:\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n\nComponent Capability:\n - Path: page.composition.links[].to.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de destino, incluindo global-action para command-dispatch declarativo.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando page.composition.links[].to.kind = global-action.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payload\n Category: connections\n Kind: object\n Description: Payload estruturado opcional da action global persistida; quando omitido, o valor transformado do link segue como delivery value.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payloadExpr\n Category: connections\n Kind: expression\n Description: Escape avancado explicito de payload da action global persistida.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.meta\n Category: connections\n Kind: object\n Description: Metadados opcionais do GlobalActionRef persistido, sem criar executor paralelo.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de origem persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de destino persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n\nComponent Capability:\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n\nComponent Capability:\n - Path: page.composition.links[].condition\n Category: connections\n Kind: expression\n Description: Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.\n\nComponent Capability:\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n\nComponent Capability:\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n\nComponent Capability:\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).\n\nCapability Note:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links tambem pode despachar actions globais via to.kind = global-action.\n\nCapability Note:\n - Conteudo editorial rico deve ser modelado como widget praxis-rich-content com definition.inputs.document: RichContentDocument, nao como DSL local do page-builder.\n\nCapability Note:\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n\nCapability Note:\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.\n\nCapability Note:\n - Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.\n\nCapability Note:\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n\nCapability Note:\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.",
3584
+ "content": "Component Capability:\n - Path: page.widgets[].definition.bindingOrder\n Category: widgets\n Kind: array\n Description: Ordem de aplicacao dos inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor\n Category: widgets\n Kind: object\n Description: Editor canonico de inputs publicado pela lib dona do componente e aberto pelo settings-panel do host.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.component\n Category: widgets\n Kind: object\n Description: Componente standalone que implementa SettingsValueProvider para editar definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.title\n Category: widgets\n Kind: string\n Description: Titulo opcional usado pelo host ao abrir o editor de inputs do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.contextResolver\n Category: widgets\n Kind: object\n Description: Resolver canonico de contexto transiente para o editor; catálogos, schemas, capabilities, targets e diagnostics devem ser passados por context/contextDiagnostics e nao persistidos em definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef\n Category: widgets\n Kind: object\n Description: Referencia canonica para o manifesto executavel de authoring por IA publicado pela lib dona do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.source\n Category: widgets\n Kind: string\n Description: Simbolo, modulo ou registry id estavel do manifesto usado para delegar edicoes governadas.\n\nComponent Capability:\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n\nComponent Capability:\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n\nComponent Capability:\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n\nComponent Capability:\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n\nComponent Capability:\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n\nComponent Capability:\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n\nComponent Capability:\n - Path: page.composition.links[].to.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de destino, incluindo global-action para command-dispatch declarativo.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando page.composition.links[].to.kind = global-action.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payload\n Category: connections\n Kind: object\n Description: Payload estruturado opcional da action global persistida; quando omitido, o valor transformado do link segue como delivery value.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payloadExpr\n Category: connections\n Kind: expression\n Description: Escape avancado explicito de payload da action global persistida.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.meta\n Category: connections\n Kind: object\n Description: Metadados opcionais do GlobalActionRef persistido, sem criar executor paralelo.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de origem persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de destino persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n\nComponent Capability:\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n\nComponent Capability:\n - Path: page.composition.links[].condition\n Category: connections\n Kind: expression\n Description: Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.\n\nComponent Capability:\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n\nComponent Capability:\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n\nComponent Capability:\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).\n\nCapability Note:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links tambem pode despachar actions globais via to.kind = global-action.\n\nCapability Note:\n - Conteudo editorial rico deve ser modelado como widget praxis-rich-content com definition.inputs.document: RichContentDocument, nao como DSL local do page-builder.\n\nCapability Note:\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n\nCapability Note:\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.",
3547
3585
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3548
- "contentHash": "27bea3a3a7860dd6cebd7ec4e745ccc12851826ef955892cc7bf00bd1768a548",
3586
+ "contentHash": "74122117d42e4bf487212932b774c970dd39d2a72605d61e66c3ca79eb8f882d",
3549
3587
  "sourceKind": "component_definition",
3550
3588
  "sourceId": "praxis-page-builder",
3551
3589
  "corpusVersion": "1.0.0"
3552
3590
  },
3553
3591
  {
3554
3592
  "chunkIndex": 4,
3555
- "chunkKind": "authoring_manifest",
3556
- "content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3557
- "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3558
- "contentHash": "e70b02785b20c89a33f526f9d28ffa2bf3f0d1274ec77ca0f6293438ca751106",
3593
+ "chunkKind": "capabilities",
3594
+ "content": "Capability Note:\n - Nao gere links nested via owner.widgetEvent, bindingPath profundo, page.connections ou wrappers host-specific. widgetEvent e bridge legada/avancada, nao contrato principal de authoring.\n\nCapability Note:\n - Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.\n\nCapability Note:\n - pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.",
3595
+ "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3596
+ "contentHash": "f39d211664c7e2fa7792ce140249946d22070fa9b131a328b0863467f63a3708",
3559
3597
  "sourceKind": "component_definition",
3560
3598
  "sourceId": "praxis-page-builder",
3561
3599
  "corpusVersion": "1.0.0"
@@ -3563,9 +3601,9 @@
3563
3601
  {
3564
3602
  "chunkIndex": 5,
3565
3603
  "chunkKind": "authoring_manifest",
3566
- "content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3604
+ "content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3567
3605
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3568
- "contentHash": "1c31dff53757969cfd35aeee974af1636e3dc7db87fa28bad8a7c98fd8443f1c",
3606
+ "contentHash": "7cffc3d650c895a9cbdcd60e16a61fab2446f8af415133ec5f3fe0eac651e78c",
3569
3607
  "sourceKind": "component_definition",
3570
3608
  "sourceId": "praxis-page-builder",
3571
3609
  "corpusVersion": "1.0.0"
@@ -3573,9 +3611,9 @@
3573
3611
  {
3574
3612
  "chunkIndex": 6,
3575
3613
  "chunkKind": "authoring_manifest",
3576
- "content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3614
+ "content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3577
3615
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3578
- "contentHash": "646059d7e1af5e129b676dddb6c274592e3022e845d65f6442544a0cee400721",
3616
+ "contentHash": "dfc1d7ded075a05138e9263d4084dfa727c18c15202f68aac7f88aec88fd639c",
3579
3617
  "sourceKind": "component_definition",
3580
3618
  "sourceId": "praxis-page-builder",
3581
3619
  "corpusVersion": "1.0.0"
@@ -3583,9 +3621,9 @@
3583
3621
  {
3584
3622
  "chunkIndex": 7,
3585
3623
  "chunkKind": "authoring_manifest",
3586
- "content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3624
+ "content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3587
3625
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3588
- "contentHash": "d0d7cbf5ea7650aaa674b7a4a08b0448ab0e05c581498c43c184ef5122caae7b",
3626
+ "contentHash": "71b463fe12bfa156dbf74cf169b97eee535898396ea3a740ef47286ae98972c2",
3589
3627
  "sourceKind": "component_definition",
3590
3628
  "sourceId": "praxis-page-builder",
3591
3629
  "corpusVersion": "1.0.0"
@@ -3593,9 +3631,9 @@
3593
3631
  {
3594
3632
  "chunkIndex": 8,
3595
3633
  "chunkKind": "authoring_manifest",
3596
- "content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3634
+ "content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3597
3635
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3598
- "contentHash": "2d0dbe9acdfea82b0534f79cbce0a1ac64c27cd776ec01dfa4a7dda225e0a732",
3636
+ "contentHash": "e38ea6f9a7439879fc76119eb36f2e83b59118d172285edc6169f551a8851de0",
3599
3637
  "sourceKind": "component_definition",
3600
3638
  "sourceId": "praxis-page-builder",
3601
3639
  "corpusVersion": "1.0.0"
@@ -3603,9 +3641,9 @@
3603
3641
  {
3604
3642
  "chunkIndex": 9,
3605
3643
  "chunkKind": "authoring_manifest",
3606
- "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3644
+ "content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3607
3645
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3608
- "contentHash": "8eaee27e51d17c5c0cd3d837909517cdc6c64f164ef00fb038aa194b042b4afa",
3646
+ "contentHash": "a296d0c24003669076ebe2bb97cb074b1fc0b6e18ee63e71e0ab817a3baae87c",
3609
3647
  "sourceKind": "component_definition",
3610
3648
  "sourceId": "praxis-page-builder",
3611
3649
  "corpusVersion": "1.0.0"
@@ -3613,9 +3651,9 @@
3613
3651
  {
3614
3652
  "chunkIndex": 10,
3615
3653
  "chunkKind": "authoring_manifest",
3616
- "content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\",\"to.ref.widget\",\"to.ref.port\",\"to.ref.direction\",\"to.ref.bindingPath\",\"to.ref.nestedPath\",\"to.ref.path\",\"to.ref.layer\",\"global-action\",\"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}]}",
3654
+ "content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3617
3655
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3618
- "contentHash": "8f03aadf6072666c050a2849a088e2da903553f0f105eae11fb99cdadef14a2a",
3656
+ "contentHash": "9cde361f373f42fc2e3be2009ee536260358533fb0d2de35fa933eeee1f9d477",
3619
3657
  "sourceKind": "component_definition",
3620
3658
  "sourceId": "praxis-page-builder",
3621
3659
  "corpusVersion": "1.0.0"
@@ -3623,9 +3661,9 @@
3623
3661
  {
3624
3662
  "chunkIndex": 11,
3625
3663
  "chunkKind": "authoring_manifest",
3626
- "content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3664
+ "content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\",\"to.ref.widget\",\"to.ref.port\",\"to.ref.direction\",\"to.ref.bindingPath\",\"to.ref.nestedPath\",\"to.ref.path\",\"to.ref.layer\",\"global-action\",\"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}]}",
3627
3665
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3628
- "contentHash": "f05b880b6e6ddc55db404c7fb5770f6ace6fcc804e5b3f6497fc32f052c3c817",
3666
+ "contentHash": "9baae01f1b7dff4b7bd8cd3986e3f05e8e590c4c54327bea48a0ec2f5801602b",
3629
3667
  "sourceKind": "component_definition",
3630
3668
  "sourceId": "praxis-page-builder",
3631
3669
  "corpusVersion": "1.0.0"
@@ -3633,9 +3671,9 @@
3633
3671
  {
3634
3672
  "chunkIndex": 12,
3635
3673
  "chunkKind": "authoring_manifest",
3636
- "content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3674
+ "content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3637
3675
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3638
- "contentHash": "aaaac49ce8526be2d13ea27f6923ba83212f99735825a075ca413beb883a98d1",
3676
+ "contentHash": "9607dcb206d931579c4c8675df0420ecda5d71ac9a6525c06bd972429cc2c6a0",
3639
3677
  "sourceKind": "component_definition",
3640
3678
  "sourceId": "praxis-page-builder",
3641
3679
  "corpusVersion": "1.0.0"
@@ -3643,9 +3681,9 @@
3643
3681
  {
3644
3682
  "chunkIndex": 13,
3645
3683
  "chunkKind": "authoring_manifest",
3646
- "content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3684
+ "content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3647
3685
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3648
- "contentHash": "8ae94a6b56febf26652989cd81cfb4b081db759e666a049f8a8b3c25d085ceb2",
3686
+ "contentHash": "1dc6222d376631688f4592fc7122bc7d162632df2b193d7dd069945d5a352e6d",
3649
3687
  "sourceKind": "component_definition",
3650
3688
  "sourceId": "praxis-page-builder",
3651
3689
  "corpusVersion": "1.0.0"
@@ -3653,9 +3691,9 @@
3653
3691
  {
3654
3692
  "chunkIndex": 14,
3655
3693
  "chunkKind": "authoring_manifest",
3656
- "content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[\"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\":\"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\":[]}",
3694
+ "content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3657
3695
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3658
- "contentHash": "f1f0a9e63bc493560aed8fc81539ce185739aead1c8f9bb1b94b81b22cc331c6",
3696
+ "contentHash": "8c00773409c5a81719f7232ba7e5c75710405a8a82f42412f89b551fe350afde",
3659
3697
  "sourceKind": "component_definition",
3660
3698
  "sourceId": "praxis-page-builder",
3661
3699
  "corpusVersion": "1.0.0"
@@ -3663,9 +3701,9 @@
3663
3701
  {
3664
3702
  "chunkIndex": 15,
3665
3703
  "chunkKind": "authoring_manifest",
3666
- "content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":[]}",
3704
+ "content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[\"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\":\"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\":[]}",
3667
3705
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3668
- "contentHash": "1d773c23275095d0ea759b9de43a29e909a182efd624b0c4b3e0762bfdde892c",
3706
+ "contentHash": "5e6502fb4a08c15194e0edac91b8048cef9eea32508e7cde1e5c18d26fdc0f37",
3669
3707
  "sourceKind": "component_definition",
3670
3708
  "sourceId": "praxis-page-builder",
3671
3709
  "corpusVersion": "1.0.0"
@@ -3673,9 +3711,9 @@
3673
3711
  {
3674
3712
  "chunkIndex": 16,
3675
3713
  "chunkKind": "authoring_manifest",
3676
- "content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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}]}",
3714
+ "content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[]}",
3677
3715
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3678
- "contentHash": "0b66cf0655ed194b624b87781c38a77406dde3f3288b771bf135ae20f3d3048f",
3716
+ "contentHash": "2b428be69d81de1770a8deede7f4c35b8dbdbb049bae2e5f6a66c4d43b38d3b3",
3679
3717
  "sourceKind": "component_definition",
3680
3718
  "sourceId": "praxis-page-builder",
3681
3719
  "corpusVersion": "1.0.0"
@@ -3683,9 +3721,9 @@
3683
3721
  {
3684
3722
  "chunkIndex": 17,
3685
3723
  "chunkKind": "authoring_manifest",
3686
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"identity\"}",
3724
+ "content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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}]}",
3687
3725
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3688
- "contentHash": "64cbb1a93abe4cb3fb77a93c8f26318f2fe93580d13dd53618384358c000b332",
3726
+ "contentHash": "046c2ddb651ae1d8012fc1d9bdf77e08df9bc2009784d23524ec1648e29ada6c",
3689
3727
  "sourceKind": "component_definition",
3690
3728
  "sourceId": "praxis-page-builder",
3691
3729
  "corpusVersion": "1.0.0"
@@ -3693,9 +3731,9 @@
3693
3731
  {
3694
3732
  "chunkIndex": 18,
3695
3733
  "chunkKind": "authoring_manifest",
3696
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":\"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.\"}]}",
3734
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"identity\"}",
3697
3735
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3698
- "contentHash": "7fec3eb01baf7ce992f2fcedf8dc29c957f0822e0445983af03f6bcb0c3b46c1",
3736
+ "contentHash": "b2edc2d8786f6f349fe98f522c48cc8d863201b523501ce9fa98759e861bc509",
3699
3737
  "sourceKind": "component_definition",
3700
3738
  "sourceId": "praxis-page-builder",
3701
3739
  "corpusVersion": "1.0.0"
@@ -3703,9 +3741,9 @@
3703
3741
  {
3704
3742
  "chunkIndex": 19,
3705
3743
  "chunkKind": "authoring_manifest",
3706
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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.\"}]}",
3744
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":\"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.\"}]}",
3707
3745
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3708
- "contentHash": "4fea23fa9747896f2106df4c2c6918edca8035d58bc9bc6118c163ebb6b104e8",
3746
+ "contentHash": "cb00bced23006165562902a42cb2db5f5df6f6a6ed0fa6bdfad6bba68a6306e9",
3709
3747
  "sourceKind": "component_definition",
3710
3748
  "sourceId": "praxis-page-builder",
3711
3749
  "corpusVersion": "1.0.0"
@@ -3713,9 +3751,9 @@
3713
3751
  {
3714
3752
  "chunkIndex": 20,
3715
3753
  "chunkKind": "authoring_manifest",
3716
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\"]}]}",
3754
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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.\"}]}",
3717
3755
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3718
- "contentHash": "45e00e2778db78bce4d4f3bddd9ed05899d2438356bbf86085d51130be5464b3",
3756
+ "contentHash": "7ce421c812be72cdc288b78a1b3a79da46abafecfd1ff9b433c7e4959850f6f3",
3719
3757
  "sourceKind": "component_definition",
3720
3758
  "sourceId": "praxis-page-builder",
3721
3759
  "corpusVersion": "1.0.0"
@@ -3723,9 +3761,9 @@
3723
3761
  {
3724
3762
  "chunkIndex": 21,
3725
3763
  "chunkKind": "authoring_manifest",
3726
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\"]}}}}}]},\"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\"]}}}}}]},\"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\"]},{\"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\":[\"UiCompositionPlan\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"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\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Compiles the agentic intermediate 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\"]}]}",
3764
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\"]}]}",
3727
3765
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3728
- "contentHash": "30cbfa3f2da674b084d293c857c73dfd3874a7ba56dc7ec230c81ac3845046c4",
3766
+ "contentHash": "93d2d45b5e84803efac543386e8a9e7b85443f29cb783591c5cfd67ca6baf6d3",
3729
3767
  "sourceKind": "component_definition",
3730
3768
  "sourceId": "praxis-page-builder",
3731
3769
  "corpusVersion": "1.0.0"
@@ -3733,9 +3771,9 @@
3733
3771
  {
3734
3772
  "chunkIndex": 22,
3735
3773
  "chunkKind": "authoring_manifest",
3736
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"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\":[\"PageBuilderAiAdapter.applyCompiledFormPatch\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Applies only compiledFormPatch.patch.page to the local runtime page; the backend envelope remains diagnostic data.\"}}],\"validators\":[\"preview-result-valid\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"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\"]}]}",
3774
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\"]}}}}}]},\"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\"]}}}}}]},\"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\"]}]}",
3737
3775
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3738
- "contentHash": "344d61f3477537668edb81c8b8316c818d7c4dab22567e198f9619e3d5cadaeb",
3776
+ "contentHash": "de5a1cee81f658b944fc13b1913b22ed04cdf835070cb922cfaa7488e0456828",
3739
3777
  "sourceKind": "component_definition",
3740
3778
  "sourceId": "praxis-page-builder",
3741
3779
  "corpusVersion": "1.0.0"
@@ -3743,9 +3781,9 @@
3743
3781
  {
3744
3782
  "chunkIndex": 23,
3745
3783
  "chunkKind": "authoring_manifest",
3746
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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\":\"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.\"},{\"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.\"}]}",
3784
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":[\"PageBuilderAiAdapter.applyCompiledFormPatch\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Applies only compiledFormPatch.patch.page to the local runtime page; the backend envelope remains diagnostic data.\"}}],\"validators\":[\"preview-result-valid\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"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\"]}]}",
3747
3785
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3748
- "contentHash": "73a1d565a0d1ae452b216dc05bfcb8a7317d34d45a38f9540cfff93bf3c49f51",
3786
+ "contentHash": "0200509b4b87bbc15fd3e089f4461b021c6a9eab178dbfe26f1c83f3894f313e",
3749
3787
  "sourceKind": "component_definition",
3750
3788
  "sourceId": "praxis-page-builder",
3751
3789
  "corpusVersion": "1.0.0"
@@ -3753,9 +3791,9 @@
3753
3791
  {
3754
3792
  "chunkIndex": 24,
3755
3793
  "chunkKind": "authoring_manifest",
3756
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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.\",\"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.\",\"UiCompositionPlan.contextScopes compiles constant context into explicit widget inputs and state context into explicit page.composition.links; runtime inheritance is never ambient.\",\"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 applies only compiledFormPatch.patch.page to runtime; the full patch envelope is 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.\"]}",
3794
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":\"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.\"},{\"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.\"}]}",
3757
3795
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3758
- "contentHash": "7bd101db563c91c4b549a788d4e48f6ea33b0036b9c9d8dff09c195d57ab035a",
3796
+ "contentHash": "74f7f77a4de5e2517fb9da59a1648c75e63a62aa56f5c66e8485b1728650849b",
3759
3797
  "sourceKind": "component_definition",
3760
3798
  "sourceId": "praxis-page-builder",
3761
3799
  "corpusVersion": "1.0.0"
@@ -3763,15 +3801,25 @@
3763
3801
  {
3764
3802
  "chunkIndex": 25,
3765
3803
  "chunkKind": "authoring_manifest",
3766
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.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}]}",
3804
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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.\",\"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 applies only compiledFormPatch.patch.page to runtime; the full patch envelope is 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.\"]}",
3767
3805
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3768
- "contentHash": "ad8ccfb24806987a81969fc86c1b2371c7f6e2636123dd02652fc5e97af79fb8",
3806
+ "contentHash": "5451af852c070c2aff438992d360ba790b28e7d1ead008cbb82f0bcfd5f917ef",
3769
3807
  "sourceKind": "component_definition",
3770
3808
  "sourceId": "praxis-page-builder",
3771
3809
  "corpusVersion": "1.0.0"
3772
3810
  },
3773
3811
  {
3774
3812
  "chunkIndex": 26,
3813
+ "chunkKind": "authoring_manifest",
3814
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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}]}",
3815
+ "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3816
+ "contentHash": "25d5fbefff26f056e2bd3524b6fb3268a4a2163a15037f878d36c5466d8febb1",
3817
+ "sourceKind": "component_definition",
3818
+ "sourceId": "praxis-page-builder",
3819
+ "corpusVersion": "1.0.0"
3820
+ },
3821
+ {
3822
+ "chunkIndex": 27,
3775
3823
  "chunkKind": "context_pack",
3776
3824
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"version\":\"v1.3\",\"optionsByPath\":{\"page.canvas.columns\":{\"mode\":\"suggested\",\"options\":[{\"value\":6,\"label\":\"6 colunas\"},{\"value\":8,\"label\":\"8 colunas\"},{\"value\":12,\"label\":\"12 colunas\"},{\"value\":16,\"label\":\"16 colunas\"}]},\"page.canvas.rowUnit\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"64px\",\"label\":\"64px\"},{\"value\":\"80px\",\"label\":\"80px\"},{\"value\":\"100px\",\"label\":\"100px\"},{\"value\":\"120px\",\"label\":\"120px\"}]},\"page.canvas.gap\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"8px\",\"label\":\"8px\"},{\"value\":\"12px\",\"label\":\"12px\"},{\"value\":\"16px\",\"label\":\"16px\"},{\"value\":\"24px\",\"label\":\"24px\"}]},\"page.widgets[].definition.id\":{\"mode\":\"enum\",\"options\":[{\"value\":\"praxis-crud\",\"label\":\"Praxis CRUD\"},{\"value\":\"praxis-table\",\"label\":\"Praxis Table\"},{\"value\":\"praxis-dynamic-form\",\"label\":\"Praxis Dynamic Form\"},{\"value\":\"praxis-list\",\"label\":\"Praxis List\"},{\"value\":\"praxis-tabs\",\"label\":\"Praxis Tabs\"},{\"value\":\"praxis-stepper\",\"label\":\"Praxis Stepper\"},{\"value\":\"praxis-expansion\",\"label\":\"Praxis Expansion\"},{\"value\":\"praxis-files-upload\",\"label\":\"Praxis Files Upload\"},{\"value\":\"praxis-rich-content\",\"label\":\"Praxis Rich Content\"},{\"value\":\"pdx-cron-builder\",\"label\":\"Praxis Cron Builder\"},{\"value\":\"praxis-settings-panel\",\"label\":\"Praxis Settings Panel\"},{\"value\":\"praxis-dashboard-stats\",\"label\":\"Praxis Dashboard Stats\"},{\"value\":\"praxis-chart\",\"label\":\"Praxis Chart\"}]},\"uiCompositionPlan.widgets[].componentId\":{\"mode\":\"enum\",\"options\":[{\"value\":\"praxis-crud\",\"label\":\"Praxis CRUD\"},{\"value\":\"praxis-table\",\"label\":\"Praxis Table\"},{\"value\":\"praxis-dynamic-form\",\"label\":\"Praxis Dynamic Form\"},{\"value\":\"praxis-list\",\"label\":\"Praxis List\"},{\"value\":\"praxis-tabs\",\"label\":\"Praxis Tabs\"},{\"value\":\"praxis-stepper\",\"label\":\"Praxis Stepper\"},{\"value\":\"praxis-expansion\",\"label\":\"Praxis Expansion\"},{\"value\":\"praxis-files-upload\",\"label\":\"Praxis Files Upload\"},{\"value\":\"praxis-rich-content\",\"label\":\"Praxis Rich Content\"},{\"value\":\"pdx-cron-builder\",\"label\":\"Praxis Cron Builder\"},{\"value\":\"praxis-settings-panel\",\"label\":\"Praxis Settings Panel\"},{\"value\":\"praxis-dashboard-stats\",\"label\":\"Praxis Dashboard Stats\"},{\"value\":\"praxis-chart\",\"label\":\"Praxis Chart\"}]}}}}",
3777
3825
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
@@ -3781,7 +3829,7 @@
3781
3829
  "corpusVersion": "1.0.0"
3782
3830
  },
3783
3831
  {
3784
- "chunkIndex": 27,
3832
+ "chunkIndex": 28,
3785
3833
  "chunkKind": "context_pack",
3786
3834
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"ui-composition-plan.create\",\"intentExamples\":[\"ui composition plan\",\"agentic page plan\",\"master detail\",\"dashboard composition\",\"nested component ports\",\"nestedPath\",\"planejar pagina\",\"composicao declarativa\"],\"patchTemplate\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"layoutPreset\":\"{{params.layoutPreset}}\",\"state\":\"{{params.state}}\",\"widgets\":\"{{params.widgets}}\",\"bindings\":\"{{params.bindings}}\"}}},{\"id\":\"page.canvas.columns.set\",\"intentExamples\":[\"columns\",\"canvas columns\",\"grid columns\",\"colunas do canvas\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"columns\":\"{{value}}\"}}}},{\"id\":\"page.canvas.rowUnit.set\",\"intentExamples\":[\"row height\",\"row size\",\"canvas row\",\"altura da linha\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"rowUnit\":\"{{value}}\"}}}},{\"id\":\"page.canvas.gap.set\",\"intentExamples\":[\"gap\",\"spacing\",\"canvas gap\",\"espaçamento\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"gap\":\"{{value}}\"}}}},{\"id\":\"page.context.set\",\"intentExamples\":[\"page context\",\"context variable\",\"variavel de contexto\"],\"patchTemplate\":{\"page\":{\"context\":{\"{{params.key}}\":\"{{value}}\"}}}},{\"id\":\"widget.add\",\"intentExamples\":[\"add widget\",\"new widget\",\"add component\",\"adicionar componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"id\":\"{{params.componentId}}\"}}],\"canvas\":{\"items\":{\"{{target}}\":{\"col\":1,\"row\":1,\"colSpan\":4,\"rowSpan\":2}}}}}},{\"id\":\"widget.remove\",\"intentExamples\":[\"remove widget\",\"delete widget\",\"remover componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"_delete\":true}]}}},{\"id\":\"widget.component.set\",\"intentExamples\":[\"widget type\",\"component id\",\"widget component\",\"tipo do componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"id\":\"{{value}}\"}}]}}},{\"id\":\"widget.className.set\",\"intentExamples\":[\"widget class\",\"css class\",\"classe css\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"className\":\"{{value}}\"}]}}},{\"id\":\"widget.canvasItem.set\",\"intentExamples\":[\"move widget\",\"resize widget\",\"widget canvas\",\"posicionar\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"items\":{\"{{target}}\":{\"col\":\"{{params.col}}\",\"row\":\"{{params.row}}\",\"colSpan\":\"{{params.colSpan}}\",\"rowSpan\":\"{{params.rowSpan}}\"}}}}}},{\"id\":\"widget.inputs.set\",\"intentExamples\":[\"widget inputs\",\"configure widget\",\"set inputs\",\"configurar componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"inputs\":\"{{value}}\"}}]}}},{\"id\":\"widget.bindingOrder.set\",\"intentExamples\":[\"binding order\",\"input order\",\"ordem de inputs\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"bindingOrder\":\"{{value}}\"}}]}}},{\"id\":\"connection.add\",\"intentExamples\":[\"connect widgets\",\"link widgets\",\"wire output\",\"create connection\",\"nested component port\",\"nestedPath\",\"conectar\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.set_static\",\"intentExamples\":[\"set input value\",\"static connection\",\"valor fixo na conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.map.set\",\"intentExamples\":[\"map connection\",\"update map\",\"mapear conexao\",\"atualizar map\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.condition.set\",\"intentExamples\":[\"connection condition\",\"link condition\",\"json logic guard\",\"condicao da conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"condition\":\"{{value}}\"}]}}}},{\"id\":\"connection.policy.set\",\"intentExamples\":[\"connection policy\",\"debounce\",\"distinct\",\"missing value policy\",\"politica da conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"policy\":\"{{value}}\"}]}}}},{\"id\":\"connection.remove\",\"intentExamples\":[\"remove connection\",\"unlink widgets\",\"desconectar\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"_delete\":true}]}}}}],\"fieldResolvers\":{\"page.widgets[]\":[\"key\",\"definition.id\"],\"page.composition.links[]\":[\"id\"]}}}",
3787
3835
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
@@ -3791,17 +3839,17 @@
3791
3839
  "corpusVersion": "1.0.0"
3792
3840
  },
3793
3841
  {
3794
- "chunkIndex": 28,
3842
+ "chunkIndex": 29,
3795
3843
  "chunkKind": "context_pack",
3796
- "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"hints\":[\"For agentic page creation, prefer returning uiCompositionPlan in the preview envelope and let the page-builder compiler emit WidgetPageDefinition.\",\"Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; do not depend on host-only enrichment after compilation.\",\"Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.\",\"Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; the compiler emits page.composition.links.\",\"For nested component ports, use component-port endpoints with nestedPath in uiCompositionPlan.bindings; keep widget as the top-level owner and put the real child port in port/direction.\",\"NestedPath must be relative to the owner widget and must end with a widget segment containing a stable key. Do not use index as the only identity.\",\"Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.\",\"Do not emit uiCompositionPlan shorthands/bindings and hand-authored page.composition.links as competing sources of truth for the same preview.\",\"Use page.widgets[].key as the merge key; avoid array indexes.\",\"Canvas items use 1-based col/row with integer spans.\",\"Widget definition id must match a registered component selector.\",\"Use runtimeState.componentCatalog for available component ids, input/output descriptors, semantic ports, insertion presets, actions, commands, configEditor availability, and authoringManifestRef delegation.\",\"Use page.composition.links as the canonical persisted wiring surface.\",\"Composition links should use stable ids and canonical component-port/state endpoints.\",\"For global-action targets, keep execution declarative: use to.kind = global-action with to.ref.actionId plus optional to.ref.payload, payloadExpr and meta only.\",\"For uiCompositionPlan transforms, use pick-path for event payload extraction, query-context for resource filters, template for structured document/input generation, and constant for fixed values.\",\"Write semantic guards to page.composition.links[].condition as Json Logic, not as legacy filter strings.\",\"Write operational behavior to page.composition.links[].policy, not mixed into condition or metadata.\",\"Transforms and metadata must be written under the link envelope, not as legacy connection fields.\",\"To remove a widget, use _delete: true with the widget key.\",\"To remove a link, use _delete: true with the same canonical from/to endpoints.\"]}}",
3844
+ "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"hints\":[\"For agentic page creation, prefer returning uiCompositionPlan in the preview envelope and let the page-builder compiler emit WidgetPageDefinition.\",\"Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; when a PraxisTextValue key exists in the fallbackLocale dictionary, omit repeated text and let the compiler materialize the executable fallback.\",\"Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.\",\"Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; constant values and state.initial become explicit inputs, while state references compile to page.composition.links.\",\"For nested component ports, use component-port endpoints with nestedPath in uiCompositionPlan.bindings; keep widget as the top-level owner and put the real child port in port/direction.\",\"NestedPath must be relative to the owner widget and must end with a widget segment containing a stable key. Do not use index as the only identity.\",\"Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.\",\"Do not emit uiCompositionPlan shorthands/bindings and hand-authored page.composition.links as competing sources of truth for the same preview.\",\"Use page.widgets[].key as the merge key; avoid array indexes.\",\"Canvas items use 1-based col/row with integer spans.\",\"Widget definition id must match a registered component selector.\",\"Use runtimeState.componentCatalog for available component ids, input/output descriptors, semantic ports, insertion presets, actions, commands, configEditor availability, and authoringManifestRef delegation.\",\"Use page.composition.links as the canonical persisted wiring surface.\",\"Composition links should use stable ids and canonical component-port/state endpoints.\",\"For global-action targets, keep execution declarative: use to.kind = global-action with to.ref.actionId plus optional to.ref.payload, payloadExpr and meta only.\",\"For uiCompositionPlan transforms, use pick-path for event payload extraction, query-context for resource filters, template for structured document/input generation, and constant for fixed values.\",\"Write semantic guards to page.composition.links[].condition as Json Logic, not as legacy filter strings.\",\"Write operational behavior to page.composition.links[].policy, not mixed into condition or metadata.\",\"Transforms and metadata must be written under the link envelope, not as legacy connection fields.\",\"To remove a widget, use _delete: true with the widget key.\",\"To remove a link, use _delete: true with the same canonical from/to endpoints.\"]}}",
3797
3845
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
3798
- "contentHash": "3a2170775f6214cfb814e36833b43ab080bce94751d3edf631147beb53156235",
3846
+ "contentHash": "0c2f7d3051f7e5d74725da7b8b3a1e6650d46b7d2723b1b79bcc9f7c86bf54f5",
3799
3847
  "sourceKind": "component_definition",
3800
3848
  "sourceId": "praxis-page-builder",
3801
3849
  "corpusVersion": "1.0.0"
3802
3850
  },
3803
3851
  {
3804
- "chunkIndex": 29,
3852
+ "chunkIndex": 30,
3805
3853
  "chunkKind": "recipe",
3806
3854
  "content": "{\"_comment\":\"Receita de Dashboard (Grid Page) com Tabela Mestre e Formulário Detalhe conectados.\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"master-detail\",\"useWhen\":\"Page builder layout with master table and detail form.\",\"examplePrompts\":[\"create a master detail page with table and form\",\"set up a grid page with table + detail form\"]},\"options\":{\"cols\":12,\"rowHeight\":80,\"gap\":16,\"compactType\":\"vertical\"},\"widgets\":[{\"key\":\"userTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"email\",\"header\":\"Email\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"userDetailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"email\"]}]},{\"columns\":[{\"fields\":[\"role\",\"status\"]}]}]}]}}}},{\"key\":\"statsCard\",\"layout\":{\"col\":1,\"row\":7,\"colSpan\":4,\"rowSpan\":2},\"definition\":{\"id\":\"praxis-custom-card\",\"inputs\":{\"title\":\"Total Selecionado\",\"content\":\"Nenhum\"}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"userDetailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"},{\"_comment\":\"Ao clicar na linha, atualiza o título do card de estatísticas\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"statsCard\",\"input\":\"inputs.content\"},\"map\":\"Selecionado: ${payload.row.name}\"}]}",
3807
3855
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-grid-page.json",
@@ -3811,7 +3859,7 @@
3811
3859
  "corpusVersion": "1.0.0"
3812
3860
  },
3813
3861
  {
3814
- "chunkIndex": 30,
3862
+ "chunkIndex": 31,
3815
3863
  "chunkKind": "recipe",
3816
3864
  "content": "{\"_comment\":\"Receita para Page Builder usando Gridster e conexões entre widgets.\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"base\",\"useWhen\":\"Base page builder layout with gridster widgets.\",\"examplePrompts\":[\"create a page builder layout\",\"set up a gridster page with table and form\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"userTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"email\",\"header\":\"Email\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"userDetailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"email\"]}]},{\"columns\":[{\"fields\":[\"role\",\"status\"]}]}]}]}}}},{\"_comment\":\"Componente custom do app; substitua por um id registrado no ComponentMetadataRegistry.\",\"key\":\"statsCard\",\"layout\":{\"col\":1,\"row\":7,\"colSpan\":4,\"rowSpan\":2},\"definition\":{\"id\":\"praxis-custom-card\",\"inputs\":{\"title\":\"Total Selecionado\",\"content\":\"Nenhum\"}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"userDetailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"},{\"_comment\":\"Ao clicar na linha, atualiza o título do card de estatísticas\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"statsCard\",\"input\":\"inputs.content\"},\"map\":\"Selecionado: ${payload.row.name}\"}]}}",
3817
3865
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-gridster-page.json",
@@ -3821,7 +3869,7 @@
3821
3869
  "corpusVersion": "1.0.0"
3822
3870
  },
3823
3871
  {
3824
- "chunkIndex": 31,
3872
+ "chunkIndex": 32,
3825
3873
  "chunkKind": "recipe",
3826
3874
  "content": "{\"_comment\":\"Template base para Praxis Page Builder (gridster).\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"base\",\"defaultVariantId\":\"base\",\"variants\":[{\"id\":\"base\",\"registryKey\":\"praxis-page-builder:base\",\"variantId\":\"base\",\"description\":\"Cria um workspace base do page builder com widgets em gridster.\",\"useWhen\":\"Base page builder layout with gridster widgets.\"},{\"id\":\"master-detail\",\"registryKey\":\"praxis-page-builder:master-detail\",\"variantId\":\"master-detail\",\"description\":\"Cria workspace com tabela, formulário de detalhes e superfícies editoriais governadas por rich-content.\",\"useWhen\":\"Page builder layout with master table, detail form and governed editorial action surfaces.\"}],\"useWhen\":\"Base page builder layout with gridster widgets and optional governed editorial action surfaces.\",\"examplePrompts\":[\"create a page builder layout\",\"set up a gridster page with table and form\",\"add a governed action card to a page-builder master-detail workspace\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"masterTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"detailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"status\"]}]}]}]}}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"masterTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"detailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"}]}}",
3827
3875
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.json",
@@ -3831,7 +3879,7 @@
3831
3879
  "corpusVersion": "1.0.0"
3832
3880
  },
3833
3881
  {
3834
- "chunkIndex": 32,
3882
+ "chunkIndex": 33,
3835
3883
  "chunkKind": "recipe",
3836
3884
  "content": "{\"_comment\":\"Template master-detail para Praxis Page Builder (gridster).\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"_comment3\":\"Widgets praxis-rich-content podem complementar o workspace com orientacao editorial e actions mediadas por host, mas hostCapabilities nao pertence ao JSON persistido.\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"master-detail\",\"useWhen\":\"Page builder layout with master table, detail form and governed editorial workspace.\",\"examplePrompts\":[\"create a master detail page with table and form\",\"build a page with a table and a detail form\",\"add a governed editorial panel to a page-builder master-detail workspace\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"masterTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"detailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\",\"config\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"formBlocksBefore\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"callout\",\"tone\":\"neutral\",\"icon\":\"dashboard_customize\",\"title\":\"Page-builder host\",\"message\":\"Mesmo no page builder, rich-content continua sendo documento portavel e host-mediated em runtime.\"}]},\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"status\"]}]}]}]}},\"outputs\":{\"customAction\":\"emit\"}}},{\"key\":\"editorialGuide\",\"layout\":{\"col\":8,\"row\":7,\"colSpan\":5,\"rowSpan\":3},\"definition\":{\"id\":\"praxis-rich-content\",\"bindingOrder\":[\"document\",\"context\"],\"inputs\":{\"context\":{\"workspace\":{\"resourceLabel\":\"{{resourceLabel}}\",\"layout\":\"gridster\",\"governance\":\"host-mediated runtime actions\"}},\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"recordSummary\",\"title\":\"Master-detail workspace\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"meta\":\"praxis-page-builder\",\"fields\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\"},{\"label\":\"Governance\",\"valueExpr\":\"${workspace.governance}\"}]},{\"type\":\"statGroup\",\"title\":\"Workspace signals\",\"subtitle\":\"Portable summary cards inside the builder workspace\",\"layout\":\"grid\",\"items\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\",\"caption\":\"gridster\",\"icon\":\"grid_view\"},{\"label\":\"Governance\",\"value\":\"host\",\"captionExpr\":\"${workspace.governance}\",\"icon\":\"shield\"}]},{\"type\":\"tabs\",\"title\":\"Builder views\",\"subtitle\":\"Canonical editorial tabs inside the page-builder workspace.\",\"appearance\":\"underline\",\"defaultTabId\":\"overview\",\"items\":[{\"id\":\"overview\",\"label\":\"Overview\",\"icon\":\"dashboard\",\"content\":[{\"type\":\"text\",\"text\":\"Tabs let the builder workspace organize guidance, runtime notes and next steps without inventing builder-specific markup.\"}]},{\"id\":\"governance\",\"label\":\"Governance\",\"icon\":\"shield\",\"badge\":\"Host\",\"content\":[{\"type\":\"keyValueList\",\"layout\":\"stacked\",\"items\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\"},{\"label\":\"Governance\",\"valueExpr\":\"${workspace.governance}\"},{\"label\":\"Persistence rule\",\"value\":\"hostCapabilities stay outside persisted page JSON.\"}]}]}]},{\"type\":\"ctaGroup\",\"title\":\"Next steps\",\"subtitle\":\"Governed builder actions\",\"message\":\"Use a semantic CTA cluster for builder-side flows without embedding handlers in the document.\",\"layout\":\"split\",\"actions\":[{\"type\":\"actionButton\",\"label\":\"Abrir fluxo governado\",\"icon\":\"open_in_new\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}}},{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"disclosure\",\"title\":\"Persisted versus runtime\",\"subtitle\":\"A pagina salva document/config; o host injeta capabilities apenas em runtime\",\"appearance\":\"card\",\"defaultExpanded\":true,\"content\":[{\"type\":\"keyValueList\",\"layout\":\"stacked\",\"items\":[{\"label\":\"Persistir\",\"value\":\"document, context e config do widget\"},{\"label\":\"Nao persistir\",\"value\":\"hostCapabilities\"}]}]},{\"type\":\"relatedRecord\",\"title\":\"Selected related record\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"relationLabel\":\"Builder selection\",\"meta\":\"resolved relationship\",\"ctaLabel\":\"Abrir relacionado\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}},\"fields\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\",\"hint\":\"Resolved from the same builder workspace context.\"}],\"secondaryActions\":[{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"actionCard\",\"title\":\"Open governed builder flow\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"message\":\"Use actionCard when the page-builder workspace needs a governed host action from a portable editorial document.\",\"meta\":\"praxis-page-builder\",\"ctaLabel\":\"Abrir fluxo governado\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}},\"secondaryActions\":[{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"emptyState\",\"icon\":\"hub\",\"title\":\"Acione um fluxo governado pelo host\",\"message\":\"Use actionButton para abrir surface, drawer ou modal sem embutir manipuladores no documento.\",\"actions\":[{\"type\":\"actionButton\",\"label\":\"Abrir painel\",\"icon\":\"open_in_new\",\"variant\":\"stroked\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}}}]}]}}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"masterTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"detailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"}]}}",
3837
3885
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.master-detail.json",
@@ -3841,7 +3889,7 @@
3841
3889
  "corpusVersion": "1.0.0"
3842
3890
  },
3843
3891
  {
3844
- "chunkIndex": 33,
3892
+ "chunkIndex": 34,
3845
3893
  "chunkKind": "recipe",
3846
3894
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"_comment\",\"_comment\":\"Contrato operacional para orientar LLM/backend a emitir UiCompositionPlan antes do WidgetPageDefinition final.\"}",
3847
3895
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
@@ -3851,7 +3899,7 @@
3851
3899
  "corpusVersion": "1.0.0"
3852
3900
  },
3853
3901
  {
3854
- "chunkIndex": 34,
3902
+ "chunkIndex": 35,
3855
3903
  "chunkKind": "recipe",
3856
3904
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"templateMeta\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"ui-composition-plan\",\"status\":\"golden-fixture\",\"useWhen\":\"Agentic page creation or modification needs multiple Praxis widgets, state and bindings before compiling the persisted page JSON.\",\"examplePrompts\":[\"Crie uma tela master detail de departamentos com funcionarios, folha e resumo\",\"Monte um dashboard com lista mestre, tabela detalhe, grafico e texto dinamico\"]}}",
3857
3905
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
@@ -3861,27 +3909,27 @@
3861
3909
  "corpusVersion": "1.0.0"
3862
3910
  },
3863
3911
  {
3864
- "chunkIndex": 35,
3912
+ "chunkIndex": 36,
3865
3913
  "chunkKind": "recipe",
3866
- "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"outputEnvelope\",\"outputEnvelope\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"i18n\":{\"fallbackLocale\":\"{{fallbackLocale}}\",\"dictionaries\":{\"{{locale}}\":{\"{{businessCopyKey}}\":\"{{businessCopyValue}}\"}}},\"context\":{\"{{explicitContextKey}}\":\"{{explicitContextValue}}\"},\"layout\":{\"columns\":12,\"gap\":\"16px\",\"breakpoints\":{\"sm\":1,\"md\":6,\"lg\":12}},\"layoutPreset\":\"{{layoutPreset}}\",\"state\":{\"values\":{\"{{stateKey}}\":null}},\"widgets\":[{\"key\":\"{{stableWidgetKey}}\",\"componentId\":\"{{registeredComponentId}}\",\"role\":\"{{semanticRole}}\",\"shell\":{\"kind\":\"dashboard-card\",\"title\":{\"key\":\"{{widgetTitleKey}}\",\"text\":\"{{widgetTitleFallback}}\"}},\"bindingOrder\":[\"{{inputName}}\"],\"inputs\":{\"{{inputName}}\":\"{{canonicalInputValue}}\"}}],\"selectionSyncs\":[{\"id\":\"{{stableSelectionSyncId}}\",\"intent\":\"selection-sync\",\"sources\":[{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{selectionOutputPort}}\",\"direction\":\"output\"}],\"target\":{\"kind\":\"state\",\"path\":\"{{selectionStatePath}}\",\"layer\":\"values\"},\"mapping\":{\"{{selectionField}}\":\"{{selectionPayloadPath}}\"}}],\"contextScopes\":[{\"id\":\"{{stableContextScopeId}}\",\"context\":{\"parentResourcePath\":{\"kind\":\"constant\",\"value\":\"{{parentResourcePath}}\"},\"parentResourceId\":{\"kind\":\"state\",\"path\":\"{{parentResourceIdStatePath}}\",\"layer\":\"values\"}},\"targets\":[{\"widget\":\"{{contextOwnerWidgetKey}}\",\"nestedPath\":[{\"kind\":\"{{containerSegmentKind}}\",\"id\":\"{{containerSegmentId}}\"},{\"kind\":\"widget\",\"key\":\"{{nestedWidgetKey}}\"}]}]}],\"bindings\":[{\"id\":\"{{stableBindingId}}\",\"from\":{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{outputPort}}\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"{{statePath}}\"},\"intent\":\"state-write\",\"transform\":{\"kind\":\"pick-path\",\"id\":\"{{transformId}}\",\"path\":\"{{payloadPath}}\"},\"metadata\":{\"source\":\"ui-composition-plan\"}}]},\"compiledFormPatch\":{\"version\":\"1.1\",\"patch\":{}}}}",
3914
+ "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"outputEnvelope\",\"outputEnvelope\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"i18n\":{\"fallbackLocale\":\"{{fallbackLocale}}\",\"dictionaries\":{\"{{locale}}\":{\"{{businessCopyKey}}\":\"{{businessCopyValue}}\"}}},\"context\":{\"{{explicitContextKey}}\":\"{{explicitContextValue}}\"},\"layout\":{\"columns\":12,\"gap\":\"16px\",\"breakpoints\":{\"sm\":1,\"md\":6,\"lg\":12}},\"layoutPreset\":\"{{layoutPreset}}\",\"state\":{\"values\":{\"{{stateKey}}\":null}},\"widgets\":[{\"key\":\"{{stableWidgetKey}}\",\"componentId\":\"{{registeredComponentId}}\",\"role\":\"{{semanticRole}}\",\"shell\":{\"kind\":\"dashboard-card\",\"title\":{\"key\":\"{{widgetTitleKey}}\",\"text\":\"{{widgetTitleFallback}}\"}},\"bindingOrder\":[\"{{inputName}}\"],\"inputs\":{\"{{inputName}}\":\"{{canonicalInputValue}}\"}}],\"selectionSyncs\":[{\"id\":\"{{stableSelectionSyncId}}\",\"intent\":\"selection-sync\",\"sources\":[{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{selectionOutputPort}}\",\"direction\":\"output\"}],\"target\":{\"kind\":\"state\",\"path\":\"{{selectionStatePath}}\",\"layer\":\"values\"},\"mapping\":{\"{{selectionField}}\":\"{{selectionPayloadPath}}\"}}],\"contextScopes\":[{\"id\":\"{{stableContextScopeId}}\",\"context\":{\"parentResourcePath\":{\"kind\":\"constant\",\"value\":\"{{parentResourcePath}}\"},\"parentResourceId\":{\"kind\":\"state\",\"path\":\"{{parentResourceIdStatePath}}\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"{{contextOwnerWidgetKey}}\",\"nestedPath\":[{\"kind\":\"{{containerSegmentKind}}\",\"id\":\"{{containerSegmentId}}\"},{\"kind\":\"widget\",\"key\":\"{{nestedWidgetKey}}\"}]}]}],\"bindings\":[{\"id\":\"{{stableBindingId}}\",\"from\":{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{outputPort}}\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"{{statePath}}\"},\"intent\":\"state-write\",\"transform\":{\"kind\":\"pick-path\",\"id\":\"{{transformId}}\",\"path\":\"{{payloadPath}}\"},\"metadata\":{\"source\":\"ui-composition-plan\"}}]},\"compiledFormPatch\":{\"version\":\"1.1\",\"patch\":{}}}}",
3867
3915
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3868
- "contentHash": "308be3fc33c17953079df467e84e14ce148eb46810f91f27601205bc659be851",
3916
+ "contentHash": "302c3aa4014a68dba905fd58af2833e52b4d047658545aff49ef1d64e9b336d8",
3869
3917
  "sourceKind": "component_definition",
3870
3918
  "sourceId": "praxis-page-builder",
3871
3919
  "corpusVersion": "1.0.0"
3872
3920
  },
3873
3921
  {
3874
- "chunkIndex": 36,
3922
+ "chunkIndex": 37,
3875
3923
  "chunkKind": "recipe",
3876
- "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"validationRules\",\"validationRules\":[\"uiCompositionPlan.version deve ser 1.0.\",\"uiCompositionPlan.kind deve ser praxis.ui-composition-plan.\",\"i18n, context e layout pertencentes a pagina devem ser compilados para os campos homonimos de WidgetPageDefinition; nao dependa de enriquecimento oculto do host.\",\"widgets[].key deve ser estavel e unico.\",\"widgets[].componentId deve existir no catalogo de componentes registrado do Page Builder.\",\"bindings[].from/to com kind component-port devem referenciar widgets existentes no proprio plano.\",\"bindings[].from/to com kind state devem usar paths declarados ou justificaveis em state.values/state.derived.\",\"bindings[].to com kind global-action deve declarar actionId e compila para page.composition.links[].to.ref.[actionId].\",\"Use intent command-dispatch para bindings cujo destino e global-action.\",\"selectionSyncs[] reduz autoria repetitiva e sempre compila cada source/mapping em page.composition.links explicitos com intent selection-sync.\",\"contextScopes[] materializa constantes em inputs e estado em links state-read explicitos; nao existe heranca de contexto ambiente no runtime persistido.\",\"Use bindings como fonte declarativa. Nao emita connections legado nem page.composition.links concorrente no mesmo plano.\",\"Use pick-path para extrair payload/evento, query-context para filtros de recurso, template para gerar inputs estruturados e constant para valores fixos.\",\"Se API, metadata, surface, action, capability ou porta de componente nao estiver confirmada, retorne clarification/diagnostic em vez de alucinar o plano.\"]}",
3924
+ "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"validationRules\",\"validationRules\":[\"uiCompositionPlan.version deve ser 1.0.\",\"uiCompositionPlan.kind deve ser praxis.ui-composition-plan.\",\"i18n, context e layout pertencentes a pagina devem ser compilados para os campos homonimos de WidgetPageDefinition; descritores PraxisTextValue podem omitir text quando key existir no dicionario de fallback, e nao devem depender de enriquecimento oculto do host.\",\"widgets[].key deve ser estavel e unico.\",\"widgets[].componentId deve existir no catalogo de componentes registrado do Page Builder.\",\"bindings[].from/to com kind component-port devem referenciar widgets existentes no proprio plano.\",\"bindings[].from/to com kind state devem usar paths declarados ou justificaveis em state.values/state.derived.\",\"bindings[].to com kind global-action deve declarar actionId e compila para page.composition.links[].to.ref.[actionId].\",\"Use intent command-dispatch para bindings cujo destino e global-action.\",\"selectionSyncs[] reduz autoria repetitiva e sempre compila cada source/mapping em page.composition.links explicitos com intent selection-sync.\",\"contextScopes[] materializa constantes e state.initial em inputs, alem de estado em links state-read explicitos; nao existe heranca de contexto ambiente no runtime persistido.\",\"Use bindings como fonte declarativa. Nao emita connections legado nem page.composition.links concorrente no mesmo plano.\",\"Use pick-path para extrair payload/evento, query-context para filtros de recurso, template para gerar inputs estruturados e constant para valores fixos.\",\"Se API, metadata, surface, action, capability ou porta de componente nao estiver confirmada, retorne clarification/diagnostic em vez de alucinar o plano.\"]}",
3877
3925
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3878
- "contentHash": "7c27b9c0ffa0b98dddf9c13aa2daa004ba914dff6bca73f68883272c9b8f6e7b",
3926
+ "contentHash": "62505b10c9000ab36019e3a53fca762d720e596133d2764eba71e33b62186576",
3879
3927
  "sourceKind": "component_definition",
3880
3928
  "sourceId": "praxis-page-builder",
3881
3929
  "corpusVersion": "1.0.0"
3882
3930
  },
3883
3931
  {
3884
- "chunkIndex": 37,
3932
+ "chunkIndex": 38,
3885
3933
  "chunkKind": "recipe",
3886
3934
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"example\",\"example\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"layoutPreset\":\"master-detail-dashboard\",\"state\":{\"values\":{\"selection\":{\"departmentId\":null,\"departmentName\":null}}},\"widgets\":[{\"key\":\"department-master\",\"componentId\":\"praxis-list\",\"role\":\"master\",\"inputs\":{\"config\":{\"dataSource\":{\"resourcePath\":\"/api/human-resources/departamentos\"}}}},{\"key\":\"department-employees\",\"componentId\":\"praxis-table\",\"role\":\"detail\",\"inputs\":{\"resourcePath\":\"/api/human-resources/funcionarios\",\"tableId\":\"department-employees\"}},{\"key\":\"department-payroll\",\"componentId\":\"praxis-chart\",\"role\":\"detail\",\"inputs\":{\"config\":{\"chartId\":\"department-payroll\",\"resourcePath\":\"/api/human-resources/vw-analytics-folha-pagamento\"}}},{\"key\":\"department-summary\",\"componentId\":\"praxis-rich-content\",\"role\":\"detail\",\"inputs\":{\"document\":{\"kind\":\"praxis.rich-content.document\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"text\":\"Selecione um departamento para revisar funcionarios, folha e observacoes.\"}]}}}],\"selectionSyncs\":[{\"id\":\"department-selection\",\"intent\":\"selection-sync\",\"sources\":[{\"kind\":\"component-port\",\"widget\":\"department-master\",\"port\":\"itemSelect\",\"direction\":\"output\"}],\"target\":{\"kind\":\"state\",\"path\":\"selection\",\"layer\":\"values\"},\"mapping\":{\"departmentId\":\"payload.item.id\",\"departmentName\":\"payload.item.nome\"},\"policy\":{\"distinct\":true,\"missingValuePolicy\":\"skip\"},\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"master-detail\",\"selection\"]}}],\"bindings\":[{\"id\":\"department-master.itemSelect->global-action.department-selection-audit\",\"from\":{\"kind\":\"component-port\",\"widget\":\"department-master\",\"port\":\"itemSelect\",\"direction\":\"output\"},\"to\":{\"kind\":\"global-action\",\"actionId\":\"department.selection.audit\",\"payloadExpr\":\"payload.item\",\"meta\":{\"label\":\"Audit department selection\"}},\"intent\":\"command-dispatch\",\"policy\":{\"distinct\":true,\"distinctBy\":\"payload.item.id\",\"missingValuePolicy\":\"skip\"},\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"master-detail\",\"global-action\"]}},{\"id\":\"state.selection.departmentId->department-employees.queryContext\",\"from\":{\"kind\":\"state\",\"path\":\"selection.departmentId\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"department-employees\",\"port\":\"queryContext\",\"direction\":\"input\"},\"intent\":\"state-read\",\"condition\":{\"!=\":[{\"var\":\"state.selection.departmentId\"},null]},\"transform\":{\"kind\":\"query-context\",\"id\":\"department-filter\",\"field\":\"departamentoId\"},\"policy\":{\"distinct\":true,\"distinctBy\":\"value\",\"missingValuePolicy\":\"skip\"},\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"master-detail\",\"table-filter\"]}},{\"id\":\"state.selection.departmentId->department-payroll.queryContext\",\"from\":{\"kind\":\"state\",\"path\":\"selection.departmentId\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"department-payroll\",\"port\":\"queryContext\",\"direction\":\"input\"},\"intent\":\"state-read\",\"condition\":{\"!=\":[{\"var\":\"state.selection.departmentId\"},null]},\"transform\":{\"kind\":\"query-context\",\"id\":\"department-payroll-filter\",\"field\":\"departamentoId\"},\"policy\":{\"distinct\":true,\"missingValuePolicy\":\"skip\"},\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"master-detail\",\"chart-filter\"]}},{\"id\":\"state.selection.departmentName->department-summary.document\",\"from\":{\"kind\":\"state\",\"path\":\"selection.departmentName\"},\"to\":{\"kind\":\"component-port\",\"widget\":\"department-summary\",\"port\":\"document\",\"direction\":\"input\"},\"intent\":\"state-read\",\"condition\":{\"!!\":[{\"var\":\"state.selection.departmentName\"}]},\"transform\":{\"kind\":\"template\",\"id\":\"department-summary-document\",\"template\":{\"kind\":\"praxis.rich-content.document\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"text\":{\"concat\":[\"Departamento selecionado: \",{\"var\":\"value\"}]}}]}},\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"master-detail\",\"rich-content\"]}}]}}}",
3887
3935
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
@@ -3891,7 +3939,7 @@
3891
3939
  "corpusVersion": "1.0.0"
3892
3940
  },
3893
3941
  {
3894
- "chunkIndex": 38,
3942
+ "chunkIndex": 39,
3895
3943
  "chunkKind": "recipe",
3896
3944
  "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"compiledOutput\",\"compiledOutput\":{\"summary\":\"O compilador expande selectionSyncs e bindings em WidgetPageDefinition com page.widgets[].definition.id, page.widgets[].definition.inputs e page.composition.links version 1.0.0. O JSON persistido nao deve conter o plano intermediario nem connections legado.\",\"forbiddenLegacyPaths\":[\"page.options\",\"page.widgets[].layout\",\"page.connections\",\"connections\"]}}",
3897
3945
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",