@praxisui/page-builder 9.0.67 → 9.0.68-rc.1
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 +302 -10
- package/ai/component-registry.json +76 -34
- package/fesm2022/praxisui-page-builder.mjs +3315 -1949
- package/package.json +4 -4
- package/types/praxisui-page-builder.d.ts +183 -45
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-09-
|
|
3
|
+
"generatedAt": "2026-09-09T11:40:45.048Z",
|
|
4
4
|
"packageName": "@praxisui/page-builder",
|
|
5
|
-
"packageVersion": "9.0.
|
|
5
|
+
"packageVersion": "9.0.68-rc.1",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -504,6 +504,12 @@
|
|
|
504
504
|
"valueKind": "string",
|
|
505
505
|
"description": "Altura base das linhas do canvas (ex: 80px)."
|
|
506
506
|
},
|
|
507
|
+
{
|
|
508
|
+
"path": "page.layout.paddingInline",
|
|
509
|
+
"category": "layout",
|
|
510
|
+
"valueKind": "string",
|
|
511
|
+
"description": "Margem lateral compartilhada da pagina: medida CSS ou var(); 0px remove, omitido herda o token --pdx-page-padding-inline do host. Override por deviceLayouts.*.layout.paddingInline."
|
|
512
|
+
},
|
|
507
513
|
{
|
|
508
514
|
"path": "page.canvas.gap",
|
|
509
515
|
"category": "layout",
|
|
@@ -631,6 +637,12 @@
|
|
|
631
637
|
"valueKind": "object",
|
|
632
638
|
"description": "Componente standalone que implementa SettingsValueProvider para editar definition.inputs."
|
|
633
639
|
},
|
|
640
|
+
{
|
|
641
|
+
"path": "ComponentDocMeta.configEditor.loadComponent",
|
|
642
|
+
"category": "widgets",
|
|
643
|
+
"valueKind": "object",
|
|
644
|
+
"description": "Loader assíncrono publicado pela lib dona para materializar o editor somente quando o authoring for solicitado."
|
|
645
|
+
},
|
|
634
646
|
{
|
|
635
647
|
"path": "ComponentDocMeta.configEditor.title",
|
|
636
648
|
"category": "widgets",
|
|
@@ -2061,6 +2073,24 @@
|
|
|
2061
2073
|
"shell": {
|
|
2062
2074
|
"type": "object",
|
|
2063
2075
|
"properties": {
|
|
2076
|
+
"avatar": {
|
|
2077
|
+
"type": "object",
|
|
2078
|
+
"additionalProperties": false,
|
|
2079
|
+
"properties": {
|
|
2080
|
+
"imageSrc": {
|
|
2081
|
+
"type": "string",
|
|
2082
|
+
"description": "Photo URL or shell template, including ${transient.employee.avatarUrl}."
|
|
2083
|
+
},
|
|
2084
|
+
"name": {
|
|
2085
|
+
"type": "string",
|
|
2086
|
+
"description": "Accessible name and initials fallback; supports shell templates."
|
|
2087
|
+
},
|
|
2088
|
+
"initials": {
|
|
2089
|
+
"type": "string",
|
|
2090
|
+
"description": "Optional explicit initials fallback."
|
|
2091
|
+
}
|
|
2092
|
+
}
|
|
2093
|
+
},
|
|
2064
2094
|
"stickyHeader": {
|
|
2065
2095
|
"type": "boolean",
|
|
2066
2096
|
"description": "Retain the existing header within the widget during page scrolling; suspended for drag authoring, collapsed/overlay states and scroll recovery."
|
|
@@ -3467,6 +3497,7 @@
|
|
|
3467
3497
|
"roundTripRequirements": [
|
|
3468
3498
|
"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.",
|
|
3469
3499
|
"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.",
|
|
3500
|
+
"Page side inset is authored through UiCompositionPlan.layout.paddingInline and materialized as page.layout.paddingInline. It accepts a CSS length or var(); 0px removes it and omission inherits the host --pdx-page-padding-inline token. Device-specific overrides live under deviceLayouts.*.layout.paddingInline. The inset belongs to the page, not to widget shell body padding or table cells.",
|
|
3470
3501
|
"UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.",
|
|
3471
3502
|
"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.",
|
|
3472
3503
|
"UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.",
|
|
@@ -3474,6 +3505,7 @@
|
|
|
3474
3505
|
"UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.",
|
|
3475
3506
|
"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.",
|
|
3476
3507
|
"Persisted wiring uses page.composition.links and must not write legacy connections.",
|
|
3508
|
+
"The connection editor supports format-value in WidgetPageDefinition links with explicit config.format. This does not extend the UiCompositionPlanTransform shorthand. Invalid date/mask values prevent delivery and retain the previous target; plan identity, empty state and failures together.",
|
|
3477
3509
|
"Nested component ports use component-port refs with nestedPath ending in a stable widget key.",
|
|
3478
3510
|
"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.",
|
|
3479
3511
|
"Agentic preview preflights UiCompositionPlan against the target registry and applies the attested WidgetPageDefinition; persistence rebuilds patch.page from that page while the surrounding envelope remains diagnostics/audit data.",
|
|
@@ -3709,9 +3741,9 @@
|
|
|
3709
3741
|
{
|
|
3710
3742
|
"chunkIndex": 2,
|
|
3711
3743
|
"chunkKind": "capabilities",
|
|
3712
|
-
"content": "Component 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, constant ou select-case total.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.fallbackValue\n Category: connections\n Kind: object\n Description: Fallback JSON explicito do pipeline quando a projecao resolve undefined; use null, objeto ou colecao conforme o contrato do destino.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.cases\n Category: connections\n Kind: array\n Description: Branches do select-case, cada uma com guarda Json Logic canonica em when e valor total em value.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.defaultValue\n Category: connections\n Kind: object\n Description: Valor total obrigatorio do select-case quando nenhuma branch corresponde; permite empty/reset sem um segundo binding.\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.
|
|
3744
|
+
"content": "Component 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, constant ou select-case total.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.fallbackValue\n Category: connections\n Kind: object\n Description: Fallback JSON explicito do pipeline quando a projecao resolve undefined; use null, objeto ou colecao conforme o contrato do destino.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.cases\n Category: connections\n Kind: array\n Description: Branches do select-case, cada uma com guarda Json Logic canonica em when e valor total em value.\n\nComponent Capability:\n - Path: uiCompositionPlan.bindings[].transform.defaultValue\n Category: connections\n Kind: object\n Description: Valor total obrigatorio do select-case quando nenhuma branch corresponde; permite empty/reset sem um segundo binding.\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.layout.paddingInline\n Category: layout\n Kind: string\n Description: Margem lateral compartilhada da pagina: medida CSS ou var(); 0px remove, omitido herda o token --pdx-page-padding-inline do host. Override por deviceLayouts.*.layout.paddingInline.\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.",
|
|
3713
3745
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
|
|
3714
|
-
"contentHash": "
|
|
3746
|
+
"contentHash": "1c2568286cfabf897c08293c33d554a66719468a715adeb3dd3a2112f3713e37",
|
|
3715
3747
|
"sourceKind": "component_definition",
|
|
3716
3748
|
"sourceId": "praxis-page-builder",
|
|
3717
3749
|
"corpusVersion": "1.0.0"
|
|
@@ -3719,9 +3751,9 @@
|
|
|
3719
3751
|
{
|
|
3720
3752
|
"chunkIndex": 3,
|
|
3721
3753
|
"chunkKind": "capabilities",
|
|
3722
|
-
"content": "Component 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.\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)
|
|
3754
|
+
"content": "Component 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.loadComponent\n Category: widgets\n Kind: object\n Description: Loader assíncrono publicado pela lib dona para materializar o editor somente quando o authoring for solicitado.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.title\n Category: widgets\n Kind: string\n Description: Titulo opcional usado pelo host ao abrir o editor de inputs do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.configEditor.contextResolver\n Category: widgets\n Kind: object\n Description: Resolver canonico de contexto transiente para o editor; catálogos, schemas, capabilities, targets e diagnostics devem ser passados por context/contextDiagnostics e nao persistidos em definition.inputs.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef\n Category: widgets\n Kind: object\n Description: Referencia canonica para o manifesto executavel de authoring por IA publicado pela lib dona do componente.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.componentId\n Category: widgets\n Kind: string\n Description: ID do componente no registry/backend de manifestos de authoring.\n\nComponent Capability:\n - Path: ComponentDocMeta.authoringManifestRef.source\n Category: widgets\n Kind: string\n Description: Simbolo, modulo ou registry id estavel do manifesto usado para delegar edicoes governadas.\n\nComponent Capability:\n - Path: page.composition\n Category: connections\n Kind: object\n Description: Envelope canonico da composicao persistida.\n\nComponent Capability:\n - Path: page.composition.version\n Category: connections\n Kind: string\n Description: Versao do envelope de composicao.\n\nComponent Capability:\n - Path: page.composition.links\n Category: connections\n Kind: array\n Description: Links canonicos entre widgets, estado e actions globais.\n\nComponent Capability:\n - Path: page.composition.links[].id\n Category: connections\n Kind: string\n Description: Identificador estavel do link.\n\nComponent Capability:\n - Path: page.composition.links[].from\n Category: connections\n Kind: object\n Description: Endpoint de origem do link.\n\nComponent Capability:\n - Path: page.composition.links[].to\n Category: connections\n Kind: object\n Description: Endpoint de destino do link.\n\nComponent Capability:\n - Path: page.composition.links[].to.kind\n Category: connections\n Kind: string\n Description: Tipo do endpoint de destino, incluindo global-action para command-dispatch declarativo.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.[actionId]\n Category: connections\n Kind: string\n Description: ID da action global quando page.composition.links[].to.kind = global-action.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payload\n Category: connections\n Kind: object\n Description: Payload estruturado opcional da action global persistida; quando omitido, o valor transformado do link segue como delivery value.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.payloadExpr\n Category: connections\n Kind: expression\n Description: Escape avancado explicito de payload da action global persistida.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.meta\n Category: connections\n Kind: object\n Description: Metadados opcionais do GlobalActionRef persistido, sem criar executor paralelo.\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de origem persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].from.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de origem. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath\n Category: connections\n Kind: array\n Description: NestedPath canonico em endpoint component-port de destino persistido. Omita para top-level; nao serialize nestedPath: [].\n\nComponent Capability:\n - Path: page.composition.links[].to.ref.nestedPath[].key\n Category: connections\n Kind: string\n Description: Chave estavel do widget filho no segmento terminal widget de destino. Obrigatoria para endpoint nested persistido.\n\nComponent Capability:\n - Path: page.composition.links[].intent\n Category: connections\n Kind: string\n Description: Intencao semantica do link.\n\nComponent Capability:\n - Path: page.composition.links[].transform\n Category: connections\n Kind: object\n Description: Pipeline de transformacao do link.\n\nComponent Capability:\n - Path: page.composition.links[].condition\n Category: connections\n Kind: expression\n Description: Guarda semantica opcional do link, expressa como um unico AST Json Logic canonico.\n\nComponent Capability:\n - Path: page.composition.links[].policy\n Category: connections\n Kind: object\n Description: Politicas operacionais opcionais do link, separadas da condition semantica.\n\nComponent Capability:\n - Path: page.composition.links[].metadata\n Category: connections\n Kind: object\n Description: Metadados opcionais do link.\n\nComponent Capability:\n - Path: page.context\n Category: context\n Kind: object\n Description: Contexto da pagina (compartilhado por widgets).",
|
|
3723
3755
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
|
|
3724
|
-
"contentHash": "
|
|
3756
|
+
"contentHash": "fe893bce91d45580181acff6ecec8cc2339eae2af9777b75d4a8bbc3223c0a91",
|
|
3725
3757
|
"sourceKind": "component_definition",
|
|
3726
3758
|
"sourceId": "praxis-page-builder",
|
|
3727
3759
|
"corpusVersion": "1.0.0"
|
|
@@ -3729,9 +3761,9 @@
|
|
|
3729
3761
|
{
|
|
3730
3762
|
"chunkIndex": 4,
|
|
3731
3763
|
"chunkKind": "capabilities",
|
|
3732
|
-
"content": "Capability Note:\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n\nCapability Note:\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.\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.\n\nCapability Note:\n - authoringCapabilities é um grant transitório do host para limitar affordances visíveis; não integra WidgetPageDefinition, não é persistido e não concede autoridade de edição à IA.",
|
|
3764
|
+
"content": "Capability Note:\n - page segue o modelo canonico WidgetPageDefinition (widgets, composition.links, context e state opcional); composition.links pode despachar actions globais via to.kind = global-action e receber continuations exatas via from.kind = global-action.\n\nCapability Note:\n - Conteudo editorial rico deve ser modelado como widget praxis-rich-content com definition.inputs.document: RichContentDocument, nao como DSL local do page-builder.\n\nCapability Note:\n - Quando definition.id = praxis-rich-content em uma pagina dinamica, definition.inputs.document continua sendo o contrato persistido; hostCapabilities e mediado em runtime pelo host praxis-dynamic-page e nao deve ser serializado no JSON da pagina.\n\nCapability Note:\n - Edicao visual de inputs de widget deve usar ComponentDocMeta.configEditor ou ComponentDocMeta.authoringManifestRef publicado pela lib dona do componente; nao criar editor local no page-builder para semantica de outro pacote.\n\nCapability Note:\n - Canvas e o modelo espacial canonico da pagina quando houver posicionamento explicito.\n\nCapability Note:\n - Taxonomia editorial: condition usa Json Logic canonico; transform usa pipeline declarativo; policy cobre apenas comportamento operacional.\n\nCapability Note:\n - Para criacao agentic de paginas, o preview pode trazer uiCompositionPlan como plano intermediario validavel; o page-builder compila esse plano para WidgetPageDefinition antes de aplicar.\n\nCapability Note:\n - UiCompositionPlan usa widgets[].componentId e bindings declarativos. UiCompositionPlanTemplateReference pode piná-lo por registryKey + configSha256, mas precisa ser resolvido pelo backend governado antes da compilação. O JSON persistido continua sendo page.widgets[].definition.id e page.composition.links.\n\nCapability Note:\n - Nested component ports usam endpoint component-port com nestedPath. O owner em ref.widget ou bindings[].*.widget continua sendo o widget top-level; a porta real do filho fica em port/direction e o caminho ate o filho fica em nestedPath.\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.\n\nCapability Note:\n - authoringCapabilities é um grant transitório do host para limitar affordances visíveis; não integra WidgetPageDefinition, não é persistido e não concede autoridade de edição à IA.",
|
|
3733
3765
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
|
|
3734
|
-
"contentHash": "
|
|
3766
|
+
"contentHash": "d2693a742ec80356a510dd6485d6c88210ba821f81281beb2de604f09c35ce4c",
|
|
3735
3767
|
"sourceKind": "component_definition",
|
|
3736
3768
|
"sourceId": "praxis-page-builder",
|
|
3737
3769
|
"corpusVersion": "1.0.0"
|
|
@@ -3789,9 +3821,9 @@
|
|
|
3789
3821
|
{
|
|
3790
3822
|
"chunkIndex": 10,
|
|
3791
3823
|
"chunkKind": "authoring_manifest",
|
|
3792
|
-
"content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\",\"shell.stickyHeader\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3824
|
+
"content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure widget shell Effects: compile-domain-patch. Rename the employees widget card and enable the refresh shell action.\",\"scope\":\"templating\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"shell\"],\"semanticTerms\":[\"widgetKey\",\"shell\",\"shell.avatar\",\"shell.stickyHeader\",\"shell.avatar.imageSrc\",\"shell.avatar.name\",\"shell.avatar.initials\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].shell\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3793
3825
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3794
|
-
"contentHash": "
|
|
3826
|
+
"contentHash": "5186f1865976a4f68245eb5891d95c41dca70de0eea153f296f7298981716ca5",
|
|
3795
3827
|
"sourceKind": "component_definition",
|
|
3796
3828
|
"sourceId": "praxis-page-builder",
|
|
3797
3829
|
"corpusVersion": "1.0.0"
|
|
@@ -3899,9 +3931,9 @@
|
|
|
3899
3931
|
{
|
|
3900
3932
|
"chunkIndex": 21,
|
|
3901
3933
|
"chunkKind": "authoring_manifest",
|
|
3902
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"page.configure\",\"title\":\"Configure page metadata\",\"scope\":\"global\",\"targetKind\":\"page\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition\",\"DynamicPageConfigEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.title\",\"page.layoutPreset\",\"page.themePreset\",\"page.context\",\"page.metadata\"],\"identityKeys\":[\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"page-not-loaded\",\"context-not-json\",\"settings-panel-bridge-missing\"],\"description\":\"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"}}],\"validators\":[\"widget-page-definition-valid\",\"no-legacy-grid-page-definition\",\"page-context-json-valid\",\"settings-panel-round-trip-valid\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"canvas.configure\",\"title\":\"Configure page canvas\",\"scope\":\"layout\",\"targetKind\":\"canvas\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-canvas-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas\",\"DynamicPageBuilderComponent\"],\"writes\":[\"page.canvas.columns\",\"page.canvas.rowUnit\",\"page.canvas.gap\",\"page.canvas.items\"],\"identityKeys\":[\"canvas\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"failureModes\":[\"canvas-missing\",\"canvas-item-references-missing-widget\",\"invalid-grid-geometry\"],\"description\":\"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"}}],\"validators\":[\"canvas-columns-integer\",\"canvas-row-unit-valid\",\"canvas-gap-valid\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"widget.add\",\"title\":\"Add widget to page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas\",\"ComponentDocRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-key-duplicate\",\"component-not-registered\",\"canvas-item-invalid\",\"child-input-contract-unknown\"],\"description\":\"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"}}],\"validators\":[\"widget-key-unique\",\"component-registered\",\"canvas-item-valid\",\"child-inputs-delegated\",\"widget-key-not-array-index\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"widget.remove\",\"title\":\"Remove widget from page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\",\"page.composition.links[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"destructive-removal-not-confirmed\",\"dangling-composition-link\"],\"description\":\"Removes a widget and cleans canvas items and composition links that reference it.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"widget-exists\",\"destructive-removal-confirmed\",\"composition-links-cleaned\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.moveResize\",\"title\":\"Move or resize widget\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-move-resize\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.widgets\"],\"writes\":[\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"canvas-item-invalid\",\"canvas-overlap-invalid\"],\"description\":\"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"}}],\"validators\":[\"widget-exists\",\"canvas-item-valid\",\"canvas-item-targets-existing-widget\",\"canvas-overlap-policy-valid\"],\"affectedPaths\":[\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]}
|
|
3934
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"page.configure\",\"title\":\"Configure page metadata\",\"scope\":\"global\",\"targetKind\":\"page\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition\",\"DynamicPageConfigEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.title\",\"page.layoutPreset\",\"page.themePreset\",\"page.context\",\"page.metadata\"],\"identityKeys\":[\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"page-not-loaded\",\"context-not-json\",\"settings-panel-bridge-missing\"],\"description\":\"Updates root page metadata while preserving the renderable WidgetPageDefinition shape.\"}}],\"validators\":[\"widget-page-definition-valid\",\"no-legacy-grid-page-definition\",\"page-context-json-valid\",\"settings-panel-round-trip-valid\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"canvas.configure\",\"title\":\"Configure page canvas\",\"scope\":\"layout\",\"targetKind\":\"canvas\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-canvas-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas\",\"DynamicPageBuilderComponent\"],\"writes\":[\"page.canvas.columns\",\"page.canvas.rowUnit\",\"page.canvas.gap\",\"page.canvas.items\"],\"identityKeys\":[\"canvas\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"columns\":{\"type\":\"number\"},\"rowUnit\":{\"type\":\"number\"},\"gap\":{\"type\":\"number\"},\"items\":{\"type\":\"array\"}}},\"failureModes\":[\"canvas-missing\",\"canvas-item-references-missing-widget\",\"invalid-grid-geometry\"],\"description\":\"Configures the top-level canvas without introducing legacy GridPageDefinition semantics.\"}}],\"validators\":[\"canvas-columns-integer\",\"canvas-row-unit-valid\",\"canvas-gap-valid\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"widget.add\",\"title\":\"Add widget to page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas\",\"ComponentDocRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"componentId\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"componentId\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"inputs\":{\"type\":\"object\"},\"canvasItem\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-key-duplicate\",\"component-not-registered\",\"canvas-item-invalid\",\"child-input-contract-unknown\"],\"description\":\"Adds a registered component as a widget and places it on the canvas using a stable widgetKey.\"}}],\"validators\":[\"widget-key-unique\",\"component-registered\",\"canvas-item-valid\",\"child-inputs-delegated\",\"widget-key-not-array-index\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"widget.remove\",\"title\":\"Remove widget from page\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.widgets[]\",\"page.canvas.items[]\",\"page.composition.links[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"destructive-removal-not-confirmed\",\"dangling-composition-link\"],\"description\":\"Removes a widget and cleans canvas items and composition links that reference it.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"widget-exists\",\"destructive-removal-confirmed\",\"composition-links-cleaned\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"widget.moveResize\",\"title\":\"Move or resize widget\",\"scope\":\"layout\",\"targetKind\":\"widget\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"canvasItem\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-move-resize\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.canvas.items\",\"WidgetPageDefinition.widgets\"],\"writes\":[\"page.canvas.items[]\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"canvas-item-invalid\",\"canvas-overlap-invalid\"],\"description\":\"Updates canvas placement for an existing widget using widgetKey as the stable identity.\"}}],\"validators\":[\"widget-exists\",\"canvas-item-valid\",\"canvas-item-targets-existing-widget\",\"canvas-overlap-policy-valid\"],\"affectedPaths\":[\"canvas.items[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]}]}",
|
|
3903
3935
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3904
|
-
"contentHash": "
|
|
3936
|
+
"contentHash": "6706a22ebbb3746701fd3af3fa1a5a2672fac4bf9c26833c5b48d3f1745132b7",
|
|
3905
3937
|
"sourceKind": "component_definition",
|
|
3906
3938
|
"sourceId": "praxis-page-builder",
|
|
3907
3939
|
"corpusVersion": "1.0.0"
|
|
@@ -3909,9 +3941,9 @@
|
|
|
3909
3941
|
{
|
|
3910
3942
|
"chunkIndex": 22,
|
|
3911
3943
|
"chunkKind": "authoring_manifest",
|
|
3912
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]}
|
|
3944
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"widget.shell.configure\",\"title\":\"Configure widget shell\",\"scope\":\"templating\",\"targetKind\":\"widgetShell\",\"target\":{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"shell\":{\"type\":\"object\",\"properties\":{\"avatar\":{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"imageSrc\":{\"type\":\"string\",\"description\":\"Photo URL or shell template, including ${transient.employee.avatarUrl}.\"},\"name\":{\"type\":\"string\",\"description\":\"Accessible name and initials fallback; supports shell templates.\"},\"initials\":{\"type\":\"string\",\"description\":\"Optional explicit initials fallback.\"}}},\"stickyHeader\":{\"type\":\"boolean\",\"description\":\"Retain the existing header within the widget during page scrolling; suspended for drag authoring, collapsed/overlay states and scroll recovery.\"}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-widget-shell-configure\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"WidgetShellEditorComponent\",\"SettingsPanelBridge\"],\"writes\":[\"page.widgets[].shell\"],\"identityKeys\":[\"widgetKey\"],\"failureModes\":[\"widget-not-found\",\"settings-panel-bridge-missing\",\"shell-config-invalid\"],\"description\":\"Updates the page-builder-owned widget shell without editing child component inputs.\"}}],\"validators\":[\"widget-exists\",\"widget-shell-shape-valid\",\"settings-panel-bridge-available\",\"child-inputs-not-mutated\"],\"affectedPaths\":[\"widgets[].shell\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\"]},{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]}]}",
|
|
3913
3945
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3914
|
-
"contentHash": "
|
|
3946
|
+
"contentHash": "16f9dc001bd8f81587dc824a4e82c0bc835aaa7d6a154b27041bcf2d1f780acb",
|
|
3915
3947
|
"sourceKind": "component_definition",
|
|
3916
3948
|
"sourceId": "praxis-page-builder",
|
|
3917
3949
|
"corpusVersion": "1.0.0"
|
|
@@ -3919,9 +3951,9 @@
|
|
|
3919
3951
|
{
|
|
3920
3952
|
"chunkIndex": 23,
|
|
3921
3953
|
"chunkKind": "authoring_manifest",
|
|
3922
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.plan.compile\",\"title\":\"Compile UI composition plan\",\"scope\":\"rules\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"uiCompositionPlan\"],\"properties\":{\"uiCompositionPlan\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-ui-composition-plan-compile\",\"handlerContract\":{\"reads\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"UiCompositionPlan.bindings[].transform.fallbackValue\",\"UiCompositionPlan.bindings[].transform.select-case\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"preflightUiCompositionPlan\",\"ComponentMetadataRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]}
|
|
3954
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"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\":[\"UiCompositionPlanAuthoringInput\",\"UiCompositionPlan\",\"UiCompositionPlanTemplateReference\",\"UiCompositionPlanTemplateMaterialization\",\"UiCompositionPlan.i18n\",\"UiCompositionPlan.context\",\"UiCompositionPlan.layout\",\"UiCompositionPlan.selectionSyncs\",\"UiCompositionPlan.contextScopes\",\"UiCompositionPlan.bindings[].transform.fallbackValue\",\"UiCompositionPlan.bindings[].transform.select-case\",\"resolveUiCompositionPlanTemplate\",\"compileUiCompositionPlan\",\"preflightUiCompositionPlan\",\"ComponentMetadataRegistry\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\",\"ComponentDocMeta.configEditor\"],\"writes\":[\"compiledFormPatch.patch.page\"],\"identityKeys\":[\"uiCompositionPlan.id\",\"widgetKey\",\"uiCompositionPlan.bindings[].id\",\"uiCompositionPlan.selectionSyncs[].id\",\"uiCompositionPlan.contextScopes[].id\"],\"failureModes\":[\"ui-composition-plan-invalid\",\"ui-composition-template-reference-invalid\",\"ui-composition-template-not-found\",\"ui-composition-template-hash-mismatch\",\"ui-composition-template-overrides-unsupported\",\"widget-catalog-missing\",\"compiled-page-invalid\",\"child-config-editor-missing\"],\"description\":\"Resolves an optional exact governed template reference and compiles the expanded UiCompositionPlan into a renderable WidgetPageDefinition patch.page.\"}}],\"validators\":[\"ui-composition-plan-valid\",\"compiled-page-valid\",\"widget-keys-unique\",\"composition-endpoints-resolve\",\"canvas-items-reference-existing-widgets\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"submissionImpact\":\"none\",\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"]},{\"operationId\":\"state.set\",\"title\":\"Set page state value\",\"scope\":\"dataBinding\",\"targetKind\":\"state\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"path\",\"value\"],\"properties\":{\"path\":{\"type\":\"string\"},\"value\":{},\"layer\":{\"enum\":[\"page\",\"session\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-state-set\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.state\",\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.state\"],\"identityKeys\":[\"path\"],\"failureModes\":[\"state-path-invalid\",\"state-json-invalid\",\"composition-state-link-invalid\"],\"description\":\"Sets canonical page state used by composition links without creating host-only binding paths.\"}}],\"validators\":[\"state-path-valid\",\"state-layer-valid\",\"state-json-valid\",\"composition-state-links-still-valid\"],\"affectedPaths\":[\"state\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\"]},{\"operationId\":\"page.preview.apply\",\"title\":\"Apply agentic preview locally\",\"scope\":\"interaction\",\"targetKind\":\"agenticPreview\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"previewId\"],\"properties\":{\"previewId\":{\"type\":\"string\"},\"compiledFormPatch\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-preview-apply\",\"handlerContract\":{\"reads\":[\"UiCompositionPlan\",\"PageBuilderAiAdapter.applyUiCompositionPlan\",\"ComponentMetadataRegistry\",\"CompositionValidatorService.validatePage\",\"compiledFormPatch.patch.page\",\"PraxisAssistantTurnViewState\"],\"writes\":[\"DynamicPageBuilderComponent.page\",\"pageChange\"],\"identityKeys\":[\"previewId\"],\"failureModes\":[\"preview-result-invalid\",\"target-registry-missing\",\"component-not-registered\",\"component-not-materializable\",\"port-not-registered\",\"port-contract-incompatible\",\"patch-page-missing\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Preflights UiCompositionPlan against the target runtime registry and canonical Core composition validator before applying the attested WidgetPageDefinition locally.\"}}],\"validators\":[\"preview-result-valid\",\"ui-composition-target-registry-available\",\"ui-composition-components-materializable\",\"composition-endpoints-resolve\",\"compiled-page-patch-present\",\"no-envelope-runtime-persistence\",\"runtime-page-valid\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"agentic-preview-loaded\"]},{\"operationId\":\"page.persist.save\",\"title\":\"Persist page through config API\",\"scope\":\"interaction\",\"targetKind\":\"pageIdentity\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"pageIdentity\"],\"properties\":{\"pageIdentity\":{\"type\":\"object\"},\"page\":{\"type\":\"object\"},\"etag\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-page-persist-save\",\"handlerContract\":{\"reads\":[\"pageIdentity\",\"WidgetPageDefinition\",\"PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS\",\"ui_user_config ETag\"],\"writes\":[\"POST/PUT /api/praxis/config/ui-user-config\",\"If-Match\"],\"identityKeys\":[\"pageIdentity.componentType\",\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"failureModes\":[\"page-identity-incomplete\",\"etag-conflict\",\"runtime-page-invalid\",\"patch-envelope-persistence-attempted\"],\"description\":\"Persists the renderable WidgetPageDefinition with pageIdentity and ETag delegated to praxis-config-starter.\"}}],\"validators\":[\"page-identity-complete\",\"etag-policy-valid\",\"runtime-page-valid\",\"no-envelope-runtime-persistence\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"page-identity-known\"]}]}",
|
|
3923
3955
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3924
|
-
"contentHash": "
|
|
3956
|
+
"contentHash": "2daee98ccc409f7dae96a0744b6d05b5f36198af4160e9d6e67474c9427de839",
|
|
3925
3957
|
"sourceKind": "component_definition",
|
|
3926
3958
|
"sourceId": "praxis-page-builder",
|
|
3927
3959
|
"corpusVersion": "1.0.0"
|
|
@@ -3929,6 +3961,16 @@
|
|
|
3929
3961
|
{
|
|
3930
3962
|
"chunkIndex": 24,
|
|
3931
3963
|
"chunkKind": "authoring_manifest",
|
|
3964
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"childOperation.delegate\",\"title\":\"Delegate widget child operation\",\"scope\":\"global\",\"targetKind\":\"childOperation\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-child-operation-delegate\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.widgets\",\"ComponentDocMeta.configEditor\",\"child ComponentAuthoringManifest\",\"PAGE_BUILDER_WIDGET_AI_CATALOGS\"],\"writes\":[\"page.widgets[].definition.inputs\"],\"identityKeys\":[\"widgetKey\",\"childComponentId\",\"childOperationId\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":{\"widgetKey\":{\"type\":\"string\"},\"childComponentId\":{\"type\":\"string\"},\"childOperationId\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"},\"childTarget\":{\"type\":\"object\"},\"childParams\":{\"type\":\"object\"}}},\"failureModes\":[\"widget-not-found\",\"child-manifest-missing\",\"child-operation-unknown\",\"local-child-input-write-attempted\"],\"description\":\"Delegates child widget input edits to the owning manifest or configEditor instead of redefining child semantics in page-builder.\"}}],\"validators\":[\"widget-exists\",\"child-manifest-available\",\"child-operation-known\",\"component-config-editor-respected\",\"no-local-child-input-write\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"]}]}",
|
|
3965
|
+
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3966
|
+
"contentHash": "d6e7801eb3e562cafd948e46d36fb9e81de0bdba7dcc39768a2c359e6efca892",
|
|
3967
|
+
"sourceKind": "component_definition",
|
|
3968
|
+
"sourceId": "praxis-page-builder",
|
|
3969
|
+
"corpusVersion": "1.0.0"
|
|
3970
|
+
},
|
|
3971
|
+
{
|
|
3972
|
+
"chunkIndex": 25,
|
|
3973
|
+
"chunkKind": "authoring_manifest",
|
|
3932
3974
|
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"},{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"},{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"},{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"},{\"validatorId\":\"widget-shell-shape-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SHELL_SHAPE\",\"description\":\"Widget shell config must match the shell editor contract.\"},{\"validatorId\":\"settings-panel-bridge-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_BRIDGE\",\"description\":\"Settings panel bridge must be available for shell/page editors.\"},{\"validatorId\":\"child-inputs-not-mutated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_NOT_MUTATED\",\"description\":\"Shell edits cannot mutate child inputs.\"},{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"},{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"},{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"},{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"}]}",
|
|
3933
3975
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3934
3976
|
"contentHash": "96179c791c97c06699402dac0eac69b553386ca55a1f92446e8fe8b43776745c",
|
|
@@ -3937,7 +3979,7 @@
|
|
|
3937
3979
|
"corpusVersion": "1.0.0"
|
|
3938
3980
|
},
|
|
3939
3981
|
{
|
|
3940
|
-
"chunkIndex":
|
|
3982
|
+
"chunkIndex": 26,
|
|
3941
3983
|
"chunkKind": "authoring_manifest",
|
|
3942
3984
|
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}]}",
|
|
3943
3985
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
@@ -3947,17 +3989,17 @@
|
|
|
3947
3989
|
"corpusVersion": "1.0.0"
|
|
3948
3990
|
},
|
|
3949
3991
|
{
|
|
3950
|
-
"chunkIndex":
|
|
3992
|
+
"chunkIndex": 27,
|
|
3951
3993
|
"chunkKind": "authoring_manifest",
|
|
3952
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"WidgetPageDefinition is the canonical persisted runtime page shape for page-builder.\",\"UiCompositionPlan is an intermediate agentic plan and must compile before local preview/apply.\",\"UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.\",\"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.\",\"UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.\",\"UiCompositionPlan transforms devem ser totais: use fallbackValue para invalidacao de selecao e select-case com defaultValue para materializar conteudo ou empty/reset sem bindings clear paralelos.\",\"UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.\",\"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\"Persisted wiring uses page.composition.links and must not write legacy connections.\",\"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\"Agentic preview preflights UiCompositionPlan against the target registry and applies the attested WidgetPageDefinition; persistence rebuilds patch.page from that page while the surrounding envelope remains diagnostics/audit data.\",\"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"]}",
|
|
3994
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.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.\",\"Page side inset is authored through UiCompositionPlan.layout.paddingInline and materialized as page.layout.paddingInline. It accepts a CSS length or var(); 0px removes it and omission inherits the host --pdx-page-padding-inline token. Device-specific overrides live under deviceLayouts.*.layout.paddingInline. The inset belongs to the page, not to widget shell body padding or table cells.\",\"UiCompositionPlan.i18n, context and layout compile into the corresponding WidgetPageDefinition fields so a complete page never depends on host-only enrichment. A key-only PraxisTextValue receives text from the fallbackLocale dictionary when available.\",\"UiCompositionPlan.selectionSyncs is an authoring shorthand that compiles into explicit canonical page.composition.links and is never persisted in WidgetPageDefinition.\",\"UiCompositionPlan.contextScopes compiles constants and state.initial into explicit widget inputs, and state context into explicit page.composition.links; runtime inheritance is never ambient.\",\"UiCompositionPlan transforms devem ser totais: use fallbackValue para invalidacao de selecao e select-case com defaultValue para materializar conteudo ou empty/reset sem bindings clear paralelos.\",\"UiCompositionPlan global-action sources declare only actionId; dynamicPage.composition.dispatch supplies the runtime payload, and target-only payload fields fail closed on sources.\",\"Widget keys and composition link ids are stable identities; array indexes are never canonical identities.\",\"Persisted wiring uses page.composition.links and must not write legacy connections.\",\"The connection editor supports format-value in WidgetPageDefinition links with explicit config.format. This does not extend the UiCompositionPlanTransform shorthand. Invalid date/mask values prevent delivery and retain the previous target; plan identity, empty state and failures together.\",\"Nested component ports use component-port refs with nestedPath ending in a stable widget key.\",\"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.\",\"Agentic preview preflights UiCompositionPlan against the target registry and applies the attested WidgetPageDefinition; persistence rebuilds patch.page from that page while the surrounding envelope remains diagnostics/audit data.\",\"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.\",\"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.\"]}",
|
|
3953
3995
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3954
|
-
"contentHash": "
|
|
3996
|
+
"contentHash": "9a24bbf23a95d1fb531bd523b0cde9903adad44b53d578b18d9264d4d0de8cab",
|
|
3955
3997
|
"sourceKind": "component_definition",
|
|
3956
3998
|
"sourceId": "praxis-page-builder",
|
|
3957
3999
|
"corpusVersion": "1.0.0"
|
|
3958
4000
|
},
|
|
3959
4001
|
{
|
|
3960
|
-
"chunkIndex":
|
|
4002
|
+
"chunkIndex": 28,
|
|
3961
4003
|
"chunkKind": "authoring_manifest",
|
|
3962
4004
|
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.0\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true},{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true},{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true},{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true},{\"id\":\"configure-widget-shell\",\"request\":\"Rename the employees widget card and enable the refresh shell action.\",\"operationId\":\"widget.shell.configure\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"shell\":{\"title\":\"Employees\",\"actions\":[{\"id\":\"refresh\"}]}},\"isPositive\":true},{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true},{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true},{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true},{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true},{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true},{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true},{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true},{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false},{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
|
|
3963
4005
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
@@ -3967,7 +4009,7 @@
|
|
|
3967
4009
|
"corpusVersion": "1.0.0"
|
|
3968
4010
|
},
|
|
3969
4011
|
{
|
|
3970
|
-
"chunkIndex":
|
|
4012
|
+
"chunkIndex": 29,
|
|
3971
4013
|
"chunkKind": "context_pack",
|
|
3972
4014
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"version\":\"v1.3\",\"optionsByPath\":{\"page.canvas.columns\":{\"mode\":\"suggested\",\"options\":[{\"value\":6,\"label\":\"6 colunas\"},{\"value\":8,\"label\":\"8 colunas\"},{\"value\":12,\"label\":\"12 colunas\"},{\"value\":16,\"label\":\"16 colunas\"}]},\"page.canvas.rowUnit\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"64px\",\"label\":\"64px\"},{\"value\":\"80px\",\"label\":\"80px\"},{\"value\":\"100px\",\"label\":\"100px\"},{\"value\":\"120px\",\"label\":\"120px\"}]},\"page.canvas.gap\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"8px\",\"label\":\"8px\"},{\"value\":\"12px\",\"label\":\"12px\"},{\"value\":\"16px\",\"label\":\"16px\"},{\"value\":\"24px\",\"label\":\"24px\"}]},\"page.widgets[].definition.id\":{\"mode\":\"enum\",\"options\":[{\"value\":\"praxis-crud\",\"label\":\"Praxis CRUD\"},{\"value\":\"praxis-table\",\"label\":\"Praxis Table\"},{\"value\":\"praxis-dynamic-form\",\"label\":\"Praxis Dynamic Form\"},{\"value\":\"praxis-list\",\"label\":\"Praxis List\"},{\"value\":\"praxis-tabs\",\"label\":\"Praxis Tabs\"},{\"value\":\"praxis-stepper\",\"label\":\"Praxis Stepper\"},{\"value\":\"praxis-expansion\",\"label\":\"Praxis Expansion\"},{\"value\":\"praxis-files-upload\",\"label\":\"Praxis Files Upload\"},{\"value\":\"praxis-rich-content\",\"label\":\"Praxis Rich Content\"},{\"value\":\"pdx-cron-builder\",\"label\":\"Praxis Cron Builder\"},{\"value\":\"praxis-settings-panel\",\"label\":\"Praxis Settings Panel\"},{\"value\":\"praxis-dashboard-stats\",\"label\":\"Praxis Dashboard Stats\"},{\"value\":\"praxis-chart\",\"label\":\"Praxis Chart\"}]},\"uiCompositionPlan.widgets[].componentId\":{\"mode\":\"enum\",\"options\":[{\"value\":\"praxis-crud\",\"label\":\"Praxis CRUD\"},{\"value\":\"praxis-table\",\"label\":\"Praxis Table\"},{\"value\":\"praxis-dynamic-form\",\"label\":\"Praxis Dynamic Form\"},{\"value\":\"praxis-list\",\"label\":\"Praxis List\"},{\"value\":\"praxis-tabs\",\"label\":\"Praxis Tabs\"},{\"value\":\"praxis-stepper\",\"label\":\"Praxis Stepper\"},{\"value\":\"praxis-expansion\",\"label\":\"Praxis Expansion\"},{\"value\":\"praxis-files-upload\",\"label\":\"Praxis Files Upload\"},{\"value\":\"praxis-rich-content\",\"label\":\"Praxis Rich Content\"},{\"value\":\"pdx-cron-builder\",\"label\":\"Praxis Cron Builder\"},{\"value\":\"praxis-settings-panel\",\"label\":\"Praxis Settings Panel\"},{\"value\":\"praxis-dashboard-stats\",\"label\":\"Praxis Dashboard Stats\"},{\"value\":\"praxis-chart\",\"label\":\"Praxis Chart\"}]}}}}",
|
|
3973
4015
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
|
|
@@ -3977,7 +4019,7 @@
|
|
|
3977
4019
|
"corpusVersion": "1.0.0"
|
|
3978
4020
|
},
|
|
3979
4021
|
{
|
|
3980
|
-
"chunkIndex":
|
|
4022
|
+
"chunkIndex": 30,
|
|
3981
4023
|
"chunkKind": "context_pack",
|
|
3982
4024
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"ui-composition-plan.create\",\"intentExamples\":[\"ui composition plan\",\"agentic page plan\",\"master detail\",\"dashboard composition\",\"nested component ports\",\"nestedPath\",\"planejar pagina\",\"composicao declarativa\"],\"patchTemplate\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"layoutPreset\":\"{{params.layoutPreset}}\",\"state\":\"{{params.state}}\",\"widgets\":\"{{params.widgets}}\",\"bindings\":\"{{params.bindings}}\"}}},{\"id\":\"page.canvas.columns.set\",\"intentExamples\":[\"columns\",\"canvas columns\",\"grid columns\",\"colunas do canvas\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"columns\":\"{{value}}\"}}}},{\"id\":\"page.canvas.rowUnit.set\",\"intentExamples\":[\"row height\",\"row size\",\"canvas row\",\"altura da linha\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"rowUnit\":\"{{value}}\"}}}},{\"id\":\"page.canvas.gap.set\",\"intentExamples\":[\"gap\",\"spacing\",\"canvas gap\",\"espaçamento\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"gap\":\"{{value}}\"}}}},{\"id\":\"page.context.set\",\"intentExamples\":[\"page context\",\"context variable\",\"variavel de contexto\"],\"patchTemplate\":{\"page\":{\"context\":{\"{{params.key}}\":\"{{value}}\"}}}},{\"id\":\"widget.add\",\"intentExamples\":[\"add widget\",\"new widget\",\"add component\",\"adicionar componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"id\":\"{{params.componentId}}\"}}],\"canvas\":{\"items\":{\"{{target}}\":{\"col\":1,\"row\":1,\"colSpan\":4,\"rowSpan\":2}}}}}},{\"id\":\"widget.remove\",\"intentExamples\":[\"remove widget\",\"delete widget\",\"remover componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"_delete\":true}]}}},{\"id\":\"widget.component.set\",\"intentExamples\":[\"widget type\",\"component id\",\"widget component\",\"tipo do componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"id\":\"{{value}}\"}}]}}},{\"id\":\"widget.className.set\",\"intentExamples\":[\"widget class\",\"css class\",\"classe css\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"className\":\"{{value}}\"}]}}},{\"id\":\"widget.canvasItem.set\",\"intentExamples\":[\"move widget\",\"resize widget\",\"widget canvas\",\"posicionar\"],\"patchTemplate\":{\"page\":{\"canvas\":{\"items\":{\"{{target}}\":{\"col\":\"{{params.col}}\",\"row\":\"{{params.row}}\",\"colSpan\":\"{{params.colSpan}}\",\"rowSpan\":\"{{params.rowSpan}}\"}}}}}},{\"id\":\"widget.inputs.set\",\"intentExamples\":[\"widget inputs\",\"configure widget\",\"set inputs\",\"configurar componente\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"inputs\":\"{{value}}\"}}]}}},{\"id\":\"widget.bindingOrder.set\",\"intentExamples\":[\"binding order\",\"input order\",\"ordem de inputs\"],\"patchTemplate\":{\"page\":{\"widgets\":[{\"key\":\"{{target}}\",\"definition\":{\"bindingOrder\":\"{{value}}\"}}]}}},{\"id\":\"connection.add\",\"intentExamples\":[\"connect widgets\",\"link widgets\",\"wire output\",\"create connection\",\"nested component port\",\"nestedPath\",\"conectar\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.set_static\",\"intentExamples\":[\"set input value\",\"static connection\",\"valor fixo na conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.map.set\",\"intentExamples\":[\"map connection\",\"update map\",\"mapear conexao\",\"atualizar map\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"transform\":\"{{value}}\",\"metadata\":{\"source\":\"persisted-composition-link\"}}]}}}},{\"id\":\"connection.condition.set\",\"intentExamples\":[\"connection condition\",\"link condition\",\"json logic guard\",\"condicao da conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"condition\":\"{{value}}\"}]}}}},{\"id\":\"connection.policy.set\",\"intentExamples\":[\"connection policy\",\"debounce\",\"distinct\",\"missing value policy\",\"politica da conexao\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"intent\":\"event-propagation\",\"policy\":\"{{value}}\"}]}}}},{\"id\":\"connection.remove\",\"intentExamples\":[\"remove connection\",\"unlink widgets\",\"desconectar\"],\"patchTemplate\":{\"page\":{\"composition\":{\"version\":\"1.0.0\",\"links\":[{\"id\":\"{{params.fromWidget}}.{{params.fromOutput}}->{{params.toWidget}}.{{params.toInput}}\",\"from\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.fromWidget}}\",\"port\":\"{{params.fromOutput}}\",\"direction\":\"output\"}},\"to\":{\"kind\":\"component-port\",\"ref\":{\"widget\":\"{{params.toWidget}}\",\"port\":\"{{params.toInput}}\",\"direction\":\"input\"}},\"_delete\":true}]}}}}],\"fieldResolvers\":{\"page.widgets[]\":[\"key\",\"definition.id\"],\"page.composition.links[]\":[\"id\"]}}}",
|
|
3983
4025
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
|
|
@@ -3987,7 +4029,7 @@
|
|
|
3987
4029
|
"corpusVersion": "1.0.0"
|
|
3988
4030
|
},
|
|
3989
4031
|
{
|
|
3990
|
-
"chunkIndex":
|
|
4032
|
+
"chunkIndex": 31,
|
|
3991
4033
|
"chunkKind": "context_pack",
|
|
3992
4034
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"hints\":[\"For agentic page creation, prefer returning uiCompositionPlan in the preview envelope and let the page-builder compiler emit WidgetPageDefinition.\",\"Carry page-owned i18n, explicit context, canonical layout and governed widget shell in uiCompositionPlan; when a PraxisTextValue key exists in the fallbackLocale dictionary, omit repeated text and let the compiler materialize the executable fallback.\",\"Use uiCompositionPlan.widgets[].componentId in plans; the compiler maps it to page.widgets[].definition.id.\",\"Use uiCompositionPlan.selectionSyncs for repeated selection projections, contextScopes for repeated explicit widget context, and bindings for remaining wiring; constant values and state.initial become explicit inputs, while state references compile to page.composition.links.\",\"Para invalidacao de selecao, use fallbackValue no mesmo transform pick-path. Para materializar conteudo ou empty/reset em um unico binding, use select-case com branches when/value e defaultValue total; nao crie pares condition + :clear.\",\"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.\"]}}",
|
|
3993
4035
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-context-pack.ts",
|
|
@@ -3997,7 +4039,7 @@
|
|
|
3997
4039
|
"corpusVersion": "1.0.0"
|
|
3998
4040
|
},
|
|
3999
4041
|
{
|
|
4000
|
-
"chunkIndex":
|
|
4042
|
+
"chunkIndex": 32,
|
|
4001
4043
|
"chunkKind": "recipe",
|
|
4002
4044
|
"content": "{\"_comment\":\"Receita de Dashboard (Grid Page) com Tabela Mestre e Formulário Detalhe conectados.\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"master-detail\",\"useWhen\":\"Page builder layout with master table and detail form.\",\"examplePrompts\":[\"create a master detail page with table and form\",\"set up a grid page with table + detail form\"]},\"options\":{\"cols\":12,\"rowHeight\":80,\"gap\":16,\"compactType\":\"vertical\"},\"widgets\":[{\"key\":\"userTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"email\",\"header\":\"Email\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"userDetailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"email\"]}]},{\"columns\":[{\"fields\":[\"role\",\"status\"]}]}]}]}}}},{\"key\":\"statsCard\",\"layout\":{\"col\":1,\"row\":7,\"colSpan\":4,\"rowSpan\":2},\"definition\":{\"id\":\"praxis-custom-card\",\"inputs\":{\"title\":\"Total Selecionado\",\"content\":\"Nenhum\"}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"userDetailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"},{\"_comment\":\"Ao clicar na linha, atualiza o título do card de estatísticas\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"statsCard\",\"input\":\"inputs.content\"},\"map\":\"Selecionado: ${payload.row.name}\"}]}",
|
|
4003
4045
|
"sourcePointer": "examples/ai-recipes/praxis-dynamic-grid-page.json",
|
|
@@ -4007,7 +4049,7 @@
|
|
|
4007
4049
|
"corpusVersion": "1.0.0"
|
|
4008
4050
|
},
|
|
4009
4051
|
{
|
|
4010
|
-
"chunkIndex":
|
|
4052
|
+
"chunkIndex": 33,
|
|
4011
4053
|
"chunkKind": "recipe",
|
|
4012
4054
|
"content": "{\"_comment\":\"Receita para Page Builder usando Gridster e conexões entre widgets.\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"base\",\"useWhen\":\"Base page builder layout with gridster widgets.\",\"examplePrompts\":[\"create a page builder layout\",\"set up a gridster page with table and form\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"userTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"email\",\"header\":\"Email\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"userDetailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"email\"]}]},{\"columns\":[{\"fields\":[\"role\",\"status\"]}]}]}]}}}},{\"_comment\":\"Componente custom do app; substitua por um id registrado no ComponentMetadataRegistry.\",\"key\":\"statsCard\",\"layout\":{\"col\":1,\"row\":7,\"colSpan\":4,\"rowSpan\":2},\"definition\":{\"id\":\"praxis-custom-card\",\"inputs\":{\"title\":\"Total Selecionado\",\"content\":\"Nenhum\"}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"userDetailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"},{\"_comment\":\"Ao clicar na linha, atualiza o título do card de estatísticas\",\"from\":{\"widget\":\"userTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"statsCard\",\"input\":\"inputs.content\"},\"map\":\"Selecionado: ${payload.row.name}\"}]}}",
|
|
4013
4055
|
"sourcePointer": "examples/ai-recipes/praxis-dynamic-gridster-page.json",
|
|
@@ -4017,7 +4059,7 @@
|
|
|
4017
4059
|
"corpusVersion": "1.0.0"
|
|
4018
4060
|
},
|
|
4019
4061
|
{
|
|
4020
|
-
"chunkIndex":
|
|
4062
|
+
"chunkIndex": 34,
|
|
4021
4063
|
"chunkKind": "recipe",
|
|
4022
4064
|
"content": "{\"_comment\":\"Template base para Praxis Page Builder (gridster).\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"base\",\"defaultVariantId\":\"base\",\"variants\":[{\"id\":\"base\",\"registryKey\":\"praxis-page-builder:base\",\"variantId\":\"base\",\"description\":\"Cria um workspace base do page builder com widgets em gridster.\",\"useWhen\":\"Base page builder layout with gridster widgets.\"},{\"id\":\"master-detail\",\"registryKey\":\"praxis-page-builder:master-detail\",\"variantId\":\"master-detail\",\"description\":\"Cria workspace com tabela, formulário de detalhes e superfícies editoriais governadas por rich-content.\",\"useWhen\":\"Page builder layout with master table, detail form and governed editorial action surfaces.\"}],\"useWhen\":\"Base page builder layout with gridster widgets and optional governed editorial action surfaces.\",\"examplePrompts\":[\"create a page builder layout\",\"set up a gridster page with table and form\",\"add a governed action card to a page-builder master-detail workspace\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"masterTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"detailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"status\"]}]}]}]}}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"masterTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"detailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"}]}}",
|
|
4023
4065
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.json",
|
|
@@ -4027,7 +4069,7 @@
|
|
|
4027
4069
|
"corpusVersion": "1.0.0"
|
|
4028
4070
|
},
|
|
4029
4071
|
{
|
|
4030
|
-
"chunkIndex":
|
|
4072
|
+
"chunkIndex": 35,
|
|
4031
4073
|
"chunkKind": "recipe",
|
|
4032
4074
|
"content": "{\"_comment\":\"Template master-detail para Praxis Page Builder (gridster).\",\"_comment2\":\"resourcePath deve ser o path base do recurso (sem /filter).\",\"_comment3\":\"Widgets praxis-rich-content podem complementar o workspace com orientacao editorial e actions mediadas por host, mas hostCapabilities nao pertence ao JSON persistido.\",\"templateMeta\":{\"registryKey\":\"praxis-page-builder\",\"variantId\":\"master-detail\",\"useWhen\":\"Page builder layout with master table, detail form and governed editorial workspace.\",\"examplePrompts\":[\"create a master detail page with table and form\",\"build a page with a table and a detail form\",\"add a governed editorial panel to a page-builder master-detail workspace\"]},\"page\":{\"options\":{\"cols\":12,\"rowHeight\":100,\"gap\":12},\"widgets\":[{\"key\":\"masterTable\",\"layout\":{\"col\":1,\"row\":1,\"colSpan\":7,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-table\",\"bindingOrder\":[\"config\",\"resourcePath\"],\"inputs\":{\"resourcePath\":\"{{resourcePath}}\",\"tableId\":\"{{resourceKey}}-master\",\"config\":{\"columns\":[{\"field\":\"id\",\"header\":\"ID\",\"width\":\"60px\"},{\"field\":\"name\",\"header\":\"Nome\"},{\"field\":\"status\",\"header\":\"Status\",\"renderer\":{\"type\":\"chip\"}}],\"toolbar\":{\"visible\":true,\"title\":\"{{resourceLabel}}\"},\"behavior\":{\"selection\":{\"enabled\":true,\"type\":\"single\"}}}},\"outputs\":{\"rowClick\":\"emit\"}}},{\"key\":\"detailForm\",\"layout\":{\"col\":8,\"row\":1,\"colSpan\":5,\"rowSpan\":6},\"definition\":{\"id\":\"praxis-dynamic-form\",\"bindingOrder\":[\"resourcePath\",\"formId\",\"resourceId\",\"config\"],\"inputs\":{\"formId\":\"{{resourceKey}}-detail-view\",\"resourcePath\":\"{{resourcePath}}\",\"mode\":\"view\",\"config\":{\"formBlocksBefore\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"callout\",\"tone\":\"neutral\",\"icon\":\"dashboard_customize\",\"title\":\"Page-builder host\",\"message\":\"Mesmo no page builder, rich-content continua sendo documento portavel e host-mediated em runtime.\"}]},\"sections\":[{\"title\":\"Detalhes de {{resourceLabel}}\",\"rows\":[{\"columns\":[{\"fields\":[\"name\",\"status\"]}]}]}]}},\"outputs\":{\"customAction\":\"emit\"}}},{\"key\":\"editorialGuide\",\"layout\":{\"col\":8,\"row\":7,\"colSpan\":5,\"rowSpan\":3},\"definition\":{\"id\":\"praxis-rich-content\",\"bindingOrder\":[\"document\",\"context\"],\"inputs\":{\"context\":{\"workspace\":{\"resourceLabel\":\"{{resourceLabel}}\",\"layout\":\"gridster\",\"governance\":\"host-mediated runtime actions\"}},\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"recordSummary\",\"title\":\"Master-detail workspace\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"meta\":\"praxis-page-builder\",\"fields\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\"},{\"label\":\"Governance\",\"valueExpr\":\"${workspace.governance}\"}]},{\"type\":\"statGroup\",\"title\":\"Workspace signals\",\"subtitle\":\"Portable summary cards inside the builder workspace\",\"layout\":\"grid\",\"items\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\",\"caption\":\"gridster\",\"icon\":\"grid_view\"},{\"label\":\"Governance\",\"value\":\"host\",\"captionExpr\":\"${workspace.governance}\",\"icon\":\"shield\"}]},{\"type\":\"tabs\",\"title\":\"Builder views\",\"subtitle\":\"Canonical editorial tabs inside the page-builder workspace.\",\"appearance\":\"underline\",\"defaultTabId\":\"overview\",\"items\":[{\"id\":\"overview\",\"label\":\"Overview\",\"icon\":\"dashboard\",\"content\":[{\"type\":\"text\",\"text\":\"Tabs let the builder workspace organize guidance, runtime notes and next steps without inventing builder-specific markup.\"}]},{\"id\":\"governance\",\"label\":\"Governance\",\"icon\":\"shield\",\"badge\":\"Host\",\"content\":[{\"type\":\"keyValueList\",\"layout\":\"stacked\",\"items\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\"},{\"label\":\"Governance\",\"valueExpr\":\"${workspace.governance}\"},{\"label\":\"Persistence rule\",\"value\":\"hostCapabilities stay outside persisted page JSON.\"}]}]}]},{\"type\":\"ctaGroup\",\"title\":\"Next steps\",\"subtitle\":\"Governed builder actions\",\"message\":\"Use a semantic CTA cluster for builder-side flows without embedding handlers in the document.\",\"layout\":\"split\",\"actions\":[{\"type\":\"actionButton\",\"label\":\"Abrir fluxo governado\",\"icon\":\"open_in_new\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}}},{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"disclosure\",\"title\":\"Persisted versus runtime\",\"subtitle\":\"A pagina salva document/config; o host injeta capabilities apenas em runtime\",\"appearance\":\"card\",\"defaultExpanded\":true,\"content\":[{\"type\":\"keyValueList\",\"layout\":\"stacked\",\"items\":[{\"label\":\"Persistir\",\"value\":\"document, context e config do widget\"},{\"label\":\"Nao persistir\",\"value\":\"hostCapabilities\"}]}]},{\"type\":\"relatedRecord\",\"title\":\"Selected related record\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"relationLabel\":\"Builder selection\",\"meta\":\"resolved relationship\",\"ctaLabel\":\"Abrir relacionado\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}},\"fields\":[{\"label\":\"Layout\",\"valueExpr\":\"${workspace.layout}\",\"hint\":\"Resolved from the same builder workspace context.\"}],\"secondaryActions\":[{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"actionCard\",\"title\":\"Open governed builder flow\",\"subtitleExpr\":\"${workspace.resourceLabel}\",\"message\":\"Use actionCard when the page-builder workspace needs a governed host action from a portable editorial document.\",\"meta\":\"praxis-page-builder\",\"ctaLabel\":\"Abrir fluxo governado\",\"variant\":\"raised\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}},\"secondaryActions\":[{\"type\":\"actionButton\",\"label\":\"Inspecionar workspace\",\"icon\":\"manage_search\",\"variant\":\"stroked\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"detailForm\",\"resourceKey\":\"{{resourceKey}}\"}}}]},{\"type\":\"emptyState\",\"icon\":\"hub\",\"title\":\"Acione um fluxo governado pelo host\",\"message\":\"Use actionButton para abrir surface, drawer ou modal sem embutir manipuladores no documento.\",\"actions\":[{\"type\":\"actionButton\",\"label\":\"Abrir painel\",\"icon\":\"open_in_new\",\"variant\":\"stroked\",\"color\":\"primary\",\"action\":{\"actionId\":\"openBuilderPanel\",\"payload\":{\"widgetKey\":\"editorialGuide\",\"resourceKey\":\"{{resourceKey}}\"}}}]}]}}}}],\"connections\":[{\"_comment\":\"Ao clicar na linha da tabela, carrega o formulário com o ID correspondente\",\"from\":{\"widget\":\"masterTable\",\"output\":\"rowClick\"},\"to\":{\"widget\":\"detailForm\",\"input\":\"resourceId\"},\"map\":\"payload.row.{{idField}}\"}]}}",
|
|
4033
4075
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.master-detail.json",
|
|
@@ -4037,7 +4079,7 @@
|
|
|
4037
4079
|
"corpusVersion": "1.0.0"
|
|
4038
4080
|
},
|
|
4039
4081
|
{
|
|
4040
|
-
"chunkIndex":
|
|
4082
|
+
"chunkIndex": 36,
|
|
4041
4083
|
"chunkKind": "recipe",
|
|
4042
4084
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"_comment\",\"_comment\":\"Contrato operacional para orientar LLM/backend a emitir UiCompositionPlan antes do WidgetPageDefinition final.\"}",
|
|
4043
4085
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|
|
@@ -4047,7 +4089,7 @@
|
|
|
4047
4089
|
"corpusVersion": "1.0.0"
|
|
4048
4090
|
},
|
|
4049
4091
|
{
|
|
4050
|
-
"chunkIndex":
|
|
4092
|
+
"chunkIndex": 37,
|
|
4051
4093
|
"chunkKind": "recipe",
|
|
4052
4094
|
"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\"]}}",
|
|
4053
4095
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|
|
@@ -4057,7 +4099,7 @@
|
|
|
4057
4099
|
"corpusVersion": "1.0.0"
|
|
4058
4100
|
},
|
|
4059
4101
|
{
|
|
4060
|
-
"chunkIndex":
|
|
4102
|
+
"chunkIndex": 38,
|
|
4061
4103
|
"chunkKind": "recipe",
|
|
4062
4104
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"outputEnvelope\",\"outputEnvelope\":{\"uiCompositionPlan\":{\"version\":\"1.0\",\"kind\":\"praxis.ui-composition-plan\",\"i18n\":{\"fallbackLocale\":\"{{fallbackLocale}}\",\"dictionaries\":{\"{{locale}}\":{\"{{businessCopyKey}}\":\"{{businessCopyValue}}\"}}},\"context\":{\"{{explicitContextKey}}\":\"{{explicitContextValue}}\"},\"layout\":{\"columns\":12,\"gap\":\"16px\",\"breakpoints\":{\"sm\":1,\"md\":6,\"lg\":12}},\"layoutPreset\":\"{{layoutPreset}}\",\"state\":{\"values\":{\"{{stateKey}}\":null}},\"widgets\":[{\"key\":\"{{stableWidgetKey}}\",\"componentId\":\"{{registeredComponentId}}\",\"role\":\"{{semanticRole}}\",\"shell\":{\"kind\":\"dashboard-card\",\"title\":{\"key\":\"{{widgetTitleKey}}\",\"text\":\"{{widgetTitleFallback}}\"}},\"bindingOrder\":[\"{{inputName}}\"],\"inputs\":{\"{{inputName}}\":\"{{canonicalInputValue}}\"}}],\"selectionSyncs\":[{\"id\":\"{{stableSelectionSyncId}}\",\"intent\":\"selection-sync\",\"sources\":[{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{selectionOutputPort}}\",\"direction\":\"output\"}],\"target\":{\"kind\":\"state\",\"path\":\"{{selectionStatePath}}\",\"layer\":\"values\"},\"mapping\":{\"{{selectionField}}\":\"{{selectionPayloadPath}}\"}}],\"contextScopes\":[{\"id\":\"{{stableContextScopeId}}\",\"context\":{\"parentResourcePath\":{\"kind\":\"constant\",\"value\":\"{{parentResourcePath}}\"},\"parentResourceId\":{\"kind\":\"state\",\"path\":\"{{parentResourceIdStatePath}}\",\"layer\":\"values\",\"initial\":null}},\"targets\":[{\"widget\":\"{{contextOwnerWidgetKey}}\",\"nestedPath\":[{\"kind\":\"{{containerSegmentKind}}\",\"id\":\"{{containerSegmentId}}\"},{\"kind\":\"widget\",\"key\":\"{{nestedWidgetKey}}\"}]}]}],\"bindings\":[{\"id\":\"{{stableBindingId}}\",\"from\":{\"kind\":\"component-port\",\"widget\":\"{{sourceWidgetKey}}\",\"port\":\"{{outputPort}}\",\"direction\":\"output\"},\"to\":{\"kind\":\"state\",\"path\":\"{{statePath}}\"},\"intent\":\"state-write\",\"transform\":{\"kind\":\"pick-path\",\"id\":\"{{transformId}}\",\"path\":\"{{payloadPath}}\"},\"metadata\":{\"source\":\"ui-composition-plan\"}}]},\"compiledFormPatch\":{\"version\":\"1.1\",\"patch\":{}}}}",
|
|
4063
4105
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|
|
@@ -4067,7 +4109,7 @@
|
|
|
4067
4109
|
"corpusVersion": "1.0.0"
|
|
4068
4110
|
},
|
|
4069
4111
|
{
|
|
4070
|
-
"chunkIndex":
|
|
4112
|
+
"chunkIndex": 39,
|
|
4071
4113
|
"chunkKind": "recipe",
|
|
4072
4114
|
"content": "{\"componentId\":\"praxis-page-builder\",\"chunkSection\":\"validationRules\",\"validationRules\":[\"uiCompositionPlan.version deve ser 1.0.\",\"uiCompositionPlan.kind deve ser praxis.ui-composition-plan.\",\"i18n, context e layout pertencentes a pagina devem ser compilados para os campos homonimos de WidgetPageDefinition; descritores PraxisTextValue podem omitir text quando key existir no dicionario de fallback, e nao devem depender de enriquecimento oculto do host.\",\"widgets[].key deve ser estavel e unico.\",\"widgets[].componentId deve existir no catalogo de componentes registrado do Page Builder.\",\"bindings[].from/to com kind component-port devem referenciar widgets existentes no proprio plano.\",\"bindings[].from/to com kind state devem usar paths declarados ou justificaveis em state.values/state.derived.\",\"bindings[].from com kind global-action deve declarar somente actionId; payload, payloadExpr, meta, label ou result type nao selecionam a continuacao, pois o payload vem de dynamicPage.composition.dispatch.\",\"bindings[].to com kind global-action deve declarar actionId e compila para page.composition.links[].to.ref.[actionId].\",\"Use intent command-dispatch para bindings cujo destino e global-action.\",\"selectionSyncs[] reduz autoria repetitiva e sempre compila cada source/mapping em page.composition.links explicitos com intent selection-sync.\",\"contextScopes[] materializa constantes e state.initial em inputs, alem de estado em links state-read explicitos; nao existe heranca de contexto ambiente no runtime persistido.\",\"Use bindings como fonte declarativa. Nao emita connections legado nem page.composition.links concorrente no mesmo plano.\",\"Use pick-path para extrair payload/evento, query-context para filtros de recurso, template para gerar inputs estruturados e constant para valores fixos.\",\"Se API, metadata, surface, action, capability ou porta de componente nao estiver confirmada, retorne clarification/diagnostic em vez de alucinar o plano.\"]}",
|
|
4073
4115
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|
|
@@ -4077,7 +4119,7 @@
|
|
|
4077
4119
|
"corpusVersion": "1.0.0"
|
|
4078
4120
|
},
|
|
4079
4121
|
{
|
|
4080
|
-
"chunkIndex":
|
|
4122
|
+
"chunkIndex": 40,
|
|
4081
4123
|
"chunkKind": "recipe",
|
|
4082
4124
|
"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},\"decisionResult\":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.decision.accepted->state.decisionResult\",\"from\":{\"kind\":\"global-action\",\"actionId\":\"department.decision.accepted\"},\"to\":{\"kind\":\"state\",\"path\":\"decisionResult\"},\"intent\":\"state-write\",\"metadata\":{\"source\":\"ui-composition-plan\",\"tags\":[\"surface-result\",\"page-state\"]}},{\"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\"]}}]}}}",
|
|
4083
4125
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|
|
@@ -4087,7 +4129,7 @@
|
|
|
4087
4129
|
"corpusVersion": "1.0.0"
|
|
4088
4130
|
},
|
|
4089
4131
|
{
|
|
4090
|
-
"chunkIndex":
|
|
4132
|
+
"chunkIndex": 41,
|
|
4091
4133
|
"chunkKind": "recipe",
|
|
4092
4134
|
"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\"]}}",
|
|
4093
4135
|
"sourcePointer": "examples/ai-recipes/praxis-page-builder.ui-composition-plan.json",
|