@praxisui/crud 9.0.0-beta.21 → 9.0.0-beta.25
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/ai/component-registry.json +117 -12
- package/fesm2022/praxisui-crud.mjs +23 -1
- package/package.json +7 -7
- package/types/praxisui-crud.d.ts +5 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-30T12:05:08.567Z",
|
|
4
4
|
"packageName": "@praxisui/crud",
|
|
5
|
-
"packageVersion": "9.0.0-beta.
|
|
5
|
+
"packageVersion": "9.0.0-beta.25",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 2,
|
|
@@ -495,6 +495,12 @@
|
|
|
495
495
|
"valueKind": "object",
|
|
496
496
|
"description": "Seed fixo do formulario injetado em inputs.initialValue antes da abertura."
|
|
497
497
|
},
|
|
498
|
+
{
|
|
499
|
+
"path": "actions[].form.layoutPolicy",
|
|
500
|
+
"category": "actions",
|
|
501
|
+
"valueKind": "object",
|
|
502
|
+
"description": "Politica schema-driven opt-in encaminhada ao Dynamic Form para materializar detalhe ou command form sem FormConfig.sections local; deve acompanhar schemaUrl compativel, especialmente schemaType=request para comandos."
|
|
503
|
+
},
|
|
498
504
|
{
|
|
499
505
|
"path": "actions[].back",
|
|
500
506
|
"category": "navigation",
|
|
@@ -1608,6 +1614,9 @@
|
|
|
1608
1614
|
},
|
|
1609
1615
|
"initialValue": {
|
|
1610
1616
|
"type": "object"
|
|
1617
|
+
},
|
|
1618
|
+
"layoutPolicy": {
|
|
1619
|
+
"type": "object"
|
|
1611
1620
|
}
|
|
1612
1621
|
}
|
|
1613
1622
|
},
|
|
@@ -2657,9 +2666,9 @@
|
|
|
2657
2666
|
{
|
|
2658
2667
|
"chunkIndex": 1,
|
|
2659
2668
|
"chunkKind": "capabilities",
|
|
2660
|
-
"content": "Component Capabilities:\n - Path: component\n Category: meta\n Kind: enum\n Description: Identificador fixo do componente.\n - Path: resource\n Category: resource\n Kind: object\n Description: Recurso principal do CRUD.\n - Path: resource.path\n Category: resource\n Kind: string\n Description: Endpoint base do recurso.\n - Path: resource.idField\n Category: resource\n Kind: string\n Description: Campo identificador do recurso.\n - Path: resource.endpointKey\n Category: resource\n Kind: string\n Description: Chave de endpoint (ApiEndpoint).\n - Path: queryContext.meta.domainCatalog\n Category: resource\n Kind: object\n Description: Referencia leve para contexto semantico/governanca resolvido via Domain Catalog; nao materializa regras em FormConfig.\n - Path: queryContext.meta.domainCatalog.schemaVersion\n Category: resource\n Kind: string\n Description: Versao do contrato DomainCatalogContextHint usado em runtime e prompts.\n - Path: queryContext.meta.domainCatalog.resourceKey\n Category: resource\n Kind: string\n Description: ResourceKey semantico estavel usado para resolver vocabulario/governanca de dominio.\n - Path: queryContext.meta.domainCatalog.releaseId\n Category: resource\n Kind: string\n Description: Release opcional do Domain Catalog usada como fonte do contexto.\n - Path: queryContext.meta.domainCatalog.query\n Category: resource\n Kind: string\n Description: Probe de campo/conceito usado para buscar itens relevantes, como cpf, salario ou status.\n - Path: queryContext.meta.domainCatalog.intent\n Category: resource\n Kind: enum\n Description: Intencao de uso do contexto para orientar LLMs e validadores sem expor dados alem do necessario.\n - Path: table\n Category: table\n Kind: object\n Description: TableConfig completo (usar catalogo de tabela).\n - Path: form\n Category: form\n Kind: object\n Description: FormConfig completo (usar catalogo de formulario).\n - Path: defaults\n Category: defaults\n Kind: object\n Description: Defaults aplicados a acoes e UI.\n - Path: defaults.openMode\n Category: defaults\n Kind: enum\n Description: Modo padrao de abertura (route/modal/drawer).\n - Path: defaults.modal\n Category: defaults\n Kind: object\n Description: Config de dialog (DialogConfig).\n - Path: defaults.back\n Category: navigation\n Kind: object\n Description: Config de retorno (BackConfig).\n - Path: defaults.back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno.\n - Path: defaults.back.returnTo\n Category: navigation\n Kind: string\n Description: Rota de retorno quando strategy=navigate.\n - Path: defaults.back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Confirmar ao sair com alteracoes.\n - Path: defaults.header\n Category: defaults\n Kind: object\n Description: Config do header do CRUD.\n - Path: defaults.header.showBack\n Category: defaults\n Kind: boolean\n Description: Exibir botao voltar.\n - Path: defaults.header.backLabel\n Category: defaults\n Kind: string\n Description: Label do botao voltar.\n - Path: defaults.header.variant\n Category: defaults\n Kind: enum\n Description: Variante visual do header.\n - Path: defaults.header.sticky\n Category: defaults\n Kind: boolean\n Description: Header fixo.\n - Path: defaults.header.breadcrumbs\n Category: defaults\n Kind: boolean\n Description: Exibir breadcrumbs.\n - Path: defaults.header.divider\n Category: defaults\n Kind: boolean\n Description: Exibir divisor no header.\n - Path: actions\n Category: actions\n Kind: array\n Description: Acoes disponiveis no CRUD.\n - Path: actions[].id\n Category: actions\n Kind: string\n Description: ID da acao (RowAction/ToolbarAction).\n - Path: actions[].label\n Category: actions\n Kind: string\n Description: Label da acao.\n - Path: actions[].icon\n Category: actions\n Kind: string\n Description: Icone da acao.\n - Path: actions[].color\n Category: actions\n Kind: string\n Description: Cor da acao.\n - Path: actions[].disabled\n Category: actions\n Kind: boolean\n Description: Acao desabilitada.\n - Path: actions[].action\n Category: actions\n Kind: string\n Description: Nome da acao emitida.\n - Path: actions[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip da acao.\n - Path: actions[].requiresConfirmation\n Category: actions\n Kind: boolean\n Description: Exige confirmacao.\n - Path: actions[].visibleWhen\n Category: actions\n Kind: expression\n Description: Condicao de visibilidade (RowAction/ToolbarAction).\n - Path: actions[].separator\n Category: actions\n Kind: boolean\n Description: Separador apos a acao (RowAction).\n - Path: actions[].autoDelete\n Category: actions\n Kind: boolean\n Description: Habilita auto delete (RowAction).\n - Path: actions[].deleteEndpoint\n Category: actions\n Kind: string\n Description: Endpoint custom para delete (RowAction).\n - Path: actions[].type\n Category: actions\n Kind: enum\n Description: Tipo de acao (ToolbarAction).\n - Path: actions[].appearance\n Category: actions\n Kind: enum\n Description: Aparencia do botao (ToolbarAction).\n - Path: actions[].position\n Category: actions\n Kind: enum\n Description: Posicao da acao (ToolbarAction).\n - Path: actions[].order\n Category: actions\n Kind: number\n Description: Ordem de exibicao (ToolbarAction).\n - Path: actions[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ToolbarAction).\n - Path: actions[].children\n Category: actions\n Kind: array\n Description: Sub-acoes (menu).\n - Path: actions[].openMode\n Category: actions\n Kind: enum\n Description: Modo de abertura da acao.\n - Path: actions[].route\n Category: actions\n Kind: string\n Description: Rota para openMode=route.\n - Path: actions[].formId\n Category: actions\n Kind: string\n Description: FormId canonico para modal/drawer; se ausente, o host precisa resolve-lo por override por acao antes da abertura.\n - Path: actions[].params\n Category: actions\n Kind: array\n Description: Mapeamento de parametros.\n - Path: actions[].params[].from\n Category: actions\n Kind: string\n Description: Origem do parametro.\n - Path: actions[].params[].to\n Category: actions\n Kind: enum\n Description: Destino do parametro.\n - Path: actions[].params[].name\n Category: actions\n Kind: string\n Description: Nome do parametro no destino.\n - Path: actions[].form.initialValue\n Category: actions\n Kind: object\n Description: Seed fixo do formulario injetado em inputs.initialValue antes da abertura.\n - Path: actions[].back\n Category: navigation\n Kind: object\n Description: BackConfig por acao.\n - Path: actions[].back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno da acao (auto, close, navigate).\n - Path: actions[].back.returnTo\n Category: navigation\n Kind: string\n Description: Rota ou destino usado quando a estrategia de retorno for navigate.\n - Path: actions[].back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Solicita confirmacao antes de sair com alteracoes nao salvas.\n - Path: i18n\n Category: i18n\n Kind: object\n Description: Mensagens i18n do CRUD.\n - Path: i18n.crudDialog\n Category: i18n\n Kind: object\n Description: Mapa de textos do dialog.\nCapability Notes:\n - CrudMetadata agrega TableConfig e FormConfig; use os catalogos de tabela e formulario para detalhes.\n - actions[] herda campos de RowAction e ToolbarAction; combine com openMode/route/formId quando aplicavel.\n",
|
|
2669
|
+
"content": "Component Capabilities:\n - Path: component\n Category: meta\n Kind: enum\n Description: Identificador fixo do componente.\n - Path: resource\n Category: resource\n Kind: object\n Description: Recurso principal do CRUD.\n - Path: resource.path\n Category: resource\n Kind: string\n Description: Endpoint base do recurso.\n - Path: resource.idField\n Category: resource\n Kind: string\n Description: Campo identificador do recurso.\n - Path: resource.endpointKey\n Category: resource\n Kind: string\n Description: Chave de endpoint (ApiEndpoint).\n - Path: queryContext.meta.domainCatalog\n Category: resource\n Kind: object\n Description: Referencia leve para contexto semantico/governanca resolvido via Domain Catalog; nao materializa regras em FormConfig.\n - Path: queryContext.meta.domainCatalog.schemaVersion\n Category: resource\n Kind: string\n Description: Versao do contrato DomainCatalogContextHint usado em runtime e prompts.\n - Path: queryContext.meta.domainCatalog.resourceKey\n Category: resource\n Kind: string\n Description: ResourceKey semantico estavel usado para resolver vocabulario/governanca de dominio.\n - Path: queryContext.meta.domainCatalog.releaseId\n Category: resource\n Kind: string\n Description: Release opcional do Domain Catalog usada como fonte do contexto.\n - Path: queryContext.meta.domainCatalog.query\n Category: resource\n Kind: string\n Description: Probe de campo/conceito usado para buscar itens relevantes, como cpf, salario ou status.\n - Path: queryContext.meta.domainCatalog.intent\n Category: resource\n Kind: enum\n Description: Intencao de uso do contexto para orientar LLMs e validadores sem expor dados alem do necessario.\n - Path: table\n Category: table\n Kind: object\n Description: TableConfig completo (usar catalogo de tabela).\n - Path: form\n Category: form\n Kind: object\n Description: FormConfig completo (usar catalogo de formulario).\n - Path: defaults\n Category: defaults\n Kind: object\n Description: Defaults aplicados a acoes e UI.\n - Path: defaults.openMode\n Category: defaults\n Kind: enum\n Description: Modo padrao de abertura (route/modal/drawer).\n - Path: defaults.modal\n Category: defaults\n Kind: object\n Description: Config de dialog (DialogConfig).\n - Path: defaults.back\n Category: navigation\n Kind: object\n Description: Config de retorno (BackConfig).\n - Path: defaults.back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno.\n - Path: defaults.back.returnTo\n Category: navigation\n Kind: string\n Description: Rota de retorno quando strategy=navigate.\n - Path: defaults.back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Confirmar ao sair com alteracoes.\n - Path: defaults.header\n Category: defaults\n Kind: object\n Description: Config do header do CRUD.\n - Path: defaults.header.showBack\n Category: defaults\n Kind: boolean\n Description: Exibir botao voltar.\n - Path: defaults.header.backLabel\n Category: defaults\n Kind: string\n Description: Label do botao voltar.\n - Path: defaults.header.variant\n Category: defaults\n Kind: enum\n Description: Variante visual do header.\n - Path: defaults.header.sticky\n Category: defaults\n Kind: boolean\n Description: Header fixo.\n - Path: defaults.header.breadcrumbs\n Category: defaults\n Kind: boolean\n Description: Exibir breadcrumbs.\n - Path: defaults.header.divider\n Category: defaults\n Kind: boolean\n Description: Exibir divisor no header.\n - Path: actions\n Category: actions\n Kind: array\n Description: Acoes disponiveis no CRUD.\n - Path: actions[].id\n Category: actions\n Kind: string\n Description: ID da acao (RowAction/ToolbarAction).\n - Path: actions[].label\n Category: actions\n Kind: string\n Description: Label da acao.\n - Path: actions[].icon\n Category: actions\n Kind: string\n Description: Icone da acao.\n - Path: actions[].color\n Category: actions\n Kind: string\n Description: Cor da acao.\n - Path: actions[].disabled\n Category: actions\n Kind: boolean\n Description: Acao desabilitada.\n - Path: actions[].action\n Category: actions\n Kind: string\n Description: Nome da acao emitida.\n - Path: actions[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip da acao.\n - Path: actions[].requiresConfirmation\n Category: actions\n Kind: boolean\n Description: Exige confirmacao.\n - Path: actions[].visibleWhen\n Category: actions\n Kind: expression\n Description: Condicao de visibilidade (RowAction/ToolbarAction).\n - Path: actions[].separator\n Category: actions\n Kind: boolean\n Description: Separador apos a acao (RowAction).\n - Path: actions[].autoDelete\n Category: actions\n Kind: boolean\n Description: Habilita auto delete (RowAction).\n - Path: actions[].deleteEndpoint\n Category: actions\n Kind: string\n Description: Endpoint custom para delete (RowAction).\n - Path: actions[].type\n Category: actions\n Kind: enum\n Description: Tipo de acao (ToolbarAction).\n - Path: actions[].appearance\n Category: actions\n Kind: enum\n Description: Aparencia do botao (ToolbarAction).\n - Path: actions[].position\n Category: actions\n Kind: enum\n Description: Posicao da acao (ToolbarAction).\n - Path: actions[].order\n Category: actions\n Kind: number\n Description: Ordem de exibicao (ToolbarAction).\n - Path: actions[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ToolbarAction).\n - Path: actions[].children\n Category: actions\n Kind: array\n Description: Sub-acoes (menu).\n - Path: actions[].openMode\n Category: actions\n Kind: enum\n Description: Modo de abertura da acao.\n - Path: actions[].route\n Category: actions\n Kind: string\n Description: Rota para openMode=route.\n - Path: actions[].formId\n Category: actions\n Kind: string\n Description: FormId canonico para modal/drawer; se ausente, o host precisa resolve-lo por override por acao antes da abertura.\n - Path: actions[].params\n Category: actions\n Kind: array\n Description: Mapeamento de parametros.\n - Path: actions[].params[].from\n Category: actions\n Kind: string\n Description: Origem do parametro.\n - Path: actions[].params[].to\n Category: actions\n Kind: enum\n Description: Destino do parametro.\n - Path: actions[].params[].name\n Category: actions\n Kind: string\n Description: Nome do parametro no destino.\n - Path: actions[].form.initialValue\n Category: actions\n Kind: object\n Description: Seed fixo do formulario injetado em inputs.initialValue antes da abertura.\n - Path: actions[].form.layoutPolicy\n Category: actions\n Kind: object\n Description: Politica schema-driven opt-in encaminhada ao Dynamic Form para materializar detalhe ou command form sem FormConfig.sections local; deve acompanhar schemaUrl compativel, especialmente schemaType=request para comandos.\n - Path: actions[].back\n Category: navigation\n Kind: object\n Description: BackConfig por acao.\n - Path: actions[].back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno da acao (auto, close, navigate).\n - Path: actions[].back.returnTo\n Category: navigation\n Kind: string\n Description: Rota ou destino usado quando a estrategia de retorno for navigate.\n - Path: actions[].back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Solicita confirmacao antes de sair com alteracoes nao salvas.\n - Path: i18n\n Category: i18n\n Kind: object\n Description: Mensagens i18n do CRUD.\n - Path: i18n.crudDialog\n Category: i18n\n Kind: object\n Description: Mapa de textos do dialog.\nCapability Notes:\n - CrudMetadata agrega TableConfig e FormConfig; use os catalogos de tabela e formulario para detalhes.\n - actions[] herda campos de RowAction e ToolbarAction; combine com openMode/route/formId quando aplicavel.\n",
|
|
2661
2670
|
"sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/crud-ai-capabilities.ts",
|
|
2662
|
-
"contentHash": "
|
|
2671
|
+
"contentHash": "e3959d7122d7d2b398435cdc7a7d6b351e0d98b2abf6dc753b1cf352cb4d0aee",
|
|
2663
2672
|
"sourceKind": "component_definition",
|
|
2664
2673
|
"sourceId": "praxis-crud",
|
|
2665
2674
|
"corpusVersion": "1.0.0"
|
|
@@ -2667,9 +2676,9 @@
|
|
|
2667
2676
|
{
|
|
2668
2677
|
"chunkIndex": 2,
|
|
2669
2678
|
"chunkKind": "authoring_manifest",
|
|
2670
|
-
"content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-crud\",\n \"ownerPackage\": \"@praxisui/crud\",\n \"configSchemaId\": \"CrudMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"metadata\",\n \"type\": \"CrudMetadata | string\",\n \"description\": \"Canonical CRUD metadata or serialized metadata document.\"\n },\n {\n \"name\": \"crudId\",\n \"type\": \"string\",\n \"description\": \"Stable CRUD instance id used for table/form identity and persistence.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional stable host instance id for multiple CRUD widgets on the same route.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context used for authoring seeds and launcher inputs.\"\n },\n {\n \"name\": \"afterOpen\",\n \"type\": \"{ mode: FormOpenMode; action: string }\",\n \"description\": \"Emitted after a CRUD action opens.\"\n },\n {\n \"name\": \"afterSave\",\n \"type\": \"{ id: string | number; data: unknown }\",\n \"description\": \"Emitted after save; CRUD refetches the list.\"\n },\n {\n \"name\": \"afterDelete\",\n \"type\": \"{ id: string | number }\",\n \"description\": \"Emitted after delete; CRUD refetches the list.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"description\": \"Resource path/key, id field, endpoint key and query context owned by CRUD orchestration.\"\n },\n {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"description\": \"CRUD-hosted list surface and table delegation boundary.\"\n },\n {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"description\": \"Create action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"description\": \"Edit action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"description\": \"View action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"description\": \"Delete action enablement, confirmation, endpoint and capability policy.\"\n },\n {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"description\": \"Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent.\"\n },\n {\n \"kind\": \"formBinding\",\n \"resolver\": \"crud-action-form-contract-by-action-id\",\n \"description\": \"CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue.\"\n },\n {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"description\": \"CRUD action availability derived from resource capabilities and action permissions.\"\n },\n {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"description\": \"Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"description\": \"Delegated form/table/dialog/settings-panel operation owned by the child component manifest.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"resource.bind\",\n \"title\": \"Bind CRUD resource\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"resourceBinding\",\n \"target\": {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourcePath\"\n ],\n \"properties\": {\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"idField\": {\n \"type\": [\n \"string\",\n \"number\"\n ]\n },\n \"endpointKey\": {\n \"type\": \"string\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-resource-bind\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"api_metadata\",\n \"ResourceDiscoveryService\",\n \"GET /{resource}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"PraxisCrudComponent.tableCrudContext\"\n ],\n \"identityKeys\": [\n \"resourcePath\",\n \"resourceKey\"\n ],\n \"failureModes\": [\n \"resource-not-found\",\n \"schema-url-not-canonical\",\n \"capabilities-unavailable\",\n \"id-field-missing\"\n ],\n \"description\": \"Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use.\"\n }\n }\n ],\n \"validators\": [\n \"resource-exists-in-api-metadata\",\n \"resource-path-canonical\",\n \"resource-key-stable\",\n \"id-field-known\",\n \"resource-capabilities-resolvable\"\n ],\n \"affectedPaths\": [\n \"resource.path\",\n \"resource.idField\",\n \"resource.endpointKey\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\"\n ]\n },\n {\n \"operationId\": \"domain.governanceContext.attach\",\n \"title\": \"Attach Domain Catalog governance context\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"domainGovernanceContext\",\n \"target\": {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourceKey\",\n \"query\"\n ],\n \"properties\": {\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"releaseId\": {\n \"type\": \"string\"\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"itemTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"governance\",\n \"vocabulary\",\n \"relationship\"\n ]\n }\n },\n \"intent\": {\n \"enum\": [\n \"authoring\",\n \"explain\",\n \"validate\",\n \"ai-access-control\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-domain-governance-context-attach\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"DomainCatalogService.getGovernanceContext\",\n \"DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.queryContext.meta.domainCatalog\"\n ],\n \"identityKeys\": [\n \"resourceKey\",\n \"releaseId\",\n \"query\"\n ],\n \"failureModes\": [\n \"resource-key-missing\",\n \"domain-catalog-release-not-found\",\n \"governance-context-empty\",\n \"ai-usage-forbidden\"\n ],\n \"description\": \"Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog.\"\n }\n }\n ],\n \"validators\": [\n \"resource-key-stable\",\n \"domain-catalog-context-resolvable\",\n \"domain-catalog-read-only\",\n \"ai-usage-visibility-respected\",\n \"no-form-config-rule-materialization\"\n ],\n \"affectedPaths\": [\n \"queryContext.meta.domainCatalog\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\",\n \"domain-catalog-service-available\"\n ]\n },\n {\n \"operationId\": \"list.surface.configure\",\n \"title\": \"Configure CRUD list surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"listSurface\",\n \"target\": {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"tablePatch\": {\n \"type\": \"object\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n },\n \"filterCriteria\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-list-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"CRUD_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"CrudMetadata.filterCriteria\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"table-operation-not-delegated\",\n \"table-patch-not-supported\",\n \"query-context-invalid\"\n ],\n \"description\": \"Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest.\"\n }\n }\n ],\n \"validators\": [\n \"table-child-operation-delegated\",\n \"query-context-valid\",\n \"filter-criteria-bridge-valid\",\n \"crud-context-stable\"\n ],\n \"affectedPaths\": [\n \"table\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"praxis-table-manifest-available\"\n ]\n },\n {\n \"operationId\": \"surface.create.configure\",\n \"title\": \"Configure create surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"createSurface\",\n \"target\": {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\",\n \"openMode\"\n ],\n \"properties\": {\n \"actionId\": {\n \"enum\": [\n \"create\",\n \"edit\",\n \"view\"\n ]\n },\n \"openMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"route\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaUrl\": {\n \"type\": \"string\"\n },\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n },\n \"initialValue\": {\n \"type\": \"object\"\n }\n }\n },\n \"params\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"from\",\n \"to\",\n \"name\"\n ],\n \"properties\": {\n \"from\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"enum\": [\n \"routeParam\",\n \"query\",\n \"input\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-create-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"schema-url-not-canonical\",\n \"submit-url-not-canonical\",\n \"resource-create-not-supported\"\n ],\n \"description\": \"Configures create action binding and launcher inputs without editing the child FormConfig.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-create-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.edit.configure\",\n \"title\": \"Configure edit surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"editSurface\",\n \"target\": {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-edit-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource.idField\",\n \"CrudLauncherService.resolveOpenMode\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"id-param-missing\",\n \"open-mode-binding-incomplete\",\n \"resource-edit-not-supported\",\n \"submit-url-not-canonical\"\n ],\n \"description\": \"Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"id-field-known\",\n \"id-param-mapping-valid\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-edit-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.view.configure\",\n \"title\": \"Configure view surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"viewSurface\",\n \"target\": {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-view-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"resource-view-not-supported\",\n \"readonly-form-delegation-missing\"\n ],\n \"description\": \"Configures view action binding and delegates readonly form behavior to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"resource-view-supported\",\n \"form-child-operation-delegated\",\n \"readonly-form-delegation-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"delete.enabled.set\",\n \"title\": \"Configure delete behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"deleteBehavior\",\n \"target\": {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"actionId\": {\n \"type\": \"string\"\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"autoDelete\": {\n \"type\": \"boolean\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-delete-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource\",\n \"GET /{resource}/{id}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].requiresConfirmation\",\n \"CrudMetadata.actions[].autoDelete\",\n \"CrudMetadata.actions[].form\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"delete-action-not-found\",\n \"resource-delete-not-supported\",\n \"destructive-delete-not-confirmed\",\n \"delete-submit-url-not-canonical\"\n ],\n \"description\": \"Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"delete-action-exists\",\n \"resource-delete-supported\",\n \"destructive-delete-confirmed\",\n \"submit-url-canonical\",\n \"permissions-delete-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].requiresConfirmation\",\n \"actions[].autoDelete\",\n \"actions[].form\",\n \"actions[].form.submitUrl\",\n \"actions[].form.submitMethod\",\n \"actions[].form.apiEndpointKey\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Configure CRUD dialog host defaults\",\n \"scope\": \"interaction\",\n \"targetKind\": \"dialogHost\",\n \"target\": {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"defaultOpenMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"modal\": {\n \"type\": \"object\",\n \"properties\": {\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"density\": {\n \"type\": \"string\"\n },\n \"canMaximize\": {\n \"type\": \"boolean\"\n },\n \"rememberLastState\": {\n \"type\": \"boolean\"\n },\n \"startMaximized\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnEsc\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnBackdrop\": {\n \"type\": \"boolean\"\n },\n \"fullscreenBreakpoint\": {\n \"type\": \"string\"\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-dialog-host-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.defaults\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DialogService\",\n \"CRUD_DRAWER_ADAPTER\"\n ],\n \"writes\": [\n \"CrudMetadata.defaults.openMode\",\n \"CrudMetadata.defaults.modal\",\n \"CrudMetadata.defaults.back\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"open-mode-unsupported\",\n \"drawer-adapter-missing\",\n \"modal-size-invalid\",\n \"back-policy-invalid\"\n ],\n \"description\": \"Configures CRUD-owned route/modal/drawer defaults consumed by the launcher and dialog host.\"\n }\n }\n ],\n \"validators\": [\n \"open-mode-supported\",\n \"modal-size-valid\",\n \"drawer-adapter-available-when-needed\",\n \"back-policy-valid\",\n \"settings-panel-shell-compatible\"\n ],\n \"affectedPaths\": [\n \"defaults.openMode\",\n \"defaults.modal\",\n \"defaults.back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"permissions.set\",\n \"title\": \"Configure CRUD permissions\",\n \"scope\": \"interaction\",\n \"targetKind\": \"permissions\",\n \"target\": {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requiredCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"create\",\n \"view\",\n \"edit\",\n \"delete\"\n ]\n }\n },\n \"actionPermissions\": {\n \"type\": \"object\"\n },\n \"denyWhenMissingCapability\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-permissions-set\",\n \"handlerContract\": {\n \"reads\": [\n \"GET /{resource}/capabilities\",\n \"GET /{resource}/{id}/capabilities\",\n \"CrudMetadata.actions\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[].disabled\",\n \"CrudMetadata.actions[].visibleWhen\",\n \"CrudMetadata.actions[].requiresConfirmation\"\n ],\n \"identityKeys\": [\n \"resourcePath\"\n ],\n \"failureModes\": [\n \"capability-not-found\",\n \"action-permission-conflict\",\n \"delete-permission-without-confirmation\"\n ],\n \"description\": \"Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source.\"\n }\n }\n ],\n \"validators\": [\n \"resource-capabilities-resolvable\",\n \"action-permission-supported\",\n \"delete-permission-requires-confirmation\",\n \"permissions-do-not-shadow-backend\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].visibleWhen\",\n \"actions[].requiresConfirmation\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"form.childOperation.delegate\",\n \"title\": \"Delegate child form/table/dialog authoring operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"childComponentId\": {\n \"enum\": [\n \"praxis-dynamic-form\",\n \"praxis-table\",\n \"praxis-dialog\",\n \"praxis-settings-panel\"\n ]\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"PRAXIS_DIALOG_AUTHORING_MANIFEST\",\n \"PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST\"\n ],\n \"writes\": [\n \"delegatedAuthoringOperations[]\"\n ],\n \"identityKeys\": [\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"child-manifest-missing\",\n \"child-operation-not-found\",\n \"attempted-local-child-config-write\"\n ],\n \"description\": \"Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration.\"\n }\n }\n ],\n \"validators\": [\n \"child-manifest-available\",\n \"child-operation-known\",\n \"no-local-form-config-write\",\n \"no-local-table-config-write\",\n \"delegation-target-valid\"\n ],\n \"affectedPaths\": [\n \"delegatedAuthoringOperations\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"child-manifest-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"resource-exists-in-api-metadata\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_EXISTS\",\n \"description\": \"Resource must exist in api_metadata or resource discovery.\"\n },\n {\n \"validatorId\": \"resource-path-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_PATH_CANONICAL\",\n \"description\": \"Resource path must be canonical and not a local alias.\"\n },\n {\n \"validatorId\": \"resource-key-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_KEY_STABLE\",\n \"description\": \"Resource key must remain stable for surfaces/actions/capabilities.\"\n },\n {\n \"validatorId\": \"id-field-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_FIELD_KNOWN\",\n \"description\": \"CRUD id field must exist for edit/view/delete flows.\"\n },\n {\n \"validatorId\": \"resource-capabilities-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CAPABILITIES_RESOLVABLE\",\n \"description\": \"Resource capabilities must be resolvable before action enablement is authored.\"\n },\n {\n \"validatorId\": \"domain-catalog-context-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE\",\n \"description\": \"Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it.\"\n },\n {\n \"validatorId\": \"domain-catalog-read-only\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_READ_ONLY\",\n \"description\": \"Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules.\"\n },\n {\n \"validatorId\": \"ai-usage-visibility-respected\",\n \"level\": \"error\",\n \"code\": \"CRUD_AI_USAGE_VISIBILITY_RESPECTED\",\n \"description\": \"Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches.\"\n },\n {\n \"validatorId\": \"no-form-config-rule-materialization\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_FORM_RULE_MATERIALIZATION\",\n \"description\": \"Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it.\"\n },\n {\n \"validatorId\": \"table-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_TABLE_CHILD_DELEGATED\",\n \"description\": \"Table semantics must be delegated to praxis-table.\"\n },\n {\n \"validatorId\": \"query-context-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_QUERY_CONTEXT_VALID\",\n \"description\": \"Query context must be valid for the bound resource.\"\n },\n {\n \"validatorId\": \"filter-criteria-bridge-valid\",\n \"level\": \"warning\",\n \"code\": \"CRUD_FILTER_CRITERIA_BRIDGE_VALID\",\n \"description\": \"filterCriteria is a bridge; prefer queryContext for new remote authoring.\"\n },\n {\n \"validatorId\": \"crud-context-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CONTEXT_STABLE\",\n \"description\": \"Authoring must not break stable crudContext references.\"\n },\n {\n \"validatorId\": \"action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_EXISTS\",\n \"description\": \"Target action must exist or be created through CRUD action orchestration.\"\n },\n {\n \"validatorId\": \"open-mode-binding-complete\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_BINDING_COMPLETE\",\n \"description\": \"route requires route; modal/drawer require formId unless resolved by governed overrides.\"\n },\n {\n \"validatorId\": \"schema-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SCHEMA_URL_CANONICAL\",\n \"description\": \"Schema URLs must be canonical for the bound resource/action.\"\n },\n {\n \"validatorId\": \"submit-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SUBMIT_URL_CANONICAL\",\n \"description\": \"Submit URL and method must be canonical and declared together.\"\n },\n {\n \"validatorId\": \"resource-create-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_CREATE_SUPPORTED\",\n \"description\": \"Create surface requires resource create capability.\"\n },\n {\n \"validatorId\": \"resource-edit-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_EDIT_SUPPORTED\",\n \"description\": \"Edit surface requires resource edit capability.\"\n },\n {\n \"validatorId\": \"resource-view-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_VIEW_SUPPORTED\",\n \"description\": \"View surface requires resource view capability.\"\n },\n {\n \"validatorId\": \"form-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_FORM_CHILD_DELEGATED\",\n \"description\": \"FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests.\"\n },\n {\n \"validatorId\": \"id-param-mapping-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_PARAM_MAPPING_VALID\",\n \"description\": \"Edit/view actions must map resource id into route/query/input as required.\"\n },\n {\n \"validatorId\": \"readonly-form-delegation-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_READONLY_FORM_DELEGATED\",\n \"description\": \"Readonly form behavior belongs to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"delete-action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_ACTION_EXISTS\",\n \"description\": \"Delete behavior requires a delete action target.\"\n },\n {\n \"validatorId\": \"resource-delete-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_SUPPORTED\",\n \"description\": \"Delete behavior requires resource delete capability.\"\n },\n {\n \"validatorId\": \"destructive-delete-confirmed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_CONFIRMED\",\n \"description\": \"Destructive delete behavior requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"permissions-delete-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_VALID\",\n \"description\": \"Delete permission cannot bypass resource capabilities or confirmation policy.\"\n },\n {\n \"validatorId\": \"open-mode-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_SUPPORTED\",\n \"description\": \"Open mode must be route, modal or drawer.\"\n },\n {\n \"validatorId\": \"modal-size-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_MODAL_SIZE_VALID\",\n \"description\": \"Modal sizing defaults must be valid DialogConfig values.\"\n },\n {\n \"validatorId\": \"drawer-adapter-available-when-needed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DRAWER_ADAPTER_AVAILABLE\",\n \"description\": \"Drawer open mode requires a host-provided drawer adapter.\"\n },\n {\n \"validatorId\": \"back-policy-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_BACK_POLICY_VALID\",\n \"description\": \"Back policy must be valid for route/modal/drawer behavior.\"\n },\n {\n \"validatorId\": \"settings-panel-shell-compatible\",\n \"level\": \"warning\",\n \"code\": \"CRUD_SETTINGS_PANEL_COMPATIBLE\",\n \"description\": \"Authoring shell must preserve apply/save/reset semantics.\"\n },\n {\n \"validatorId\": \"action-permission-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_PERMISSION_SUPPORTED\",\n \"description\": \"Action permissions must map to supported resource capabilities.\"\n },\n {\n \"validatorId\": \"delete-permission-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_CONFIRMATION\",\n \"description\": \"Delete permission enablement requires confirmation policy.\"\n },\n {\n \"validatorId\": \"permissions-do-not-shadow-backend\",\n \"level\": \"error\",\n \"code\": \"CRUD_PERMISSIONS_NO_BACKEND_SHADOW\",\n \"description\": \"UI permissions must not shadow backend capability denial.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child manifest must be available.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated operation must exist in the child manifest.\"\n },\n {\n \"validatorId\": \"no-local-form-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_FORM_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine FormConfig semantics.\"\n },\n {\n \"validatorId\": \"no-local-table-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_TABLE_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine TableConfig semantics.\"\n },\n {\n \"validatorId\": \"delegation-target-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELEGATION_TARGET_VALID\",\n \"description\": \"Delegation target must be resolvable by the child manifest.\"\n }\n ],\n \"roundTripRequirements\": [\n \"CrudMetadata is the canonical CRUD document shape.\",\n \"CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.\",\n \"Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.\",\n \"Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.\",\n \"Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.\",\n \"FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.\",\n \"TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.\",\n \"Delete behavior is destructive and requires explicit confirmation plus backend capability support.\",\n \"crudContext must remain reference-stable across change detection cycles.\"\n ],\n \"examples\": [\n {\n \"id\": \"crud-bind-funcionarios-resource\",\n \"request\": \"Bind this CRUD to funcionarios using id as the identifier.\",\n \"operationId\": \"resource.bind\",\n \"target\": \"resource:funcionarios\",\n \"params\": {\n \"resourcePath\": \"/funcionarios\",\n \"resourceKey\": \"funcionarios\",\n \"idField\": \"id\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-attach-lgpd-cpf-context\",\n \"request\": \"Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-list-query-context\",\n \"request\": \"Filter the list by active employees using the canonical query context.\",\n \"operationId\": \"list.surface.configure\",\n \"target\": \"listSurface\",\n \"params\": {\n \"queryContext\": {\n \"filters\": [\n {\n \"field\": \"active\",\n \"operator\": \"eq\",\n \"value\": true\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-create-modal\",\n \"request\": \"Open create in a modal with the employee form.\",\n \"operationId\": \"surface.create.configure\",\n \"target\": \"action:create\",\n \"params\": {\n \"actionId\": \"create\",\n \"openMode\": \"modal\",\n \"formId\": \"employee-create\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-edit-route-with-id\",\n \"request\": \"Edit should navigate to /employees/:id and map the row id.\",\n \"operationId\": \"surface.edit.configure\",\n \"target\": \"action:edit\",\n \"params\": {\n \"actionId\": \"edit\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-view-drawer-readonly\",\n \"request\": \"Open view in a drawer and keep the form readonly.\",\n \"operationId\": \"surface.view.configure\",\n \"target\": \"action:view\",\n \"params\": {\n \"actionId\": \"view\",\n \"openMode\": \"drawer\",\n \"formId\": \"employee-view\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delete-enable-confirmed\",\n \"request\": \"Enable delete but require confirmation.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": true,\n \"autoDelete\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-dialog-size-medium\",\n \"request\": \"Make CRUD modals 900px wide and remember their last state.\",\n \"operationId\": \"dialog.size.set\",\n \"target\": \"dialogHost\",\n \"params\": {\n \"defaultOpenMode\": \"modal\",\n \"modal\": {\n \"width\": \"900px\",\n \"rememberLastState\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-permissions-no-delete\",\n \"request\": \"Hide delete when the resource capabilities do not allow it.\",\n \"operationId\": \"permissions.set\",\n \"target\": \"permissions:delete\",\n \"params\": {\n \"requiredCapabilities\": [\n \"delete\"\n ],\n \"denyWhenMissingCapability\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-form-layout\",\n \"request\": \"Add a new field to the create form.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:field.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Form field semantics belong to dynamic-form\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-table-column\",\n \"request\": \"Add a salary column to the list table.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-table:column.add\",\n \"params\": {\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"Table column semantics belong to praxis-table\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-reject-local-form-rules\",\n \"request\": \"Put this dynamic-form validation rule directly inside CRUD.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:rules.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"rules.add\",\n \"reason\": \"CRUD must not redefine FormConfig rules\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-copy-domain-rule-to-formconfig\",\n \"request\": \"Copy the LGPD rule from Domain Catalog directly into the create form JSON.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-delete-without-capability\",\n \"request\": \"Force delete even though the backend does not expose delete capability.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": false\n },\n \"isPositive\": false\n }\n ]\n}",
|
|
2679
|
+
"content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-crud\",\n \"ownerPackage\": \"@praxisui/crud\",\n \"configSchemaId\": \"CrudMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"metadata\",\n \"type\": \"CrudMetadata | string\",\n \"description\": \"Canonical CRUD metadata or serialized metadata document.\"\n },\n {\n \"name\": \"crudId\",\n \"type\": \"string\",\n \"description\": \"Stable CRUD instance id used for table/form identity and persistence.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional stable host instance id for multiple CRUD widgets on the same route.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context used for authoring seeds and launcher inputs.\"\n },\n {\n \"name\": \"afterOpen\",\n \"type\": \"{ mode: FormOpenMode; action: string }\",\n \"description\": \"Emitted after a CRUD action opens.\"\n },\n {\n \"name\": \"afterSave\",\n \"type\": \"{ id: string | number; data: unknown }\",\n \"description\": \"Emitted after save; CRUD refetches the list.\"\n },\n {\n \"name\": \"afterDelete\",\n \"type\": \"{ id: string | number }\",\n \"description\": \"Emitted after delete; CRUD refetches the list.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"description\": \"Resource path/key, id field, endpoint key and query context owned by CRUD orchestration.\"\n },\n {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"description\": \"CRUD-hosted list surface and table delegation boundary.\"\n },\n {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"description\": \"Create action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"description\": \"Edit action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"description\": \"View action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"description\": \"Delete action enablement, confirmation, endpoint and capability policy.\"\n },\n {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"description\": \"Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent.\"\n },\n {\n \"kind\": \"formBinding\",\n \"resolver\": \"crud-action-form-contract-by-action-id\",\n \"description\": \"CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue.\"\n },\n {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"description\": \"CRUD action availability derived from resource capabilities and action permissions.\"\n },\n {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"description\": \"Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"description\": \"Delegated form/table/dialog/settings-panel operation owned by the child component manifest.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"resource.bind\",\n \"title\": \"Bind CRUD resource\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"resourceBinding\",\n \"target\": {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourcePath\"\n ],\n \"properties\": {\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"idField\": {\n \"type\": [\n \"string\",\n \"number\"\n ]\n },\n \"endpointKey\": {\n \"type\": \"string\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-resource-bind\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"api_metadata\",\n \"ResourceDiscoveryService\",\n \"GET /{resource}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"PraxisCrudComponent.tableCrudContext\"\n ],\n \"identityKeys\": [\n \"resourcePath\",\n \"resourceKey\"\n ],\n \"failureModes\": [\n \"resource-not-found\",\n \"schema-url-not-canonical\",\n \"capabilities-unavailable\",\n \"id-field-missing\"\n ],\n \"description\": \"Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use.\"\n }\n }\n ],\n \"validators\": [\n \"resource-exists-in-api-metadata\",\n \"resource-path-canonical\",\n \"resource-key-stable\",\n \"id-field-known\",\n \"resource-capabilities-resolvable\"\n ],\n \"affectedPaths\": [\n \"resource.path\",\n \"resource.idField\",\n \"resource.endpointKey\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\"\n ]\n },\n {\n \"operationId\": \"domain.governanceContext.attach\",\n \"title\": \"Attach Domain Catalog governance context\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"domainGovernanceContext\",\n \"target\": {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourceKey\",\n \"query\"\n ],\n \"properties\": {\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"releaseId\": {\n \"type\": \"string\"\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"itemTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"governance\",\n \"vocabulary\",\n \"relationship\"\n ]\n }\n },\n \"intent\": {\n \"enum\": [\n \"authoring\",\n \"explain\",\n \"validate\",\n \"ai-access-control\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-domain-governance-context-attach\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"DomainCatalogService.getGovernanceContext\",\n \"DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.queryContext.meta.domainCatalog\"\n ],\n \"identityKeys\": [\n \"resourceKey\",\n \"releaseId\",\n \"query\"\n ],\n \"failureModes\": [\n \"resource-key-missing\",\n \"domain-catalog-release-not-found\",\n \"governance-context-empty\",\n \"ai-usage-forbidden\"\n ],\n \"description\": \"Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog.\"\n }\n }\n ],\n \"validators\": [\n \"resource-key-stable\",\n \"domain-catalog-context-resolvable\",\n \"domain-catalog-read-only\",\n \"ai-usage-visibility-respected\",\n \"no-form-config-rule-materialization\"\n ],\n \"affectedPaths\": [\n \"queryContext.meta.domainCatalog\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\",\n \"domain-catalog-service-available\"\n ]\n },\n {\n \"operationId\": \"list.surface.configure\",\n \"title\": \"Configure CRUD list surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"listSurface\",\n \"target\": {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"tablePatch\": {\n \"type\": \"object\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n },\n \"filterCriteria\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-list-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"CRUD_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"CrudMetadata.filterCriteria\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"table-operation-not-delegated\",\n \"table-patch-not-supported\",\n \"query-context-invalid\"\n ],\n \"description\": \"Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest.\"\n }\n }\n ],\n \"validators\": [\n \"table-child-operation-delegated\",\n \"query-context-valid\",\n \"filter-criteria-bridge-valid\",\n \"crud-context-stable\"\n ],\n \"affectedPaths\": [\n \"table\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"praxis-table-manifest-available\"\n ]\n },\n {\n \"operationId\": \"surface.create.configure\",\n \"title\": \"Configure create surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"createSurface\",\n \"target\": {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\",\n \"openMode\"\n ],\n \"properties\": {\n \"actionId\": {\n \"enum\": [\n \"create\",\n \"edit\",\n \"view\"\n ]\n },\n \"openMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"route\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaUrl\": {\n \"type\": \"string\"\n },\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n },\n \"initialValue\": {\n \"type\": \"object\"\n },\n \"layoutPolicy\": {\n \"type\": \"object\"\n }\n }\n },\n \"params\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"from\",\n \"to\",\n \"name\"\n ],\n \"properties\": {\n \"from\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"enum\": [\n \"routeParam\",\n \"query\",\n \"input\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-create-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"schema-url-not-canonical\",\n \"submit-url-not-canonical\",\n \"resource-create-not-supported\"\n ],\n \"description\": \"Configures create action binding and launcher inputs without editing the child FormConfig.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-create-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.edit.configure\",\n \"title\": \"Configure edit surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"editSurface\",\n \"target\": {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-edit-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource.idField\",\n \"CrudLauncherService.resolveOpenMode\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"id-param-missing\",\n \"open-mode-binding-incomplete\",\n \"resource-edit-not-supported\",\n \"submit-url-not-canonical\"\n ],\n \"description\": \"Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"id-field-known\",\n \"id-param-mapping-valid\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-edit-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.view.configure\",\n \"title\": \"Configure view surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"viewSurface\",\n \"target\": {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-view-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"resource-view-not-supported\",\n \"readonly-form-delegation-missing\"\n ],\n \"description\": \"Configures view action binding and delegates readonly form behavior to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"resource-view-supported\",\n \"form-child-operation-delegated\",\n \"readonly-form-delegation-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"delete.enabled.set\",\n \"title\": \"Configure delete behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"deleteBehavior\",\n \"target\": {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"actionId\": {\n \"type\": \"string\"\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"autoDelete\": {\n \"type\": \"boolean\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-delete-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource\",\n \"GET /{resource}/{id}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].requiresConfirmation\",\n \"CrudMetadata.actions[].autoDelete\",\n \"CrudMetadata.actions[].form\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"delete-action-not-found\",\n \"resource-delete-not-supported\",\n \"destructive-delete-not-confirmed\",\n \"delete-submit-url-not-canonical\"\n ],\n \"description\": \"Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"delete-action-exists\",\n \"resource-delete-supported\",\n \"destructive-delete-confirmed\",\n \"submit-url-canonical\",\n \"permissions-delete-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].requiresConfirmation\",\n \"actions[].autoDelete\",\n \"actions[].form\",\n \"actions[].form.submitUrl\",\n \"actions[].form.submitMethod\",\n \"actions[].form.apiEndpointKey\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Configure CRUD dialog host defaults\",\n \"scope\": \"interaction\",\n \"targetKind\": \"dialogHost\",\n \"target\": {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"defaultOpenMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"modal\": {\n \"type\": \"object\",\n \"properties\": {\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"density\": {\n \"type\": \"string\"\n },\n \"canMaximize\": {\n \"type\": \"boolean\"\n },\n \"rememberLastState\": {\n \"type\": \"boolean\"\n },\n \"startMaximized\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnEsc\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnBackdrop\": {\n \"type\": \"boolean\"\n },\n \"fullscreenBreakpoint\": {\n \"type\": \"string\"\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-dialog-host-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.defaults\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DialogService\",\n \"CRUD_DRAWER_ADAPTER\"\n ],\n \"writes\": [\n \"CrudMetadata.defaults.openMode\",\n \"CrudMetadata.defaults.modal\",\n \"CrudMetadata.defaults.back\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"open-mode-unsupported\",\n \"drawer-adapter-missing\",\n \"modal-size-invalid\",\n \"back-policy-invalid\"\n ],\n \"description\": \"Configures CRUD-owned route/modal/drawer defaults consumed by the launcher and dialog host.\"\n }\n }\n ],\n \"validators\": [\n \"open-mode-supported\",\n \"modal-size-valid\",\n \"drawer-adapter-available-when-needed\",\n \"back-policy-valid\",\n \"settings-panel-shell-compatible\"\n ],\n \"affectedPaths\": [\n \"defaults.openMode\",\n \"defaults.modal\",\n \"defaults.back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"permissions.set\",\n \"title\": \"Configure CRUD permissions\",\n \"scope\": \"interaction\",\n \"targetKind\": \"permissions\",\n \"target\": {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requiredCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"create\",\n \"view\",\n \"edit\",\n \"delete\"\n ]\n }\n },\n \"actionPermissions\": {\n \"type\": \"object\"\n },\n \"denyWhenMissingCapability\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-permissions-set\",\n \"handlerContract\": {\n \"reads\": [\n \"GET /{resource}/capabilities\",\n \"GET /{resource}/{id}/capabilities\",\n \"CrudMetadata.actions\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[].disabled\",\n \"CrudMetadata.actions[].visibleWhen\",\n \"CrudMetadata.actions[].requiresConfirmation\"\n ],\n \"identityKeys\": [\n \"resourcePath\"\n ],\n \"failureModes\": [\n \"capability-not-found\",\n \"action-permission-conflict\",\n \"delete-permission-without-confirmation\"\n ],\n \"description\": \"Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source.\"\n }\n }\n ],\n \"validators\": [\n \"resource-capabilities-resolvable\",\n \"action-permission-supported\",\n \"delete-permission-requires-confirmation\",\n \"permissions-do-not-shadow-backend\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].visibleWhen\",\n \"actions[].requiresConfirmation\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"form.childOperation.delegate\",\n \"title\": \"Delegate child form/table/dialog authoring operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"childComponentId\": {\n \"enum\": [\n \"praxis-dynamic-form\",\n \"praxis-table\",\n \"praxis-dialog\",\n \"praxis-settings-panel\"\n ]\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"PRAXIS_DIALOG_AUTHORING_MANIFEST\",\n \"PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST\"\n ],\n \"writes\": [\n \"delegatedAuthoringOperations[]\"\n ],\n \"identityKeys\": [\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"child-manifest-missing\",\n \"child-operation-not-found\",\n \"attempted-local-child-config-write\"\n ],\n \"description\": \"Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration.\"\n }\n }\n ],\n \"validators\": [\n \"child-manifest-available\",\n \"child-operation-known\",\n \"no-local-form-config-write\",\n \"no-local-table-config-write\",\n \"delegation-target-valid\"\n ],\n \"affectedPaths\": [\n \"delegatedAuthoringOperations\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"child-manifest-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"resource-exists-in-api-metadata\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_EXISTS\",\n \"description\": \"Resource must exist in api_metadata or resource discovery.\"\n },\n {\n \"validatorId\": \"resource-path-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_PATH_CANONICAL\",\n \"description\": \"Resource path must be canonical and not a local alias.\"\n },\n {\n \"validatorId\": \"resource-key-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_KEY_STABLE\",\n \"description\": \"Resource key must remain stable for surfaces/actions/capabilities.\"\n },\n {\n \"validatorId\": \"id-field-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_FIELD_KNOWN\",\n \"description\": \"CRUD id field must exist for edit/view/delete flows.\"\n },\n {\n \"validatorId\": \"resource-capabilities-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CAPABILITIES_RESOLVABLE\",\n \"description\": \"Resource capabilities must be resolvable before action enablement is authored.\"\n },\n {\n \"validatorId\": \"domain-catalog-context-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE\",\n \"description\": \"Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it.\"\n },\n {\n \"validatorId\": \"domain-catalog-read-only\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_READ_ONLY\",\n \"description\": \"Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules.\"\n },\n {\n \"validatorId\": \"ai-usage-visibility-respected\",\n \"level\": \"error\",\n \"code\": \"CRUD_AI_USAGE_VISIBILITY_RESPECTED\",\n \"description\": \"Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches.\"\n },\n {\n \"validatorId\": \"no-form-config-rule-materialization\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_FORM_RULE_MATERIALIZATION\",\n \"description\": \"Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it.\"\n },\n {\n \"validatorId\": \"table-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_TABLE_CHILD_DELEGATED\",\n \"description\": \"Table semantics must be delegated to praxis-table.\"\n },\n {\n \"validatorId\": \"query-context-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_QUERY_CONTEXT_VALID\",\n \"description\": \"Query context must be valid for the bound resource.\"\n },\n {\n \"validatorId\": \"filter-criteria-bridge-valid\",\n \"level\": \"warning\",\n \"code\": \"CRUD_FILTER_CRITERIA_BRIDGE_VALID\",\n \"description\": \"filterCriteria is a bridge; prefer queryContext for new remote authoring.\"\n },\n {\n \"validatorId\": \"crud-context-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CONTEXT_STABLE\",\n \"description\": \"Authoring must not break stable crudContext references.\"\n },\n {\n \"validatorId\": \"action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_EXISTS\",\n \"description\": \"Target action must exist or be created through CRUD action orchestration.\"\n },\n {\n \"validatorId\": \"open-mode-binding-complete\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_BINDING_COMPLETE\",\n \"description\": \"route requires route; modal/drawer require formId unless resolved by governed overrides.\"\n },\n {\n \"validatorId\": \"schema-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SCHEMA_URL_CANONICAL\",\n \"description\": \"Schema URLs must be canonical for the bound resource/action.\"\n },\n {\n \"validatorId\": \"submit-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SUBMIT_URL_CANONICAL\",\n \"description\": \"Submit URL and method must be canonical and declared together.\"\n },\n {\n \"validatorId\": \"resource-create-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_CREATE_SUPPORTED\",\n \"description\": \"Create surface requires resource create capability.\"\n },\n {\n \"validatorId\": \"resource-edit-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_EDIT_SUPPORTED\",\n \"description\": \"Edit surface requires resource edit capability.\"\n },\n {\n \"validatorId\": \"resource-view-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_VIEW_SUPPORTED\",\n \"description\": \"View surface requires resource view capability.\"\n },\n {\n \"validatorId\": \"form-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_FORM_CHILD_DELEGATED\",\n \"description\": \"FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests.\"\n },\n {\n \"validatorId\": \"id-param-mapping-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_PARAM_MAPPING_VALID\",\n \"description\": \"Edit/view actions must map resource id into route/query/input as required.\"\n },\n {\n \"validatorId\": \"readonly-form-delegation-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_READONLY_FORM_DELEGATED\",\n \"description\": \"Readonly form behavior belongs to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"delete-action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_ACTION_EXISTS\",\n \"description\": \"Delete behavior requires a delete action target.\"\n },\n {\n \"validatorId\": \"resource-delete-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_SUPPORTED\",\n \"description\": \"Delete behavior requires resource delete capability.\"\n },\n {\n \"validatorId\": \"destructive-delete-confirmed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_CONFIRMED\",\n \"description\": \"Destructive delete behavior requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"permissions-delete-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_VALID\",\n \"description\": \"Delete permission cannot bypass resource capabilities or confirmation policy.\"\n },\n {\n \"validatorId\": \"open-mode-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_SUPPORTED\",\n \"description\": \"Open mode must be route, modal or drawer.\"\n },\n {\n \"validatorId\": \"modal-size-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_MODAL_SIZE_VALID\",\n \"description\": \"Modal sizing defaults must be valid DialogConfig values.\"\n },\n {\n \"validatorId\": \"drawer-adapter-available-when-needed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DRAWER_ADAPTER_AVAILABLE\",\n \"description\": \"Drawer open mode requires a host-provided drawer adapter.\"\n },\n {\n \"validatorId\": \"back-policy-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_BACK_POLICY_VALID\",\n \"description\": \"Back policy must be valid for route/modal/drawer behavior.\"\n },\n {\n \"validatorId\": \"settings-panel-shell-compatible\",\n \"level\": \"warning\",\n \"code\": \"CRUD_SETTINGS_PANEL_COMPATIBLE\",\n \"description\": \"Authoring shell must preserve apply/save/reset semantics.\"\n },\n {\n \"validatorId\": \"action-permission-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_PERMISSION_SUPPORTED\",\n \"description\": \"Action permissions must map to supported resource capabilities.\"\n },\n {\n \"validatorId\": \"delete-permission-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_CONFIRMATION\",\n \"description\": \"Delete permission enablement requires confirmation policy.\"\n },\n {\n \"validatorId\": \"permissions-do-not-shadow-backend\",\n \"level\": \"error\",\n \"code\": \"CRUD_PERMISSIONS_NO_BACKEND_SHADOW\",\n \"description\": \"UI permissions must not shadow backend capability denial.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child manifest must be available.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated operation must exist in the child manifest.\"\n },\n {\n \"validatorId\": \"no-local-form-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_FORM_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine FormConfig semantics.\"\n },\n {\n \"validatorId\": \"no-local-table-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_TABLE_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine TableConfig semantics.\"\n },\n {\n \"validatorId\": \"delegation-target-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELEGATION_TARGET_VALID\",\n \"description\": \"Delegation target must be resolvable by the child manifest.\"\n }\n ],\n \"roundTripRequirements\": [\n \"CrudMetadata is the canonical CRUD document shape.\",\n \"CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.\",\n \"Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.\",\n \"Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.\",\n \"Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.\",\n \"FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.\",\n \"TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.\",\n \"Delete behavior is destructive and requires explicit confirmation plus backend capability support.\",\n \"crudContext must remain reference-stable across change detection cycles.\"\n ],\n \"examples\": [\n {\n \"id\": \"crud-bind-funcionarios-resource\",\n \"request\": \"Bind this CRUD to funcionarios using id as the identifier.\",\n \"operationId\": \"resource.bind\",\n \"target\": \"resource:funcionarios\",\n \"params\": {\n \"resourcePath\": \"/funcionarios\",\n \"resourceKey\": \"funcionarios\",\n \"idField\": \"id\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-attach-lgpd-cpf-context\",\n \"request\": \"Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-list-query-context\",\n \"request\": \"Filter the list by active employees using the canonical query context.\",\n \"operationId\": \"list.surface.configure\",\n \"target\": \"listSurface\",\n \"params\": {\n \"queryContext\": {\n \"filters\": [\n {\n \"field\": \"active\",\n \"operator\": \"eq\",\n \"value\": true\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-create-modal\",\n \"request\": \"Open create in a modal with the employee form.\",\n \"operationId\": \"surface.create.configure\",\n \"target\": \"action:create\",\n \"params\": {\n \"actionId\": \"create\",\n \"openMode\": \"modal\",\n \"formId\": \"employee-create\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-edit-route-with-id\",\n \"request\": \"Edit should navigate to /employees/:id and map the row id.\",\n \"operationId\": \"surface.edit.configure\",\n \"target\": \"action:edit\",\n \"params\": {\n \"actionId\": \"edit\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-view-drawer-readonly\",\n \"request\": \"Open view in a drawer and keep the form readonly.\",\n \"operationId\": \"surface.view.configure\",\n \"target\": \"action:view\",\n \"params\": {\n \"actionId\": \"view\",\n \"openMode\": \"drawer\",\n \"formId\": \"employee-view\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delete-enable-confirmed\",\n \"request\": \"Enable delete but require confirmation.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": true,\n \"autoDelete\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-dialog-size-medium\",\n \"request\": \"Make CRUD modals 900px wide and remember their last state.\",\n \"operationId\": \"dialog.size.set\",\n \"target\": \"dialogHost\",\n \"params\": {\n \"defaultOpenMode\": \"modal\",\n \"modal\": {\n \"width\": \"900px\",\n \"rememberLastState\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-permissions-no-delete\",\n \"request\": \"Hide delete when the resource capabilities do not allow it.\",\n \"operationId\": \"permissions.set\",\n \"target\": \"permissions:delete\",\n \"params\": {\n \"requiredCapabilities\": [\n \"delete\"\n ],\n \"denyWhenMissingCapability\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-form-layout\",\n \"request\": \"Add a new field to the create form.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:field.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Form field semantics belong to dynamic-form\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-table-column\",\n \"request\": \"Add a salary column to the list table.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-table:column.add\",\n \"params\": {\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"Table column semantics belong to praxis-table\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-reject-local-form-rules\",\n \"request\": \"Put this dynamic-form validation rule directly inside CRUD.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:rules.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"rules.add\",\n \"reason\": \"CRUD must not redefine FormConfig rules\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-copy-domain-rule-to-formconfig\",\n \"request\": \"Copy the LGPD rule from Domain Catalog directly into the create form JSON.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-delete-without-capability\",\n \"request\": \"Force delete even though the backend does not expose delete capability.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": false\n },\n \"isPositive\": false\n }\n ]\n}",
|
|
2671
2680
|
"sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/praxis-crud-authoring-manifest.ts",
|
|
2672
|
-
"contentHash": "
|
|
2681
|
+
"contentHash": "e8cd992dec1ae1ef9455c779727fbde83f79b6db05898027e40f4ae5616344a6",
|
|
2673
2682
|
"sourceKind": "component_definition",
|
|
2674
2683
|
"sourceId": "praxis-crud",
|
|
2675
2684
|
"corpusVersion": "1.0.0"
|
|
@@ -2751,6 +2760,11 @@
|
|
|
2751
2760
|
"type": "Record<string, unknown>",
|
|
2752
2761
|
"required": false
|
|
2753
2762
|
},
|
|
2763
|
+
{
|
|
2764
|
+
"name": "data.inputs.layoutPolicy",
|
|
2765
|
+
"type": "DynamicFormLayoutPolicy",
|
|
2766
|
+
"required": false
|
|
2767
|
+
},
|
|
2754
2768
|
{
|
|
2755
2769
|
"name": "data.metadata.resource.path",
|
|
2756
2770
|
"type": "string",
|
|
@@ -2939,6 +2953,76 @@
|
|
|
2939
2953
|
"description": "Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.",
|
|
2940
2954
|
"safetyNotes": "Nao reprocessa layouts ja persistidos ou authorados."
|
|
2941
2955
|
},
|
|
2956
|
+
{
|
|
2957
|
+
"path": "inputs.layoutPolicy",
|
|
2958
|
+
"category": "inputs",
|
|
2959
|
+
"valueKind": "object",
|
|
2960
|
+
"description": "Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.",
|
|
2961
|
+
"safetyNotes": "Use source=schema com persistence=transient para surfaces schema-driven; nao use para sobrescrever layouts authorados sem detach explicito."
|
|
2962
|
+
},
|
|
2963
|
+
{
|
|
2964
|
+
"path": "inputs.layoutPolicy.source",
|
|
2965
|
+
"category": "inputs",
|
|
2966
|
+
"valueKind": "enum",
|
|
2967
|
+
"allowedValues": [
|
|
2968
|
+
"authored",
|
|
2969
|
+
"schema"
|
|
2970
|
+
],
|
|
2971
|
+
"description": "Define se o layout vem de configuracao authorada ou do schema."
|
|
2972
|
+
},
|
|
2973
|
+
{
|
|
2974
|
+
"path": "inputs.layoutPolicy.preset",
|
|
2975
|
+
"category": "inputs",
|
|
2976
|
+
"valueKind": "enum",
|
|
2977
|
+
"allowedValues": [
|
|
2978
|
+
"default",
|
|
2979
|
+
"compactPresentation",
|
|
2980
|
+
"groupedCommand"
|
|
2981
|
+
],
|
|
2982
|
+
"description": "Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit."
|
|
2983
|
+
},
|
|
2984
|
+
{
|
|
2985
|
+
"path": "inputs.layoutPolicy.intent",
|
|
2986
|
+
"category": "inputs",
|
|
2987
|
+
"valueKind": "enum",
|
|
2988
|
+
"allowedValues": [
|
|
2989
|
+
"detail",
|
|
2990
|
+
"command"
|
|
2991
|
+
],
|
|
2992
|
+
"description": "Intencao da surface: detalhe/apresentacao ou comando/editavel."
|
|
2993
|
+
},
|
|
2994
|
+
{
|
|
2995
|
+
"path": "inputs.layoutPolicy.lifecycle",
|
|
2996
|
+
"category": "inputs",
|
|
2997
|
+
"valueKind": "enum",
|
|
2998
|
+
"allowedValues": [
|
|
2999
|
+
"initial",
|
|
3000
|
+
"live"
|
|
3001
|
+
],
|
|
3002
|
+
"description": "Ciclo de materializacao do layout schema-driven."
|
|
3003
|
+
},
|
|
3004
|
+
{
|
|
3005
|
+
"path": "inputs.layoutPolicy.persistence",
|
|
3006
|
+
"category": "inputs",
|
|
3007
|
+
"valueKind": "enum",
|
|
3008
|
+
"allowedValues": [
|
|
3009
|
+
"transient",
|
|
3010
|
+
"authorable"
|
|
3011
|
+
],
|
|
3012
|
+
"description": "Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito."
|
|
3013
|
+
},
|
|
3014
|
+
{
|
|
3015
|
+
"path": "inputs.fieldIconPolicy",
|
|
3016
|
+
"category": "inputs",
|
|
3017
|
+
"valueKind": "enum",
|
|
3018
|
+
"allowedValues": [
|
|
3019
|
+
"all",
|
|
3020
|
+
"presentation-only",
|
|
3021
|
+
"none"
|
|
3022
|
+
],
|
|
3023
|
+
"description": "Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.",
|
|
3024
|
+
"safetyNotes": "Use presentation-only para telas corporativas densas quando os icones ajudam no detalhe read-only mas poluem controles editaveis."
|
|
3025
|
+
},
|
|
2942
3026
|
{
|
|
2943
3027
|
"path": "inputs.backConfig",
|
|
2944
3028
|
"category": "inputs",
|
|
@@ -3343,6 +3427,27 @@
|
|
|
3343
3427
|
}
|
|
3344
3428
|
}
|
|
3345
3429
|
},
|
|
3430
|
+
{
|
|
3431
|
+
"id": "inputs.layoutPolicy.schemaDetail",
|
|
3432
|
+
"intentExamples": [
|
|
3433
|
+
"layout schema detail",
|
|
3434
|
+
"detalhe agrupado",
|
|
3435
|
+
"readonly agrupado"
|
|
3436
|
+
],
|
|
3437
|
+
"patchTemplate": {
|
|
3438
|
+
"inputs": {
|
|
3439
|
+
"layoutPolicy": {
|
|
3440
|
+
"source": "schema",
|
|
3441
|
+
"intent": "detail",
|
|
3442
|
+
"preset": "compactPresentation",
|
|
3443
|
+
"lifecycle": "live",
|
|
3444
|
+
"persistence": "transient",
|
|
3445
|
+
"schemaOperation": "detail",
|
|
3446
|
+
"schemaType": "response"
|
|
3447
|
+
}
|
|
3448
|
+
}
|
|
3449
|
+
}
|
|
3450
|
+
},
|
|
3346
3451
|
{
|
|
3347
3452
|
"id": "inputs.enableCustomization.enable",
|
|
3348
3453
|
"intentExamples": [
|
|
@@ -3380,9 +3485,9 @@
|
|
|
3380
3485
|
{
|
|
3381
3486
|
"chunkIndex": 0,
|
|
3382
3487
|
"chunkKind": "summary",
|
|
3383
|
-
"content": "Component ID: praxis-dynamic-form-dialog-host\nSelector: praxis-dynamic-form-dialog-host\nFriendly Name: Praxis Dynamic Form Dialog Host\nDescription: Dialog host that renders PraxisDynamicForm for CRUD actions.\nCategory: form\nLib/Package: @praxisui/crud\nTags: dialog, crud, form, host\nInputs:\n - data (CrudDialogData)\n - data.metadata (CrudMetadata)\n - data.action (CrudAction)\n - data.inputs (Record<string, unknown>)\n - data.metadata.resource.path (string)\n - data.metadata.resource.endpointKey (ApiEndpoint)\n - data.metadata.resource.idField (string | number)\n - data.metadata.defaults.modal (DialogConfig)\n - data.metadata.defaults.back (BackConfig)\n - data.action.formId (string)\n - data.action.action (string)\n",
|
|
3488
|
+
"content": "Component ID: praxis-dynamic-form-dialog-host\nSelector: praxis-dynamic-form-dialog-host\nFriendly Name: Praxis Dynamic Form Dialog Host\nDescription: Dialog host that renders PraxisDynamicForm for CRUD actions.\nCategory: form\nLib/Package: @praxisui/crud\nTags: dialog, crud, form, host\nInputs:\n - data (CrudDialogData)\n - data.metadata (CrudMetadata)\n - data.action (CrudAction)\n - data.inputs (Record<string, unknown>)\n - data.inputs.layoutPolicy (DynamicFormLayoutPolicy)\n - data.metadata.resource.path (string)\n - data.metadata.resource.endpointKey (ApiEndpoint)\n - data.metadata.resource.idField (string | number)\n - data.metadata.defaults.modal (DialogConfig)\n - data.metadata.defaults.back (BackConfig)\n - data.action.formId (string)\n - data.action.action (string)\n",
|
|
3384
3489
|
"sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
|
|
3385
|
-
"contentHash": "
|
|
3490
|
+
"contentHash": "67a8ec3d87ad00d705a544fd3c6253ef8827ca7d292ffed324ad2693c69873a9",
|
|
3386
3491
|
"sourceKind": "component_definition",
|
|
3387
3492
|
"sourceId": "praxis-dynamic-form-dialog-host",
|
|
3388
3493
|
"corpusVersion": "1.0.0"
|
|
@@ -3390,9 +3495,9 @@
|
|
|
3390
3495
|
{
|
|
3391
3496
|
"chunkIndex": 1,
|
|
3392
3497
|
"chunkKind": "capabilities",
|
|
3393
|
-
"content": "Component Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
|
|
3498
|
+
"content": "Component Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.layoutPolicy\n Category: inputs\n Kind: object\n Description: Politica opt-in para materializar layout diretamente do schema atual sem depender de FormConfig.sections authoradas.\n - Path: inputs.layoutPolicy.source\n Category: inputs\n Kind: enum\n Description: Define se o layout vem de configuracao authorada ou do schema.\n - Path: inputs.layoutPolicy.preset\n Category: inputs\n Kind: enum\n Description: Preset de layout schema-driven. compactPresentation cobre detalhe read-only; groupedCommand cobre create/edit.\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n - Path: inputs.layoutPolicy.persistence\n Category: inputs\n Kind: enum\n Description: Define se sections geradas sao transient ou podem virar layout authorado apos detach explicito.\n - Path: inputs.fieldIconPolicy\n Category: inputs\n Kind: enum\n Description: Controla se icones prefix/suffix dos metadados aparecem em todos os modos, apenas apresentacao, ou nunca.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
|
|
3394
3499
|
"sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
|
|
3395
|
-
"contentHash": "
|
|
3500
|
+
"contentHash": "34cba6eff21308b2981b18235594c7bbe0ce91ea856efa617e2dc85c1db3ed81",
|
|
3396
3501
|
"sourceKind": "component_definition",
|
|
3397
3502
|
"sourceId": "praxis-dynamic-form-dialog-host",
|
|
3398
3503
|
"corpusVersion": "1.0.0"
|
|
@@ -3400,9 +3505,9 @@
|
|
|
3400
3505
|
{
|
|
3401
3506
|
"chunkIndex": 2,
|
|
3402
3507
|
"chunkKind": "context_pack",
|
|
3403
|
-
"content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {},\n \"actionCatalog\": [\n {\n \"id\": \"inputs.formId.set\",\n \"intentExamples\": [\n \"form id\",\n \"formulario\",\n \"identificador\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"formId\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.resourcePath.set\",\n \"intentExamples\": [\n \"resource path\",\n \"endpoint\",\n \"api\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"resourcePath\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.mode.set\",\n \"intentExamples\": [\n \"modo\",\n \"mode\",\n \"create\",\n \"edit\",\n \"view\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"mode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.schemaSource.set\",\n \"intentExamples\": [\n \"schema source\",\n \"schema\",\n \"resource\",\n \"filter\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"schemaSource\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.enable\",\n \"intentExamples\": [\n \"enable edit\",\n \"modo edicao\",\n \"edit layout\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": true\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.disable\",\n \"intentExamples\": [\n \"disable edit\",\n \"somente leitura\",\n \"no edit\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": false\n }\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"Dialog host: patches operate over inputs.*.\",\n \"Use mode=create|edit|view and schemaSource=resource|filter.\"\n ]\n }\n}",
|
|
3508
|
+
"content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {},\n \"actionCatalog\": [\n {\n \"id\": \"inputs.formId.set\",\n \"intentExamples\": [\n \"form id\",\n \"formulario\",\n \"identificador\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"formId\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.resourcePath.set\",\n \"intentExamples\": [\n \"resource path\",\n \"endpoint\",\n \"api\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"resourcePath\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.mode.set\",\n \"intentExamples\": [\n \"modo\",\n \"mode\",\n \"create\",\n \"edit\",\n \"view\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"mode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.schemaSource.set\",\n \"intentExamples\": [\n \"schema source\",\n \"schema\",\n \"resource\",\n \"filter\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"schemaSource\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.layoutPolicy.schemaDetail\",\n \"intentExamples\": [\n \"layout schema detail\",\n \"detalhe agrupado\",\n \"readonly agrupado\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"layoutPolicy\": {\n \"source\": \"schema\",\n \"intent\": \"detail\",\n \"preset\": \"compactPresentation\",\n \"lifecycle\": \"live\",\n \"persistence\": \"transient\",\n \"schemaOperation\": \"detail\",\n \"schemaType\": \"response\"\n }\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.enable\",\n \"intentExamples\": [\n \"enable edit\",\n \"modo edicao\",\n \"edit layout\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": true\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.disable\",\n \"intentExamples\": [\n \"disable edit\",\n \"somente leitura\",\n \"no edit\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": false\n }\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"Dialog host: patches operate over inputs.*.\",\n \"Use mode=create|edit|view and schemaSource=resource|filter.\"\n ]\n }\n}",
|
|
3404
3509
|
"sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/dynamic-form-dialog-host-context-pack.ts",
|
|
3405
|
-
"contentHash": "
|
|
3510
|
+
"contentHash": "764c843c42c97c7f28ddc4e35455b4faff7d2ea90d4120572bef2b97c4b08ee9",
|
|
3406
3511
|
"sourceKind": "component_definition",
|
|
3407
3512
|
"sourceId": "praxis-dynamic-form-dialog-host",
|
|
3408
3513
|
"corpusVersion": "1.0.0"
|
|
@@ -248,6 +248,9 @@ class CrudLauncherService {
|
|
|
248
248
|
if (resolved.apiUrlEntry != null) {
|
|
249
249
|
inputs['apiUrlEntry'] = resolved.apiUrlEntry;
|
|
250
250
|
}
|
|
251
|
+
if (resolved.layoutPolicy != null) {
|
|
252
|
+
inputs['layoutPolicy'] = resolved.layoutPolicy;
|
|
253
|
+
}
|
|
251
254
|
if (action.form?.initialValue != null) {
|
|
252
255
|
inputs['initialValue'] = action.form.initialValue;
|
|
253
256
|
}
|
|
@@ -274,12 +277,14 @@ class CrudLauncherService {
|
|
|
274
277
|
submitMethod: action.form?.submitMethod ?? null,
|
|
275
278
|
apiEndpointKey: action.form?.apiEndpointKey ?? null,
|
|
276
279
|
apiUrlEntry: action.form?.apiUrlEntry ?? null,
|
|
280
|
+
layoutPolicy: action.form?.layoutPolicy ?? null,
|
|
277
281
|
};
|
|
278
282
|
}
|
|
279
283
|
if (!this.isCanonicalCrudAction(action.action)) {
|
|
280
284
|
return {
|
|
281
285
|
apiEndpointKey: action.form?.apiEndpointKey ?? null,
|
|
282
286
|
apiUrlEntry: action.form?.apiUrlEntry ?? null,
|
|
287
|
+
layoutPolicy: action.form?.layoutPolicy ?? null,
|
|
283
288
|
};
|
|
284
289
|
}
|
|
285
290
|
const resourcePath = String(metadata.resource?.path ?? metadata.table?.resourcePath ?? '').trim();
|
|
@@ -309,6 +314,7 @@ class CrudLauncherService {
|
|
|
309
314
|
submitMethod: resolved?.submitMethod ?? null,
|
|
310
315
|
apiEndpointKey: action.form?.apiEndpointKey ?? metadata.resource?.endpointKey ?? null,
|
|
311
316
|
apiUrlEntry: action.form?.apiUrlEntry ?? null,
|
|
317
|
+
layoutPolicy: action.form?.layoutPolicy ?? null,
|
|
312
318
|
};
|
|
313
319
|
}
|
|
314
320
|
resolveRuntimeContract(action, row, metadata, runtime) {
|
|
@@ -4756,6 +4762,7 @@ class DynamicFormDialogHostComponent {
|
|
|
4756
4762
|
submitMethod;
|
|
4757
4763
|
apiEndpointKey;
|
|
4758
4764
|
apiUrlEntry;
|
|
4765
|
+
layoutPolicy;
|
|
4759
4766
|
formActions;
|
|
4760
4767
|
mode = 'create';
|
|
4761
4768
|
backConfig;
|
|
@@ -4812,6 +4819,7 @@ class DynamicFormDialogHostComponent {
|
|
|
4812
4819
|
this.apiUrlEntry = this.data.inputs?.['apiUrlEntry'] ?? null;
|
|
4813
4820
|
const act = this.data.action?.action;
|
|
4814
4821
|
this.mode = act === 'edit' ? 'edit' : act === 'view' ? 'view' : 'create';
|
|
4822
|
+
this.layoutPolicy = this.resolveLayoutPolicy();
|
|
4815
4823
|
this.formActions = this.resolveFormActions();
|
|
4816
4824
|
// Back config: defaults from metadata/action, overridden by saved per-form config
|
|
4817
4825
|
const defaults = (this.data.action?.back || this.data.metadata?.defaults?.back) || {};
|
|
@@ -4857,6 +4865,7 @@ class DynamicFormDialogHostComponent {
|
|
|
4857
4865
|
'apiEndpointKey',
|
|
4858
4866
|
'apiUrlEntry',
|
|
4859
4867
|
'initialValue',
|
|
4868
|
+
'layoutPolicy',
|
|
4860
4869
|
]);
|
|
4861
4870
|
const explicit = inputs['initialValue'] && typeof inputs['initialValue'] === 'object'
|
|
4862
4871
|
? { ...inputs['initialValue'] }
|
|
@@ -4890,6 +4899,15 @@ class DynamicFormDialogHostComponent {
|
|
|
4890
4899
|
},
|
|
4891
4900
|
};
|
|
4892
4901
|
}
|
|
4902
|
+
resolveLayoutPolicy() {
|
|
4903
|
+
const explicit = this.data.inputs?.['layoutPolicy'] ??
|
|
4904
|
+
this.data.action?.form?.layoutPolicy ??
|
|
4905
|
+
this.data.action?.layoutPolicy;
|
|
4906
|
+
if (explicit && typeof explicit === 'object') {
|
|
4907
|
+
return explicit;
|
|
4908
|
+
}
|
|
4909
|
+
return null;
|
|
4910
|
+
}
|
|
4893
4911
|
resolveSubmitLabel() {
|
|
4894
4912
|
const action = this.data.action ?? {};
|
|
4895
4913
|
const explicit = stringOrUndefined(action.form?.submitLabel ??
|
|
@@ -5074,6 +5092,7 @@ class DynamicFormDialogHostComponent {
|
|
|
5074
5092
|
[submitMethod]="submitMethod"
|
|
5075
5093
|
[apiEndpointKey]="apiEndpointKey"
|
|
5076
5094
|
[apiUrlEntry]="apiUrlEntry"
|
|
5095
|
+
[layoutPolicy]="layoutPolicy"
|
|
5077
5096
|
[presentationModeGlobal]="mode === 'view' ? true : null"
|
|
5078
5097
|
[backConfig]="backConfig"
|
|
5079
5098
|
[actions]="formActions"
|
|
@@ -5081,7 +5100,7 @@ class DynamicFormDialogHostComponent {
|
|
|
5081
5100
|
(formCancel)="onCancel()"
|
|
5082
5101
|
></praxis-dynamic-form>
|
|
5083
5102
|
</mat-dialog-content>
|
|
5084
|
-
`, isInline: true, styles: [":host{--dlg-header-h: 56px;--dlg-footer-h: 56px;--dlg-pad: 16px;display:flex;flex-direction:column;height:100%;overflow:hidden}:host([data-density=\"compact\"]){--dlg-header-h: 44px;--dlg-footer-h: 44px;--dlg-pad: 12px}.dialog-header{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:var(--dlg-pad);padding:0 var(--dlg-pad);height:var(--dlg-header-h);margin:0;background:var(--md-sys-color-surface-container-high);border-bottom:1px solid var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.dialog-title{margin:0;font:inherit;font-weight:600;color:var(--md-sys-color-on-surface)}.spacer{flex:1}.dialog-content{overflow:auto;padding:var(--dlg-pad);max-height:calc(100svh - var(--dlg-header-h) - 32px)}.dialog-header button.mat-icon-button{color:var(--md-sys-color-on-surface-variant)}.dialog-header button.mat-icon-button:hover{color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.dialog-footer{position:sticky;bottom:0;z-index:1;padding:var(--dlg-pad)}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisDynamicForm, selector: "praxis-dynamic-form", inputs: ["resourcePath", "resourceId", "initialValue", "editorialContext", "mode", "config", "actions", "schemaSource", "schemaUrl", "readUrl", "submitUrl", "submitMethod", "responseSchemaUrl", "apiEndpointKey", "apiUrlEntry", "enableCustomization", "showAiAssistant", "formId", "componentInstanceId", "configPersistenceStrategy", "layout", "generatedLayoutPreset", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "visibleGlobal", "domainRules", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "configPatchChange", "formReady", "valueChange", "syncCompleted", "initializationError", "loadingStateChange", "enableCustomizationChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError", "ruleDiagnosticsChange"] }] });
|
|
5103
|
+
`, isInline: true, styles: [":host{--dlg-header-h: 56px;--dlg-footer-h: 56px;--dlg-pad: 16px;display:flex;flex-direction:column;height:100%;overflow:hidden}:host([data-density=\"compact\"]){--dlg-header-h: 44px;--dlg-footer-h: 44px;--dlg-pad: 12px}.dialog-header{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:var(--dlg-pad);padding:0 var(--dlg-pad);height:var(--dlg-header-h);margin:0;background:var(--md-sys-color-surface-container-high);border-bottom:1px solid var(--md-sys-color-outline-variant);color:var(--md-sys-color-on-surface)}.dialog-title{margin:0;font:inherit;font-weight:600;color:var(--md-sys-color-on-surface)}.spacer{flex:1}.dialog-content{overflow:auto;padding:var(--dlg-pad);max-height:calc(100svh - var(--dlg-header-h) - 32px)}.dialog-header button.mat-icon-button{color:var(--md-sys-color-on-surface-variant)}.dialog-header button.mat-icon-button:hover{color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.dialog-footer{position:sticky;bottom:0;z-index:1;padding:var(--dlg-pad)}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisDynamicForm, selector: "praxis-dynamic-form", inputs: ["resourcePath", "resourceId", "initialValue", "editorialContext", "mode", "config", "actions", "schemaSource", "schemaUrl", "readUrl", "submitUrl", "submitMethod", "responseSchemaUrl", "apiEndpointKey", "apiUrlEntry", "enableCustomization", "showAiAssistant", "formId", "componentInstanceId", "configPersistenceStrategy", "layout", "generatedLayoutPreset", "layoutPolicy", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "visibleGlobal", "domainRules", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "configPatchChange", "formReady", "valueChange", "syncCompleted", "initializationError", "loadingStateChange", "enableCustomizationChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError", "ruleDiagnosticsChange"] }] });
|
|
5085
5104
|
}
|
|
5086
5105
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicFormDialogHostComponent, decorators: [{
|
|
5087
5106
|
type: Component,
|
|
@@ -5136,6 +5155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
5136
5155
|
[submitMethod]="submitMethod"
|
|
5137
5156
|
[apiEndpointKey]="apiEndpointKey"
|
|
5138
5157
|
[apiUrlEntry]="apiUrlEntry"
|
|
5158
|
+
[layoutPolicy]="layoutPolicy"
|
|
5139
5159
|
[presentationModeGlobal]="mode === 'view' ? true : null"
|
|
5140
5160
|
[backConfig]="backConfig"
|
|
5141
5161
|
[actions]="formActions"
|
|
@@ -5699,6 +5719,7 @@ const CRUD_AI_CAPABILITIES = {
|
|
|
5699
5719
|
{ path: 'actions[].params[].to', category: 'actions', valueKind: 'enum', allowedValues: ENUMS.paramTarget, description: 'Destino do parametro.' },
|
|
5700
5720
|
{ path: 'actions[].params[].name', category: 'actions', valueKind: 'string', description: 'Nome do parametro no destino.' },
|
|
5701
5721
|
{ path: 'actions[].form.initialValue', category: 'actions', valueKind: 'object', description: 'Seed fixo do formulario injetado em inputs.initialValue antes da abertura.' },
|
|
5722
|
+
{ path: 'actions[].form.layoutPolicy', category: 'actions', valueKind: 'object', description: 'Politica schema-driven opt-in encaminhada ao Dynamic Form para materializar detalhe ou command form sem FormConfig.sections local; deve acompanhar schemaUrl compativel, especialmente schemaType=request para comandos.' },
|
|
5702
5723
|
{ path: 'actions[].back', category: 'navigation', valueKind: 'object', description: 'BackConfig por acao.' },
|
|
5703
5724
|
{ path: 'actions[].back.strategy', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS.backStrategy, description: 'Estrategia de retorno da acao (auto, close, navigate).' },
|
|
5704
5725
|
{ path: 'actions[].back.returnTo', category: 'navigation', valueKind: 'string', description: 'Rota ou destino usado quando a estrategia de retorno for navigate.' },
|
|
@@ -5736,6 +5757,7 @@ const surfaceConfigureSchema = {
|
|
|
5736
5757
|
submitMethod: { enum: ['post', 'put', 'patch', 'delete'] },
|
|
5737
5758
|
apiEndpointKey: { type: 'string' },
|
|
5738
5759
|
initialValue: { type: 'object' },
|
|
5760
|
+
layoutPolicy: { type: 'object' },
|
|
5739
5761
|
},
|
|
5740
5762
|
},
|
|
5741
5763
|
params: {
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/crud",
|
|
3
|
-
"version": "9.0.0-beta.
|
|
3
|
+
"version": "9.0.0-beta.25",
|
|
4
4
|
"description": "CRUD building blocks for Praxis UI: integrates dynamic forms and tables with unified configuration and services.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
7
7
|
"@angular/core": "^21.0.0",
|
|
8
|
-
"@praxisui/dynamic-form": "^9.0.0-beta.
|
|
9
|
-
"@praxisui/table": "^9.0.0-beta.
|
|
10
|
-
"@praxisui/core": "^9.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^9.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^9.0.0-beta.
|
|
8
|
+
"@praxisui/dynamic-form": "^9.0.0-beta.25",
|
|
9
|
+
"@praxisui/table": "^9.0.0-beta.25",
|
|
10
|
+
"@praxisui/core": "^9.0.0-beta.25",
|
|
11
|
+
"@praxisui/dynamic-fields": "^9.0.0-beta.25",
|
|
12
|
+
"@praxisui/settings-panel": "^9.0.0-beta.25",
|
|
13
13
|
"@angular/cdk": "^21.0.0",
|
|
14
14
|
"@angular/forms": "^21.0.0",
|
|
15
15
|
"@angular/material": "^21.0.0",
|
|
16
16
|
"@angular/router": "^21.0.0",
|
|
17
|
-
"@praxisui/ai": "^9.0.0-beta.
|
|
17
|
+
"@praxisui/ai": "^9.0.0-beta.25",
|
|
18
18
|
"rxjs": "~7.8.0"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
package/types/praxisui-crud.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _praxisui_core from '@praxisui/core';
|
|
2
|
-
import { RowAction, ToolbarAction, ApiEndpoint, ApiUrlEntry, BackConfig, TableConfig, PraxisDataQueryContext, FormConfig, ResourceActionCatalogItem, ResourceSurfaceCatalogItem, LoadingState, RestApiLinks, ResourceCapabilitySnapshot, GenericCrudService, AsyncConfigStorage, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, SettingsValueProvider } from '@praxisui/core';
|
|
2
|
+
import { RowAction, ToolbarAction, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, BackConfig, TableConfig, PraxisDataQueryContext, FormConfig, ResourceActionCatalogItem, ResourceSurfaceCatalogItem, LoadingState, RestApiLinks, ResourceCapabilitySnapshot, GenericCrudService, AsyncConfigStorage, ComponentDocMeta, AiCapabilityCatalog, AiCapability, AiCapabilityCategory, AiValueKind, ComponentAuthoringManifest, SettingsValueProvider } from '@praxisui/core';
|
|
3
3
|
export { BackConfig } from '@praxisui/core';
|
|
4
4
|
import * as _angular_core from '@angular/core';
|
|
5
5
|
import { NgZone, OnChanges, EventEmitter, SimpleChanges, OnInit, Provider, AfterViewInit, OnDestroy } from '@angular/core';
|
|
@@ -53,6 +53,7 @@ interface CrudActionFormContract {
|
|
|
53
53
|
apiEndpointKey?: ApiEndpoint | string | null;
|
|
54
54
|
apiUrlEntry?: ApiUrlEntry | null;
|
|
55
55
|
initialValue?: Record<string, unknown> | null;
|
|
56
|
+
layoutPolicy?: DynamicFormLayoutPolicy | null;
|
|
56
57
|
}
|
|
57
58
|
type CrudActionResolutionMode = 'inferred' | 'explicit';
|
|
58
59
|
type CrudAction = (RowAction | ToolbarAction) & {
|
|
@@ -316,6 +317,7 @@ declare class CrudLauncherService {
|
|
|
316
317
|
submitMethod?: string | null;
|
|
317
318
|
apiEndpointKey?: unknown;
|
|
318
319
|
apiUrlEntry?: unknown;
|
|
320
|
+
layoutPolicy?: unknown;
|
|
319
321
|
};
|
|
320
322
|
private buildInferredFormId;
|
|
321
323
|
private isCanonicalCrudAction;
|
|
@@ -347,6 +349,7 @@ declare class DynamicFormDialogHostComponent implements OnInit {
|
|
|
347
349
|
submitMethod?: string | null;
|
|
348
350
|
apiEndpointKey?: ApiEndpoint | string | null;
|
|
349
351
|
apiUrlEntry?: ApiUrlEntry | null;
|
|
352
|
+
layoutPolicy?: DynamicFormLayoutPolicy | null;
|
|
350
353
|
formActions?: FormConfig['actions'];
|
|
351
354
|
mode: 'create' | 'edit' | 'view';
|
|
352
355
|
backConfig?: BackConfig;
|
|
@@ -355,6 +358,7 @@ declare class DynamicFormDialogHostComponent implements OnInit {
|
|
|
355
358
|
constructor(dialogRef: DialogRef<DynamicFormDialogHostComponent>, data: any, dialogService: DialogService, crud: GenericCrudService<any>, configStorage: AsyncConfigStorage);
|
|
356
359
|
private extractInitialValue;
|
|
357
360
|
private resolveFormActions;
|
|
361
|
+
private resolveLayoutPolicy;
|
|
358
362
|
private resolveSubmitLabel;
|
|
359
363
|
ngOnInit(): void;
|
|
360
364
|
onSave(result: unknown): void;
|