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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -204,6 +204,8 @@ providers: [
204
204
 
205
205
  The package exports `PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST` for governed operation discovery. The persisted runtime page is still `WidgetPageDefinition`; intermediate AI plans such as `UiCompositionPlan` must compile before preview, apply, or save.
206
206
 
207
+ `UiCompositionPlan` can carry the complete page-owned envelope required by the runtime: `i18n`, explicit `context`, canonical `layout`, state, presets, responsive variants, governed widget `shell`, component inputs and semantic wiring. The compiler clones these fields into `WidgetPageDefinition`; hosts must not add business copy, tenant context, layout or widget chrome after compilation as an undocumented enrichment step. `context` is page-wide runtime context, while `contextScopes` is an authoring shorthand that expands repeated values into explicit widget inputs and links.
208
+
207
209
  Repeated selection projections can be authored once through `UiCompositionPlan.selectionSyncs`. A sync declares structured component-output sources, a base state target, and a field-to-payload mapping. `compileUiCompositionPlan` expands every source/mapping pair into explicit `page.composition.links` with stable ids, canonical `pick-path` transforms, policy, condition, and `selection-sync` intent. The shorthand is never persisted in `WidgetPageDefinition`, so runtime inspection and audit continue to see the complete executable graph.
208
210
 
209
211
  ```ts
@@ -225,6 +227,8 @@ selectionSyncs: [{
225
227
 
226
228
  Repeated parent/resource context can be declared through `UiCompositionPlan.contextScopes`. Each context value is explicitly either `constant` or `state`; each target uses a stable owner widget and optional canonical `nestedPath`. During compilation, constants are materialized into component inputs through core's `NestedWidgetConfigAccessor`, while state values become normal `state-read` links. Targets can inherit all keys or an explicit subset. The persisted page therefore contains only concrete widget inputs and `composition.links`, never ambient or implicit context inheritance.
227
229
 
230
+ The official Employee Operations case is an executable regression for this boundary. Its 22 persisted links are expressed in authoring as one `selectionSyncs` declaration plus two `contextScopes` declarations, while compilation preserves the same 22 source/target paths, guards and policies. This reduces the repeated wiring declarations from 22 to 3 (86%) without hiding the executable graph from runtime inspection, audit or the public JSON viewer.
231
+
228
232
  Streaming apply is fail-closed. A preview is persistable only when it is the unchanged payload of an applicable terminal `result` event and its diagnostics carry the matching `streamId`, `threadId`, `turnId`, and `resultEventId`. A locally regenerated or normalized preview remains available for review, but it cannot reuse an older terminal reference or call `page-apply`; the backend must issue a new terminal result for the new patch.
229
233
 
230
234
  ## Public API
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-11T20:12:18.507Z",
3
+ "generatedAt": "2026-08-12T03:48:40.610Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "9.0.5-rc.2",
5
+ "packageVersion": "9.0.5-rc.3",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -86,6 +86,24 @@
86
86
  "valueKind": "string",
87
87
  "description": "Discriminador do plano. Valor atual: praxis.ui-composition-plan."
88
88
  },
89
+ {
90
+ "path": "uiCompositionPlan.i18n",
91
+ "category": "page",
92
+ "valueKind": "object",
93
+ "description": "Catalogo de textos de negocio da pagina, compilado para page.i18n sem criar copy no runtime."
94
+ },
95
+ {
96
+ "path": "uiCompositionPlan.context",
97
+ "category": "context",
98
+ "valueKind": "object",
99
+ "description": "Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria."
100
+ },
101
+ {
102
+ "path": "uiCompositionPlan.layout",
103
+ "category": "layout",
104
+ "valueKind": "object",
105
+ "description": "Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset."
106
+ },
89
107
  {
90
108
  "path": "uiCompositionPlan.layoutPreset",
91
109
  "category": "layout",
@@ -148,6 +166,12 @@
148
166
  "description": "Componente registrado que sera compilado para definition.id.",
149
167
  "critical": true
150
168
  },
169
+ {
170
+ "path": "uiCompositionPlan.widgets[].shell",
171
+ "category": "widgets",
172
+ "valueKind": "object",
173
+ "description": "Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host."
174
+ },
151
175
  {
152
176
  "path": "uiCompositionPlan.widgets[].inputs",
153
177
  "category": "widgets",
@@ -1390,12 +1414,13 @@
1390
1414
  },
1391
1415
  "hints": [
1392
1416
  "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.",
1393
1418
  "Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.",
1394
- "Use uiCompositionPlan.bindings as the declarative source for wiring; the compiler emits page.composition.links.",
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.",
1395
1420
  "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.",
1396
1421
  "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.",
1397
1422
  "Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.",
1398
- "Do not emit both uiCompositionPlan.bindings and hand-authored page.composition.links as competing sources of truth for the same preview.",
1423
+ "Do not emit uiCompositionPlan shorthands/bindings and hand-authored page.composition.links as competing sources of truth for the same preview.",
1399
1424
  "Use page.widgets[].key as the merge key; avoid array indexes.",
1400
1425
  "Canvas items use 1-based col/row with integer spans.",
1401
1426
  "Widget definition id must match a registered component selector.",
@@ -2621,6 +2646,9 @@
2621
2646
  "handlerContract": {
2622
2647
  "reads": [
2623
2648
  "UiCompositionPlan",
2649
+ "UiCompositionPlan.i18n",
2650
+ "UiCompositionPlan.context",
2651
+ "UiCompositionPlan.layout",
2624
2652
  "UiCompositionPlan.selectionSyncs",
2625
2653
  "UiCompositionPlan.contextScopes",
2626
2654
  "compileUiCompositionPlan",
@@ -3265,6 +3293,7 @@
3265
3293
  "roundTripRequirements": [
3266
3294
  "WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.",
3267
3295
  "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.",
3268
3297
  "UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.",
3269
3298
  "UiCompositionPlan.contextScopes compiles constant context into explicit widget inputs and state context into explicit page.composition.links; runtime inheritance is never ambient.",
3270
3299
  "Widget keys and composition link ids are stable identities; array indexes are never canonical identities.",
@@ -3494,9 +3523,9 @@
3494
3523
  {
3495
3524
  "chunkIndex": 1,
3496
3525
  "chunkKind": "capabilities",
3497
- "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.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[].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.\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.",
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.",
3498
3527
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3499
- "contentHash": "1eee664e1bbde9b2851bc7c2781b87fb6c543751ef583479a602eb08dc10fccf",
3528
+ "contentHash": "1934dff5a13a9939eb2941e7f7d4cc029fcf772aa59b1418eda4ccc49374a527",
3500
3529
  "sourceKind": "component_definition",
3501
3530
  "sourceId": "praxis-page-builder",
3502
3531
  "corpusVersion": "1.0.0"
@@ -3504,9 +3533,9 @@
3504
3533
  {
3505
3534
  "chunkIndex": 2,
3506
3535
  "chunkKind": "capabilities",
3507
- "content": "Component 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.\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.",
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.",
3508
3537
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3509
- "contentHash": "ed1bd8225e385bfc7168534cec4a7fc3a8a57cc34e10ff6d5f97ac7627460dea",
3538
+ "contentHash": "49dc4f938cc153ddc5db4f96845bbfc3741ead8f0e6092385e167445f1354da0",
3510
3539
  "sourceKind": "component_definition",
3511
3540
  "sourceId": "praxis-page-builder",
3512
3541
  "corpusVersion": "1.0.0"
@@ -3514,9 +3543,9 @@
3514
3543
  {
3515
3544
  "chunkIndex": 3,
3516
3545
  "chunkKind": "capabilities",
3517
- "content": "Component 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.",
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.",
3518
3547
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
3519
- "contentHash": "20d983b400275e2daed29afefed9e41438ecda1d76ab3092f0ff523f6709da91",
3548
+ "contentHash": "27bea3a3a7860dd6cebd7ec4e745ccc12851826ef955892cc7bf00bd1768a548",
3520
3549
  "sourceKind": "component_definition",
3521
3550
  "sourceId": "praxis-page-builder",
3522
3551
  "corpusVersion": "1.0.0"
@@ -3694,9 +3723,9 @@
3694
3723
  {
3695
3724
  "chunkIndex": 21,
3696
3725
  "chunkKind": "authoring_manifest",
3697
- "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.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\"]}]}",
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\"]}]}",
3698
3727
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3699
- "contentHash": "f3de19943a6dfbd0452ecd46b1c1e5f4860cd71fd43eab9aa83958b6037604e9",
3728
+ "contentHash": "30cbfa3f2da674b084d293c857c73dfd3874a7ba56dc7ec230c81ac3845046c4",
3700
3729
  "sourceKind": "component_definition",
3701
3730
  "sourceId": "praxis-page-builder",
3702
3731
  "corpusVersion": "1.0.0"
@@ -3724,9 +3753,9 @@
3724
3753
  {
3725
3754
  "chunkIndex": 24,
3726
3755
  "chunkKind": "authoring_manifest",
3727
- "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.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.\"]}",
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.\"]}",
3728
3757
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
3729
- "contentHash": "01d817d6b28effa45c76146f3bf01e15e2c3488f97efa19eabbb62375a315f64",
3758
+ "contentHash": "7bd101db563c91c4b549a788d4e48f6ea33b0036b9c9d8dff09c195d57ab035a",
3730
3759
  "sourceKind": "component_definition",
3731
3760
  "sourceId": "praxis-page-builder",
3732
3761
  "corpusVersion": "1.0.0"
@@ -3764,9 +3793,9 @@
3764
3793
  {
3765
3794
  "chunkIndex": 28,
3766
3795
  "chunkKind": "context_pack",
3767
- "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.\",\"Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.\",\"Use uiCompositionPlan.bindings as the declarative source for 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 both uiCompositionPlan.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.\"]}}",
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.\"]}}",
3768
3797
  "sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
3769
- "contentHash": "3f1c2658a38ceff2988a325bb7404a8fe8e58ca1f090c5df78eed53066484b3c",
3798
+ "contentHash": "3a2170775f6214cfb814e36833b43ab080bce94751d3edf631147beb53156235",
3770
3799
  "sourceKind": "component_definition",
3771
3800
  "sourceId": "praxis-page-builder",
3772
3801
  "corpusVersion": "1.0.0"
@@ -3814,9 +3843,59 @@
3814
3843
  {
3815
3844
  "chunkIndex": 33,
3816
3845
  "chunkKind": "recipe",
3817
- "content": "{\"_comment\":\"Contrato operacional para orientar LLM/backend a emitir UiCompositionPlan antes do WidgetPageDefinition final.\",\"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\"]},\"outputEnvelope\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"layoutPreset\":\"{{layoutPreset}}\",\"state\":{\"values\":{\"{{stateKey}}\":null}},\"widgets\":[{\"key\":\"{{stableWidgetKey}}\",\"componentId\":\"{{registeredComponentId}}\",\"role\":\"{{semanticRole}}\",\"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\":{}}},\"validationRules\":[\"uiCompositionPlan.version deve ser 1.0.\",\"uiCompositionPlan.kind deve ser praxis.ui-composition-plan.\",\"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.\"],\"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\"]}}]}},\"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\"]}}",
3846
+ "content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"_comment\",\"_comment\":\"Contrato operacional para orientar LLM/backend a emitir UiCompositionPlan antes do WidgetPageDefinition final.\"}",
3847
+ "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3848
+ "contentHash": "645723adfaca9d9ea924c86d2e74bcc2ef812903a2a9f71ad0df8a69f6f8881b",
3849
+ "sourceKind": "component_definition",
3850
+ "sourceId": "praxis-page-builder",
3851
+ "corpusVersion": "1.0.0"
3852
+ },
3853
+ {
3854
+ "chunkIndex": 34,
3855
+ "chunkKind": "recipe",
3856
+ "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
+ "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3858
+ "contentHash": "ba53e635389e3c7470c3cfce79890eca079dfd33bd641565024bfbca743d798a",
3859
+ "sourceKind": "component_definition",
3860
+ "sourceId": "praxis-page-builder",
3861
+ "corpusVersion": "1.0.0"
3862
+ },
3863
+ {
3864
+ "chunkIndex": 35,
3865
+ "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\":{}}}}",
3867
+ "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3868
+ "contentHash": "308be3fc33c17953079df467e84e14ce148eb46810f91f27601205bc659be851",
3869
+ "sourceKind": "component_definition",
3870
+ "sourceId": "praxis-page-builder",
3871
+ "corpusVersion": "1.0.0"
3872
+ },
3873
+ {
3874
+ "chunkIndex": 36,
3875
+ "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.\"]}",
3877
+ "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3878
+ "contentHash": "7c27b9c0ffa0b98dddf9c13aa2daa004ba914dff6bca73f68883272c9b8f6e7b",
3879
+ "sourceKind": "component_definition",
3880
+ "sourceId": "praxis-page-builder",
3881
+ "corpusVersion": "1.0.0"
3882
+ },
3883
+ {
3884
+ "chunkIndex": 37,
3885
+ "chunkKind": "recipe",
3886
+ "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
+ "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3888
+ "contentHash": "ed54b8a948c2cbb67c6975c60decbeb98f28d36d2dea788ee08c30160f407883",
3889
+ "sourceKind": "component_definition",
3890
+ "sourceId": "praxis-page-builder",
3891
+ "corpusVersion": "1.0.0"
3892
+ },
3893
+ {
3894
+ "chunkIndex": 38,
3895
+ "chunkKind": "recipe",
3896
+ "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\"]}}",
3818
3897
  "sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
3819
- "contentHash": "30f2d6b6b0b8fd552d4079e7ce6caf68d0d2c47151a9f604f5573e4ed0396252",
3898
+ "contentHash": "c77ce254e9a442113cb83487e790b223c6df7779dc3c0e6a27e2d555cf78ed2f",
3820
3899
  "sourceKind": "component_definition",
3821
3900
  "sourceId": "praxis-page-builder",
3822
3901
  "corpusVersion": "1.0.0"
@@ -12568,6 +12568,9 @@ const PAGE_BUILDER_AI_CAPABILITIES = {
12568
12568
  { path: 'uiCompositionPlan', category: 'page', valueKind: 'object', description: 'Plano declarativo intermediario aceito em preview agentic antes do WidgetPageDefinition.' },
12569
12569
  { path: 'uiCompositionPlan.version', category: 'page', valueKind: 'string', description: 'Versao do plano. Valor atual: 1.0.' },
12570
12570
  { path: 'uiCompositionPlan.kind', category: 'page', valueKind: 'string', description: 'Discriminador do plano. Valor atual: praxis.ui-composition-plan.' },
12571
+ { path: 'uiCompositionPlan.i18n', category: 'page', valueKind: 'object', description: 'Catalogo de textos de negocio da pagina, compilado para page.i18n sem criar copy no runtime.' },
12572
+ { path: 'uiCompositionPlan.context', category: 'context', valueKind: 'object', description: 'Contexto explicito da pagina, compilado para page.context; nao substitui contextScopes de autoria.' },
12573
+ { path: 'uiCompositionPlan.layout', category: 'layout', valueKind: 'object', description: 'Layout responsivo canonico compilado para page.layout quando a pagina nao usa apenas canvas/preset.' },
12571
12574
  { path: 'uiCompositionPlan.layoutPreset', category: 'layout', valueKind: 'string', description: 'Preset semantico opcional da composicao planejada.' },
12572
12575
  { path: 'uiCompositionPlan.layoutPresetOptions', category: 'layout', valueKind: 'object', description: 'Opcoes semanticas opcionais do preset, como familia visual, estrategia responsiva e politica de densidade.' },
12573
12576
  { path: 'uiCompositionPlan.grouping', category: 'layout', valueKind: 'array', description: 'Agrupamentos semanticos opcionais para organizar widgets em hero, section, tabs ou rail no runtime.' },
@@ -12578,6 +12581,7 @@ const PAGE_BUILDER_AI_CAPABILITIES = {
12578
12581
  { path: 'uiCompositionPlan.widgets', category: 'widgets', valueKind: 'array', description: 'Widgets planejados antes da compilacao para page.widgets.' },
12579
12582
  { path: 'uiCompositionPlan.widgets[].key', category: 'widgets', valueKind: 'string', description: 'ID estavel do widget planejado.', critical: true },
12580
12583
  { path: 'uiCompositionPlan.widgets[].componentId', category: 'widgets', valueKind: 'string', description: 'Componente registrado que sera compilado para definition.id.', critical: true },
12584
+ { path: 'uiCompositionPlan.widgets[].shell', category: 'widgets', valueKind: 'object', description: 'Moldura governada do widget, compilada para page.widgets[].shell sem enriquecimento do host.' },
12581
12585
  { path: 'uiCompositionPlan.widgets[].inputs', category: 'widgets', valueKind: 'object', description: 'Inputs canonicos do componente, compilados para definition.inputs.' },
12582
12586
  { path: 'uiCompositionPlan.widgets[].bindingOrder', category: 'widgets', valueKind: 'array', description: 'Ordem declarativa de binding, compilada para definition.bindingOrder.' },
12583
12587
  { path: 'uiCompositionPlan.bindings', category: 'connections', valueKind: 'array', description: 'Bindings declarativos que serao compilados para page.composition.links.' },
@@ -13226,12 +13230,13 @@ const PAGE_BUILDER_COMPONENT_CONTEXT_PACK = {
13226
13230
  },
13227
13231
  hints: [
13228
13232
  'For agentic page creation, prefer returning uiCompositionPlan in the preview envelope and let the page-builder compiler emit WidgetPageDefinition.',
13233
+ 'Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; do not depend on host-only enrichment after compilation.',
13229
13234
  'Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.',
13230
- 'Use uiCompositionPlan.bindings as the declarative source for wiring; the compiler emits page.composition.links.',
13235
+ 'Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; the compiler emits page.composition.links.',
13231
13236
  '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.',
13232
13237
  '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.',
13233
13238
  'Do not author nested links through owner.widgetEvent, deep bindingPath, page.connections, or host-specific wrapper outputs; those are legacy or bridge mechanisms.',
13234
- 'Do not emit both uiCompositionPlan.bindings and hand-authored page.composition.links as competing sources of truth for the same preview.',
13239
+ 'Do not emit uiCompositionPlan shorthands/bindings and hand-authored page.composition.links as competing sources of truth for the same preview.',
13235
13240
  'Use page.widgets[].key as the merge key; avoid array indexes.',
13236
13241
  'Canvas items use 1-based col/row with integer spans.',
13237
13242
  'Widget definition id must match a registered component selector.',
@@ -13765,7 +13770,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
13765
13770
  target: { kind: 'agenticPreview', resolver: 'agentic-preview-result', ambiguityPolicy: 'fail', required: true },
13766
13771
  inputSchema: { type: 'object', required: ['uiCompositionPlan'], properties: { uiCompositionPlan: { type: 'object' } } },
13767
13772
  effects: [{ kind: 'compile-domain-patch', handler: 'page-builder-ui-composition-plan-compile', handlerContract: {
13768
- reads: ['UiCompositionPlan', 'UiCompositionPlan.selectionSyncs', 'UiCompositionPlan.contextScopes', 'compileUiCompositionPlan', 'PAGE_BUILDER_WIDGET_AI_CATALOGS', 'ComponentDocMeta.configEditor'],
13773
+ reads: ['UiCompositionPlan', 'UiCompositionPlan.i18n', 'UiCompositionPlan.context', 'UiCompositionPlan.layout', 'UiCompositionPlan.selectionSyncs', 'UiCompositionPlan.contextScopes', 'compileUiCompositionPlan', 'PAGE_BUILDER_WIDGET_AI_CATALOGS', 'ComponentDocMeta.configEditor'],
13769
13774
  writes: ['compiledFormPatch.patch.page'],
13770
13775
  identityKeys: ['uiCompositionPlan.id', 'widgetKey', 'uiCompositionPlan.bindings[].id', 'uiCompositionPlan.selectionSyncs[].id', 'uiCompositionPlan.contextScopes[].id'],
13771
13776
  failureModes: ['ui-composition-plan-invalid', 'widget-catalog-missing', 'compiled-page-invalid', 'child-config-editor-missing'],
@@ -13904,6 +13909,7 @@ const PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST = {
13904
13909
  roundTripRequirements: [
13905
13910
  'WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.',
13906
13911
  'UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.',
13912
+ 'UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment.',
13907
13913
  'UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.',
13908
13914
  'UiCompositionPlan.contextScopes compiles constant context into explicit widget inputs and state context into explicit page.composition.links; runtime inheritance is never ambient.',
13909
13915
  'Widget keys and composition link ids are stable identities; array indexes are never canonical identities.',
@@ -14051,6 +14057,9 @@ function compileUiCompositionPlan(plan) {
14051
14057
  return {
14052
14058
  valid: true,
14053
14059
  page: {
14060
+ i18n: clone(plan.i18n),
14061
+ context: clone(plan.context),
14062
+ layout: clone(plan.layout),
14054
14063
  layoutPreset: plan.layoutPreset,
14055
14064
  layoutPresetOptions: clone(plan.layoutPresetOptions),
14056
14065
  canvas: resolveCanvas(plan),
@@ -14678,6 +14687,7 @@ function toWidgetInstance(widget, bindings) {
14678
14687
  const outputs = linkedTopLevelOutputs(widget.key, widget.outputs, bindings);
14679
14688
  return {
14680
14689
  key: widget.key,
14690
+ shell: clone(widget.shell),
14681
14691
  definition: {
14682
14692
  id: widget.componentId,
14683
14693
  bindingOrder: widget.bindingOrder,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/page-builder",
3
- "version": "9.0.5-rc.2",
3
+ "version": "9.0.5-rc.3",
4
4
  "description": "Page and widget builder utilities for Praxis UI (grid, dynamic widgets, editors).",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -8,9 +8,9 @@
8
8
  "@angular/forms": "^21.0.0",
9
9
  "@angular/cdk": "^21.0.0",
10
10
  "@angular/material": "^21.0.0",
11
- "@praxisui/ai": "^9.0.5-rc.2",
12
- "@praxisui/core": "^9.0.5-rc.2",
13
- "@praxisui/settings-panel": "^9.0.5-rc.2",
11
+ "@praxisui/ai": "^9.0.5-rc.3",
12
+ "@praxisui/core": "^9.0.5-rc.3",
13
+ "@praxisui/settings-panel": "^9.0.5-rc.3",
14
14
  "rxjs": "~7.8.0"
15
15
  },
16
16
  "dependencies": {
@@ -1534,6 +1534,7 @@ interface UiCompositionPlanWidget {
1534
1534
  key: string;
1535
1535
  componentId: string;
1536
1536
  role?: string;
1537
+ shell?: WidgetInstance['shell'];
1537
1538
  inputs?: Record<string, unknown>;
1538
1539
  outputs?: Record<string, unknown>;
1539
1540
  bindingOrder?: string[];
@@ -1596,6 +1597,12 @@ interface UiCompositionPlanContextScope {
1596
1597
  interface UiCompositionPlan {
1597
1598
  version: '1.0';
1598
1599
  kind: 'praxis.ui-composition-plan';
1600
+ /** Page-owned business copy compiled verbatim into WidgetPageDefinition.i18n. */
1601
+ i18n?: WidgetPageDefinition['i18n'];
1602
+ /** Explicit page-wide context compiled into WidgetPageDefinition.context. */
1603
+ context?: WidgetPageDefinition['context'];
1604
+ /** Canonical responsive grid layout compiled into WidgetPageDefinition.layout. */
1605
+ layout?: WidgetPageDefinition['layout'];
1599
1606
  layoutPreset?: string;
1600
1607
  layoutPresetOptions?: Record<string, unknown>;
1601
1608
  canvas?: WidgetPageCanvasLayout;