@praxisui/page-builder 10.0.0-rc.4 → 10.0.0-rc.41
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 +140 -3
- package/ai/component-registry.json +112 -62
- package/fesm2022/praxisui-page-builder.mjs +15256 -8439
- package/package.json +4 -4
- package/types/praxisui-page-builder.d.ts +816 -30
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-27T22:14:23.237Z",
|
|
4
4
|
"packageName": "@praxisui/page-builder",
|
|
5
|
-
"packageVersion": "10.0.0-rc.
|
|
5
|
+
"packageVersion": "10.0.0-rc.41",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -11,8 +11,21 @@
|
|
|
11
11
|
"id": "praxis-page-builder",
|
|
12
12
|
"description": "Page builder using the canonical praxis-dynamic-page runtime.",
|
|
13
13
|
"category": "page",
|
|
14
|
-
"inputs": [
|
|
14
|
+
"inputs": [
|
|
15
|
+
{
|
|
16
|
+
"name": "autoPersist",
|
|
17
|
+
"type": "boolean",
|
|
18
|
+
"required": false,
|
|
19
|
+
"description": "Opt-in Core persistence for manual pages; defaults to false. Disabled for authoringDocument and agentic authoring."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
15
22
|
"outputs": [
|
|
23
|
+
{
|
|
24
|
+
"name": "persistenceChange",
|
|
25
|
+
"type": "WidgetPagePersistenceState",
|
|
26
|
+
"required": false,
|
|
27
|
+
"description": "Core persistence lifecycle and safe failure category; saved requires storage acknowledgement."
|
|
28
|
+
},
|
|
16
29
|
{
|
|
17
30
|
"name": "pageChange",
|
|
18
31
|
"type": "WidgetPageDefinition",
|
|
@@ -815,7 +828,8 @@
|
|
|
815
828
|
"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.",
|
|
816
829
|
"Payloads legados de layout ainda podem ser ingeridos, mas sao normalizados para canvas e nao devem ser reemitidos.",
|
|
817
830
|
"pageIdentity identifica o escopo de persistencia e nao pertence ao objeto page.",
|
|
818
|
-
"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."
|
|
831
|
+
"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.",
|
|
832
|
+
"Tokens de interpolacao de estado/contexto em inputs de widgets ({{state.<path> | pipe}} ou ${state.<path> | pipe}) suportam pipes declarativos CSP-safe encadeaveis: default:<fallback>, number, round[:decimals], percent[:decimals], currency[:code], uppercase e lowercase."
|
|
819
833
|
],
|
|
820
834
|
"componentContext": {
|
|
821
835
|
"version": "v1.3",
|
|
@@ -1521,8 +1535,13 @@
|
|
|
1521
1535
|
"componentId": "praxis-page-builder",
|
|
1522
1536
|
"ownerPackage": "@praxisui/page-builder",
|
|
1523
1537
|
"configSchemaId": "WidgetPageDefinition",
|
|
1524
|
-
"manifestVersion": "1.5.
|
|
1538
|
+
"manifestVersion": "1.5.2",
|
|
1525
1539
|
"runtimeInputs": [
|
|
1540
|
+
{
|
|
1541
|
+
"name": "autoPersist",
|
|
1542
|
+
"type": "boolean",
|
|
1543
|
+
"description": "Host-only opt-in Core persistence for manual pages. Disabled for agentic authoring and authoringDocument; never use to persist an AI preview."
|
|
1544
|
+
},
|
|
1526
1545
|
{
|
|
1527
1546
|
"name": "page",
|
|
1528
1547
|
"type": "WidgetPageDefinition",
|
|
@@ -1578,7 +1597,7 @@
|
|
|
1578
1597
|
{
|
|
1579
1598
|
"kind": "page",
|
|
1580
1599
|
"resolver": "widget-page-definition-root",
|
|
1581
|
-
"description": "Root WidgetPageDefinition document: title, metadata, context and renderable page envelope."
|
|
1600
|
+
"description": "Root WidgetPageDefinition document: title, metadata, context, declarative dataSources and renderable page envelope."
|
|
1582
1601
|
},
|
|
1583
1602
|
{
|
|
1584
1603
|
"kind": "canvas",
|
|
@@ -1650,6 +1669,16 @@
|
|
|
1650
1669
|
},
|
|
1651
1670
|
"metadata": {
|
|
1652
1671
|
"type": "object"
|
|
1672
|
+
},
|
|
1673
|
+
"dataSources": {
|
|
1674
|
+
"oneOf": [
|
|
1675
|
+
{
|
|
1676
|
+
"type": "array"
|
|
1677
|
+
},
|
|
1678
|
+
{
|
|
1679
|
+
"type": "object"
|
|
1680
|
+
}
|
|
1681
|
+
]
|
|
1653
1682
|
}
|
|
1654
1683
|
}
|
|
1655
1684
|
},
|
|
@@ -1668,7 +1697,8 @@
|
|
|
1668
1697
|
"page.layoutPreset",
|
|
1669
1698
|
"page.themePreset",
|
|
1670
1699
|
"page.context",
|
|
1671
|
-
"page.metadata"
|
|
1700
|
+
"page.metadata",
|
|
1701
|
+
"page.dataSources"
|
|
1672
1702
|
],
|
|
1673
1703
|
"identityKeys": [
|
|
1674
1704
|
"pageIdentity.componentId",
|
|
@@ -1691,6 +1721,16 @@
|
|
|
1691
1721
|
},
|
|
1692
1722
|
"metadata": {
|
|
1693
1723
|
"type": "object"
|
|
1724
|
+
},
|
|
1725
|
+
"dataSources": {
|
|
1726
|
+
"oneOf": [
|
|
1727
|
+
{
|
|
1728
|
+
"type": "array"
|
|
1729
|
+
},
|
|
1730
|
+
{
|
|
1731
|
+
"type": "object"
|
|
1732
|
+
}
|
|
1733
|
+
]
|
|
1694
1734
|
}
|
|
1695
1735
|
}
|
|
1696
1736
|
},
|
|
@@ -1699,7 +1739,7 @@
|
|
|
1699
1739
|
"context-not-json",
|
|
1700
1740
|
"settings-panel-bridge-missing"
|
|
1701
1741
|
],
|
|
1702
|
-
"description": "Updates root page metadata while preserving the renderable WidgetPageDefinition shape."
|
|
1742
|
+
"description": "Updates root page metadata and declarative dataSources while preserving the renderable WidgetPageDefinition shape."
|
|
1703
1743
|
}
|
|
1704
1744
|
}
|
|
1705
1745
|
],
|
|
@@ -1714,7 +1754,8 @@
|
|
|
1714
1754
|
"layoutPreset",
|
|
1715
1755
|
"themePreset",
|
|
1716
1756
|
"context",
|
|
1717
|
-
"metadata"
|
|
1757
|
+
"metadata",
|
|
1758
|
+
"dataSources"
|
|
1718
1759
|
],
|
|
1719
1760
|
"submissionImpact": "config-only",
|
|
1720
1761
|
"preconditions": [
|
|
@@ -2106,6 +2147,14 @@
|
|
|
2106
2147
|
"fallbackBackground": {
|
|
2107
2148
|
"type": "string",
|
|
2108
2149
|
"description": "Opaque background for reduced transparency, unsupported blur and fullscreen/expanded modes."
|
|
2150
|
+
},
|
|
2151
|
+
"interactionHighlight": {
|
|
2152
|
+
"type": "string",
|
|
2153
|
+
"enum": [
|
|
2154
|
+
"standard",
|
|
2155
|
+
"gradient"
|
|
2156
|
+
],
|
|
2157
|
+
"description": "Editing selection and keyboard-focus highlight. Absence in the saved shell inherits the preset, then standard. This operation merges partial input: omission preserves an existing override; use the visual editor to remove it. Gradient uses theme colors; never changes child inputs."
|
|
2109
2158
|
}
|
|
2110
2159
|
}
|
|
2111
2160
|
},
|
|
@@ -3576,7 +3625,8 @@
|
|
|
3576
3625
|
"Child widget definition.inputs edits delegate to the child manifest or ComponentDocMeta.configEditor.",
|
|
3577
3626
|
"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.",
|
|
3578
3627
|
"Save uses pageIdentity and ETag policy from praxis-config-starter; pageIdentity is not persisted inside WidgetPageDefinition.",
|
|
3579
|
-
"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift."
|
|
3628
|
+
"Settings panel apply/save/reset/reopen must preserve page settings and widget shell config without hidden normalization drift.",
|
|
3629
|
+
"Widget inputs and inputs.context may reference page.state.values and page.state.derived using {{state.<path> | pipe}} or ${state.<path> | pipe} with CSP-safe declarative pipes (default/coalesce, round, number, percent, currency, uppercase, lowercase); the Page State Binder detects unbound state tokens across widget inputs and *Expr properties for one-click binding."
|
|
3580
3630
|
],
|
|
3581
3631
|
"examples": [
|
|
3582
3632
|
{
|
|
@@ -3787,9 +3837,9 @@
|
|
|
3787
3837
|
{
|
|
3788
3838
|
"chunkIndex": 0,
|
|
3789
3839
|
"chunkKind": "summary",
|
|
3790
|
-
"content": "Component ID: praxis-page-builder\nSelector: praxis-dynamic-page-builder\nFriendly Name: Praxis Page Builder\nDescription: Page builder using the canonical praxis-dynamic-page runtime.\nCategory: page\nLib/Package: @praxisui/page-builder\nTags: widget, page-builder, configurable\nOutputs:\n - pageChange (WidgetPageDefinition)\n - pageAuthoringChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - pageSaveRequested (WidgetPageDefinition)\n - agenticAuthoringApplied (PageBuilderApplyResult)\n - agenticAuthoringSharedRuleHandoff (PageBuilderAgenticAuthoringSharedRuleHandoff)\n - pageRestart (void)\n - savedPageDeleteRequested (void)\n",
|
|
3840
|
+
"content": "Component ID: praxis-page-builder\nSelector: praxis-dynamic-page-builder\nFriendly Name: Praxis Page Builder\nDescription: Page builder using the canonical praxis-dynamic-page runtime.\nCategory: page\nLib/Package: @praxisui/page-builder\nTags: widget, page-builder, configurable\nInputs:\n - autoPersist (boolean)\nOutputs:\n - persistenceChange (WidgetPagePersistenceState)\n - pageChange (WidgetPageDefinition)\n - pageAuthoringChange (WidgetPageDefinition)\n - widgetEvent (WidgetEventEnvelope)\n - pageSaveRequested (WidgetPageDefinition)\n - agenticAuthoringApplied (PageBuilderApplyResult)\n - agenticAuthoringSharedRuleHandoff (PageBuilderAgenticAuthoringSharedRuleHandoff)\n - pageRestart (void)\n - savedPageDeleteRequested (void)\n",
|
|
3791
3841
|
"sourcePointer": "projects/praxis-page-builder/src/lib/praxis-page-builder.metadata.ts",
|
|
3792
|
-
"contentHash": "
|
|
3842
|
+
"contentHash": "acfafb4a7cb94daea94b58deb47b64645e2ef8e535e25dca1d4ee7b8a2db7598",
|
|
3793
3843
|
"sourceKind": "component_definition",
|
|
3794
3844
|
"sourceId": "praxis-page-builder",
|
|
3795
3845
|
"corpusVersion": "1.0.0"
|
|
@@ -3827,9 +3877,9 @@
|
|
|
3827
3877
|
{
|
|
3828
3878
|
"chunkIndex": 4,
|
|
3829
3879
|
"chunkKind": "capabilities",
|
|
3830
|
-
"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.",
|
|
3880
|
+
"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.\n\nCapability Note:\n - Tokens de interpolacao de estado/contexto em inputs de widgets ({{state.<path> | pipe}} ou ${state.<path> | pipe}) suportam pipes declarativos CSP-safe encadeaveis: default:<fallback>, number, round[:decimals], percent[:decimals], currency[:code], uppercase e lowercase.",
|
|
3831
3881
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/page-builder-ai-capabilities.ts",
|
|
3832
|
-
"contentHash": "
|
|
3882
|
+
"contentHash": "850720755d0b37bb6840725da7b596f86159dcef48d2783e52db7141d96c7cb6",
|
|
3833
3883
|
"sourceKind": "component_definition",
|
|
3834
3884
|
"sourceId": "praxis-page-builder",
|
|
3835
3885
|
"corpusVersion": "1.0.0"
|
|
@@ -3837,9 +3887,9 @@
|
|
|
3837
3887
|
{
|
|
3838
3888
|
"chunkIndex": 5,
|
|
3839
3889
|
"chunkKind": "authoring_manifest",
|
|
3840
|
-
"content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3890
|
+
"content": "{\"operationId\":\"page.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page metadata Effects: compile-domain-patch. Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"scope\":\"global\",\"target\":{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\",\"dataSources\"],\"semanticTerms\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\",\"dataSources\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"title\",\"layoutPreset\",\"themePreset\",\"context\",\"metadata\",\"dataSources\"],\"validators\":[{\"validatorId\":\"widget-page-definition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_VALID\",\"description\":\"The document must remain a renderable WidgetPageDefinition.\"},{\"validatorId\":\"no-legacy-grid-page-definition\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_GRID_PAGE\",\"description\":\"Legacy GridPageDefinition semantics cannot be reintroduced.\"},{\"validatorId\":\"page-context-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONTEXT_JSON\",\"description\":\"Page context must stay JSON-serializable.\"},{\"validatorId\":\"settings-panel-round-trip-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_SETTINGS_ROUND_TRIP\",\"description\":\"Settings panel apply/save/reset/reopen must preserve the same page shape.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-dashboard-page\",\"request\":\"Set this page title to Payroll Overview and store payrollPeriod in the page context.\",\"operationId\":\"page.configure\",\"params\":{\"title\":\"Payroll Overview\",\"context\":{\"payrollPeriod\":\"current\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3841
3891
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3842
|
-
"contentHash": "
|
|
3892
|
+
"contentHash": "72a7f823d406f99e530f1073245598157f260d62b752982f90ab16a8717ad5b0",
|
|
3843
3893
|
"sourceKind": "component_definition",
|
|
3844
3894
|
"sourceId": "praxis-page-builder",
|
|
3845
3895
|
"corpusVersion": "1.0.0"
|
|
@@ -3847,9 +3897,9 @@
|
|
|
3847
3897
|
{
|
|
3848
3898
|
"chunkIndex": 6,
|
|
3849
3899
|
"chunkKind": "authoring_manifest",
|
|
3850
|
-
"content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3900
|
+
"content": "{\"operationId\":\"canvas.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure page canvas Effects: compile-domain-patch. Use a 12 column dashboard grid with compact gaps.\",\"scope\":\"layout\",\"target\":{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"columns\",\"rowUnit\",\"gap\",\"items\"],\"semanticTerms\":[\"columns\",\"rowUnit\",\"gap\",\"items\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.columns\",\"canvas.rowUnit\",\"canvas.gap\",\"canvas.items\"],\"validators\":[{\"validatorId\":\"canvas-columns-integer\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_COLUMNS\",\"description\":\"Canvas columns must be an integer grid count.\"},{\"validatorId\":\"canvas-row-unit-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ROW_UNIT\",\"description\":\"Canvas row unit must be a positive layout unit.\"},{\"validatorId\":\"canvas-gap-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_GAP\",\"description\":\"Canvas gap must be a valid non-negative spacing value.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-canvas-grid\",\"request\":\"Use a 12 column dashboard grid with compact gaps.\",\"operationId\":\"canvas.configure\",\"target\":\"canvas\",\"params\":{\"columns\":12,\"rowUnit\":8,\"gap\":8},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3851
3901
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3852
|
-
"contentHash": "
|
|
3902
|
+
"contentHash": "5e578d0b56cd4e7f2613ceaf69a253fae9d51de28e8c7d41995b2bfe35e5da5a",
|
|
3853
3903
|
"sourceKind": "component_definition",
|
|
3854
3904
|
"sourceId": "praxis-page-builder",
|
|
3855
3905
|
"corpusVersion": "1.0.0"
|
|
@@ -3857,9 +3907,9 @@
|
|
|
3857
3907
|
{
|
|
3858
3908
|
"chunkIndex": 7,
|
|
3859
3909
|
"chunkKind": "authoring_manifest",
|
|
3860
|
-
"content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3910
|
+
"content": "{\"operationId\":\"widget.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add widget to page Effects: compile-domain-patch. Add an employees table widget to the left half of the first row.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"componentId\"],\"properties\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"componentId\",\"title\",\"inputs\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-key-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_UNIQUE\",\"description\":\"Widget keys must be unique.\"},{\"validatorId\":\"component-registered\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPONENT_REGISTERED\",\"description\":\"Widget component id must exist in the component registry/catalog.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"child-inputs-delegated\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_INPUTS_DELEGATED\",\"description\":\"Child component input edits must delegate to the child owner.\"},{\"validatorId\":\"widget-key-not-array-index\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEY_INDEX\",\"description\":\"Array index is not a stable widget identity.\"}],\"preconditions\":[\"page-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-employees-table-widget\",\"request\":\"Add an employees table widget to the left half of the first row.\",\"operationId\":\"widget.add\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"componentId\":\"praxis-table\",\"canvasItem\":{\"x\":0,\"y\":0,\"w\":6,\"h\":8}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3861
3911
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3862
|
-
"contentHash": "
|
|
3912
|
+
"contentHash": "a8c77f46c44903ea186fa36d9339afabd62b721122ac48a930c65df848d986ec",
|
|
3863
3913
|
"sourceKind": "component_definition",
|
|
3864
3914
|
"sourceId": "praxis-page-builder",
|
|
3865
3915
|
"corpusVersion": "1.0.0"
|
|
@@ -3867,9 +3917,9 @@
|
|
|
3867
3917
|
{
|
|
3868
3918
|
"chunkIndex": 8,
|
|
3869
3919
|
"chunkKind": "authoring_manifest",
|
|
3870
|
-
"content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3920
|
+
"content": "{\"operationId\":\"widget.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove widget from page Effects: compile-domain-patch. Remove the summary-card widget and its links.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\"],\"properties\":[\"widgetKey\",\"confirmed\"],\"semanticTerms\":[\"widgetKey\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[]\",\"canvas.items[]\",\"composition.links[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-cleaned\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_CLEANED\",\"description\":\"Removing a widget must remove dangling composition links.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-summary-card\",\"request\":\"Remove the summary-card widget and its links.\",\"operationId\":\"widget.remove\",\"target\":\"summary-card\",\"params\":{\"widgetKey\":\"summary-card\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3871
3921
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3872
|
-
"contentHash": "
|
|
3922
|
+
"contentHash": "70db16cce21062bcc9f06ca40dee39731ba7324f44f8c266ef20935ef763205a",
|
|
3873
3923
|
"sourceKind": "component_definition",
|
|
3874
3924
|
"sourceId": "praxis-page-builder",
|
|
3875
3925
|
"corpusVersion": "1.0.0"
|
|
@@ -3877,9 +3927,9 @@
|
|
|
3877
3927
|
{
|
|
3878
3928
|
"chunkIndex": 9,
|
|
3879
3929
|
"chunkKind": "authoring_manifest",
|
|
3880
|
-
"content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3930
|
+
"content": "{\"operationId\":\"widget.moveResize\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Move or resize widget Effects: compile-domain-patch. Move payroll-chart to the right column and make it taller.\",\"scope\":\"layout\",\"target\":{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"required\":true},\"inputContract\":{\"required\":[\"widgetKey\",\"canvasItem\"],\"properties\":[\"widgetKey\",\"canvasItem\"],\"semanticTerms\":[\"widgetKey\",\"canvasItem\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"canvas.items[]\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"canvas-item-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM\",\"description\":\"Canvas item geometry must be valid.\"},{\"validatorId\":\"canvas-item-targets-existing-widget\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_ITEM_TARGET\",\"description\":\"Moved canvas item must target an existing widget.\"},{\"validatorId\":\"canvas-overlap-policy-valid\",\"level\":\"warning\",\"code\":\"PAGE_BUILDER_CANVAS_OVERLAP\",\"description\":\"Canvas overlap policy must be respected.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-payroll-chart\",\"request\":\"Move payroll-chart to the right column and make it taller.\",\"operationId\":\"widget.moveResize\",\"target\":\"payroll-chart\",\"params\":{\"widgetKey\":\"payroll-chart\",\"canvasItem\":{\"x\":6,\"y\":0,\"w\":6,\"h\":10}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3881
3931
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3882
|
-
"contentHash": "
|
|
3932
|
+
"contentHash": "79b5c7c65d029bb35c069b5c3ef61d942397f04645b0606b8cd2ca533924d64a",
|
|
3883
3933
|
"sourceKind": "component_definition",
|
|
3884
3934
|
"sourceId": "praxis-page-builder",
|
|
3885
3935
|
"corpusVersion": "1.0.0"
|
|
@@ -3887,9 +3937,9 @@
|
|
|
3887
3937
|
{
|
|
3888
3938
|
"chunkIndex": 10,
|
|
3889
3939
|
"chunkKind": "authoring_manifest",
|
|
3890
|
-
"content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3940
|
+
"content": "{\"operationId\":\"widget.shell.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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.appearance\",\"shell.avatar\",\"shell.stickyHeader\",\"shell.appearance.card\",\"shell.appearance.header\",\"shell.avatar.imageSrc\",\"shell.avatar.name\",\"shell.avatar.initials\",\"shell.appearance.card.background\",\"shell.appearance.card.borderColor\",\"shell.appearance.card.borderWidth\",\"shell.appearance.card.borderStyle\",\"shell.appearance.card.borderRadius\",\"shell.appearance.card.shadow\",\"shell.appearance.card.backdropFilter\",\"shell.appearance.card.fallbackBackground\",\"shell.appearance.card.interactionHighlight\",\"shell.appearance.header.background\",\"shell.appearance.header.borderColor\",\"shell.appearance.header.borderWidth\",\"shell.appearance.header.borderStyle\",\"shell.appearance.header.titleColor\",\"shell.appearance.header.subtitleColor\",\"shell.appearance.header.iconColor\",\"standard\",\"gradient\"]},\"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\":[]}",
|
|
3891
3941
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3892
|
-
"contentHash": "
|
|
3942
|
+
"contentHash": "6e03c9b2e76b14b1ce517ce4abbb9bd95191513436e17ddb98d719a718a2f26a",
|
|
3893
3943
|
"sourceKind": "component_definition",
|
|
3894
3944
|
"sourceId": "praxis-page-builder",
|
|
3895
3945
|
"corpusVersion": "1.0.0"
|
|
@@ -3897,9 +3947,9 @@
|
|
|
3897
3947
|
{
|
|
3898
3948
|
"chunkIndex": 11,
|
|
3899
3949
|
"chunkKind": "authoring_manifest",
|
|
3900
|
-
"content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3950
|
+
"content": "{\"operationId\":\"composition.link.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add page composition link Effects: compile-domain-patch. When department-list selection changes, filter employees-table by department id. Create the widget link under the old connections collection.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"properties\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\"],\"semanticTerms\":[\"id\",\"from\",\"to\",\"intent\",\"condition\",\"transform\",\"policy\",\"metadata\",\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\",\"from.kind\",\"from.ref\",\"to.kind\",\"to.ref\",\"component-port\",\"from.ref.widget\",\"from.ref.port\",\"from.ref.direction\",\"from.ref.bindingPath\",\"from.ref.nestedPath\",\"state\",\"from.ref.path\",\"from.ref.layer\",\"global-action\",\"from.ref.actionId\",\"to.ref.widget\",\"to.ref.port\",\"to.ref.direction\",\"to.ref.bindingPath\",\"to.ref.nestedPath\",\"to.ref.path\",\"to.ref.layer\",\"to.ref.actionId\",\"to.ref.payload\",\"to.ref.payloadExpr\",\"to.ref.meta\",\"input\",\"output\",\"values\",\"derived\",\"transient\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-id-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ID_UNIQUE\",\"description\":\"Composition link ids must be unique.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"nested-path-terminal-widget-key-required\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NESTED_PATH_WIDGET_KEY\",\"description\":\"Nested component-port paths must terminate at a stable widget key.\"},{\"validatorId\":\"json-logic-condition-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_JSON_LOGIC\",\"description\":\"Composition link condition must be valid Json Logic.\"},{\"validatorId\":\"no-legacy-connections-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LEGACY_CONNECTIONS\",\"description\":\"Operations must write page.composition.links, not legacy connections.\"}],\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"link-department-selection-to-table\",\"request\":\"When department-list selection changes, filter employees-table by department id.\",\"operationId\":\"composition.link.add\",\"target\":\"department-selection-to-employees\",\"params\":{\"id\":\"department-selection-to-employees\",\"from\":{\"widget\":\"department-list\",\"port\":\"selection\"},\"to\":{\"widget\":\"employees-table\",\"port\":\"filter\"},\"intent\":\"selection-sync\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-legacy-connections\",\"request\":\"Create the widget link under the old connections collection.\",\"operationId\":\"composition.link.add\",\"target\":\"legacy-connection\",\"params\":{\"id\":\"legacy-connection\",\"collection\":\"connections\"},\"isPositive\":false}]}",
|
|
3901
3951
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3902
|
-
"contentHash": "
|
|
3952
|
+
"contentHash": "b14b16b4f14b04250e475f82596087529b8c2bd1ee6c97718a6e2b50e4b3114b",
|
|
3903
3953
|
"sourceKind": "component_definition",
|
|
3904
3954
|
"sourceId": "praxis-page-builder",
|
|
3905
3955
|
"corpusVersion": "1.0.0"
|
|
@@ -3907,9 +3957,9 @@
|
|
|
3907
3957
|
{
|
|
3908
3958
|
"chunkIndex": 12,
|
|
3909
3959
|
"chunkKind": "authoring_manifest",
|
|
3910
|
-
"content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3960
|
+
"content": "{\"operationId\":\"composition.link.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove page composition link Effects: compile-domain-patch. Remove the old payroll-filter-link composition link.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"confirmed\"],\"semanticTerms\":[\"id\",\"confirmed\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"composition.links[]\"],\"validators\":[{\"validatorId\":\"composition-link-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_EXISTS\",\"description\":\"Target composition link must exist.\"},{\"validatorId\":\"destructive-removal-confirmed\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_DESTRUCTIVE_CONFIRMED\",\"description\":\"Destructive removals require explicit confirmation.\"},{\"validatorId\":\"composition-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINKS_STILL_VALID\",\"description\":\"Remaining composition links must still validate after the operation.\"}],\"preconditions\":[\"page-loaded\",\"target-link-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-obsolete-link\",\"request\":\"Remove the old payroll-filter-link composition link.\",\"operationId\":\"composition.link.remove\",\"target\":\"payroll-filter-link\",\"params\":{\"id\":\"payroll-filter-link\",\"confirmed\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3911
3961
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3912
|
-
"contentHash": "
|
|
3962
|
+
"contentHash": "30edf7855ef543106e001a108bc52961a797249f294965d752e306ed782b162f",
|
|
3913
3963
|
"sourceKind": "component_definition",
|
|
3914
3964
|
"sourceId": "praxis-page-builder",
|
|
3915
3965
|
"corpusVersion": "1.0.0"
|
|
@@ -3917,9 +3967,9 @@
|
|
|
3917
3967
|
{
|
|
3918
3968
|
"chunkIndex": 13,
|
|
3919
3969
|
"chunkKind": "authoring_manifest",
|
|
3920
|
-
"content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3970
|
+
"content": "{\"operationId\":\"composition.plan.compile\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Compile UI composition plan Effects: compile-domain-patch. Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"scope\":\"rules\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"uiCompositionPlan\"],\"properties\":[\"uiCompositionPlan\"],\"semanticTerms\":[\"uiCompositionPlan\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\"],\"validators\":[{\"validatorId\":\"ui-composition-plan-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_VALID\",\"description\":\"UiCompositionPlan must match the intermediate agentic plan contract.\"},{\"validatorId\":\"compiled-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_COMPILED_PAGE_VALID\",\"description\":\"Compiled output must be a valid WidgetPageDefinition.\"},{\"validatorId\":\"widget-keys-unique\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_KEYS_UNIQUE\",\"description\":\"Compiled plan must produce unique widget keys.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"canvas-items-reference-existing-widgets\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CANVAS_WIDGET_REFS\",\"description\":\"Every canvas item must reference an existing widgetKey.\"}],\"preconditions\":[\"agentic-preview-loaded\",\"component-catalog-loaded\"],\"submissionImpact\":\"none\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"compile-resource-dashboard-plan\",\"request\":\"Compile the resource-dashboard plan returned by the assistant into a renderable page preview.\",\"operationId\":\"composition.plan.compile\",\"target\":\"preview-payroll-dashboard\",\"params\":{\"uiCompositionPlan\":{\"layoutPreset\":\"resource-dashboard\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3921
3971
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3922
|
-
"contentHash": "
|
|
3972
|
+
"contentHash": "4120abe97ae80f206c17a12390b8ca4c6bfcf2fb16eaacc86f67d03f28a95513",
|
|
3923
3973
|
"sourceKind": "component_definition",
|
|
3924
3974
|
"sourceId": "praxis-page-builder",
|
|
3925
3975
|
"corpusVersion": "1.0.0"
|
|
@@ -3927,9 +3977,9 @@
|
|
|
3927
3977
|
{
|
|
3928
3978
|
"chunkIndex": 14,
|
|
3929
3979
|
"chunkKind": "authoring_manifest",
|
|
3930
|
-
"content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3980
|
+
"content": "{\"operationId\":\"state.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set page state value Effects: compile-domain-patch. Store selectedDepartmentId in page state for downstream links.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"required\":true},\"inputContract\":{\"required\":[\"path\",\"value\"],\"properties\":[\"path\",\"value\",\"layer\"],\"semanticTerms\":[\"path\",\"value\",\"layer\",\"page\",\"session\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"state\"],\"validators\":[{\"validatorId\":\"state-path-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_PATH\",\"description\":\"State paths must be valid page state paths.\"},{\"validatorId\":\"state-layer-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LAYER\",\"description\":\"State layer must be page or session.\"},{\"validatorId\":\"state-json-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_JSON\",\"description\":\"State values must be JSON-serializable.\"},{\"validatorId\":\"composition-state-links-still-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_STATE_LINKS\",\"description\":\"State edits must not break composition links.\"}],\"preconditions\":[\"page-loaded\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-selected-department-state\",\"request\":\"Store selectedDepartmentId in page state for downstream links.\",\"operationId\":\"state.set\",\"target\":\"state.selectedDepartmentId\",\"params\":{\"path\":\"selectedDepartmentId\",\"value\":\"sales\",\"layer\":\"page\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3931
3981
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3932
|
-
"contentHash": "
|
|
3982
|
+
"contentHash": "4585027932cdefb1796dea6f38ddb8547a5ec8cedc46d42589e88df0e87eaa70",
|
|
3933
3983
|
"sourceKind": "component_definition",
|
|
3934
3984
|
"sourceId": "praxis-page-builder",
|
|
3935
3985
|
"corpusVersion": "1.0.0"
|
|
@@ -3937,9 +3987,9 @@
|
|
|
3937
3987
|
{
|
|
3938
3988
|
"chunkIndex": 15,
|
|
3939
3989
|
"chunkKind": "authoring_manifest",
|
|
3940
|
-
"content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
3990
|
+
"content": "{\"operationId\":\"page.preview.apply\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Apply agentic preview locally Effects: compile-domain-patch. Apply the current assistant preview to the local page.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"required\":true},\"inputContract\":{\"required\":[\"previewId\"],\"properties\":[\"previewId\",\"compiledFormPatch\"],\"semanticTerms\":[\"previewId\",\"compiledFormPatch\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"uiCompositionPlan\",\"compiledFormPatch.patch.page\",\"page\"],\"validators\":[{\"validatorId\":\"preview-result-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PREVIEW_VALID\",\"description\":\"Agentic preview result must be structurally valid.\"},{\"validatorId\":\"ui-composition-target-registry-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_TARGET_REGISTRY\",\"description\":\"UiCompositionPlan apply requires the ComponentMetadataRegistry of the target host.\"},{\"validatorId\":\"ui-composition-components-materializable\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_UI_PLAN_COMPONENTS_MATERIALIZABLE\",\"description\":\"Every planned component must resolve materializable metadata in the target registry.\"},{\"validatorId\":\"composition-endpoints-resolve\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_LINK_ENDPOINTS\",\"description\":\"Composition endpoints must resolve to known widgets, ports and nested paths.\"},{\"validatorId\":\"compiled-page-patch-present\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PATCH_PAGE_PRESENT\",\"description\":\"Preview envelope must include compiledFormPatch.patch.page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"}],\"preconditions\":[\"agentic-preview-loaded\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"apply-agentic-preview\",\"request\":\"Apply the current assistant preview to the local page.\",\"operationId\":\"page.preview.apply\",\"target\":\"preview-current\",\"params\":{\"previewId\":\"preview-current\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3941
3991
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3942
|
-
"contentHash": "
|
|
3992
|
+
"contentHash": "d611f11464e767d58127500f313a2e3712ce81475ec0de6e678c6a5a1141d7d8",
|
|
3943
3993
|
"sourceKind": "component_definition",
|
|
3944
3994
|
"sourceId": "praxis-page-builder",
|
|
3945
3995
|
"corpusVersion": "1.0.0"
|
|
@@ -3947,9 +3997,9 @@
|
|
|
3947
3997
|
{
|
|
3948
3998
|
"chunkIndex": 16,
|
|
3949
3999
|
"chunkKind": "authoring_manifest",
|
|
3950
|
-
"content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4000
|
+
"content": "{\"operationId\":\"page.persist.save\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Persist page through config API Effects: compile-domain-patch. Save this page configuration using the current ETag.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"required\":true},\"inputContract\":{\"required\":[\"pageIdentity\"],\"properties\":[\"pageIdentity\",\"page\",\"etag\"],\"semanticTerms\":[\"pageIdentity\",\"page\",\"etag\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"page\",\"pageIdentity\",\"etag\"],\"validators\":[{\"validatorId\":\"page-identity-complete\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_PAGE_IDENTITY\",\"description\":\"Save requires component type, component id and scope identity.\"},{\"validatorId\":\"etag-policy-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_ETAG_POLICY\",\"description\":\"Save must respect backend ETag/If-Match policy.\"},{\"validatorId\":\"runtime-page-valid\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_RUNTIME_PAGE_VALID\",\"description\":\"Runtime page must remain renderable by praxis-dynamic-page.\"},{\"validatorId\":\"no-envelope-runtime-persistence\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_ENVELOPE_PERSISTENCE\",\"description\":\"Runtime persistence cannot save the full preview envelope.\"}],\"preconditions\":[\"page-loaded\",\"page-identity-known\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"persist-page\",\"request\":\"Save this page configuration using the current ETag.\",\"operationId\":\"page.persist.save\",\"target\":\"tenant-dashboard-page\",\"params\":{\"pageIdentity\":{\"componentType\":\"page-builder\",\"componentId\":\"tenant-dashboard\",\"scope\":\"tenant\"},\"etag\":\"\\\"v7\\\"\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
3951
4001
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3952
|
-
"contentHash": "
|
|
4002
|
+
"contentHash": "45dc99a41d33049a5aaff51ef07b996b26a493c98a27896335c1bd011bbba7da",
|
|
3953
4003
|
"sourceKind": "component_definition",
|
|
3954
4004
|
"sourceId": "praxis-page-builder",
|
|
3955
4005
|
"corpusVersion": "1.0.0"
|
|
@@ -3957,9 +4007,9 @@
|
|
|
3957
4007
|
{
|
|
3958
4008
|
"chunkIndex": 17,
|
|
3959
4009
|
"chunkKind": "authoring_manifest",
|
|
3960
|
-
"content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4010
|
+
"content": "{\"operationId\":\"childOperation.delegate\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Delegate widget child operation Effects: compile-domain-patch. Add a salary column to the employees table widget. Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"scope\":\"global\",\"target\":{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"required\":false},\"inputContract\":{\"required\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\"],\"properties\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"],\"semanticTerms\":[\"widgetKey\",\"childComponentId\",\"childOperationId\",\"reason\",\"childTarget\",\"childParams\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"widgets[].definition.inputs\"],\"validators\":[{\"validatorId\":\"widget-exists\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_WIDGET_EXISTS\",\"description\":\"Target widget must exist.\"},{\"validatorId\":\"child-manifest-available\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_MANIFEST_AVAILABLE\",\"description\":\"Delegated child component must expose an authoring manifest or configEditor.\"},{\"validatorId\":\"child-operation-known\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CHILD_OPERATION_KNOWN\",\"description\":\"Delegated child operation id must be known.\"},{\"validatorId\":\"component-config-editor-respected\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_CONFIG_EDITOR_RESPECTED\",\"description\":\"ComponentDocMeta.configEditor must remain the source for child input editing.\"},{\"validatorId\":\"no-local-child-input-write\",\"level\":\"error\",\"code\":\"PAGE_BUILDER_NO_LOCAL_CHILD_INPUT_WRITE\",\"description\":\"Page-builder must not define child component input semantics locally.\"}],\"preconditions\":[\"page-loaded\",\"target-widget-exists\",\"child-authoring-contract-available\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"delegate-table-column-edit\",\"request\":\"Add a salary column to the employees table widget.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employees-table\",\"params\":{\"widgetKey\":\"employees-table\",\"childComponentId\":\"praxis-table\",\"childOperationId\":\"column.add\",\"reason\":\"TableConfig is owned by praxis-table.\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-direct-dynamic-form-field-write\",\"request\":\"Directly write a new dynamic-form field into the widget inputs from page-builder.\",\"operationId\":\"childOperation.delegate\",\"target\":\"employee-form\",\"params\":{\"widgetKey\":\"employee-form\",\"childComponentId\":\"praxis-dynamic-form\",\"childOperationId\":\"field.add\",\"reason\":\"Dynamic form fields are delegated.\"},\"isPositive\":false}]}",
|
|
3961
4011
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3962
|
-
"contentHash": "
|
|
4012
|
+
"contentHash": "feff01e143416953c7ba3281a4d274215d816f1ff0f739516d78c43ab4fa74f5",
|
|
3963
4013
|
"sourceKind": "component_definition",
|
|
3964
4014
|
"sourceId": "praxis-page-builder",
|
|
3965
4015
|
"corpusVersion": "1.0.0"
|
|
@@ -3967,9 +4017,9 @@
|
|
|
3967
4017
|
{
|
|
3968
4018
|
"chunkIndex": 18,
|
|
3969
4019
|
"chunkKind": "authoring_manifest",
|
|
3970
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4020
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"identity\"}",
|
|
3971
4021
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3972
|
-
"contentHash": "
|
|
4022
|
+
"contentHash": "0f8b21129f6321ab4c02633f7c8a554115d12af2b1b1e8c077088c674ca3dfce",
|
|
3973
4023
|
"sourceKind": "component_definition",
|
|
3974
4024
|
"sourceId": "praxis-page-builder",
|
|
3975
4025
|
"corpusVersion": "1.0.0"
|
|
@@ -3977,9 +4027,9 @@
|
|
|
3977
4027
|
{
|
|
3978
4028
|
"chunkIndex": 19,
|
|
3979
4029
|
"chunkKind": "authoring_manifest",
|
|
3980
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4030
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"autoPersist\",\"type\":\"boolean\",\"description\":\"Host-only opt-in Core persistence for manual pages. Disabled for agentic authoring and authoringDocument; never use to persist an AI preview.\"},{\"name\":\"page\",\"type\":\"WidgetPageDefinition\",\"description\":\"Canonical renderable page document consumed by praxis-dynamic-page.\"},{\"name\":\"pageIdentity\",\"type\":\"PageIdentity | null\",\"description\":\"Persistence identity for ui_user_config save/apply flows; not persisted inside page.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables page-builder authoring chrome around the runtime page.\"},{\"name\":\"authoringCapabilities\",\"type\":\"PageBuilderAuthoringCapabilities | null\",\"description\":\"Host-only grant that limits visible authoring operations without changing WidgetPageDefinition and without granting AI edit authority; omitted capabilities preserve full authoring.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Opaque host context passed to catalog resolution and agentic authoring.\"},{\"name\":\"pageChange\",\"type\":\"WidgetPageDefinition\",\"description\":\"Emitted after local apply/preview produces a renderable page.\"},{\"name\":\"pageAuthoringChange\",\"type\":\"WidgetPageDefinition\",\"description\":\"Emitted only after explicit visual authoring operations so hosts can keep authored source separate from runtime state.\"},{\"name\":\"agenticAuthoringEnableStreaming\",\"type\":\"boolean\",\"description\":\"Opt-in flag for the canonical streaming turn endpoints.\"},{\"name\":\"agenticAuthoringIncludeLlmDiagnostics\",\"type\":\"boolean\",\"description\":\"Opt-in flag that exposes governed diagnostics as cockpit evidence for validation and debugging.\"},{\"name\":\"agenticAuthoringContextHints\",\"type\":\"Record<string, unknown>\",\"description\":\"Host-provided semantic hints, including governed domain-catalog references and optional RAG-authored openingMessage used to ground AI-authored decisions.\"}]}",
|
|
3981
4031
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3982
|
-
"contentHash": "
|
|
4032
|
+
"contentHash": "0ba8d906647c149eca96829013642a9fd1a3484f1a6d1f16fc0403790f6154f4",
|
|
3983
4033
|
"sourceKind": "component_definition",
|
|
3984
4034
|
"sourceId": "praxis-page-builder",
|
|
3985
4035
|
"corpusVersion": "1.0.0"
|
|
@@ -3987,9 +4037,9 @@
|
|
|
3987
4037
|
{
|
|
3988
4038
|
"chunkIndex": 20,
|
|
3989
4039
|
"chunkKind": "authoring_manifest",
|
|
3990
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4040
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"page\",\"resolver\":\"widget-page-definition-root\",\"description\":\"Root WidgetPageDefinition document: title, metadata, context, declarative dataSources and renderable page envelope.\"},{\"kind\":\"canvas\",\"resolver\":\"widget-page-canvas\",\"description\":\"Canvas geometry and item placement for top-level widgets.\"},{\"kind\":\"widget\",\"resolver\":\"widget-by-stable-key\",\"description\":\"Widget definitions addressed by stable widgetKey, never by array index.\"},{\"kind\":\"widgetShell\",\"resolver\":\"widget-shell-by-widget-key\",\"description\":\"Dashboard-card shell metadata such as title, action chrome and visual preset.\"},{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"description\":\"Declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"},{\"kind\":\"state\",\"resolver\":\"page-state-path\",\"description\":\"Page-level state entries referenced by composition links.\"},{\"kind\":\"pageIdentity\",\"resolver\":\"page-builder-persistence-identity\",\"description\":\"ui_user_config identity, scope and ETag used by applyPage/save.\"},{\"kind\":\"agenticPreview\",\"resolver\":\"agentic-preview-result\",\"description\":\"Compiled backend preview envelope whose patch.page is applied locally.\"},{\"kind\":\"childOperation\",\"resolver\":\"widget-child-authoring-manifest-operation\",\"description\":\"Delegated operation owned by the child widget component manifest or configEditor.\"}]}",
|
|
3991
4041
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
3992
|
-
"contentHash": "
|
|
4042
|
+
"contentHash": "a6db7365b1b176ad69ca829858292dd4906596a23105acaf42c8cdc532e3bb57",
|
|
3993
4043
|
"sourceKind": "component_definition",
|
|
3994
4044
|
"sourceId": "praxis-page-builder",
|
|
3995
4045
|
"corpusVersion": "1.0.0"
|
|
@@ -3997,9 +4047,9 @@
|
|
|
3997
4047
|
{
|
|
3998
4048
|
"chunkIndex": 21,
|
|
3999
4049
|
"chunkKind": "authoring_manifest",
|
|
4000
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4050
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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\"},\"dataSources\":{\"oneOf\":[{\"type\":\"array\"},{\"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\",\"page.dataSources\"],\"identityKeys\":[\"pageIdentity.componentId\",\"pageIdentity.scope\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"layoutPreset\":{\"type\":\"string\"},\"themePreset\":{\"type\":\"string\"},\"context\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"},\"dataSources\":{\"oneOf\":[{\"type\":\"array\"},{\"type\":\"object\"}]}}},\"failureModes\":[\"page-not-loaded\",\"context-not-json\",\"settings-panel-bridge-missing\"],\"description\":\"Updates root page metadata and declarative dataSources 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\",\"dataSources\"],\"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\"]}]}",
|
|
4001
4051
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4002
|
-
"contentHash": "
|
|
4052
|
+
"contentHash": "57d7fff5f22a1f67f81799a50187639d02ce3aa6e8adaef3430155725b690ab0",
|
|
4003
4053
|
"sourceKind": "component_definition",
|
|
4004
4054
|
"sourceId": "praxis-page-builder",
|
|
4005
4055
|
"corpusVersion": "1.0.0"
|
|
@@ -4007,9 +4057,9 @@
|
|
|
4007
4057
|
{
|
|
4008
4058
|
"chunkIndex": 22,
|
|
4009
4059
|
"chunkKind": "authoring_manifest",
|
|
4010
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4060
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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\":{\"appearance\":{\"type\":\"object\",\"properties\":{\"card\":{\"type\":\"object\",\"properties\":{\"background\":{\"type\":\"string\"},\"borderColor\":{\"type\":\"string\"},\"borderWidth\":{\"type\":\"string\",\"description\":\"CSS border width; accepts per-side values.\"},\"borderStyle\":{\"type\":\"string\",\"description\":\"CSS border style: solid, dashed, dotted, double, none; accepts per-side values.\"},\"borderRadius\":{\"type\":\"string\"},\"shadow\":{\"type\":\"string\"},\"backdropFilter\":{\"type\":\"string\",\"description\":\"CSS backdrop effect for a translucent card, e.g. blur(16px) saturate(125%). none disables it.\"},\"fallbackBackground\":{\"type\":\"string\",\"description\":\"Opaque background for reduced transparency, unsupported blur and fullscreen/expanded modes.\"},\"interactionHighlight\":{\"type\":\"string\",\"enum\":[\"standard\",\"gradient\"],\"description\":\"Editing selection and keyboard-focus highlight. Absence in the saved shell inherits the preset, then standard. This operation merges partial input: omission preserves an existing override; use the visual editor to remove it. Gradient uses theme colors; never changes child inputs.\"}}},\"header\":{\"type\":\"object\",\"properties\":{\"background\":{\"type\":\"string\"},\"borderColor\":{\"type\":\"string\"},\"borderWidth\":{\"type\":\"string\",\"description\":\"CSS width of the bottom header divider.\"},\"borderStyle\":{\"type\":\"string\",\"description\":\"CSS style of the bottom header divider.\"},\"titleColor\":{\"type\":\"string\"},\"subtitleColor\":{\"type\":\"string\"},\"iconColor\":{\"type\":\"string\"}}}}},\"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\"]}]}",
|
|
4011
4061
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4012
|
-
"contentHash": "
|
|
4062
|
+
"contentHash": "8166c3f95e7db89082089c9625aa34b15b95bdf8c676a9d5bd2f9f0661af7cf0",
|
|
4013
4063
|
"sourceKind": "component_definition",
|
|
4014
4064
|
"sourceId": "praxis-page-builder",
|
|
4015
4065
|
"corpusVersion": "1.0.0"
|
|
@@ -4017,9 +4067,9 @@
|
|
|
4017
4067
|
{
|
|
4018
4068
|
"chunkIndex": 23,
|
|
4019
4069
|
"chunkKind": "authoring_manifest",
|
|
4020
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4070
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"componentId\":\"praxis-page-builder\",\"ownerPackage\":\"@praxisui/page-builder\",\"configSchemaId\":\"WidgetPageDefinition\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"composition.link.add\",\"title\":\"Add page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-add\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\",\"WidgetPageDefinition.widgets\",\"PAGE_BUILDER_AI_CAPABILITIES\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"from\",\"to\",\"intent\"],\"additionalProperties\":false,\"properties\":{\"id\":{\"type\":\"string\"},\"from\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"}}}}}]},\"to\":{\"oneOf\":[{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"component-port\"]},\"ref\":{\"type\":\"object\",\"required\":[\"widget\",\"port\",\"direction\"],\"additionalProperties\":false,\"properties\":{\"widget\":{\"type\":\"string\"},\"port\":{\"type\":\"string\"},\"direction\":{\"enum\":[\"input\",\"output\"]},\"bindingPath\":{\"type\":\"string\"},\"nestedPath\":{\"type\":\"array\"}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"state\"]},\"ref\":{\"type\":\"object\",\"required\":[\"path\"],\"additionalProperties\":false,\"properties\":{\"path\":{\"type\":\"string\"},\"layer\":{\"enum\":[\"values\",\"derived\",\"transient\"]}}}}},{\"type\":\"object\",\"required\":[\"kind\",\"ref\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]},\"ref\":{\"type\":\"object\",\"required\":[\"actionId\"],\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\"},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"},\"meta\":{\"type\":\"object\"}}}}}]},\"intent\":{\"enum\":[\"event-propagation\",\"state-write\",\"state-read\",\"command-dispatch\",\"selection-sync\",\"data-projection\",\"status-propagation\"]},\"condition\":{\"type\":\"object\"},\"transform\":{\"type\":\"object\"},\"policy\":{\"type\":\"object\"},\"metadata\":{\"type\":\"object\"}}},\"failureModes\":[\"link-id-duplicate\",\"endpoint-not-found\",\"nested-path-invalid\",\"json-logic-invalid\"],\"description\":\"Adds canonical declarative wiring in page.composition.links, including component-port nestedPath endpoints.\"}}],\"validators\":[\"composition-link-id-unique\",\"composition-endpoints-resolve\",\"nested-path-terminal-widget-key-required\",\"json-logic-condition-valid\",\"no-legacy-connections-write\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"widgets-resolvable\"]},{\"operationId\":\"composition.link.remove\",\"title\":\"Remove page composition link\",\"scope\":\"dataBinding\",\"targetKind\":\"compositionLink\",\"target\":{\"kind\":\"compositionLink\",\"resolver\":\"composition-link-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"confirmed\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"page-builder-composition-link-remove\",\"handlerContract\":{\"reads\":[\"WidgetPageDefinition.composition.links\"],\"writes\":[\"page.composition.links[]\"],\"identityKeys\":[\"id\"],\"failureModes\":[\"composition-link-not-found\",\"destructive-removal-not-confirmed\"],\"description\":\"Removes a canonical composition link by stable id.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"composition-link-exists\",\"destructive-removal-confirmed\",\"composition-links-still-valid\"],\"affectedPaths\":[\"composition.links[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"page-loaded\",\"target-link-exists\"]}]}",
|
|
4021
4071
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4022
|
-
"contentHash": "
|
|
4072
|
+
"contentHash": "f2a072640ae50e1276f62abc2188e7bf119d888e76613146439115ed1e0ba38a",
|
|
4023
4073
|
"sourceKind": "component_definition",
|
|
4024
4074
|
"sourceId": "praxis-page-builder",
|
|
4025
4075
|
"corpusVersion": "1.0.0"
|
|
@@ -4027,9 +4077,9 @@
|
|
|
4027
4077
|
{
|
|
4028
4078
|
"chunkIndex": 24,
|
|
4029
4079
|
"chunkKind": "authoring_manifest",
|
|
4030
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4080
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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\"]},{\"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\"]}]}",
|
|
4031
4081
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4032
|
-
"contentHash": "
|
|
4082
|
+
"contentHash": "10a5749a76e63d4bc10bf61adcf0db3c8368dd8ae5c66d5944facf5d27e81470",
|
|
4033
4083
|
"sourceKind": "component_definition",
|
|
4034
4084
|
"sourceId": "praxis-page-builder",
|
|
4035
4085
|
"corpusVersion": "1.0.0"
|
|
@@ -4037,9 +4087,9 @@
|
|
|
4037
4087
|
{
|
|
4038
4088
|
"chunkIndex": 25,
|
|
4039
4089
|
"chunkKind": "authoring_manifest",
|
|
4040
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4090
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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.\"}]}",
|
|
4041
4091
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4042
|
-
"contentHash": "
|
|
4092
|
+
"contentHash": "a13fac7022335ef74d7417acb55d0573d34b1182ccc3bbbbd11c4db141defd39",
|
|
4043
4093
|
"sourceKind": "component_definition",
|
|
4044
4094
|
"sourceId": "praxis-page-builder",
|
|
4045
4095
|
"corpusVersion": "1.0.0"
|
|
@@ -4047,9 +4097,9 @@
|
|
|
4047
4097
|
{
|
|
4048
4098
|
"chunkIndex": 26,
|
|
4049
4099
|
"chunkKind": "authoring_manifest",
|
|
4050
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4100
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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.\"}]}",
|
|
4051
4101
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4052
|
-
"contentHash": "
|
|
4102
|
+
"contentHash": "69816595a309faa8c4e0f4a1d38e25869c8843ebae2eb504cff7fc45bbaac589",
|
|
4053
4103
|
"sourceKind": "component_definition",
|
|
4054
4104
|
"sourceId": "praxis-page-builder",
|
|
4055
4105
|
"corpusVersion": "1.0.0"
|
|
@@ -4057,9 +4107,9 @@
|
|
|
4057
4107
|
{
|
|
4058
4108
|
"chunkIndex": 27,
|
|
4059
4109
|
"chunkKind": "authoring_manifest",
|
|
4060
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4110
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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.\",\"Widget inputs and inputs.context may reference page.state.values and page.state.derived using {{state.<path> | pipe}} or ${state.<path> | pipe} with CSP-safe declarative pipes (default/coalesce, round, number, percent, currency, uppercase, lowercase); the Page State Binder detects unbound state tokens across widget inputs and *Expr properties for one-click binding.\"]}",
|
|
4061
4111
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4062
|
-
"contentHash": "
|
|
4112
|
+
"contentHash": "dd7af4c4f06d2b10c2e92461dbba93a537149002acc880019ecbe349390cdd45",
|
|
4063
4113
|
"sourceKind": "component_definition",
|
|
4064
4114
|
"sourceId": "praxis-page-builder",
|
|
4065
4115
|
"corpusVersion": "1.0.0"
|
|
@@ -4067,9 +4117,9 @@
|
|
|
4067
4117
|
{
|
|
4068
4118
|
"chunkIndex": 28,
|
|
4069
4119
|
"chunkKind": "authoring_manifest",
|
|
4070
|
-
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.
|
|
4120
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.2\",\"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}]}",
|
|
4071
4121
|
"sourcePointer": "projects/praxis-page-builder/src/lib/ai/praxis-page-builder-authoring-manifest.ts",
|
|
4072
|
-
"contentHash": "
|
|
4122
|
+
"contentHash": "bc59327f6f2da015074c8b0c6912246427713e1d9d8b294280517a9d5c909020",
|
|
4073
4123
|
"sourceKind": "component_definition",
|
|
4074
4124
|
"sourceId": "praxis-page-builder",
|
|
4075
4125
|
"corpusVersion": "1.0.0"
|