@praxisui/dynamic-form 10.0.0-rc.4 → 10.0.0-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-07T11:07:08.250Z",
3
+ "generatedAt": "2026-10-26T18:09:20.136Z",
4
4
  "packageName": "@praxisui/dynamic-form",
5
- "packageVersion": "10.0.0-rc.4",
5
+ "packageVersion": "10.0.0-rc.40",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 2,
@@ -49,7 +49,7 @@
49
49
  },
50
50
  {
51
51
  "name": "mode",
52
- "type": "'create' | 'edit' | 'view'",
52
+ "type": "'create' | 'edit' | 'view' | 'presentation' | 'dossier'",
53
53
  "required": false,
54
54
  "description": "Modo do formulario",
55
55
  "label": "Modo",
@@ -176,9 +176,9 @@
176
176
  },
177
177
  {
178
178
  "name": "configPersistenceStrategy",
179
- "type": "'local-first' | 'input-first'",
179
+ "type": "'local-first' | 'input-first' | 'volatile'",
180
180
  "required": false,
181
- "description": "Define se a configuracao local persistida ou os inputs do host tem precedencia; input-first preserva inclusive o mode explicito contra preferencias persistidas.",
181
+ "description": "Define se a configuracao local persistida ou os inputs do host tem precedencia; input-first preserva inclusive o mode explícito; volatile usa a configuração do host sem ler, salvar ou limpar preferências do filho.",
182
182
  "default": "local-first"
183
183
  },
184
184
  {
@@ -272,6 +272,13 @@
272
272
  "required": false,
273
273
  "description": "Projeção de contextSnapshot.presentation para hosts e Page Builder. Tamanhos em pixels; null remove ajustes explícitos. Não altera mode nem presentationModeGlobal."
274
274
  },
275
+ {
276
+ "name": "presentationPreset",
277
+ "type": "FormPresentationPreset",
278
+ "required": false,
279
+ "description": "Preset visual nativo para modo apresentação: corporate-dossier, editorial-card, compact-presentation ou default.",
280
+ "label": "Preset de Apresentação"
281
+ },
275
282
  {
276
283
  "name": "presentationModeGlobal",
277
284
  "type": "boolean | null",
@@ -890,7 +897,6 @@
890
897
  }
891
898
  ],
892
899
  "configEditor": {
893
- "component": "[ref:PraxisDynamicFormWidgetConfigEditor]",
894
900
  "title": "Configurar formulário"
895
901
  },
896
902
  "authoringManifestRef": {
@@ -3635,6 +3641,185 @@
3635
3641
  "responsive em card"
3636
3642
  ]
3637
3643
  },
3644
+ {
3645
+ "path": "fieldMetadata[].presentation.visualization.scaleScope",
3646
+ "category": "layout",
3647
+ "valueKind": "enum",
3648
+ "allowedValues": [
3649
+ "row",
3650
+ "page"
3651
+ ],
3652
+ "description": "Escopo de normalizacao de escala para series e valores em colecoes: row (local por linha) ou page (sincronizado na pagina visivel).",
3653
+ "intentExamples": [
3654
+ "sincronizar escala de sparklines na pagina",
3655
+ "comparar amplitude entre linhas"
3656
+ ]
3657
+ },
3658
+ {
3659
+ "path": "fieldMetadata[].presentation.visualization.tone",
3660
+ "category": "appearance",
3661
+ "valueKind": "enum",
3662
+ "allowedValues": [
3663
+ "neutral",
3664
+ "info",
3665
+ "success",
3666
+ "warning",
3667
+ "danger",
3668
+ "critical"
3669
+ ],
3670
+ "description": "Tom semantico estatico da micro visualizacao.",
3671
+ "intentExamples": [
3672
+ "neutral",
3673
+ "success",
3674
+ "warning",
3675
+ "danger",
3676
+ "critical"
3677
+ ]
3678
+ },
3679
+ {
3680
+ "path": "fieldMetadata[].presentation.visualization.toneExpr",
3681
+ "category": "appearance",
3682
+ "valueKind": "object",
3683
+ "description": "Expressao Json Logic ou caminho row.<campo> para resolver dinamicamente o tom semantico da micro visualizacao.",
3684
+ "safetyNotes": "Deve retornar apenas um dos tons permitidos em presentationVisualizationTone."
3685
+ },
3686
+ {
3687
+ "path": "fieldMetadata[].presentation.visualization.valueExpr",
3688
+ "category": "behavior",
3689
+ "valueKind": "object",
3690
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter o valor principal da micro visualizacao.",
3691
+ "intentExamples": [
3692
+ "row.slaValue",
3693
+ "row.progresso"
3694
+ ]
3695
+ },
3696
+ {
3697
+ "path": "fieldMetadata[].presentation.visualization.valueSuffix",
3698
+ "category": "appearance",
3699
+ "valueKind": "string",
3700
+ "description": "Sufixo de unidade anexado ao valor numerico formatado (ex: \"%\", \" pts\", \" ms\", \" d\").",
3701
+ "intentExamples": [
3702
+ "mostrar % no bullet",
3703
+ "adicionar sufixo pts no radial"
3704
+ ]
3705
+ },
3706
+ {
3707
+ "path": "fieldMetadata[].presentation.visualization.compactValue",
3708
+ "category": "appearance",
3709
+ "valueKind": "boolean",
3710
+ "description": "Formata valores numericos em notacao compacta (ex: 1.2M, 45.3K) para celulas densas.",
3711
+ "intentExamples": [
3712
+ "compactar valores financeiros grandes",
3713
+ "mostrar 1.2M em comparison"
3714
+ ]
3715
+ },
3716
+ {
3717
+ "path": "fieldMetadata[].presentation.visualization.min",
3718
+ "category": "behavior",
3719
+ "valueKind": "number",
3720
+ "description": "Limite minimo explicito da escala numerica."
3721
+ },
3722
+ {
3723
+ "path": "fieldMetadata[].presentation.visualization.max",
3724
+ "category": "behavior",
3725
+ "valueKind": "number",
3726
+ "description": "Limite maximo explicito da escala numerica."
3727
+ },
3728
+ {
3729
+ "path": "fieldMetadata[].presentation.visualization.total",
3730
+ "category": "behavior",
3731
+ "valueKind": "number",
3732
+ "description": "Total explicito para proporcionalidade em stackedBar ou radial."
3733
+ },
3734
+ {
3735
+ "path": "fieldMetadata[].presentation.visualization.target",
3736
+ "category": "behavior",
3737
+ "valueKind": "number",
3738
+ "description": "Meta fixa para comparacao em bullet."
3739
+ },
3740
+ {
3741
+ "path": "fieldMetadata[].presentation.visualization.targetExpr",
3742
+ "category": "behavior",
3743
+ "valueKind": "object",
3744
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter a meta por linha em bullet.",
3745
+ "intentExamples": [
3746
+ "row.metaSla",
3747
+ "row.target"
3748
+ ]
3749
+ },
3750
+ {
3751
+ "path": "fieldMetadata[].presentation.visualization.baseline",
3752
+ "category": "behavior",
3753
+ "valueKind": "number",
3754
+ "description": "Valor de referencia fixo para comparison ou delta."
3755
+ },
3756
+ {
3757
+ "path": "fieldMetadata[].presentation.visualization.baselineExpr",
3758
+ "category": "behavior",
3759
+ "valueKind": "object",
3760
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter o valor de referencia (baseline) por linha em comparison ou delta.",
3761
+ "intentExamples": [
3762
+ "row.orcamentoPrevisto",
3763
+ "row.indenizacoesTotal"
3764
+ ]
3765
+ },
3766
+ {
3767
+ "path": "fieldMetadata[].presentation.visualization.pointsExpr",
3768
+ "category": "behavior",
3769
+ "valueKind": "object",
3770
+ "description": "Caminho row.<campo> ou expressao Json Logic para serie de pontos em line, area ou column.",
3771
+ "intentExamples": [
3772
+ "row.trend",
3773
+ "row.historicoMensal"
3774
+ ]
3775
+ },
3776
+ {
3777
+ "path": "fieldMetadata[].presentation.visualization.segmentsExpr",
3778
+ "category": "behavior",
3779
+ "valueKind": "object",
3780
+ "description": "Caminho row.<campo> ou expressao Json Logic para lista de segmentos em stackedBar.",
3781
+ "intentExamples": [
3782
+ "row.capacitySegments",
3783
+ "row.distribuicao"
3784
+ ]
3785
+ },
3786
+ {
3787
+ "path": "fieldMetadata[].presentation.visualization.itemsExpr",
3788
+ "category": "behavior",
3789
+ "valueKind": "object",
3790
+ "description": "Caminho row.<campo> ou expressao Json Logic para lista de etapas em processFlow.",
3791
+ "intentExamples": [
3792
+ "row.flowSteps",
3793
+ "row.etapasAprovacao"
3794
+ ]
3795
+ },
3796
+ {
3797
+ "path": "fieldMetadata[].presentation.visualization.thresholds",
3798
+ "category": "appearance",
3799
+ "valueKind": "array",
3800
+ "description": "Faixas e limiares semanticos declarativos ({ value, min, max, tone, label }) para coloracao automatica e faixas qualitativas de bullet.",
3801
+ "intentExamples": [
3802
+ "[{ \"value\": 0, \"tone\": \"danger\" }, { \"value\": 60, \"tone\": \"warning\" }, { \"value\": 85, \"tone\": \"success\" }]"
3803
+ ]
3804
+ },
3805
+ {
3806
+ "path": "fieldMetadata[].presentation.visualization.stepLabelLineClamp",
3807
+ "category": "layout",
3808
+ "valueKind": "number",
3809
+ "description": "Numero maximo de linhas (1 ou 2) para rotulos de etapas em processFlow."
3810
+ },
3811
+ {
3812
+ "path": "fieldMetadata[].presentation.visualization.ariaLabel",
3813
+ "category": "accessibility",
3814
+ "valueKind": "string",
3815
+ "description": "Rotulo acessivel explicito da micro visualizacao."
3816
+ },
3817
+ {
3818
+ "path": "fieldMetadata[].presentation.visualization.ariaLabelExpr",
3819
+ "category": "accessibility",
3820
+ "valueKind": "object",
3821
+ "description": "Caminho row.<campo> ou expressao Json Logic para compor o rotulo acessivel por linha."
3822
+ },
3638
3823
  {
3639
3824
  "path": "fieldMetadata[].presentation.visualization.fallbackText",
3640
3825
  "category": "accessibility",
@@ -3642,6 +3827,12 @@
3642
3827
  "description": "Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.",
3643
3828
  "safetyNotes": "Deve explicar valor, unidade, meta, tendencia ou estado quando aplicavel."
3644
3829
  },
3830
+ {
3831
+ "path": "fieldMetadata[].presentation.visualization.fallbackTextExpr",
3832
+ "category": "accessibility",
3833
+ "valueKind": "object",
3834
+ "description": "Caminho row.<campo> ou expressao Json Logic para gerar o fallback textual dinamico por linha."
3835
+ },
3645
3836
  {
3646
3837
  "path": "fieldMetadata[].presentationRules",
3647
3838
  "category": "appearance",
@@ -3690,6 +3881,30 @@
3690
3881
  "exibir como porcentagem"
3691
3882
  ]
3692
3883
  },
3884
+ {
3885
+ "path": "fieldMetadata[].inlineVisualStyle",
3886
+ "category": "appearance",
3887
+ "valueKind": "enum",
3888
+ "allowedValues": [
3889
+ "compact",
3890
+ "graphic"
3891
+ ],
3892
+ "description": "Estilo visual para controles numericos percentuais inline (compact: pilula liquida com micro-anel e popover; graphic: card expandido com donut, trilho graduado e presets).",
3893
+ "intentExamples": [
3894
+ "usar percentual compacto na barra",
3895
+ "exibir card grafico de percentual"
3896
+ ]
3897
+ },
3898
+ {
3899
+ "path": "fieldMetadata[].percentPresets",
3900
+ "category": "data",
3901
+ "valueKind": "array",
3902
+ "description": "Lista de percentuais rapidos exibidos nos botoes de preset do Percent Studio (ex.: [0, 25, 50, 75, 100]).",
3903
+ "intentExamples": [
3904
+ "atalhos de percentual 10, 25, 50 e 100%",
3905
+ "definir presets de porcentagem"
3906
+ ]
3907
+ },
3693
3908
  {
3694
3909
  "path": "fieldMetadata[].validators",
3695
3910
  "category": "validation",
@@ -6650,9 +6865,11 @@
6650
6865
  "allowedValues": [
6651
6866
  "create",
6652
6867
  "edit",
6653
- "view"
6868
+ "view",
6869
+ "presentation",
6870
+ "dossier"
6654
6871
  ],
6655
- "description": "Modo de operação"
6872
+ "description": "Modos nativos preservados em documentos. Em novos fluxos, prefira view com presentationModeGlobal para separar operação dos dados e apresentação."
6656
6873
  },
6657
6874
  {
6658
6875
  "name": "presentation",
@@ -6669,9 +6886,10 @@
6669
6886
  "type": "string",
6670
6887
  "allowedValues": [
6671
6888
  "local-first",
6672
- "input-first"
6889
+ "input-first",
6890
+ "volatile"
6673
6891
  ],
6674
- "description": "Precedência entre configuração persistida e contrato explícito do host. Use input-first em dialogs e surfaces transitórias governadas por schema para preservar mode e estados operacionais publicados pelo servidor."
6892
+ "description": "Precedência entre configuração persistida e contrato explícito do host. Use volatile para filhos controlados por página, sem storage independente. Use input-first em dialogs e surfaces transitórias governadas por schema para preservar mode e estados operacionais publicados pelo servidor."
6675
6893
  },
6676
6894
  {
6677
6895
  "name": "generatedLayoutPreset",
@@ -9200,9 +9418,9 @@
9200
9418
  {
9201
9419
  "chunkIndex": 0,
9202
9420
  "chunkKind": "summary",
9203
- "content": "Component ID: praxis-dynamic-form\nSelector: praxis-dynamic-form\nFriendly Name: Praxis Dynamic Form\nDescription: Formulario dinamico com layout por secoes/linhas/colunas e campos renderizados por metadados.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, configurable, hasWizard, stable\nInputs:\n - resourcePath (string)\n - resourceId (string | number | null)\n - initialValue (Record<string, unknown> | null)\n - emptyState (PraxisDynamicFormEmptyState | null)\n - editorialContext (Record<string, unknown> | null)\n - mode ('create' | 'edit' | 'view')\n - config (FormConfig)\n - actions (FormConfig['actions'] | null)\n - schemaSource ('resource' | 'filter')\n - schemaUrl (string | null)\n - readUrl (string | null)\n - apiEndpointKey (ApiEndpoint | string | null)\n - apiUrlEntry (ApiUrlEntry | null)\n - submitUrl (string | null)\n - submitMethod ('post' | 'put' | 'patch' | null)\n - submitIdempotencyKey (string | null)\n - submitCorrelationId (string | null)\n - submitResourceVersion (string | number | null)\n - submitResourceVersionTargetResourceKey (string | null)\n - submitResourceVersionTargetIdField (string | null)\n - responseSchemaUrl (string | null)\n - enableCustomization (boolean)\n - showAiAssistant (boolean)\n - formId (string)\n - componentInstanceId (string)\n - configPersistenceStrategy ('local-first' | 'input-first')\n - layout (FormLayout)\n - generatedLayoutPreset ('default' | 'compactPresentation')\n - layoutPolicy (DynamicFormLayoutPolicy | null)\n - backConfig (BackConfig)\n - hooks (FormHooksLayout)\n - removeEmptyContainersOnSave (boolean)\n - reactiveValidation (boolean | null)\n - reactiveValidationDebounceMs (number | null)\n - notifyIfOutdated ('inline' | 'snackbar' | 'both' | 'none')\n - snoozeMs (number)\n - autoOpenSettingsOnOutdated (boolean)\n - readonlyModeGlobal (boolean | null)\n - disabledModeGlobal (boolean | null)\n - presentation (DynamicFormPresentationSnapshot | null)\n - presentationModeGlobal (boolean | null)\n - fieldIconPolicy ('all' | 'presentation-only' | 'none')\n - visibleGlobal (boolean | null)\n - customEndpoints (EndpointConfig)\nOutputs:\n - formSubmit (FormSubmitEvent)\n - formCancel (void)\n - formReset (void)\n - configChange (FormConfig)\n - configPatchChange (DynamicFormConfigPatchChangeEvent)\n - formReady (FormReadyEvent)\n - valueChange (FormValueChangeEvent)\n - payloadPreviewChange (FormPayloadPreviewEvent)\n - syncCompleted (SyncResult)\n - initializationError (FormInitializationError)\n - enableCustomizationChange (boolean)\n - customAction (FormCustomActionEvent)\n - actionConfirmation (FormActionConfirmationEvent)\n - schemaStatusChange ({ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string })\n - reactiveDeterminationExecuted (ReactiveDeterminationExecutionEvent)\n - reactiveDeterminationPendingChange (boolean)\n",
9421
+ "content": "Component ID: praxis-dynamic-form\nSelector: praxis-dynamic-form\nFriendly Name: Praxis Dynamic Form\nDescription: Formulario dinamico com layout por secoes/linhas/colunas e campos renderizados por metadados.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, configurable, hasWizard, stable\nInputs:\n - resourcePath (string)\n - resourceId (string | number | null)\n - initialValue (Record<string, unknown> | null)\n - emptyState (PraxisDynamicFormEmptyState | null)\n - editorialContext (Record<string, unknown> | null)\n - mode ('create' | 'edit' | 'view' | 'presentation' | 'dossier')\n - config (FormConfig)\n - actions (FormConfig['actions'] | null)\n - schemaSource ('resource' | 'filter')\n - schemaUrl (string | null)\n - readUrl (string | null)\n - apiEndpointKey (ApiEndpoint | string | null)\n - apiUrlEntry (ApiUrlEntry | null)\n - submitUrl (string | null)\n - submitMethod ('post' | 'put' | 'patch' | null)\n - submitIdempotencyKey (string | null)\n - submitCorrelationId (string | null)\n - submitResourceVersion (string | number | null)\n - submitResourceVersionTargetResourceKey (string | null)\n - submitResourceVersionTargetIdField (string | null)\n - responseSchemaUrl (string | null)\n - enableCustomization (boolean)\n - showAiAssistant (boolean)\n - formId (string)\n - componentInstanceId (string)\n - configPersistenceStrategy ('local-first' | 'input-first' | 'volatile')\n - layout (FormLayout)\n - generatedLayoutPreset ('default' | 'compactPresentation')\n - layoutPolicy (DynamicFormLayoutPolicy | null)\n - backConfig (BackConfig)\n - hooks (FormHooksLayout)\n - removeEmptyContainersOnSave (boolean)\n - reactiveValidation (boolean | null)\n - reactiveValidationDebounceMs (number | null)\n - notifyIfOutdated ('inline' | 'snackbar' | 'both' | 'none')\n - snoozeMs (number)\n - autoOpenSettingsOnOutdated (boolean)\n - readonlyModeGlobal (boolean | null)\n - disabledModeGlobal (boolean | null)\n - presentation (DynamicFormPresentationSnapshot | null)\n - presentationPreset (FormPresentationPreset)\n - presentationModeGlobal (boolean | null)\n - fieldIconPolicy ('all' | 'presentation-only' | 'none')\n - visibleGlobal (boolean | null)\n - customEndpoints (EndpointConfig)\nOutputs:\n - formSubmit (FormSubmitEvent)\n - formCancel (void)\n - formReset (void)\n - configChange (FormConfig)\n - configPatchChange (DynamicFormConfigPatchChangeEvent)\n - formReady (FormReadyEvent)\n - valueChange (FormValueChangeEvent)\n - payloadPreviewChange (FormPayloadPreviewEvent)\n - syncCompleted (SyncResult)\n - initializationError (FormInitializationError)\n - enableCustomizationChange (boolean)\n - customAction (FormCustomActionEvent)\n - actionConfirmation (FormActionConfirmationEvent)\n - schemaStatusChange ({ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string })\n - reactiveDeterminationExecuted (ReactiveDeterminationExecutionEvent)\n - reactiveDeterminationPendingChange (boolean)\n",
9204
9422
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.metadata.ts",
9205
- "contentHash": "57063c838a09c8c0eedf363c56552f772223f3ed3159b0cf265f4f88f5a5214d",
9423
+ "contentHash": "c23522b0ae4de2b4f759620ac16675455e6d0fe9e97b630e7248b82a8a3d463c",
9206
9424
  "sourceKind": "component_definition",
9207
9425
  "sourceId": "praxis-dynamic-form",
9208
9426
  "corpusVersion": "1.0.0"
@@ -9280,9 +9498,9 @@
9280
9498
  {
9281
9499
  "chunkIndex": 8,
9282
9500
  "chunkKind": "capabilities",
9283
- "content": "Schema Capability:\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n\nSchema Capability:\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n\nSchema Capability:\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n\nSchema Capability:\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n\nSchema Capability:\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.",
9501
+ "content": "Schema Capability:\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n\nSchema Capability:\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.scaleScope\n Category: layout\n Kind: enum\n Description: Escopo de normalizacao de escala para series e valores em colecoes: row (local por linha) ou page (sincronizado na pagina visivel).\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico estatico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.toneExpr\n Category: appearance\n Kind: object\n Description: Expressao Json Logic ou caminho row.<campo> para resolver dinamicamente o tom semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.valueExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter o valor principal da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.valueSuffix\n Category: appearance\n Kind: string\n Description: Sufixo de unidade anexado ao valor numerico formatado (ex: \"%\", \" pts\", \" ms\", \" d\").\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.compactValue\n Category: appearance\n Kind: boolean\n Description: Formata valores numericos em notacao compacta (ex: 1.2M, 45.3K) para celulas densas.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.min\n Category: behavior\n Kind: number\n Description: Limite minimo explicito da escala numerica.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.max\n Category: behavior\n Kind: number\n Description: Limite maximo explicito da escala numerica.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.total\n Category: behavior\n Kind: number\n Description: Total explicito para proporcionalidade em stackedBar ou radial.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.target\n Category: behavior\n Kind: number\n Description: Meta fixa para comparacao em bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.targetExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter a meta por linha em bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.baseline\n Category: behavior\n Kind: number\n Description: Valor de referencia fixo para comparison ou delta.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.baselineExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter o valor de referencia (baseline) por linha em comparison ou delta.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.pointsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para serie de pontos em line, area ou column.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.segmentsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para lista de segmentos em stackedBar.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.itemsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para lista de etapas em processFlow.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.thresholds\n Category: appearance\n Kind: array\n Description: Faixas e limiares semanticos declarativos ({ value, min, max, tone, label }) para coloracao automatica e faixas qualitativas de bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.stepLabelLineClamp\n Category: layout\n Kind: number\n Description: Numero maximo de linhas (1 ou 2) para rotulos de etapas em processFlow.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.ariaLabel\n Category: accessibility\n Kind: string\n Description: Rotulo acessivel explicito da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.ariaLabelExpr\n Category: accessibility\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para compor o rotulo acessivel por linha.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.",
9284
9502
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9285
- "contentHash": "680baee6a38106f22c4710309b6d65ef7e59d1ee08bb65cca97f004070a99d0c",
9503
+ "contentHash": "dc6be0dc67a901095196573bc7a8f81c4cae31110aa85265ef4ff6e1646b940b",
9286
9504
  "sourceKind": "component_definition",
9287
9505
  "sourceId": "praxis-dynamic-form",
9288
9506
  "corpusVersion": "1.0.0"
@@ -9290,9 +9508,9 @@
9290
9508
  {
9291
9509
  "chunkIndex": 9,
9292
9510
  "chunkKind": "capabilities",
9293
- "content": "Schema Capability:\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n\nSchema Capability:\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n\nSchema Capability:\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n\nSchema Capability:\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n\nSchema Capability:\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n\nSchema Capability:\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n\nSchema Capability:\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n\nSchema Capability:\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n\nSchema Capability:\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n\nSchema Capability:\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.",
9511
+ "content": "Schema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackTextExpr\n Category: accessibility\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para gerar o fallback textual dinamico por linha.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n\nSchema Capability:\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n\nSchema Capability:\n - Path: fieldMetadata[].inlineVisualStyle\n Category: appearance\n Kind: enum\n Description: Estilo visual para controles numericos percentuais inline (compact: pilula liquida com micro-anel e popover; graphic: card expandido com donut, trilho graduado e presets).\n\nSchema Capability:\n - Path: fieldMetadata[].percentPresets\n Category: data\n Kind: array\n Description: Lista de percentuais rapidos exibidos nos botoes de preset do Percent Studio (ex.: [0, 25, 50, 75, 100]).\n\nSchema Capability:\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n\nSchema Capability:\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).",
9294
9512
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9295
- "contentHash": "02f3921c10fb0dd88775888b7143c2cad0a14ccd228d35ea95cdb587a28b3c3f",
9513
+ "contentHash": "1e418f6ed02cbfa86ec339516bc55adf540acfabcf2fa04fda54ccf2e15c1843",
9296
9514
  "sourceKind": "component_definition",
9297
9515
  "sourceId": "praxis-dynamic-form",
9298
9516
  "corpusVersion": "1.0.0"
@@ -9300,9 +9518,9 @@
9300
9518
  {
9301
9519
  "chunkIndex": 10,
9302
9520
  "chunkKind": "capabilities",
9303
- "content": "Schema Capability:\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n\nSchema Capability:\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n\nSchema Capability:\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n\nSchema Capability:\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n\nSchema Capability:\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n\nSchema Capability:\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n\nSchema Capability:\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n\nSchema Capability:\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n\nSchema Capability:\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\n\nComponent Capability:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n\nComponent Capability:\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n\nComponent Capability:\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n\nComponent Capability:\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n\nComponent Capability:\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n\nComponent Capability:\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitIdempotencyKey\n Category: inputs\n Kind: string\n Description: Identidade estavel da tentativa de comando, materializada a partir da politica execution da action.\n\nComponent Capability:\n - Path: inputs.submitCorrelationId\n Category: inputs\n Kind: string\n Description: Identificador de correlacao governado para rastreabilidade ponta a ponta do comando.\n\nComponent Capability:\n - Path: inputs.submitResourceVersion\n Category: inputs\n Kind: string\n Description: Versao persistida esperada, transportada como If-Match quando exigida pela action.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetResourceKey\n Category: inputs\n Kind: string\n Description: Resource key canônico materializado pela action para resolver o ETag de outro agregado no momento do submit.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetIdField\n Category: inputs\n Kind: string\n Description: Campo exato do request que identifica o agregado cujo ETag governa a action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.configPersistenceStrategy\n Category: inputs\n Kind: enum\n Description: Define se preferências locais persistidas ou o contrato explícito do host governam a materialização corrente.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.orphanFieldExpansion\n Category: inputs\n Kind: enum\n Description: Define como uma linha groupedCommand com um unico campo usa o espaco restante. O default medium-and-wide expande spans 6 ou 8 e preserva campos compactos.",
9521
+ "content": "Schema Capability:\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n\nSchema Capability:\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n\nSchema Capability:\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n\nSchema Capability:\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n\nSchema Capability:\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n\nSchema Capability:\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n\nSchema Capability:\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n\nSchema Capability:\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n\nSchema Capability:\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n\nSchema Capability:\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n\nSchema Capability:\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n\nSchema Capability:\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n\nSchema Capability:\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n\nSchema Capability:\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n\nSchema Capability:\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n\nSchema Capability:\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n\nSchema Capability:\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n\nSchema Capability:\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n\nSchema Capability:\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\n\nComponent Capability:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n\nComponent Capability:\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n\nComponent Capability:\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n\nComponent Capability:\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n\nComponent Capability:\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n\nComponent Capability:\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).",
9304
9522
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9305
- "contentHash": "26b2dfdc858e1b0af8adbd4557dec1561120af335ab33688421d1dda98a4281e",
9523
+ "contentHash": "f5e8c17c1a6e0f3ab98cc132d55ffcf4067ebed9ff5d23daf3d63dbc9072f4ca",
9306
9524
  "sourceKind": "component_definition",
9307
9525
  "sourceId": "praxis-dynamic-form",
9308
9526
  "corpusVersion": "1.0.0"
@@ -9310,9 +9528,9 @@
9310
9528
  {
9311
9529
  "chunkIndex": 11,
9312
9530
  "chunkKind": "capabilities",
9313
- "content": "Component Capability:\n - Path: inputs.layoutPolicy.groupedCommand.contextFields\n Category: inputs\n Kind: array\n Description: Campos canônicos do request cujo valor vem do contexto da surface. Eles permanecem no FormGroup e no payload, sem renderizar controles redundantes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.partialRowStrategy\n Category: inputs\n Kind: enum\n Description: Define se cada linha visual parcial, depois de resolver visibilidade responsiva, CSS order e wrap, preserva os spans canônicos ou redistribui apenas campos compatíveis para completar 12 colunas no breakpoint atual.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n\nComponent Capability:\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n\nComponent Capability:\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n\nComponent Capability:\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n\nComponent Capability:\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n\nComponent Capability:\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n\nComponent Capability:\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n\nComponent Capability:\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n\nComponent Capability:\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n\nComponent Capability:\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n\nComponent Capability:\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n\nComponent Capability:\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n\nComponent Capability:\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n\nComponent Capability:\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n\nComponent Capability:\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n\nComponent Capability:\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n\nComponent Capability:\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n\nComponent Capability:\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n\nComponent Capability:\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n\nComponent Capability:\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n\nComponent Capability:\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n\nComponent Capability:\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.",
9531
+ "content": "Component Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitIdempotencyKey\n Category: inputs\n Kind: string\n Description: Identidade estavel da tentativa de comando, materializada a partir da politica execution da action.\n\nComponent Capability:\n - Path: inputs.submitCorrelationId\n Category: inputs\n Kind: string\n Description: Identificador de correlacao governado para rastreabilidade ponta a ponta do comando.\n\nComponent Capability:\n - Path: inputs.submitResourceVersion\n Category: inputs\n Kind: string\n Description: Versao persistida esperada, transportada como If-Match quando exigida pela action.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetResourceKey\n Category: inputs\n Kind: string\n Description: Resource key canônico materializado pela action para resolver o ETag de outro agregado no momento do submit.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetIdField\n Category: inputs\n Kind: string\n Description: Campo exato do request que identifica o agregado cujo ETag governa a action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.configPersistenceStrategy\n Category: inputs\n Kind: enum\n Description: Define se preferências locais persistidas ou o contrato explícito do host governam a materialização corrente.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.orphanFieldExpansion\n Category: inputs\n Kind: enum\n Description: Define como uma linha groupedCommand com um unico campo usa o espaco restante. O default medium-and-wide expande spans 6 ou 8 e preserva campos compactos.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.contextFields\n Category: inputs\n Kind: array\n Description: Campos canônicos do request cujo valor vem do contexto da surface. Eles permanecem no FormGroup e no payload, sem renderizar controles redundantes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.partialRowStrategy\n Category: inputs\n Kind: enum\n Description: Define se cada linha visual parcial, depois de resolver visibilidade responsiva, CSS order e wrap, preserva os spans canônicos ou redistribui apenas campos compatíveis para completar 12 colunas no breakpoint atual.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.",
9314
9532
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9315
- "contentHash": "d8a5bd44a76042ef92898e9140289bc09495b4ae07573b497e95c9abdc1ab4a7",
9533
+ "contentHash": "fb0074203e0a6e14fec64b7a21f0d85f815714122bb49a18404c5e5c64904c4c",
9316
9534
  "sourceKind": "component_definition",
9317
9535
  "sourceId": "praxis-dynamic-form",
9318
9536
  "corpusVersion": "1.0.0"
@@ -9320,15 +9538,25 @@
9320
9538
  {
9321
9539
  "chunkIndex": 12,
9322
9540
  "chunkKind": "capabilities",
9323
- "content": "Component Capability:\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n\nComponent Capability:\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n\nComponent Capability:\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n\nComponent Capability:\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n\nComponent Capability:\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n\nComponent Capability:\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n\nComponent Capability:\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n\nComponent Capability:\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n\nComponent Capability:\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n\nComponent Capability:\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n\nComponent Capability:\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n\nComponent Capability:\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n\nComponent Capability:\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n\nComponent Capability:\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n\nComponent Capability:\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n\nComponent Capability:\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n\nComponent Capability:\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\n\nCapability Note:\n - Este catalogo descreve inputs e outputs do componente.\n\nCapability Note:\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n\nCapability Note:\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n\nCapability Note:\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n\nCapability Note:\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n\nCapability Note:\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.",
9541
+ "content": "Component Capability:\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n\nComponent Capability:\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n\nComponent Capability:\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n\nComponent Capability:\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n\nComponent Capability:\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n\nComponent Capability:\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n\nComponent Capability:\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n\nComponent Capability:\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n\nComponent Capability:\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n\nComponent Capability:\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n\nComponent Capability:\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n\nComponent Capability:\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n\nComponent Capability:\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n\nComponent Capability:\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n\nComponent Capability:\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n\nComponent Capability:\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n\nComponent Capability:\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n\nComponent Capability:\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n\nComponent Capability:\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n\nComponent Capability:\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n\nComponent Capability:\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n\nComponent Capability:\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n\nComponent Capability:\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n\nComponent Capability:\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n\nComponent Capability:\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n\nComponent Capability:\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n\nComponent Capability:\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n\nComponent Capability:\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n\nComponent Capability:\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n\nComponent Capability:\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n\nComponent Capability:\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.",
9324
9542
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9325
- "contentHash": "8cde02bbb0100a17feb34ecf1e03642b852a82d237170763ad456693ee7b8789",
9543
+ "contentHash": "581cd896c206465873181d72b074d69d2bacefd3bae0bca8cc3db46a378af5d3",
9326
9544
  "sourceKind": "component_definition",
9327
9545
  "sourceId": "praxis-dynamic-form",
9328
9546
  "corpusVersion": "1.0.0"
9329
9547
  },
9330
9548
  {
9331
9549
  "chunkIndex": 13,
9550
+ "chunkKind": "capabilities",
9551
+ "content": "Component Capability:\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n\nComponent Capability:\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n\nComponent Capability:\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n\nComponent Capability:\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n\nComponent Capability:\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n\nComponent Capability:\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n\nComponent Capability:\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\n\nCapability Note:\n - Este catalogo descreve inputs e outputs do componente.\n\nCapability Note:\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n\nCapability Note:\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n\nCapability Note:\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n\nCapability Note:\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n\nCapability Note:\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.",
9552
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-component-ai-capabilities.ts",
9553
+ "contentHash": "2ce7f5421defeaee7239892584b36760cd38d627750678d49068eaee9ecfd09c",
9554
+ "sourceKind": "component_definition",
9555
+ "sourceId": "praxis-dynamic-form",
9556
+ "corpusVersion": "1.0.0"
9557
+ },
9558
+ {
9559
+ "chunkIndex": 14,
9332
9560
  "chunkKind": "authoring_manifest",
9333
9561
  "content": "{\"operationId\":\"field.label.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar rótulo do campo Effects: merge-by-key. Mudar o label do campo email para \\\"E-mail Corporativo\\\" Alterar o label do campo \\\"campoInexistente\\\" Salvar e reabrir o formulário editado sem drift de configuração\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"label\"],\"properties\":[\"label\"],\"semanticTerms\":[\"label\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].label\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"relabel-schema-backed-field\",\"request\":\"Mudar o label do campo email para \\\"E-mail Corporativo\\\"\",\"operationId\":\"field.label.set\",\"target\":\"email\",\"params\":{\"label\":\"E-mail Corporativo\"},\"isPositive\":true},{\"id\":\"round-trip-no-drift\",\"request\":\"Salvar e reabrir o formulário editado sem drift de configuração\",\"operationId\":\"field.label.set\",\"target\":\"nome\",\"params\":{\"label\":\"Nome Completo\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unknown-field\",\"request\":\"Alterar o label do campo \\\"campoInexistente\\\"\",\"operationId\":\"field.label.set\",\"target\":\"campoInexistente\",\"params\":{\"label\":\"Novo Label\"},\"isPositive\":false}]}",
9334
9562
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9338,7 +9566,7 @@
9338
9566
  "corpusVersion": "1.0.0"
9339
9567
  },
9340
9568
  {
9341
- "chunkIndex": 14,
9569
+ "chunkIndex": 15,
9342
9570
  "chunkKind": "authoring_manifest",
9343
9571
  "content": "{\"operationId\":\"field.placeholder.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar placeholder do campo Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"placeholder\"],\"properties\":[\"placeholder\"],\"semanticTerms\":[\"placeholder\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].placeholder\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9344
9572
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9348,7 +9576,7 @@
9348
9576
  "corpusVersion": "1.0.0"
9349
9577
  },
9350
9578
  {
9351
- "chunkIndex": 15,
9579
+ "chunkIndex": 16,
9352
9580
  "chunkKind": "authoring_manifest",
9353
9581
  "content": "{\"operationId\":\"field.required.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir obrigatoriedade Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"required\"],\"properties\":[\"required\"],\"semanticTerms\":[\"required\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].required\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9354
9582
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9358,7 +9586,7 @@
9358
9586
  "corpusVersion": "1.0.0"
9359
9587
  },
9360
9588
  {
9361
- "chunkIndex": 16,
9589
+ "chunkIndex": 17,
9362
9590
  "chunkKind": "authoring_manifest",
9363
9591
  "content": "{\"operationId\":\"field.readOnly.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir campo como somente leitura Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"readOnly\"],\"properties\":[\"readOnly\"],\"semanticTerms\":[\"readOnly\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].readOnly\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9364
9592
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9368,7 +9596,7 @@
9368
9596
  "corpusVersion": "1.0.0"
9369
9597
  },
9370
9598
  {
9371
- "chunkIndex": 17,
9599
+ "chunkIndex": 18,
9372
9600
  "chunkKind": "authoring_manifest",
9373
9601
  "content": "{\"operationId\":\"field.disabled.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir campo como desabilitado Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"disabled\"],\"properties\":[\"disabled\"],\"semanticTerms\":[\"disabled\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].disabled\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9374
9602
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9378,7 +9606,7 @@
9378
9606
  "corpusVersion": "1.0.0"
9379
9607
  },
9380
9608
  {
9381
- "chunkIndex": 18,
9609
+ "chunkIndex": 19,
9382
9610
  "chunkKind": "authoring_manifest",
9383
9611
  "content": "{\"operationId\":\"field.hidden.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir visibilidade inicial Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"hidden\"],\"properties\":[\"hidden\"],\"semanticTerms\":[\"hidden\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].hidden\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9384
9612
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9388,7 +9616,7 @@
9388
9616
  "corpusVersion": "1.0.0"
9389
9617
  },
9390
9618
  {
9391
- "chunkIndex": 19,
9619
+ "chunkIndex": 20,
9392
9620
  "chunkKind": "authoring_manifest",
9393
9621
  "content": "{\"operationId\":\"field.controlType.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar tipo de controle Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"controlType\"],\"properties\":[\"controlType\"],\"semanticTerms\":[\"controlType\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].controlType\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"control-type-compatible\",\"level\":\"error\",\"code\":\"DF017\",\"description\":\"O tipo de controle deve ser compatível com o tipo de dado do campo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9394
9622
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9398,7 +9626,7 @@
9398
9626
  "corpusVersion": "1.0.0"
9399
9627
  },
9400
9628
  {
9401
- "chunkIndex": 20,
9629
+ "chunkIndex": 21,
9402
9630
  "chunkKind": "authoring_manifest",
9403
9631
  "content": "{\"operationId\":\"field.optionSource.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir fonte de opções do campo Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"optionSource\"],\"properties\":[\"optionSource\"],\"semanticTerms\":[\"optionSource\",\"optionSource.key\",\"optionSource.type\",\"optionSource.resourcePath\",\"optionSource.valuePropertyPath\",\"optionSource.labelPropertyPath\",\"optionSource.dependsOn\",\"optionSource.dependencyFilterMap\",\"optionSource.includeIds\",\"optionSource.capabilities\",\"optionSource.display\",\"optionSource.selectionPolicy\",\"RESOURCE_ENTITY\",\"DISTINCT_DIMENSION\",\"CATEGORICAL_BUCKET\",\"LIGHT_LOOKUP\",\"STATIC_CANONICAL\",\"optionSource.capabilities.filter\",\"optionSource.capabilities.byIds\",\"optionSource.capabilities.detail\",\"optionSource.capabilities.create\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].optionSource\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"option-source-valid\",\"level\":\"error\",\"code\":\"DF018\",\"description\":\"A fonte de opções deve ser válida para o tipo de controle especificado.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9404
9632
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9408,7 +9636,7 @@
9408
9636
  "corpusVersion": "1.0.0"
9409
9637
  },
9410
9638
  {
9411
- "chunkIndex": 21,
9639
+ "chunkIndex": 22,
9412
9640
  "chunkKind": "authoring_manifest",
9413
9641
  "content": "{\"operationId\":\"field.local.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar campo local Effects: append-unique. Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"scope\":\"global\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"required\":false},\"inputContract\":{\"required\":[\"name\",\"label\",\"controlType\",\"source\"],\"properties\":[\"name\",\"label\",\"controlType\",\"source\",\"transient\",\"submitPolicy\"],\"semanticTerms\":[\"name\",\"label\",\"controlType\",\"source\",\"transient\",\"submitPolicy\",\"local\",\"omit\",\"include\",\"includeWhenDirty\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"fieldMetadata[]\"],\"validators\":[{\"validatorId\":\"field-name-unique\",\"level\":\"error\",\"code\":\"DF002\",\"description\":\"Nomes de campos devem ser únicos em fieldMetadata.\"},{\"validatorId\":\"local-schema-name-no-collision\",\"level\":\"error\",\"code\":\"DF006\",\"description\":\"Nome de campo local não pode colidir com campo schema-backed existente.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-local-transient-field\",\"request\":\"Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"operationId\":\"field.local.add\",\"params\":{\"name\":\"notasInternas\",\"label\":\"Notas Internas\",\"controlType\":\"textarea\",\"source\":\"local\",\"transient\":true,\"submitPolicy\":\"omit\"},\"isPositive\":true}],\"negativeExamples\":[]}",
9414
9642
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9418,7 +9646,7 @@
9418
9646
  "corpusVersion": "1.0.0"
9419
9647
  },
9420
9648
  {
9421
- "chunkIndex": 22,
9649
+ "chunkIndex": 23,
9422
9650
  "chunkKind": "authoring_manifest",
9423
9651
  "content": "{\"operationId\":\"field.local.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover campo local Effects: remove-by-key, compile-domain-patch. Remover o campo auxiliar \\\"notasInternas\\\"\",\"scope\":\"field\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"remove-by-key\",\"compile-domain-patch\"],\"affectedPaths\":[\"fieldMetadata[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"field-is-local\",\"level\":\"error\",\"code\":\"DF007\",\"description\":\"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"require-confirmation-remove-field\",\"request\":\"Remover o campo auxiliar \\\"notasInternas\\\"\",\"operationId\":\"field.local.remove\",\"target\":\"notasInternas\",\"isPositive\":true}],\"negativeExamples\":[]}",
9424
9652
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9428,7 +9656,7 @@
9428
9656
  "corpusVersion": "1.0.0"
9429
9657
  },
9430
9658
  {
9431
- "chunkIndex": 23,
9659
+ "chunkIndex": 24,
9432
9660
  "chunkKind": "authoring_manifest",
9433
9661
  "content": "{\"operationId\":\"field.submitPolicy.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir política de submissão do campo Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"required\":true},\"inputContract\":{\"required\":[\"submitPolicy\"],\"properties\":[\"submitPolicy\"],\"semanticTerms\":[\"submitPolicy\",\"omit\",\"include\",\"includeWhenDirty\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].submitPolicy\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"field-is-local\",\"level\":\"error\",\"code\":\"DF007\",\"description\":\"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9434
9662
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9438,7 +9666,7 @@
9438
9666
  "corpusVersion": "1.0.0"
9439
9667
  },
9440
9668
  {
9441
- "chunkIndex": 24,
9669
+ "chunkIndex": 25,
9442
9670
  "chunkKind": "authoring_manifest",
9443
9671
  "content": "{\"operationId\":\"layout.section.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar nova seção Effects: append-unique.\",\"scope\":\"global\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"title\"],\"properties\":[\"id\",\"title\",\"icon\",\"collapsible\"],\"semanticTerms\":[\"id\",\"title\",\"icon\",\"collapsible\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[]\"],\"validators\":[{\"validatorId\":\"section-id-unique\",\"level\":\"error\",\"code\":\"DF003\",\"description\":\"IDs de seções devem ser únicos em sections[].\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9444
9672
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9448,7 +9676,7 @@
9448
9676
  "corpusVersion": "1.0.0"
9449
9677
  },
9450
9678
  {
9451
- "chunkIndex": 25,
9679
+ "chunkIndex": 26,
9452
9680
  "chunkKind": "authoring_manifest",
9453
9681
  "content": "{\"operationId\":\"layout.section.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover seção Effects: remove-by-key, compile-domain-patch. Remover a seção \\\"Dados Adicionais\\\"\",\"scope\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"remove-by-key\",\"compile-domain-patch\"],\"affectedPaths\":[\"sections[]\",\"sections[].rows[]\",\"sections[].rows[].columns[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"require-confirmation-remove-section\",\"request\":\"Remover a seção \\\"Dados Adicionais\\\"\",\"operationId\":\"layout.section.remove\",\"target\":\"secao-dados-adicionais\",\"isPositive\":true}],\"negativeExamples\":[]}",
9454
9682
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9458,7 +9686,7 @@
9458
9686
  "corpusVersion": "1.0.0"
9459
9687
  },
9460
9688
  {
9461
- "chunkIndex": 26,
9689
+ "chunkIndex": 27,
9462
9690
  "chunkKind": "authoring_manifest",
9463
9691
  "content": "{\"operationId\":\"layout.row.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar linha numa seção Effects: append-unique.\",\"scope\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"columns\"],\"semanticTerms\":[\"id\",\"columns\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[].rows[]\"],\"validators\":[{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"},{\"validatorId\":\"row-id-unique-in-section\",\"level\":\"error\",\"code\":\"DF015\",\"description\":\"O id da nova linha deve ser único dentro da seção alvo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9464
9692
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9468,7 +9696,7 @@
9468
9696
  "corpusVersion": "1.0.0"
9469
9697
  },
9470
9698
  {
9471
- "chunkIndex": 27,
9699
+ "chunkIndex": 28,
9472
9700
  "chunkKind": "authoring_manifest",
9473
9701
  "content": "{\"operationId\":\"layout.column.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar coluna numa linha Effects: append-unique.\",\"scope\":\"row\",\"target\":{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"span\"],\"semanticTerms\":[\"id\",\"span\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[].rows[].columns[]\"],\"validators\":[{\"validatorId\":\"row-exists\",\"level\":\"error\",\"code\":\"DF014\",\"description\":\"A linha alvo deve existir na seção especificada.\"},{\"validatorId\":\"column-id-unique-in-row\",\"level\":\"error\",\"code\":\"DF016\",\"description\":\"O id da nova coluna deve ser único dentro da linha alvo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9474
9702
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9478,7 +9706,7 @@
9478
9706
  "corpusVersion": "1.0.0"
9479
9707
  },
9480
9708
  {
9481
- "chunkIndex": 28,
9709
+ "chunkIndex": 29,
9482
9710
  "chunkKind": "authoring_manifest",
9483
9711
  "content": "{\"operationId\":\"layout.field.move\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Mover campo no layout Effects: compile-domain-patch. Mover campo telefone para a primeira coluna da seção de contato\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"],\"semanticTerms\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"no-index-as-identity\",\"level\":\"error\",\"code\":\"DF013\",\"description\":\"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"},{\"validatorId\":\"field-exists-in-layout\",\"level\":\"warning\",\"code\":\"DF005\",\"description\":\"Campo definido em fieldMetadata mas ausente no layout.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-field-to-column\",\"request\":\"Mover campo telefone para a primeira coluna da seção de contato\",\"operationId\":\"layout.field.move\",\"target\":\"telefone\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-1\"},\"isPositive\":true}],\"negativeExamples\":[]}",
9484
9712
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9488,7 +9716,7 @@
9488
9716
  "corpusVersion": "1.0.0"
9489
9717
  },
9490
9718
  {
9491
- "chunkIndex": 29,
9719
+ "chunkIndex": 30,
9492
9720
  "chunkKind": "authoring_manifest",
9493
9721
  "content": "{\"operationId\":\"layout.visualBlock.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar bloco visual Effects: compile-domain-patch. Adicionar um aviso visual antes dos campos de contato\",\"scope\":\"column\",\"target\":{\"kind\":\"column\",\"resolver\":\"column-by-id-in-row\",\"required\":true},\"inputContract\":{\"required\":[\"id\",\"document\"],\"properties\":[\"id\",\"document\",\"layout\",\"rootClassName\",\"index\"],\"semanticTerms\":[\"id\",\"document\",\"layout\",\"rootClassName\",\"index\",\"document.kind\",\"document.version\",\"document.nodes\",\"block\",\"inline\",\"praxis.rich-content\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"validators\":[{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"visual-block-id-unique\",\"level\":\"error\",\"code\":\"DF021\",\"description\":\"IDs de blocos visuais devem ser unicos entre os itens de layout do formulario.\"},{\"validatorId\":\"rich-content-document-valid\",\"level\":\"error\",\"code\":\"DF022\",\"description\":\"O document do bloco visual deve seguir o contrato RichContentDocument canonico.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-visual-block\",\"request\":\"Adicionar um aviso visual antes dos campos de contato\",\"operationId\":\"layout.visualBlock.add\",\"target\":\"col-contato\",\"params\":{\"id\":\"aviso-contato\",\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"text\":\"Confira os dados antes de salvar.\"}]},\"layout\":\"block\"},\"isPositive\":true}],\"negativeExamples\":[]}",
9494
9722
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9498,7 +9726,7 @@
9498
9726
  "corpusVersion": "1.0.0"
9499
9727
  },
9500
9728
  {
9501
- "chunkIndex": 30,
9729
+ "chunkIndex": 31,
9502
9730
  "chunkKind": "authoring_manifest",
9503
9731
  "content": "{\"operationId\":\"layout.visualBlock.update\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Atualizar bloco visual Effects: compile-domain-patch.\",\"scope\":\"layout\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"document\",\"layout\",\"rootClassName\"],\"semanticTerms\":[\"document\",\"layout\",\"rootClassName\",\"document.kind\",\"document.version\",\"document.nodes\",\"block\",\"inline\",\"praxis.rich-content\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"validators\":[{\"validatorId\":\"visual-block-exists\",\"level\":\"error\",\"code\":\"DF020\",\"description\":\"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"},{\"validatorId\":\"rich-content-document-valid\",\"level\":\"error\",\"code\":\"DF022\",\"description\":\"O document do bloco visual deve seguir o contrato RichContentDocument canonico.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9504
9732
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9508,7 +9736,7 @@
9508
9736
  "corpusVersion": "1.0.0"
9509
9737
  },
9510
9738
  {
9511
- "chunkIndex": 31,
9739
+ "chunkIndex": 32,
9512
9740
  "chunkKind": "authoring_manifest",
9513
9741
  "content": "{\"operationId\":\"layout.visualBlock.move\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Mover bloco visual Effects: compile-domain-patch. Mover o aviso visual para a segunda coluna da secao de contato\",\"scope\":\"layout\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"required\":true},\"inputContract\":{\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"],\"semanticTerms\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"validators\":[{\"validatorId\":\"visual-block-exists\",\"level\":\"error\",\"code\":\"DF020\",\"description\":\"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"},{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"no-index-as-identity\",\"level\":\"error\",\"code\":\"DF013\",\"description\":\"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-visual-block\",\"request\":\"Mover o aviso visual para a segunda coluna da secao de contato\",\"operationId\":\"layout.visualBlock.move\",\"target\":\"aviso-contato\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-2\"},\"isPositive\":true}],\"negativeExamples\":[]}",
9514
9742
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9518,7 +9746,7 @@
9518
9746
  "corpusVersion": "1.0.0"
9519
9747
  },
9520
9748
  {
9521
- "chunkIndex": 32,
9749
+ "chunkIndex": 33,
9522
9750
  "chunkKind": "authoring_manifest",
9523
9751
  "content": "{\"operationId\":\"layout.visualBlock.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover bloco visual Effects: compile-domain-patch.\",\"scope\":\"layout\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"validators\":[{\"validatorId\":\"visual-block-exists\",\"level\":\"error\",\"code\":\"DF020\",\"description\":\"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9524
9752
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9528,7 +9756,7 @@
9528
9756
  "corpusVersion": "1.0.0"
9529
9757
  },
9530
9758
  {
9531
- "chunkIndex": 33,
9759
+ "chunkIndex": 34,
9532
9760
  "chunkKind": "authoring_manifest",
9533
9761
  "content": "{\"operationId\":\"rule.visibility.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar regra de visibilidade Effects: append-unique. Ocultar o campo cpf quando o tipo de pessoa for jurídica\",\"scope\":\"global\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"metadata\"],\"properties\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"metadata\"],\"semanticTerms\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"metadata\",\"visibility\",\"field\",\"section\",\"row\",\"column\",\"action\",\"visualBlock\",\"metadata.origin\",\"metadata.reviewStatus\",\"llm\",\"pending\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"formRules[]\"],\"validators\":[{\"validatorId\":\"rule-id-unique\",\"level\":\"error\",\"code\":\"DF008\",\"description\":\"IDs de regras devem ser únicos em formRules[].\"},{\"validatorId\":\"rule-target-refs-exist\",\"level\":\"error\",\"code\":\"DF010\",\"description\":\"Todos os targets da regra devem referenciar campos, seções, ações ou blocos visuais existentes.\"},{\"validatorId\":\"json-logic-valid\",\"level\":\"error\",\"code\":\"DF011\",\"description\":\"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-visibility-rule\",\"request\":\"Ocultar o campo cpf quando o tipo de pessoa for jurídica\",\"operationId\":\"rule.visibility.add\",\"params\":{\"id\":\"ocultar-cpf-pj\",\"name\":\"Ocultar CPF para PJ\",\"targetType\":\"field\",\"targets\":[\"cpf\"],\"condition\":{\"==\":[{\"var\":\"tipoPessoa\"},\"juridica\"]}},\"isPositive\":true}],\"negativeExamples\":[]}",
9534
9762
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9538,7 +9766,7 @@
9538
9766
  "corpusVersion": "1.0.0"
9539
9767
  },
9540
9768
  {
9541
- "chunkIndex": 34,
9769
+ "chunkIndex": 35,
9542
9770
  "chunkKind": "authoring_manifest",
9543
9771
  "content": "{\"operationId\":\"rule.validation.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar regra de validação Effects: append-unique.\",\"scope\":\"global\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"message\",\"metadata\"],\"properties\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"message\",\"level\",\"metadata\"],\"semanticTerms\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"message\",\"level\",\"metadata\",\"validation\",\"field\",\"section\",\"row\",\"column\",\"action\",\"visualBlock\",\"error\",\"warning\",\"metadata.origin\",\"metadata.reviewStatus\",\"llm\",\"pending\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"formRules[]\"],\"validators\":[{\"validatorId\":\"rule-id-unique\",\"level\":\"error\",\"code\":\"DF008\",\"description\":\"IDs de regras devem ser únicos em formRules[].\"},{\"validatorId\":\"rule-target-refs-exist\",\"level\":\"error\",\"code\":\"DF010\",\"description\":\"Todos os targets da regra devem referenciar campos, seções, ações ou blocos visuais existentes.\"},{\"validatorId\":\"json-logic-valid\",\"level\":\"error\",\"code\":\"DF011\",\"description\":\"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9544
9772
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9548,7 +9776,7 @@
9548
9776
  "corpusVersion": "1.0.0"
9549
9777
  },
9550
9778
  {
9551
- "chunkIndex": 35,
9779
+ "chunkIndex": 36,
9552
9780
  "chunkKind": "authoring_manifest",
9553
9781
  "content": "{\"operationId\":\"rule.computedValue.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar regra de valor calculado Effects: append-unique. Calcular idade a partir da data de nascimento e limpar quando a data estiver vazia\",\"scope\":\"global\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"value\",\"metadata\"],\"properties\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"value\",\"valueWhenFalse\",\"metadata\"],\"semanticTerms\":[\"id\",\"name\",\"type\",\"targetType\",\"targets\",\"condition\",\"value\",\"valueWhenFalse\",\"metadata\",\"computedValue\",\"field\",\"value.expression\",\"value.literal\",\"valueWhenFalse.expression\",\"valueWhenFalse.literal\",\"metadata.origin\",\"metadata.reviewStatus\",\"llm\",\"pending\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"formRules[]\"],\"validators\":[{\"validatorId\":\"rule-id-unique\",\"level\":\"error\",\"code\":\"DF008\",\"description\":\"IDs de regras devem ser únicos em formRules[].\"},{\"validatorId\":\"rule-target-refs-exist\",\"level\":\"error\",\"code\":\"DF010\",\"description\":\"Todos os targets da regra devem referenciar campos, seções, ações ou blocos visuais existentes.\"},{\"validatorId\":\"json-logic-valid\",\"level\":\"error\",\"code\":\"DF011\",\"description\":\"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"},{\"validatorId\":\"computed-value-envelope-valid\",\"level\":\"error\",\"code\":\"DF023\",\"description\":\"Valores calculados devem usar envelope explícito e fechado, exatamente { expression: <JsonLogic> } ou exatamente { literal: <valor> }; objetos literais sem envelope ou envelopes com chaves extras são ambíguos.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-computed-value-rule\",\"request\":\"Calcular idade a partir da data de nascimento e limpar quando a data estiver vazia\",\"operationId\":\"rule.computedValue.add\",\"params\":{\"id\":\"birth-date-computes-age\",\"name\":\"Calcular idade\",\"type\":\"computedValue\",\"targetType\":\"field\",\"targets\":[\"age\"],\"condition\":{\"!\":[{\"isBlank\":[{\"var\":\"birthDate\"}]}]},\"value\":{\"expression\":{\"yearsSince\":[{\"var\":\"birthDate\"}]}},\"valueWhenFalse\":{},\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
9554
9782
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9558,7 +9786,7 @@
9558
9786
  "corpusVersion": "1.0.0"
9559
9787
  },
9560
9788
  {
9561
- "chunkIndex": 36,
9789
+ "chunkIndex": 37,
9562
9790
  "chunkKind": "authoring_manifest",
9563
9791
  "content": "{\"operationId\":\"rule.visualBlockGuidance.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Materializar orientação visual derivada Effects: append-unique. Materializar no aviso visual a decisao governada que exige aprovacao de compliance para fornecedor com risco critico\",\"scope\":\"global\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"type\",\"targetType\",\"targets\",\"condition\",\"properties\",\"metadata\"],\"properties\":[\"id\",\"name\",\"description\",\"type\",\"targetType\",\"context\",\"targets\",\"condition\",\"properties\",\"propertiesWhenFalse\",\"metadata\"],\"semanticTerms\":[\"id\",\"name\",\"description\",\"type\",\"targetType\",\"context\",\"targets\",\"condition\",\"properties\",\"propertiesWhenFalse\",\"metadata\",\"visualBlockGuidance\",\"visualBlock\",\"notification\",\"style\",\"properties.visible\",\"properties.hidden\",\"properties.layout\",\"properties.className\",\"properties.rootClassName\",\"properties.style\",\"properties.text\",\"properties.title\",\"properties.message\",\"properties.textNodeId\",\"properties.titleNodeId\",\"properties.messageNodeId\",\"propertiesWhenFalse.visible\",\"propertiesWhenFalse.hidden\",\"propertiesWhenFalse.layout\",\"propertiesWhenFalse.className\",\"propertiesWhenFalse.rootClassName\",\"propertiesWhenFalse.style\",\"propertiesWhenFalse.text\",\"propertiesWhenFalse.title\",\"propertiesWhenFalse.message\",\"propertiesWhenFalse.textNodeId\",\"propertiesWhenFalse.titleNodeId\",\"propertiesWhenFalse.messageNodeId\",\"metadata.origin\",\"metadata.reviewStatus\",\"block\",\"inline\",\"llm\",\"pending\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"formRules[]\"],\"validators\":[{\"validatorId\":\"rule-id-unique\",\"level\":\"error\",\"code\":\"DF008\",\"description\":\"IDs de regras devem ser únicos em formRules[].\"},{\"validatorId\":\"visual-block-exists\",\"level\":\"error\",\"code\":\"DF020\",\"description\":\"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"},{\"validatorId\":\"json-logic-valid\",\"level\":\"error\",\"code\":\"DF011\",\"description\":\"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-visual-block-guidance-rule\",\"request\":\"Materializar no aviso visual a decisao governada que exige aprovacao de compliance para fornecedor com risco critico\",\"operationId\":\"rule.visualBlockGuidance.add\",\"params\":{\"id\":\"supplier-risk-guidance\",\"name\":\"Supplier risk guidance\",\"type\":\"visualBlockGuidance\",\"targetType\":\"visualBlock\",\"targets\":[\"supplier-risk-notice\"],\"condition\":{\"===\":[{\"var\":\"riscoFornecedor\"},\"critico\"]},\"properties\":{\"message\":\"Fornecedor critico exige aprovacao de compliance antes de emitir o pedido.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--critical\"},\"propertiesWhenFalse\":{\"message\":\"Fornecedor sem bloqueios criticos para este pedido.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--neutral\"},\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
9564
9792
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9568,7 +9796,7 @@
9568
9796
  "corpusVersion": "1.0.0"
9569
9797
  },
9570
9798
  {
9571
- "chunkIndex": 37,
9799
+ "chunkIndex": 38,
9572
9800
  "chunkKind": "authoring_manifest",
9573
9801
  "content": "{\"operationId\":\"rule.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover regra Effects: remove-by-key.\",\"scope\":\"rule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"remove-by-key\"],\"affectedPaths\":[\"formRules[]\"],\"validators\":[{\"validatorId\":\"rule-exists\",\"level\":\"error\",\"code\":\"DF009\",\"description\":\"A regra alvo deve existir em formRules[].\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9574
9802
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9578,7 +9806,7 @@
9578
9806
  "corpusVersion": "1.0.0"
9579
9807
  },
9580
9808
  {
9581
- "chunkIndex": 38,
9809
+ "chunkIndex": 39,
9582
9810
  "chunkKind": "authoring_manifest",
9583
9811
  "content": "{\"operationId\":\"action.submit.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configurar botão de envio Effects: merge-object.\",\"scope\":\"global\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"label\",\"icon\",\"visible\",\"color\"],\"semanticTerms\":[\"label\",\"icon\",\"visible\",\"color\",\"primary\",\"accent\",\"warn\",\"basic\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"actions.submit\"],\"validators\":[{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9584
9812
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9588,7 +9816,7 @@
9588
9816
  "corpusVersion": "1.0.0"
9589
9817
  },
9590
9818
  {
9591
- "chunkIndex": 39,
9819
+ "chunkIndex": 40,
9592
9820
  "chunkKind": "authoring_manifest",
9593
9821
  "content": "{\"operationId\":\"action.cancel.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configurar botão de cancelar Effects: merge-object.\",\"scope\":\"global\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"label\",\"icon\",\"visible\",\"color\",\"navigateTo\"],\"semanticTerms\":[\"label\",\"icon\",\"visible\",\"color\",\"navigateTo\",\"primary\",\"accent\",\"warn\",\"basic\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"actions.cancel\"],\"validators\":[{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9594
9822
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9598,7 +9826,7 @@
9598
9826
  "corpusVersion": "1.0.0"
9599
9827
  },
9600
9828
  {
9601
- "chunkIndex": 40,
9829
+ "chunkIndex": 41,
9602
9830
  "chunkKind": "authoring_manifest",
9603
9831
  "content": "{\"operationId\":\"action.reset.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configurar botão de reset Effects: merge-object.\",\"scope\":\"global\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"label\",\"icon\",\"visible\",\"color\",\"confirmBeforeReset\"],\"semanticTerms\":[\"label\",\"icon\",\"visible\",\"color\",\"confirmBeforeReset\",\"primary\",\"accent\",\"warn\",\"basic\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"actions.reset\"],\"validators\":[{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
9604
9832
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9608,7 +9836,7 @@
9608
9836
  "corpusVersion": "1.0.0"
9609
9837
  },
9610
9838
  {
9611
- "chunkIndex": 41,
9839
+ "chunkIndex": 42,
9612
9840
  "chunkKind": "authoring_manifest",
9613
9841
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"identity\"}",
9614
9842
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9618,17 +9846,17 @@
9618
9846
  "corpusVersion": "1.0.0"
9619
9847
  },
9620
9848
  {
9621
- "chunkIndex": 42,
9849
+ "chunkIndex": 43,
9622
9850
  "chunkKind": "authoring_manifest",
9623
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"showAiAssistant\",\"type\":\"boolean\",\"description\":\"Mostra os gatilhos do copiloto semantico Praxis\"},{\"name\":\"config\",\"type\":\"FormConfig\",\"description\":\"Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.\"},{\"name\":\"actions\",\"type\":\"FormConfig['actions'] | null\",\"description\":\"Overrides de apresentação da barra de ações fornecidos pelo host sem substituir o contrato HTTP da surface.\"},{\"name\":\"formId\",\"type\":\"string\",\"description\":\"Identidade estável usada pelo runtime para persistência local da configuração.\"},{\"name\":\"resourcePath\",\"type\":\"string\",\"description\":\"Caminho do recurso (API)\"},{\"name\":\"resourceId\",\"type\":\"string | number | null\",\"description\":\"Identidade canônica do registro carregado em modos edit e view.\"},{\"name\":\"emptyState\",\"type\":\"PraxisDynamicFormEmptyState | null\",\"description\":\"Authorado em bindings.emptyState no editor; null desliga explicitamente. Placeholder opt-in para mode=view sem resourceId nem snapshot local; reutiliza o empty state compartilhado e mantém a mensagem de negócio no plano/host.\"},{\"name\":\"readUrl\",\"type\":\"string\",\"description\":\"Endpoint canonico de leitura para surfaces VIEW/READ_PROJECTION\"},{\"name\":\"mode\",\"type\":\"string\",\"allowedValues\":[\"create\",\"edit\",\"view\"],\"description\":\"Modo de operação\"},{\"name\":\"presentation\",\"type\":\"DynamicFormPresentationSnapshot | null\",\"description\":\"Projeção de contextSnapshot.presentation para hosts e Page Builder. Tamanhos em pixels; null remove ajustes explícitos. Não altera mode nem presentationModeGlobal.\"},{\"name\":\"presentationModeGlobal\",\"type\":\"boolean | null\",\"description\":\"Preferência de exibição, também authorada em bindings.presentationModeGlobal: true apresenta rótulos e valores somente em mode=view; false força campos; null/ausência segue layoutPolicy. Não altera o modo dos dados.\"},{\"name\":\"configPersistenceStrategy\",\"type\":\"string\",\"allowedValues\":[\"local-first\",\"input-first\"],\"description\":\"Precedência entre configuração persistida e contrato explícito do host. Use input-first em dialogs e surfaces transitórias governadas por schema para preservar mode e estados operacionais publicados pelo servidor.\"},{\"name\":\"generatedLayoutPreset\",\"type\":\"string\",\"allowedValues\":[\"default\",\"compactPresentation\"],\"description\":\"Preset usado apenas ao gerar a configuracao inicial a partir de metadata/schema; nao reprocessa layouts persistidos ou autorados.\"},{\"name\":\"layoutPolicy\",\"type\":\"DynamicFormLayoutPolicy\",\"description\":\"Politica opt-in para layout schema-driven transient. Use source=schema apenas quando o backend schema for a fonte canonica do agrupamento; use detailSummary para seleção de campos e densidade responsiva do resumo read-only compacto sem FormConfig.sections locais. Quando o resumo precisar vencer x-ui.width publicado para outras surfaces, use detailSummary.widthPrecedence=summary. Em groupedCommand, orphanFieldExpansion governa linhas lógicas com um unico campo; partialRowStrategy=fill-compatible projeta spans compatíveis depois de resolver visibilidade responsiva, CSS order e wrap, sem alterar x-ui.width ou persistir sections; contextFields identifica campos do request hidratados pela surface que permanecem no payload sem criar controles redundantes.\"},{\"name\":\"fieldIconPolicy\",\"type\":\"string\",\"allowedValues\":[\"all\",\"presentation-only\",\"none\"],\"description\":\"Politica visual do host para icones prefix/suffix de campos vindos da metadata. Use presentation-only para manter icones decorativos em apresentacao e ocultar em controles tradicionais.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Habilita edição visual\"}]}",
9851
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"showAiAssistant\",\"type\":\"boolean\",\"description\":\"Mostra os gatilhos do copiloto semantico Praxis\"},{\"name\":\"config\",\"type\":\"FormConfig\",\"description\":\"Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.\"},{\"name\":\"actions\",\"type\":\"FormConfig['actions'] | null\",\"description\":\"Overrides de apresentação da barra de ações fornecidos pelo host sem substituir o contrato HTTP da surface.\"},{\"name\":\"formId\",\"type\":\"string\",\"description\":\"Identidade estável usada pelo runtime para persistência local da configuração.\"},{\"name\":\"resourcePath\",\"type\":\"string\",\"description\":\"Caminho do recurso (API)\"},{\"name\":\"resourceId\",\"type\":\"string | number | null\",\"description\":\"Identidade canônica do registro carregado em modos edit e view.\"},{\"name\":\"emptyState\",\"type\":\"PraxisDynamicFormEmptyState | null\",\"description\":\"Authorado em bindings.emptyState no editor; null desliga explicitamente. Placeholder opt-in para mode=view sem resourceId nem snapshot local; reutiliza o empty state compartilhado e mantém a mensagem de negócio no plano/host.\"},{\"name\":\"readUrl\",\"type\":\"string\",\"description\":\"Endpoint canonico de leitura para surfaces VIEW/READ_PROJECTION\"},{\"name\":\"mode\",\"type\":\"string\",\"allowedValues\":[\"create\",\"edit\",\"view\",\"presentation\",\"dossier\"],\"description\":\"Modos nativos preservados em documentos. Em novos fluxos, prefira view com presentationModeGlobal para separar operação dos dados e apresentação.\"},{\"name\":\"presentation\",\"type\":\"DynamicFormPresentationSnapshot | null\",\"description\":\"Projeção de contextSnapshot.presentation para hosts e Page Builder. Tamanhos em pixels; null remove ajustes explícitos. Não altera mode nem presentationModeGlobal.\"},{\"name\":\"presentationModeGlobal\",\"type\":\"boolean | null\",\"description\":\"Preferência de exibição, também authorada em bindings.presentationModeGlobal: true apresenta rótulos e valores somente em mode=view; false força campos; null/ausência segue layoutPolicy. Não altera o modo dos dados.\"},{\"name\":\"configPersistenceStrategy\",\"type\":\"string\",\"allowedValues\":[\"local-first\",\"input-first\",\"volatile\"],\"description\":\"Precedência entre configuração persistida e contrato explícito do host. Use volatile para filhos controlados por página, sem storage independente. Use input-first em dialogs e surfaces transitórias governadas por schema para preservar mode e estados operacionais publicados pelo servidor.\"},{\"name\":\"generatedLayoutPreset\",\"type\":\"string\",\"allowedValues\":[\"default\",\"compactPresentation\"],\"description\":\"Preset usado apenas ao gerar a configuracao inicial a partir de metadata/schema; nao reprocessa layouts persistidos ou autorados.\"},{\"name\":\"layoutPolicy\",\"type\":\"DynamicFormLayoutPolicy\",\"description\":\"Politica opt-in para layout schema-driven transient. Use source=schema apenas quando o backend schema for a fonte canonica do agrupamento; use detailSummary para seleção de campos e densidade responsiva do resumo read-only compacto sem FormConfig.sections locais. Quando o resumo precisar vencer x-ui.width publicado para outras surfaces, use detailSummary.widthPrecedence=summary. Em groupedCommand, orphanFieldExpansion governa linhas lógicas com um unico campo; partialRowStrategy=fill-compatible projeta spans compatíveis depois de resolver visibilidade responsiva, CSS order e wrap, sem alterar x-ui.width ou persistir sections; contextFields identifica campos do request hidratados pela surface que permanecem no payload sem criar controles redundantes.\"},{\"name\":\"fieldIconPolicy\",\"type\":\"string\",\"allowedValues\":[\"all\",\"presentation-only\",\"none\"],\"description\":\"Politica visual do host para icones prefix/suffix de campos vindos da metadata. Use presentation-only para manter icones decorativos em apresentacao e ocultar em controles tradicionais.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Habilita edição visual\"}]}",
9624
9852
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
9625
- "contentHash": "71de795e514367583af30f004099e53c0376010d58718a6b73935e544a090303",
9853
+ "contentHash": "2c3f132524d3cf73b6c9cb6f4591d2b1c076e1b444aa5c792be33a8d3d758c46",
9626
9854
  "sourceKind": "component_definition",
9627
9855
  "sourceId": "praxis-dynamic-form",
9628
9856
  "corpusVersion": "1.0.0"
9629
9857
  },
9630
9858
  {
9631
- "chunkIndex": 43,
9859
+ "chunkIndex": 44,
9632
9860
  "chunkKind": "authoring_manifest",
9633
9861
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"description\":\"Campos do formulário (metadados schema-backed ou local; use para ops de propriedade)\"},{\"kind\":\"schemaBackedField\",\"resolver\":\"field-by-name-or-label\",\"description\":\"Campos com origem no schema do backend; não removíveis via authoring\"},{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"description\":\"Campos locais com source:\\\"local\\\"; adicionados/removidos via authoring\"},{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"description\":\"Seções de layout identificadas por id estável\"},{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"description\":\"Linhas dentro de seções, identificadas por id estável\"},{\"kind\":\"column\",\"resolver\":\"column-by-id-in-row\",\"description\":\"Colunas dentro de linhas, identificadas por id estável\"},{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"description\":\"Blocos visuais richContent em sections[].rows[].columns[].items[]; não participam do payload de submissão\"},{\"kind\":\"layoutPlacement\",\"resolver\":\"layout-placement-by-field\",\"description\":\"Posicionamento de campo no layout; target para ops de reposicionamento\"},{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"description\":\"Ações da toolbar (submit, cancel, reset)\"},{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"description\":\"Regras de visibilidade e validação\"},{\"kind\":\"message\",\"resolver\":\"message-by-id\",\"description\":\"Mensagens inline do formulário (info, warning, error); ops em desenvolvimento\"}]}",
9634
9862
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9638,7 +9866,7 @@
9638
9866
  "corpusVersion": "1.0.0"
9639
9867
  },
9640
9868
  {
9641
- "chunkIndex": 44,
9869
+ "chunkIndex": 45,
9642
9870
  "chunkKind": "authoring_manifest",
9643
9871
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"field.label.set\",\"title\":\"Alterar rótulo do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"label\"],\"properties\":{\"label\":{\"type\":\"string\",\"minLength\":1}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].label\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.placeholder.set\",\"title\":\"Alterar placeholder do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"placeholder\"],\"properties\":{\"placeholder\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].placeholder\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.required.set\",\"title\":\"Definir obrigatoriedade\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"required\"],\"properties\":{\"required\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].required\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.readOnly.set\",\"title\":\"Definir campo como somente leitura\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"readOnly\"],\"properties\":{\"readOnly\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].readOnly\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.disabled.set\",\"title\":\"Definir campo como desabilitado\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"disabled\"],\"properties\":{\"disabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].disabled\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.hidden.set\",\"title\":\"Definir visibilidade inicial\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"hidden\"],\"properties\":{\"hidden\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].hidden\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.controlType.set\",\"title\":\"Alterar tipo de controle\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"controlType\"],\"properties\":{\"controlType\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"field-exists\",\"control-type-compatible\"],\"affectedPaths\":[\"fieldMetadata[].controlType\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.optionSource.set\",\"title\":\"Definir fonte de opções do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"optionSource\"],\"properties\":{\"optionSource\":{\"type\":\"object\",\"required\":[\"key\",\"type\",\"resourcePath\"],\"properties\":{\"key\":{\"type\":\"string\"},\"type\":{\"enum\":[\"RESOURCE_ENTITY\",\"DISTINCT_DIMENSION\",\"CATEGORICAL_BUCKET\",\"LIGHT_LOOKUP\",\"STATIC_CANONICAL\"]},\"resourcePath\":{\"type\":\"string\"},\"valuePropertyPath\":{\"type\":\"string\"},\"labelPropertyPath\":{\"type\":\"string\"},\"dependsOn\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dependencyFilterMap\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}},\"includeIds\":{\"type\":\"boolean\"},\"capabilities\":{\"type\":\"object\",\"properties\":{\"filter\":{\"type\":\"boolean\"},\"byIds\":{\"type\":\"boolean\"},\"detail\":{\"type\":\"boolean\"},\"create\":{\"type\":\"boolean\"}}},\"display\":{\"type\":\"object\"},\"selectionPolicy\":{\"type\":\"object\"}}}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\",\"option-source-valid\"],\"affectedPaths\":[\"fieldMetadata[].optionSource\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.local.add\",\"title\":\"Adicionar campo local\",\"scope\":\"global\",\"targetKind\":\"localField\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"name\",\"label\",\"controlType\",\"source\"],\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"controlType\":{\"type\":\"string\"},\"source\":{\"const\":\"local\",\"description\":\"Obrigatório. Discriminador que distingue campos locais de schema-backed.\"},\"transient\":{\"type\":\"boolean\",\"default\":false,\"description\":\"Se true, o valor não persiste entre navegações.\"},\"submitPolicy\":{\"enum\":[\"omit\",\"include\",\"includeWhenDirty\"],\"default\":\"omit\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-name-unique\",\"local-schema-name-no-collision\"],\"affectedPaths\":[\"fieldMetadata[]\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"field.local.remove\",\"title\":\"Remover campo local\",\"scope\":\"field\",\"targetKind\":\"localField\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"},{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-field-cleanup\",\"handlerContract\":{\"reads\":[\"fieldMetadata[].name\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"identityKeys\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.name\"],\"properties\":{\"target.name\":{\"type\":\"string\"}}},\"failureModes\":[\"target-field-not-found\",\"target-field-not-local\",\"layout-reference-conflict\"],\"description\":\"Remove every layout placement that references the removed local field by fieldMetadata[].name.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"field-exists\",\"field-is-local\"],\"affectedPaths\":[\"fieldMetadata[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\",\"target-exists\"]}]}",
9644
9872
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9648,7 +9876,7 @@
9648
9876
  "corpusVersion": "1.0.0"
9649
9877
  },
9650
9878
  {
9651
- "chunkIndex": 45,
9879
+ "chunkIndex": 46,
9652
9880
  "chunkKind": "authoring_manifest",
9653
9881
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"field.submitPolicy.set\",\"title\":\"Definir política de submissão do campo\",\"scope\":\"field\",\"targetKind\":\"localField\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"submitPolicy\"],\"properties\":{\"submitPolicy\":{\"enum\":[\"omit\",\"include\",\"includeWhenDirty\"]}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\",\"field-is-local\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"fieldMetadata[].submitPolicy\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.section.add\",\"title\":\"Adicionar nova seção\",\"scope\":\"global\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"title\"],\"properties\":{\"id\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"collapsible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[]\",\"key\":\"id\"}],\"validators\":[\"section-id-unique\"],\"affectedPaths\":[\"sections[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"layout.section.remove\",\"title\":\"Remover seção\",\"scope\":\"section\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"sections[]\",\"key\":\"id\"},{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-section-cleanup\",\"handlerContract\":{\"reads\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[]\"],\"identityKeys\":[\"sections[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.id\"],\"properties\":{\"target.id\":{\"type\":\"string\"}}},\"failureModes\":[\"target-section-not-found\",\"ambiguous-section-target\"],\"description\":\"Removes the target section and its nested rows, columns, and field placements without deleting fieldMetadata records.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"section-exists\"],\"affectedPaths\":[\"sections[]\",\"sections[].rows[]\",\"sections[].rows[].columns[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.row.add\",\"title\":\"Adicionar linha numa seção\",\"scope\":\"section\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"columns\":{\"type\":\"number\",\"minimum\":1,\"maximum\":12,\"default\":1}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[].rows[]\",\"key\":\"id\"}],\"validators\":[\"section-exists\",\"row-id-unique-in-section\"],\"affectedPaths\":[\"sections[].rows[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.column.add\",\"title\":\"Adicionar coluna numa linha\",\"scope\":\"row\",\"targetKind\":\"row\",\"target\":{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"span\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":12,\"default\":6}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[].rows[].columns[]\",\"key\":\"id\"}],\"validators\":[\"row-exists\",\"column-id-unique-in-row\"],\"affectedPaths\":[\"sections[].rows[].columns[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.field.move\",\"title\":\"Mover campo no layout\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-reconciler\",\"handlerContract\":{\"reads\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"identityKeys\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.name\",\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"target.name\":{\"type\":\"string\"},\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"failureModes\":[\"target-field-not-found\",\"target-layout-location-not-found\",\"ambiguous-field-target\",\"duplicate-field-placement\"],\"description\":\"Moves a field placement by stable section, row, column, and field ids; index is insertion position only.\"}}],\"validators\":[\"field-exists\",\"layout-target-exists\",\"no-index-as-identity\",\"field-exists-in-layout\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.visualBlock.add\",\"title\":\"Adicionar bloco visual\",\"scope\":\"column\",\"targetKind\":\"column\",\"target\":{\"kind\":\"column\",\"resolver\":\"column-by-id-in-row\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"document\"],\"properties\":{\"id\":{\"type\":\"string\"},\"document\":{\"type\":\"object\",\"required\":[\"kind\",\"version\",\"nodes\"],\"properties\":{\"kind\":{\"const\":\"praxis.rich-content\"},\"version\":{\"type\":\"string\"},\"nodes\":{\"type\":\"array\"}}},\"layout\":{\"enum\":[\"block\",\"inline\"],\"default\":\"block\"},\"rootClassName\":{\"type\":[\"string\",\"null\"]},\"index\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-visual-block-add\",\"handlerContract\":{\"reads\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items\"],\"writes\":[\"sections[].rows[].columns[].items\"],\"identityKeys\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.sectionId\",\"target.rowId\",\"target.columnId\",\"id\",\"document\"],\"properties\":{\"target.sectionId\":{\"type\":\"string\"},\"target.rowId\":{\"type\":\"string\"},\"target.columnId\":{\"type\":\"string\"},\"id\":{\"type\":\"string\"},\"document\":{\"type\":\"object\"},\"layout\":{\"enum\":[\"block\",\"inline\"]},\"rootClassName\":{\"type\":[\"string\",\"null\"]},\"index\":{\"type\":\"number\"}}},\"failureModes\":[\"target-layout-location-not-found\",\"duplicate-visual-block-id\",\"invalid-rich-content-document\"],\"description\":\"Adds a richContent layout item into sections[].rows[].columns[].items[] by stable section, row, and column ids.\"}}],\"validators\":[\"layout-target-exists\",\"visual-block-id-unique\",\"rich-content-document-valid\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]}]}",
9654
9882
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9658,7 +9886,7 @@
9658
9886
  "corpusVersion": "1.0.0"
9659
9887
  },
9660
9888
  {
9661
- "chunkIndex": 46,
9889
+ "chunkIndex": 47,
9662
9890
  "chunkKind": "authoring_manifest",
9663
9891
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"layout.visualBlock.update\",\"title\":\"Atualizar bloco visual\",\"scope\":\"layout\",\"targetKind\":\"visualBlock\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"document\":{\"type\":\"object\",\"required\":[\"kind\",\"version\",\"nodes\"],\"properties\":{\"kind\":{\"const\":\"praxis.rich-content\"},\"version\":{\"type\":\"string\"},\"nodes\":{\"type\":\"array\"}}},\"layout\":{\"enum\":[\"block\",\"inline\"]},\"rootClassName\":{\"type\":[\"string\",\"null\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-visual-block-update\",\"handlerContract\":{\"reads\":[\"sections[].rows[].columns[].items[].id\"],\"writes\":[\"sections[].rows[].columns[].items\"],\"identityKeys\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.itemId\"],\"properties\":{\"target.itemId\":{\"type\":\"string\"},\"document\":{\"type\":\"object\"},\"layout\":{\"enum\":[\"block\",\"inline\"]},\"rootClassName\":{\"type\":[\"string\",\"null\"]}}},\"failureModes\":[\"target-visual-block-not-found\",\"invalid-rich-content-document\"],\"description\":\"Updates a richContent layout item by stable layout item id without touching fieldMetadata or form submit payload.\"}}],\"validators\":[\"visual-block-exists\",\"rich-content-document-valid\",\"editor-round-trip-preserve\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.visualBlock.move\",\"title\":\"Mover bloco visual\",\"scope\":\"layout\",\"targetKind\":\"visualBlock\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-visual-block-move\",\"handlerContract\":{\"reads\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items[].id\"],\"writes\":[\"sections[].rows[].columns[].items\"],\"identityKeys\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.itemId\",\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"target.itemId\":{\"type\":\"string\"},\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"failureModes\":[\"target-visual-block-not-found\",\"target-layout-location-not-found\",\"ambiguous-visual-block-target\"],\"description\":\"Moves a richContent layout item by stable item, section, row, and column ids; index is insertion position only.\"}}],\"validators\":[\"visual-block-exists\",\"layout-target-exists\",\"no-index-as-identity\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.visualBlock.remove\",\"title\":\"Remover bloco visual\",\"scope\":\"layout\",\"targetKind\":\"visualBlock\",\"target\":{\"kind\":\"visualBlock\",\"resolver\":\"layout-item-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-visual-block-remove\",\"handlerContract\":{\"reads\":[\"sections[].rows[].columns[].items[].id\"],\"writes\":[\"sections[].rows[].columns[].items\"],\"identityKeys\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.itemId\"],\"properties\":{\"target.itemId\":{\"type\":\"string\"}}},\"failureModes\":[\"target-visual-block-not-found\",\"ambiguous-visual-block-target\"],\"description\":\"Removes a richContent layout item from sections[].rows[].columns[].items[] without touching fieldMetadata or form submit payload.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"visual-block-exists\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"rule.visibility.add\",\"title\":\"Adicionar regra de visibilidade\",\"scope\":\"global\",\"targetKind\":\"formRule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"metadata\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"type\":{\"const\":\"visibility\",\"description\":\"Discriminador de tipo da regra; obrigatório para distinção em formRules[]\"},\"targetType\":{\"enum\":[\"field\",\"section\",\"row\",\"column\",\"action\",\"visualBlock\"],\"default\":\"field\"},\"targets\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"condition\":{\"type\":\"object\",\"description\":\"JsonLogic AST. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"},\"metadata\":{\"type\":\"object\",\"required\":[\"origin\",\"reviewStatus\"],\"properties\":{\"origin\":{\"const\":\"llm\",\"description\":\"Origem obrigatória para regra sugerida por IA.\"},\"reviewStatus\":{\"const\":\"pending\",\"description\":\"Toda regra criada pela IA entra pendente de revisão humana.\"}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"formRules[]\",\"key\":\"id\"}],\"validators\":[\"rule-id-unique\",\"rule-target-refs-exist\",\"json-logic-valid\"],\"affectedPaths\":[\"formRules[]\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"rule.validation.add\",\"title\":\"Adicionar regra de validação\",\"scope\":\"global\",\"targetKind\":\"formRule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"message\",\"metadata\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"type\":{\"const\":\"validation\",\"description\":\"Discriminador de tipo da regra; obrigatório para distinção em formRules[]\"},\"targetType\":{\"enum\":[\"field\",\"section\",\"row\",\"column\",\"action\",\"visualBlock\"],\"default\":\"field\"},\"targets\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"condition\":{\"type\":\"object\",\"description\":\"JsonLogic AST; quando true, exibe mensagem de erro. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"},\"message\":{\"type\":\"string\",\"description\":\"Mensagem de erro a exibir ao usuário\"},\"level\":{\"enum\":[\"error\",\"warning\"],\"default\":\"error\"},\"metadata\":{\"type\":\"object\",\"required\":[\"origin\",\"reviewStatus\"],\"properties\":{\"origin\":{\"const\":\"llm\",\"description\":\"Origem obrigatória para regra sugerida por IA.\"},\"reviewStatus\":{\"const\":\"pending\",\"description\":\"Toda regra criada pela IA entra pendente de revisão humana.\"}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"formRules[]\",\"key\":\"id\"}],\"validators\":[\"rule-id-unique\",\"rule-target-refs-exist\",\"json-logic-valid\"],\"affectedPaths\":[\"formRules[]\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]}]}",
9664
9892
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9668,7 +9896,7 @@
9668
9896
  "corpusVersion": "1.0.0"
9669
9897
  },
9670
9898
  {
9671
- "chunkIndex": 47,
9899
+ "chunkIndex": 48,
9672
9900
  "chunkKind": "authoring_manifest",
9673
9901
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"rule.computedValue.add\",\"title\":\"Adicionar regra de valor calculado\",\"scope\":\"global\",\"targetKind\":\"formRule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"targets\",\"condition\",\"value\",\"metadata\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"type\":{\"const\":\"computedValue\",\"description\":\"Discriminador de regra que escreve effect.properties.value em formRules[].\"},\"targetType\":{\"const\":\"field\",\"description\":\"Valor calculado só é materializado em FormControl de campo.\"},\"targets\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"condition\":{\"type\":\"object\",\"description\":\"JsonLogic AST; quando true aplica value, quando false aplica valueWhenFalse se informado. Computed expressions are runtime JSON-only unless a focused visual round-trip path exists.\"},\"value\":{\"type\":\"object\",\"description\":\"Envelope obrigatório e fechado: exatamente { expression: <JsonLogic> } para cálculo ou exatamente { literal: <valor> } para valor literal estruturado.\",\"oneOf\":[{\"required\":[\"expression\"],\"not\":{\"required\":[\"literal\"]},\"additionalProperties\":false},{\"required\":[\"literal\"],\"not\":{\"required\":[\"expression\"]},\"additionalProperties\":false}],\"properties\":{\"expression\":{\"type\":\"object\",\"description\":\"JsonLogic AST avaliado contra o contexto do formulário.\"},\"literal\":{\"description\":\"Valor literal, inclusive objeto estruturado.\"}}},\"valueWhenFalse\":{\"type\":\"object\",\"description\":\"Envelope opcional e fechado aplicado no ramo falso. Use exatamente { literal: null } para limpar o valor.\",\"oneOf\":[{\"required\":[\"expression\"],\"not\":{\"required\":[\"literal\"]},\"additionalProperties\":false},{\"required\":[\"literal\"],\"not\":{\"required\":[\"expression\"]},\"additionalProperties\":false}],\"properties\":{\"expression\":{\"type\":\"object\",\"description\":\"JsonLogic AST avaliado contra o contexto do formulário.\"},\"literal\":{\"description\":\"Valor literal, inclusive null.\"}}},\"metadata\":{\"type\":\"object\",\"required\":[\"origin\",\"reviewStatus\"],\"properties\":{\"origin\":{\"const\":\"llm\",\"description\":\"Origem obrigatória para regra sugerida por IA.\"},\"reviewStatus\":{\"const\":\"pending\",\"description\":\"Toda regra criada pela IA entra pendente de revisão humana.\"}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"formRules[]\",\"key\":\"id\"}],\"validators\":[\"rule-id-unique\",\"rule-target-refs-exist\",\"json-logic-valid\",\"computed-value-envelope-valid\"],\"affectedPaths\":[\"formRules[]\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"rule.visualBlockGuidance.add\",\"title\":\"Materializar orientação visual derivada\",\"scope\":\"global\",\"targetKind\":\"formRule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"targetType\",\"targets\",\"condition\",\"properties\",\"metadata\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"type\":{\"const\":\"visualBlockGuidance\",\"description\":\"Discriminador para regra de orientação visual derivada em formRules[].\"},\"targetType\":{\"const\":\"visualBlock\",\"description\":\"Projeções visuais sempre apontam para richContent layout items e não representam a decisão canônica.\"},\"context\":{\"enum\":[\"notification\",\"style\"],\"default\":\"notification\"},\"targets\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"condition\":{\"type\":\"object\",\"description\":\"JsonLogic AST; quando true aplica properties, quando false aplica propertiesWhenFalse. Visual-safe subset: field comparisons with scalar or field operands plus and/or groups. Advanced operators are runtime JSON-only until focused visual round-trip support exists.\"},\"properties\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"visible\":{\"type\":\"boolean\"},\"hidden\":{\"type\":\"boolean\"},\"layout\":{\"enum\":[\"block\",\"inline\"]},\"className\":{\"type\":\"string\"},\"rootClassName\":{\"type\":\"string\"},\"style\":{\"type\":\"object\"},\"text\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"},\"textNodeId\":{\"type\":\"string\"},\"titleNodeId\":{\"type\":\"string\"},\"messageNodeId\":{\"type\":\"string\"}},\"description\":\"Use apenas propriedades suportadas por RULE_PROPERTY_SCHEMA.visualBlock; não escreva document, HTML, handlers, dados de payload ou regra de negócio canônica.\"},\"propertiesWhenFalse\":{\"type\":\"object\",\"properties\":{\"visible\":{\"type\":\"boolean\"},\"hidden\":{\"type\":\"boolean\"},\"layout\":{\"enum\":[\"block\",\"inline\"]},\"className\":{\"type\":\"string\"},\"rootClassName\":{\"type\":\"string\"},\"style\":{\"type\":\"object\"},\"text\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"},\"textNodeId\":{\"type\":\"string\"},\"titleNodeId\":{\"type\":\"string\"},\"messageNodeId\":{\"type\":\"string\"}}},\"metadata\":{\"type\":\"object\",\"required\":[\"origin\",\"reviewStatus\"],\"properties\":{\"origin\":{\"const\":\"llm\",\"description\":\"Origem obrigatória para regra sugerida por IA.\"},\"reviewStatus\":{\"const\":\"pending\",\"description\":\"Toda regra criada pela IA entra pendente de revisão humana.\"}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"formRules[]\",\"key\":\"id\"}],\"validators\":[\"rule-id-unique\",\"visual-block-exists\",\"json-logic-valid\"],\"affectedPaths\":[\"formRules[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"rule.remove\",\"title\":\"Remover regra\",\"scope\":\"rule\",\"targetKind\":\"formRule\",\"target\":{\"kind\":\"formRule\",\"resolver\":\"rule-by-id-or-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"formRules[]\",\"key\":\"id\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"rule-exists\"],\"affectedPaths\":[\"formRules[]\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"action.submit.configure\",\"title\":\"Configurar botão de envio\",\"scope\":\"global\",\"targetKind\":\"formAction\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"label\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"visible\":{\"type\":\"boolean\"},\"color\":{\"enum\":[\"primary\",\"accent\",\"warn\",\"basic\"]}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"actions.submit\"}],\"validators\":[\"editor-round-trip-preserve\"],\"affectedPaths\":[\"actions.submit\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"action.cancel.configure\",\"title\":\"Configurar botão de cancelar\",\"scope\":\"global\",\"targetKind\":\"formAction\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"label\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"visible\":{\"type\":\"boolean\"},\"color\":{\"enum\":[\"primary\",\"accent\",\"warn\",\"basic\"]},\"navigateTo\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"actions.cancel\"}],\"validators\":[\"editor-round-trip-preserve\"],\"affectedPaths\":[\"actions.cancel\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
9674
9902
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9678,7 +9906,7 @@
9678
9906
  "corpusVersion": "1.0.0"
9679
9907
  },
9680
9908
  {
9681
- "chunkIndex": 48,
9909
+ "chunkIndex": 49,
9682
9910
  "chunkKind": "authoring_manifest",
9683
9911
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"action.reset.configure\",\"title\":\"Configurar botão de reset\",\"scope\":\"global\",\"targetKind\":\"formAction\",\"target\":{\"kind\":\"formAction\",\"resolver\":\"action-by-id-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"label\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"visible\":{\"type\":\"boolean\"},\"color\":{\"enum\":[\"primary\",\"accent\",\"warn\",\"basic\"]},\"confirmBeforeReset\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"actions.reset\"}],\"validators\":[\"editor-round-trip-preserve\"],\"affectedPaths\":[\"actions.reset\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
9684
9912
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9688,7 +9916,7 @@
9688
9916
  "corpusVersion": "1.0.0"
9689
9917
  },
9690
9918
  {
9691
- "chunkIndex": 49,
9919
+ "chunkIndex": 50,
9692
9920
  "chunkKind": "authoring_manifest",
9693
9921
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"field-name-unique\",\"level\":\"error\",\"code\":\"DF002\",\"description\":\"Nomes de campos devem ser únicos em fieldMetadata.\"},{\"validatorId\":\"section-id-unique\",\"level\":\"error\",\"code\":\"DF003\",\"description\":\"IDs de seções devem ser únicos em sections[].\"},{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"},{\"validatorId\":\"field-exists-in-layout\",\"level\":\"warning\",\"code\":\"DF005\",\"description\":\"Campo definido em fieldMetadata mas ausente no layout.\"},{\"validatorId\":\"local-schema-name-no-collision\",\"level\":\"error\",\"code\":\"DF006\",\"description\":\"Nome de campo local não pode colidir com campo schema-backed existente.\"},{\"validatorId\":\"field-is-local\",\"level\":\"error\",\"code\":\"DF007\",\"description\":\"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"},{\"validatorId\":\"rule-id-unique\",\"level\":\"error\",\"code\":\"DF008\",\"description\":\"IDs de regras devem ser únicos em formRules[].\"},{\"validatorId\":\"rule-exists\",\"level\":\"error\",\"code\":\"DF009\",\"description\":\"A regra alvo deve existir em formRules[].\"},{\"validatorId\":\"rule-target-refs-exist\",\"level\":\"error\",\"code\":\"DF010\",\"description\":\"Todos os targets da regra devem referenciar campos, seções, ações ou blocos visuais existentes.\"},{\"validatorId\":\"computed-value-envelope-valid\",\"level\":\"error\",\"code\":\"DF023\",\"description\":\"Valores calculados devem usar envelope explícito e fechado, exatamente { expression: <JsonLogic> } ou exatamente { literal: <valor> }; objetos literais sem envelope ou envelopes com chaves extras são ambíguos.\"},{\"validatorId\":\"json-logic-valid\",\"level\":\"error\",\"code\":\"DF011\",\"description\":\"A expressão JsonLogic deve ser um AST válido (suporte canônico à spec JsonLogic).\"},{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"no-index-as-identity\",\"level\":\"error\",\"code\":\"DF013\",\"description\":\"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"},{\"validatorId\":\"row-exists\",\"level\":\"error\",\"code\":\"DF014\",\"description\":\"A linha alvo deve existir na seção especificada.\"},{\"validatorId\":\"row-id-unique-in-section\",\"level\":\"error\",\"code\":\"DF015\",\"description\":\"O id da nova linha deve ser único dentro da seção alvo.\"},{\"validatorId\":\"column-id-unique-in-row\",\"level\":\"error\",\"code\":\"DF016\",\"description\":\"O id da nova coluna deve ser único dentro da linha alvo.\"},{\"validatorId\":\"control-type-compatible\",\"level\":\"error\",\"code\":\"DF017\",\"description\":\"O tipo de controle deve ser compatível com o tipo de dado do campo.\"},{\"validatorId\":\"option-source-valid\",\"level\":\"error\",\"code\":\"DF018\",\"description\":\"A fonte de opções deve ser válida para o tipo de controle especificado.\"},{\"validatorId\":\"editor-round-trip-preserve\",\"level\":\"error\",\"code\":\"DF019\",\"description\":\"Edição não deve corromper propriedades críticas para o round-trip do editor. Aplicado após operações que afetam submitPolicy ou source de campos locais.\"},{\"validatorId\":\"visual-block-exists\",\"level\":\"error\",\"code\":\"DF020\",\"description\":\"O bloco visual alvo deve existir como item kind:\\\"richContent\\\" em sections[].rows[].columns[].items[].\"},{\"validatorId\":\"visual-block-id-unique\",\"level\":\"error\",\"code\":\"DF021\",\"description\":\"IDs de blocos visuais devem ser unicos entre os itens de layout do formulario.\"},{\"validatorId\":\"rich-content-document-valid\",\"level\":\"error\",\"code\":\"DF022\",\"description\":\"O document do bloco visual deve seguir o contrato RichContentDocument canonico.\"}]}",
9694
9922
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9698,7 +9926,7 @@
9698
9926
  "corpusVersion": "1.0.0"
9699
9927
  },
9700
9928
  {
9701
- "chunkIndex": 50,
9929
+ "chunkIndex": 51,
9702
9930
  "chunkKind": "authoring_manifest",
9703
9931
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"strip-undefined\",\"normalize-json-logic\",\"stable-field-order\",\"preserve-column-layout-items\",\"preserve-local-field-source\",\"preserve-section-row-column-ids\"]}",
9704
9932
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9708,7 +9936,7 @@
9708
9936
  "corpusVersion": "1.0.0"
9709
9937
  },
9710
9938
  {
9711
- "chunkIndex": 51,
9939
+ "chunkIndex": 52,
9712
9940
  "chunkKind": "authoring_manifest",
9713
9941
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.5.4\",\"componentId\":\"praxis-dynamic-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"add-local-transient-field\",\"request\":\"Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"operationId\":\"field.local.add\",\"params\":{\"name\":\"notasInternas\",\"label\":\"Notas Internas\",\"controlType\":\"textarea\",\"source\":\"local\",\"transient\":true,\"submitPolicy\":\"omit\"},\"isPositive\":true},{\"id\":\"relabel-schema-backed-field\",\"request\":\"Mudar o label do campo email para \\\"E-mail Corporativo\\\"\",\"operationId\":\"field.label.set\",\"target\":\"email\",\"params\":{\"label\":\"E-mail Corporativo\"},\"isPositive\":true},{\"id\":\"move-field-to-column\",\"request\":\"Mover campo telefone para a primeira coluna da seção de contato\",\"operationId\":\"layout.field.move\",\"target\":\"telefone\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-1\"},\"isPositive\":true},{\"id\":\"add-visual-block\",\"request\":\"Adicionar um aviso visual antes dos campos de contato\",\"operationId\":\"layout.visualBlock.add\",\"target\":\"col-contato\",\"params\":{\"id\":\"aviso-contato\",\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"text\":\"Confira os dados antes de salvar.\"}]},\"layout\":\"block\"},\"isPositive\":true},{\"id\":\"move-visual-block\",\"request\":\"Mover o aviso visual para a segunda coluna da secao de contato\",\"operationId\":\"layout.visualBlock.move\",\"target\":\"aviso-contato\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-2\"},\"isPositive\":true},{\"id\":\"add-visibility-rule\",\"request\":\"Ocultar o campo cpf quando o tipo de pessoa for jurídica\",\"operationId\":\"rule.visibility.add\",\"params\":{\"id\":\"ocultar-cpf-pj\",\"name\":\"Ocultar CPF para PJ\",\"targetType\":\"field\",\"targets\":[\"cpf\"],\"condition\":{\"==\":[{\"var\":\"tipoPessoa\"},\"juridica\"]}},\"isPositive\":true},{\"id\":\"add-computed-value-rule\",\"request\":\"Calcular idade a partir da data de nascimento e limpar quando a data estiver vazia\",\"operationId\":\"rule.computedValue.add\",\"params\":{\"id\":\"birth-date-computes-age\",\"name\":\"Calcular idade\",\"type\":\"computedValue\",\"targetType\":\"field\",\"targets\":[\"age\"],\"condition\":{\"!\":[{\"isBlank\":[{\"var\":\"birthDate\"}]}]},\"value\":{\"expression\":{\"yearsSince\":[{\"var\":\"birthDate\"}]}},\"valueWhenFalse\":{},\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"}},\"isPositive\":true},{\"id\":\"add-visual-block-guidance-rule\",\"request\":\"Materializar no aviso visual a decisao governada que exige aprovacao de compliance para fornecedor com risco critico\",\"operationId\":\"rule.visualBlockGuidance.add\",\"params\":{\"id\":\"supplier-risk-guidance\",\"name\":\"Supplier risk guidance\",\"type\":\"visualBlockGuidance\",\"targetType\":\"visualBlock\",\"targets\":[\"supplier-risk-notice\"],\"condition\":{\"===\":[{\"var\":\"riscoFornecedor\"},\"critico\"]},\"properties\":{\"message\":\"Fornecedor critico exige aprovacao de compliance antes de emitir o pedido.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--critical\"},\"propertiesWhenFalse\":{\"message\":\"Fornecedor sem bloqueios criticos para este pedido.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--neutral\"},\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"}},\"isPositive\":true},{\"id\":\"reject-unknown-field\",\"request\":\"Alterar o label do campo \\\"campoInexistente\\\"\",\"operationId\":\"field.label.set\",\"target\":\"campoInexistente\",\"params\":{\"label\":\"Novo Label\"},\"isPositive\":false},{\"id\":\"require-confirmation-remove-field\",\"request\":\"Remover o campo auxiliar \\\"notasInternas\\\"\",\"operationId\":\"field.local.remove\",\"target\":\"notasInternas\",\"isPositive\":true},{\"id\":\"require-confirmation-remove-section\",\"request\":\"Remover a seção \\\"Dados Adicionais\\\"\",\"operationId\":\"layout.section.remove\",\"target\":\"secao-dados-adicionais\",\"isPositive\":true},{\"id\":\"round-trip-no-drift\",\"request\":\"Salvar e reabrir o formulário editado sem drift de configuração\",\"operationId\":\"field.label.set\",\"target\":\"nome\",\"params\":{\"label\":\"Nome Completo\"},\"isPositive\":true}]}",
9714
9942
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-dynamic-form-authoring-manifest.ts",
@@ -9718,7 +9946,7 @@
9718
9946
  "corpusVersion": "1.0.0"
9719
9947
  },
9720
9948
  {
9721
- "chunkIndex": 52,
9949
+ "chunkIndex": 53,
9722
9950
  "chunkKind": "context_pack",
9723
9951
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"fieldMetadata[].controlType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"input\",\"label\":\"Input\"},{\"value\":\"textarea\",\"label\":\"Textarea\"},{\"value\":\"email\",\"label\":\"Email\"},{\"value\":\"password\",\"label\":\"Password\"},{\"value\":\"search\",\"label\":\"Search\"},{\"value\":\"url\",\"label\":\"URL\"},{\"value\":\"phone\",\"label\":\"Phone\"},{\"value\":\"cpfCnpjInput\",\"label\":\"CPF/CNPJ\"},{\"value\":\"numericTextBox\",\"label\":\"Number\"},{\"value\":\"currency\",\"label\":\"Currency\"},{\"value\":\"priceRange\",\"label\":\"Price range\"},{\"value\":\"date\",\"label\":\"Date picker\"},{\"value\":\"dateRange\",\"label\":\"Date range\"},{\"value\":\"dateInput\",\"label\":\"Date input\"},{\"value\":\"dateTime\",\"label\":\"Datetime\"},{\"value\":\"dateTimeRange\",\"label\":\"Datetime range\"},{\"value\":\"dateTimeLocal\",\"label\":\"Datetime local\"},{\"value\":\"time\",\"label\":\"Time input\"},{\"value\":\"timePicker\",\"label\":\"Time picker\"},{\"value\":\"timeRange\",\"label\":\"Time range\"},{\"value\":\"week\",\"label\":\"Week input\"},{\"value\":\"month\",\"label\":\"Month input\"},{\"value\":\"year\",\"label\":\"Year input\"},{\"value\":\"select\",\"label\":\"Select\"},{\"value\":\"multiSelect\",\"label\":\"Multi select\"},{\"value\":\"multiSelectTree\",\"label\":\"Multi select tree\"},{\"value\":\"treeSelect\",\"label\":\"Tree select\"},{\"value\":\"transferList\",\"label\":\"Transfer list\"},{\"value\":\"autoComplete\",\"label\":\"Autocomplete\"},{\"value\":\"searchable-select\",\"label\":\"Searchable select\"},{\"value\":\"async-select\",\"label\":\"Async select\"},{\"value\":\"radio\",\"label\":\"Radio group\"},{\"value\":\"checkbox\",\"label\":\"Checkbox group\"},{\"value\":\"selectionList\",\"label\":\"Selection list\"},{\"value\":\"toggle\",\"label\":\"Toggle\"},{\"value\":\"buttonToggle\",\"label\":\"Button toggle\"},{\"value\":\"slider\",\"label\":\"Slider\"},{\"value\":\"rangeSlider\",\"label\":\"Range slider\"},{\"value\":\"rating\",\"label\":\"Rating\"},{\"value\":\"chipInput\",\"label\":\"Chips\"},{\"value\":\"chipList\",\"label\":\"Chip list\"},{\"value\":\"upload\",\"label\":\"File upload\"},{\"value\":\"color\",\"label\":\"Color input\"},{\"value\":\"colorPicker\",\"label\":\"Color picker\"},{\"value\":\"cronBuilder\",\"label\":\"Cron builder\"}]},\"fieldMetadata[].source\":{\"mode\":\"enum\",\"options\":[{\"value\":\"schema\",\"label\":\"Schema field\"},{\"value\":\"local\",\"label\":\"Local field\"}]},\"fieldMetadata[].submitPolicy\":{\"mode\":\"enum\",\"options\":[{\"value\":\"omit\",\"label\":\"Omit from submit payload\"},{\"value\":\"include\",\"label\":\"Include in submit payload\"},{\"value\":\"includeWhenDirty\",\"label\":\"Include only when dirty\"}]},\"fieldMetadata[].materialDesign.appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"fill\",\"label\":\"Fill\"},{\"value\":\"outline\",\"label\":\"Outline\"}]},\"fieldMetadata[].materialDesign.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"fieldMetadata[].materialDesign.floatLabel\":{\"mode\":\"enum\",\"options\":[{\"value\":\"auto\",\"label\":\"Auto\"},{\"value\":\"always\",\"label\":\"Always\"}]},\"fieldMetadata[].materialDesign.density\":{\"mode\":\"enum\",\"options\":[{\"value\":\"comfortable\",\"label\":\"Comfortable\"},{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"dense\",\"label\":\"Dense\"}]},\"actions.position\":{\"mode\":\"enum\",\"options\":[{\"value\":\"left\",\"label\":\"Left\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"right\",\"label\":\"Right\"},{\"value\":\"justified\",\"label\":\"Justified\"},{\"value\":\"split\",\"label\":\"Split\"}]},\"actions.orientation\":{\"mode\":\"enum\",\"options\":[{\"value\":\"horizontal\",\"label\":\"Horizontal\"},{\"value\":\"vertical\",\"label\":\"Vertical\"}]},\"actions.spacing\":{\"mode\":\"enum\",\"options\":[{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"normal\",\"label\":\"Normal\"},{\"value\":\"spacious\",\"label\":\"Spacious\"}]},\"actions.placement\":{\"mode\":\"enum\",\"options\":[{\"value\":\"insideLastSection\",\"label\":\"Inside last section\"},{\"value\":\"afterSections\",\"label\":\"After sections\"},{\"value\":\"top\",\"label\":\"Top\"}]},\"actions.submit.type\":{\"mode\":\"enum\",\"options\":[{\"value\":\"button\",\"label\":\"Button\"},{\"value\":\"submit\",\"label\":\"Submit\"},{\"value\":\"reset\",\"label\":\"Reset\"}]},\"actions.submit.variant\":{\"mode\":\"enum\",\"options\":[{\"value\":\"raised\",\"label\":\"Raised\"},{\"value\":\"stroked\",\"label\":\"Stroked\"},{\"value\":\"flat\",\"label\":\"Flat\"},{\"value\":\"fab\",\"label\":\"Fab\"}]},\"actions.submit.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"small\",\"label\":\"Small\"},{\"value\":\"medium\",\"label\":\"Medium\"},{\"value\":\"large\",\"label\":\"Large\"}]},\"actions.submit.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"},{\"value\":\"basic\",\"label\":\"Basic\"}]},\"sections[].headerAlign\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"}]},\"sections[].appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"card\",\"label\":\"Card\"},{\"value\":\"plain\",\"label\":\"Plain\"},{\"value\":\"step\",\"label\":\"Step\"}]},\"sections[].sectionHeader.mode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"icon\",\"label\":\"Icon\"},{\"value\":\"avatar-image\",\"label\":\"Avatar image\"},{\"value\":\"avatar-initials\",\"label\":\"Avatar initials\"},{\"value\":\"auto\",\"label\":\"Auto\"}]},\"sections[].sectionHeader.emptyState\":{\"mode\":\"enum\",\"options\":[{\"value\":\"placeholder-avatar\",\"label\":\"Neutral placeholder\"},{\"value\":\"fallback-icon\",\"label\":\"Fallback icon\"},{\"value\":\"none\",\"label\":\"None\"}]},\"sections[].sectionHeader.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"sm\",\"label\":\"Small\"},{\"value\":\"md\",\"label\":\"Medium\"},{\"value\":\"lg\",\"label\":\"Large\"}]},\"sections[].stepLabel\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"Dados básicos\",\"label\":\"Dados básicos\"},{\"value\":\"Detalhes\",\"label\":\"Detalhes\"},{\"value\":\"Confirmação\",\"label\":\"Confirmação\"}]},\"sections[].titleStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"titleLarge\",\"label\":\"Title large\"},{\"value\":\"titleMedium\",\"label\":\"Title medium\"},{\"value\":\"titleSmall\",\"label\":\"Title small\"},{\"value\":\"headlineSmall\",\"label\":\"Headline small\"}]},\"sections[].descriptionStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"bodyLarge\",\"label\":\"Body large\"},{\"value\":\"bodyMedium\",\"label\":\"Body medium\"},{\"value\":\"bodySmall\",\"label\":\"Body small\"}]},\"sections[].rows[].columns[].align\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"end\",\"label\":\"End\"},{\"value\":\"stretch\",\"label\":\"Stretch\"}]},\"sections[].rows[].columns[].items[].kind\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"richContent\",\"label\":\"Rich content\"}]},\"sections[].rows[].columns[].items[].layout\":{\"mode\":\"enum\",\"options\":[{\"value\":\"block\",\"label\":\"Block\"},{\"value\":\"inline\",\"label\":\"Inline\"}]},\"formRules[].targetType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"section\",\"label\":\"Section\"},{\"value\":\"row\",\"label\":\"Row\"},{\"value\":\"column\",\"label\":\"Column\"},{\"value\":\"action\",\"label\":\"Action\"},{\"value\":\"visualBlock\",\"label\":\"Visual block\"}]},\"formRules[].context\":{\"mode\":\"enum\",\"options\":[{\"value\":\"visibility\",\"label\":\"Visibility\"},{\"value\":\"readOnly\",\"label\":\"Read only\"},{\"value\":\"style\",\"label\":\"Style\"},{\"value\":\"validation\",\"label\":\"Validation\"},{\"value\":\"notification\",\"label\":\"Notification\"}]}}}}",
9724
9952
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -9728,7 +9956,7 @@
9728
9956
  "corpusVersion": "1.0.0"
9729
9957
  },
9730
9958
  {
9731
- "chunkIndex": 53,
9959
+ "chunkIndex": 54,
9732
9960
  "chunkKind": "context_pack",
9733
9961
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"field.visibility.hide\",\"intentExamples\":[\"hide field\",\"ocultar campo\",\"esconder campo\",\"invisible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":true}]}},{\"id\":\"field.visibility.show\",\"intentExamples\":[\"show field\",\"mostrar campo\",\"exibir campo\",\"visible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":false}]}},{\"id\":\"field.label.set\",\"intentExamples\":[\"label\",\"rename field\",\"renomear campo\",\"titulo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"label\":\"{{value}}\"}]}},{\"id\":\"field.placeholder.set\",\"intentExamples\":[\"placeholder\",\"hint text\",\"texto de ajuda\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"placeholder\":\"{{value}}\"}]}},{\"id\":\"field.required.enable\",\"intentExamples\":[\"required\",\"obrigatorio\",\"mandatory\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":true}]}},{\"id\":\"field.required.disable\",\"intentExamples\":[\"optional\",\"nao obrigatorio\",\"opcional\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":false}]}},{\"id\":\"field.readonly.enable\",\"intentExamples\":[\"readonly\",\"somente leitura\",\"read only\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":true}]}},{\"id\":\"field.readonly.disable\",\"intentExamples\":[\"editable\",\"editavel\",\"read write\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":false}]}},{\"id\":\"field.disabled.enable\",\"intentExamples\":[\"disable field\",\"desabilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":true}]}},{\"id\":\"field.disabled.disable\",\"intentExamples\":[\"enable field\",\"habilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":false}]}},{\"id\":\"field.controlType.set\",\"intentExamples\":[\"control type\",\"tipo de campo\",\"controlType\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"controlType\":\"{{value}}\"}]}},{\"id\":\"field.icon.prefix.set\",\"intentExamples\":[\"prefix icon\",\"icone prefixo\",\"icon before\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"prefixIcon\":\"{{value}}\"}]}},{\"id\":\"field.icon.suffix.set\",\"intentExamples\":[\"suffix icon\",\"icone sufixo\",\"icon after\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"suffixIcon\":\"{{value}}\"}]}},{\"id\":\"section.title.set\",\"intentExamples\":[\"section title\",\"titulo da secao\",\"section name\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"title\":\"{{value}}\"}]}},{\"id\":\"section.description.set\",\"intentExamples\":[\"section description\",\"descricao da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"description\":\"{{value}}\"}]}},{\"id\":\"section.add\",\"intentExamples\":[\"add section\",\"adicionar secao\",\"nova secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{value}}\",\"title\":\"{{value}}\",\"rows\":[]}]},\"safetyNotes\":\"Certifique-se de que o ID da seção é único e relevante.\"},{\"id\":\"section.remove\",\"intentExamples\":[\"remove section\",\"remover secao\",\"excluir secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"section.order.set\",\"intentExamples\":[\"order section\",\"reordenar secao\",\"mover secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_order\":\"{{value}}\"}]},\"safetyNotes\":\"A reordenação de seções é uma operação que deve ser revisada.\"},{\"id\":\"row.add\",\"intentExamples\":[\"add row\",\"adicionar linha\",\"nova linha na secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"columns\":[]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da linha é único e relevante na seção.\"},{\"id\":\"row.remove\",\"intentExamples\":[\"remove row\",\"remover linha\",\"excluir linha da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]},\"safetyNotes\":\"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.add\",\"intentExamples\":[\"add column\",\"adicionar coluna\",\"nova coluna na linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"items\":[]}]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da coluna é único e relevante na linha.\"},{\"id\":\"column.remove\",\"intentExamples\":[\"remove column\",\"remover coluna\",\"excluir coluna da linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]}]},\"safetyNotes\":\"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.field.add\",\"intentExamples\":[\"add field to column\",\"adicionar campo a coluna\",\"colocar campo na coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"id\":\"field-{{value}}\",\"fieldName\":\"{{value}}\"}]}]}]}]},\"safetyNotes\":\"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"},{\"id\":\"column.field.remove\",\"intentExamples\":[\"remove field from column\",\"remover campo da coluna\",\"tirar campo da coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"fieldName\":\"{{value}}\",\"_remove\":true}]}]}]}]},\"safetyNotes\":\"Remover um campo de uma coluna pode alterar o layout do formulário.\"},{\"id\":\"actions.submit.label.set\",\"intentExamples\":[\"submit label\",\"rotulo salvar\",\"texto botao enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.submit.visible.set\",\"intentExamples\":[\"show submit\",\"esconder salvar\",\"visibilidade enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.label.set\",\"intentExamples\":[\"cancel label\",\"rotulo cancelar\",\"texto botao cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.visible.set\",\"intentExamples\":[\"show cancel\",\"esconder cancelar\",\"visibilidade cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.reset.label.set\",\"intentExamples\":[\"reset label\",\"rotulo resetar\",\"texto botao limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.reset.visible.set\",\"intentExamples\":[\"show reset\",\"esconder reset\",\"visibilidade limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"rule.add.visibility\",\"intentExamples\":[\"add visibility rule\",\"regra de visibilidade\",\"campo condicional\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{value.id}}\",\"name\":\"{{value.name}}\",\"targetType\":\"field\",\"targets\":[\"{{target}}\"],\"effect\":{\"condition\":\"{{value.condition}}\",\"properties\":{\"hidden\":false},\"propertiesWhenFalse\":{\"hidden\":true}}}]},\"safetyNotes\":\"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"},{\"id\":\"rule.remove\",\"intentExamples\":[\"remove rule\",\"excluir regra\",\"apagar regra\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"}]}}",
9734
9962
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -9738,7 +9966,7 @@
9738
9966
  "corpusVersion": "1.0.0"
9739
9967
  },
9740
9968
  {
9741
- "chunkIndex": 54,
9969
+ "chunkIndex": 55,
9742
9970
  "chunkKind": "context_pack",
9743
9971
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"rule.add.dependency\",\"intentExamples\":[\"adicionar dependencia\",\"campo depende de\",\"mostrar se\",\"obrigatorio se\",\"desabilitar se\",\"campo condicional\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"triggerField\",\"type\":\"STRING\",\"description\":\"Campo que controla a regra (ex: tipoPessoa)\"},{\"name\":\"conditionValue\",\"type\":\"STRING\",\"description\":\"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado pela regra (ex: cnpj)\"},{\"name\":\"effectType\",\"type\":\"ENUM\",\"options\":[\"visibility\",\"required\",\"disabled\"],\"description\":\"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"rule_{{params.triggerField}}_{{params.targetField}}\",\"name\":\"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"{{params.triggerField}}\"},\"{{params.conditionValue}}\"]},\"properties\":{\"hidden\":\"{{params.effectType === 'visibility' ? false : undefined}}\",\"required\":\"{{params.effectType === 'required' ? true : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? true : undefined}}\"},\"propertiesWhenFalse\":{\"hidden\":\"{{params.effectType === 'visibility' ? true : undefined}}\",\"required\":\"{{params.effectType === 'required' ? false : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? false : undefined}}\"}}}]},\"safetyNotes\":\"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"},{\"id\":\"rule.add.custom\",\"intentExamples\":[\"adicionar regra customizada\",\"regra complexa\",\"logica de formulario\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"id\",\"type\":\"STRING\",\"description\":\"ID único da regra\"},{\"name\":\"condition\",\"type\":\"STRING\",\"description\":\"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado\"},{\"name\":\"propertyName\",\"type\":\"STRING\",\"description\":\"Propriedade afetada (hidden, required, disabled, readOnly)\"},{\"name\":\"valueIfTrue\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for verdadeira\"},{\"name\":\"valueIfFalse\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for falsa\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{params.id}}\",\"name\":\"Regra Customizada: {{params.id}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":\"{{params.condition}}\",\"properties\":{\"{{params.propertyName}}\":\"{{params.valueIfTrue}}\"},\"propertiesWhenFalse\":{\"{{params.propertyName}}\":\"{{params.valueIfFalse}}\"}}}]}}]}}",
9744
9972
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -9748,7 +9976,7 @@
9748
9976
  "corpusVersion": "1.0.0"
9749
9977
  },
9750
9978
  {
9751
- "chunkIndex": 55,
9979
+ "chunkIndex": 56,
9752
9980
  "chunkKind": "context_pack",
9753
9981
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"fieldResolvers\":{\"fieldMetadata[]\":[\"name\",\"label\"],\"sections[]\":[\"id\",\"title\"],\"sections[].rows[].columns[].items[]\":[\"id\",\"fieldName\"],\"sections[].rows[].columns[].fields[]\":[]},\"hints\":[\"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\"Local fields are real form controls. Create them in fieldMetadata[] with source:\\\"local\\\", usually transient:true and submitPolicy:\\\"omit\\\", then place them as kind:\\\"field\\\" layout items.\",\"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\"Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\\\"field\\\" items reference fieldMetadata; kind:\\\"richContent\\\" items are visual blocks outside submit payload.\",\"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\"For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \\\"birthDate\\\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.\",\"For conditional side effects, use formCommandRules with effects[].kind:\\\"global-action\\\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.\",\"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"]}}",
9754
9982
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-context-pack.ts",
@@ -9758,7 +9986,7 @@
9758
9986
  "corpusVersion": "1.0.0"
9759
9987
  },
9760
9988
  {
9761
- "chunkIndex": 56,
9989
+ "chunkIndex": 57,
9762
9990
  "chunkKind": "recipe",
9763
9991
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_comment\",\"_comment\":\"Official Praxis Dynamic Form recipe for governed conditional command rules.\"}",
9764
9992
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9768,7 +9996,7 @@
9768
9996
  "corpusVersion": "1.0.0"
9769
9997
  },
9770
9998
  {
9771
- "chunkIndex": 57,
9999
+ "chunkIndex": 58,
9772
10000
  "chunkKind": "recipe",
9773
10001
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_comment2\",\"_comment2\":\"Use when a form must execute host-mediated alerts or confirmations from declarative rules after computed values stabilize.\"}",
9774
10002
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9778,7 +10006,7 @@
9778
10006
  "corpusVersion": "1.0.0"
9779
10007
  },
9780
10008
  {
9781
- "chunkIndex": 58,
10009
+ "chunkIndex": 59,
9782
10010
  "chunkKind": "recipe",
9783
10011
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"templateMeta\",\"templateMeta\":{\"variantId\":\"command-rules\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"status\":\"public-example\",\"tags\":[\"formCommandRules\",\"global-action\",\"computed-values\",\"business-rules\",\"llm-authoring\"],\"useWhen\":\"Create a metadata-driven form with computed values, conditional required fields and governed alert or confirmation dialogs without TypeScript host logic.\",\"examplePrompts\":[\"create a dynamic form rule that calculates age from birth date and alerts when a female applicant is under 18\",\"ask for confirmation when a vacation range starts on Friday\",\"show conditional command rules using dialog.alert and dialog.confirm\"]}}",
9784
10012
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9788,7 +10016,7 @@
9788
10016
  "corpusVersion": "1.0.0"
9789
10017
  },
9790
10018
  {
9791
- "chunkIndex": 59,
10019
+ "chunkIndex": 60,
9792
10020
  "chunkKind": "recipe",
9793
10021
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"platformValue\",\"platformValue\":{\"canonicalRuntime\":\"@praxisui/dynamic-form evaluates formRules first, stabilizes computed values, then evaluates formCommandRules.\",\"commandContract\":\"formCommandRules uses PraxisRuntimeConditionalEffectRule<PraxisRuntimeGlobalActionEffect> with effects[].kind = global-action and a structured GlobalActionRef.\",\"propertyBoundary\":\"Use formRules for local field/property/value changes. Use formCommandRules for side effects such as alert, confirm, navigation or host-mediated commands.\",\"policyBoundary\":\"Use policy for trigger, distinct, distinctBy and runOnInitialEvaluation. Do not encode operational throttling inside Json Logic condition.\",\"authoringBoundary\":\"The visual config editor exposes command rules and structured payload fields for the primary effect. JSON remains an advanced escape hatch, not the primary authoring path. payloadExpr is preserved from advanced JSON when no structured payload is authored, but it is not a visual field in this cut. Secondary effects remain advanced JSON-authored and are preserved when the primary effect is edited visually.\"}}",
9794
10022
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9798,7 +10026,7 @@
9798
10026
  "corpusVersion": "1.0.0"
9799
10027
  },
9800
10028
  {
9801
- "chunkIndex": 60,
10029
+ "chunkIndex": 61,
9802
10030
  "chunkKind": "recipe",
9803
10031
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"authoringGuidance\",\"authoringGuidance\":[\"Keep condition as canonical Json Logic, not a string DSL.\",\"Use effect.properties.value with { \\\"expression\\\": ... } for computed values and { \\\"literal\\\": ... } for structured literal values.\",\"Do not put dialog.alert, dialog.confirm, showAlert, navigate or modal commands inside formRules[].effect.properties.\",\"Use formCommandRules[].effects[].globalAction.actionId for the host-mediated command.\",\"Use structured payload fields for the primary effect in the visual editor. Keep payloadExpr and secondary effects in advanced JSON for this cut.\",\"Use trigger on-condition-enter for side effects by default.\",\"Set runOnInitialEvaluation to false unless a command must intentionally run during initial hydration.\",\"Set distinct and distinctBy for value-change commands that should not repeat while the same condition/value remains active.\",\"For date-range commands, use the committed date range value, such as vacationPeriod.startDate, not transient picker preview state.\"]}",
9804
10032
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9808,7 +10036,7 @@
9808
10036
  "corpusVersion": "1.0.0"
9809
10037
  },
9810
10038
  {
9811
- "chunkIndex": 61,
10039
+ "chunkIndex": 62,
9812
10040
  "chunkKind": "recipe",
9813
10041
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"teaches\",\"teaches\":[\"dynamic-form.formRules.computed-value\",\"dynamic-form.formCommandRules\",\"dynamic-form.formCommandRules.global-action\",\"dynamic-form.formCommandRules.policy\",\"global-action.dialog.alert\",\"global-action.dialog.confirm\",\"date-range.committed-value\"]}",
9814
10042
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9818,7 +10046,7 @@
9818
10046
  "corpusVersion": "1.0.0"
9819
10047
  },
9820
10048
  {
9821
- "chunkIndex": 62,
10049
+ "chunkIndex": 63,
9822
10050
  "chunkKind": "recipe",
9823
10051
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"testScenarios\",\"testScenarios\":[{\"id\":\"birthDate-age-alert-chain\",\"source\":\"business-rules-form-demo\",\"input\":{\"gender\":\"female\",\"birthDate\":\"2012-05-05\"},\"expects\":[\"formRules computes age before formCommandRules evaluate\",\"registration:female-underage-alert resolves dialog.alert from stabilized age\",\"guardianName remains a local property rule, not a command side effect\"]},{\"id\":\"distinct-age-alert\",\"source\":\"business-rules-form-demo\",\"input\":{\"gender\":\"female\",\"birthDate\":\"2012-05-05\"},\"expects\":[\"dialog.alert runs on condition enter\",\"the same age does not reopen the modal while the condition remains true\",\"distinct memory resets after the condition evaluates false\"]},{\"id\":\"friday-range-confirm\",\"source\":\"business-rules-form-demo\",\"input\":{\"vacationPeriod\":{\"startDate\":\"2026-05-01\",\"endDate\":\"2026-05-08\"}},\"expects\":[\"dialog.confirm evaluates only after startDate and endDate are committed\",\"distinctBy uses vacationPeriod.startDate\",\"picker preview state is not used as command input\"]},{\"id\":\"editor-preview-is-not-execution\",\"source\":\"config-editor\",\"input\":{\"mode\":\"preview\",\"actionId\":\"dialog.alert\"},\"expects\":[\"visual preview reports the command intent\",\"preview does not call GlobalActionService.executeRef\",\"apply/save must still validate actionId and required payload\"]}]}",
9824
10052
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9828,7 +10056,7 @@
9828
10056
  "corpusVersion": "1.0.0"
9829
10057
  },
9830
10058
  {
9831
- "chunkIndex": 63,
10059
+ "chunkIndex": 64,
9832
10060
  "chunkKind": "recipe",
9833
10061
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"config\",\"config\":{\"fieldMetadata\":[{\"name\":\"name\",\"label\":\"Name\",\"controlType\":\"input\",\"required\":true},{\"name\":\"gender\",\"label\":\"Gender\",\"controlType\":\"select\",\"required\":true,\"options\":[{\"label\":\"Female\",\"value\":\"female\"},{\"label\":\"Male\",\"value\":\"male\"},{\"label\":\"Other\",\"value\":\"other\"}]},{\"name\":\"birthDate\",\"label\":\"Birth date\",\"controlType\":\"datePicker\",\"manualInput\":false,\"hint\":\"Select from the calendar to avoid ambiguous date formats.\"},{\"name\":\"age\",\"label\":\"Age\",\"controlType\":\"numericTextBox\",\"required\":true,\"readOnly\":true,\"min\":0,\"max\":120},{\"name\":\"guardianName\",\"label\":\"Legal guardian\",\"controlType\":\"input\",\"placeholder\":\"Required for underage applicants\"},{\"name\":\"vacationPeriod\",\"label\":\"Vacation period\",\"controlType\":\"dateRange\",\"required\":true,\"minDate\":\"2026-01-01\",\"maxDate\":\"2026-12-31\"},{\"name\":\"reason\",\"label\":\"Notes\",\"controlType\":\"textarea\",\"rows\":3}],\"sections\":[{\"id\":\"registration\",\"title\":\"Registration\",\"appearance\":\"plain\",\"rows\":[{\"id\":\"registration-row\",\"columns\":[{\"id\":\"registration-left\",\"span\":{\"xs\":12,\"md\":6},\"fields\":[\"name\",\"gender\",\"birthDate\"]},{\"id\":\"registration-right\",\"span\":{\"xs\":12,\"md\":6},\"fields\":[\"age\",\"guardianName\"]}]}]},{\"id\":\"vacation\",\"title\":\"Vacation\",\"appearance\":\"plain\",\"rows\":[{\"id\":\"vacation-row\",\"columns\":[{\"id\":\"vacation-column\",\"span\":{\"xs\":12},\"fields\":[\"vacationPeriod\",\"reason\"]}]}]}],\"formRules\":[{\"id\":\"birth-date-computes-age\",\"name\":\"Birth date computes age\",\"targetType\":\"field\",\"targets\":[\"age\"],\"effect\":{\"condition\":{\"!\":[{\"isBlank\":[{\"var\":\"birthDate\"}]}]},\"properties\":{\"value\":{\"expression\":{\"yearsSince\":[{\"var\":\"birthDate\"}]}},\"hint\":\"Calculated from birth date.\"},\"propertiesWhenFalse\":{\"value\":{\"literal\":null},\"hint\":\"\"}}},{\"id\":\"female-underage-requires-guardian\",\"name\":\"Female underage applicant requires guardian\",\"targetType\":\"field\",\"targets\":[\"guardianName\"],\"effect\":{\"condition\":{\"and\":[{\"===\":[{\"var\":\"gender\"},\"female\"]},{\"<\":[{\"var\":\"age\"},18]}]},\"properties\":{\"required\":true,\"color\":\"warn\",\"hint\":\"Required for female applicants under 18.\"},\"propertiesWhenFalse\":{\"required\":false,\"color\":\"primary\",\"hint\":\"\"}}}],\"formCommandRules\":[{\"id\":\"registration:female-underage-alert\",\"description\":\"Alert when a female applicant is under 18 after age is computed.\",\"condition\":{\"and\":[{\"===\":[{\"var\":\"gender\"},\"female\"]},{\"!\":[{\"isBlank\":[{\"var\":\"age\"}]}]},{\"<\":[{\"var\":\"age\"},18]}]},\"effects\":[{\"id\":\"minimum-age-alert\",\"kind\":\"global-action\",\"globalAction\":{\"actionId\":\"dialog.alert\",\"payload\":{\"title\":\"Minimum age\",\"message\":\"For female registration, the expected minimum age is 18.\",\"okLabel\":\"Understood\",\"variant\":\"warning\"}}}],\"policy\":{\"trigger\":\"on-condition-enter\",\"distinct\":true,\"distinctBy\":\"age\",\"runOnInitialEvaluation\":false}},{\"id\":\"vacation:friday-start-confirm\",\"description\":\"Confirm when the committed vacation range starts on Friday.\",\"condition\":{\"and\":[{\"!\":[{\"isBlank\":[{\"var\":\"vacationPeriod.startDate\"}]}]},{\"!\":[{\"isBlank\":[{\"var\":\"vacationPeriod.endDate\"}]}]},{\"weekdayIn\":[{\"var\":\"vacationPeriod.startDate\"},[5]]}]},\"effects\":[{\"id\":\"friday-start-confirm\",\"kind\":\"global-action\",\"globalAction\":{\"actionId\":\"dialog.confirm\",\"payload\":{\"title\":\"Friday start\",\"message\":\"The vacation start date falls on a Friday. Do you want to keep this choice?\",\"confirmLabel\":\"Keep\",\"cancelLabel\":\"Review\",\"variant\":\"question\"}}}],\"policy\":{\"trigger\":\"on-condition-enter\",\"distinct\":true,\"distinctBy\":\"vacationPeriod.startDate\",\"runOnInitialEvaluation\":false}}],\"actions\":{\"submit\":{\"visible\":true,\"label\":\"Submit\",\"icon\":\"send\",\"color\":\"primary\",\"variant\":\"raised\"},\"cancel\":{\"visible\":false},\"reset\":{\"visible\":false}}}}",
9834
10062
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9838,7 +10066,7 @@
9838
10066
  "corpusVersion": "1.0.0"
9839
10067
  },
9840
10068
  {
9841
- "chunkIndex": 64,
10069
+ "chunkIndex": 65,
9842
10070
  "chunkKind": "recipe",
9843
10071
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"diagnosticExpectations\",\"diagnosticExpectations\":{\"computedBeforeCommands\":true,\"commandEffectsAreGlobalActions\":true,\"commandsAreNotFormRuleProperties\":true,\"runOnInitialEvaluationDefault\":false,\"committedDateRangeOnly\":true,\"previewDoesNotExecuteGlobalAction\":true,\"payloadExprAdvancedJsonOnly\":true,\"scenarioSource\":\"business-rules-form-demo\"}}",
9844
10072
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.command-rules.json",
@@ -9848,7 +10076,7 @@
9848
10076
  "corpusVersion": "1.0.0"
9849
10077
  },
9850
10078
  {
9851
- "chunkIndex": 65,
10079
+ "chunkIndex": 66,
9852
10080
  "chunkKind": "recipe",
9853
10081
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_comment\",\"_comment\":\"Official recipe for the procurement Entity Lookup cascade published by praxis-api-quickstart.\"}",
9854
10082
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9858,7 +10086,7 @@
9858
10086
  "corpusVersion": "1.0.0"
9859
10087
  },
9860
10088
  {
9861
- "chunkIndex": 66,
10089
+ "chunkIndex": 67,
9862
10090
  "chunkKind": "recipe",
9863
10091
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_comment2\",\"_comment2\":\"Use this when agents need a metadata-driven form that selects governed business entities instead of simple option lists.\"}",
9864
10092
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9868,7 +10096,7 @@
9868
10096
  "corpusVersion": "1.0.0"
9869
10097
  },
9870
10098
  {
9871
- "chunkIndex": 67,
10099
+ "chunkIndex": 68,
9872
10100
  "chunkKind": "recipe",
9873
10101
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"templateMeta\",\"templateMeta\":{\"variantId\":\"entity-lookup-procurement\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"status\":\"public-example\",\"tags\":[\"entity-lookup\",\"resource-entity\",\"option-source\",\"cascading\",\"rehydration\",\"procurement\",\"quickstart\"],\"useWhen\":\"Create a purchase order form with real company, supplier, contract and product entity selections.\",\"examplePrompts\":[\"create a purchase order form with company supplier contract and product lookups\",\"generate a form with dependent entityLookup fields backed by optionSource metadata\",\"add a governed lookup cascade with status policy and by-ids rehydration\"]}}",
9874
10102
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9878,7 +10106,7 @@
9878
10106
  "corpusVersion": "1.0.0"
9879
10107
  },
9880
10108
  {
9881
- "chunkIndex": 68,
10109
+ "chunkIndex": 69,
9882
10110
  "chunkKind": "recipe",
9883
10111
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"platformValue\",\"platformValue\":{\"canonicalOwner\":\"praxis-metadata-starter publishes x-ui.optionSource with RESOURCE_ENTITY semantics.\",\"referenceHost\":\"praxis-api-quickstart exposes the procurement resource and its option-source endpoints.\",\"sharedTypes\":\"@praxisui/core owns OptionSourceMetadata and FieldControlType.ENTITY_LOOKUP.\",\"runtime\":\"@praxisui/dynamic-fields renders entityLookup and inlineEntityLookup.\",\"formIntegration\":\"@praxisui/dynamic-form keeps the submitted payload canonical while the UI rehydrates labels, status and disabled reasons.\",\"authoring\":\"@praxisui/metadata-editor exposes the optionSource.* fields used below.\"}}",
9884
10112
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9888,7 +10116,7 @@
9888
10116
  "corpusVersion": "1.0.0"
9889
10117
  },
9890
10118
  {
9891
- "chunkIndex": 69,
10119
+ "chunkIndex": 70,
9892
10120
  "chunkKind": "recipe",
9893
10121
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"backendSurfaces\",\"backendSurfaces\":[\"GET /schemas/filtered?path=/api/procurement/purchase-orders&operation=post&schemaType=request\",\"POST /api/procurement/purchase-orders/filter\",\"GET /api/procurement/purchase-orders/capabilities\",\"POST /api/procurement/companies/option-sources/company/options/filter\",\"POST /api/procurement/suppliers/option-sources/supplier/options/filter\",\"POST /api/procurement/contracts/option-sources/contract/options/filter\",\"POST /api/procurement/products/option-sources/product/options/filter\"]}",
9894
10122
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9898,7 +10126,7 @@
9898
10126
  "corpusVersion": "1.0.0"
9899
10127
  },
9900
10128
  {
9901
- "chunkIndex": 70,
10129
+ "chunkIndex": 71,
9902
10130
  "chunkKind": "recipe",
9903
10131
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"contractNotes\",\"contractNotes\":[\"Persist only stable IDs: companyId, supplierId, contractId and productId.\",\"Use x-ui.optionSource.dependsOn for cascades and add dependencyFilterMap only when the UI field differs from the backend filter key.\",\"Use selectionPolicy.allowRetainInvalidExistingValue to display historical invalid values while blocking new selections.\",\"Use capabilities.byIds=true when edit mode must rehydrate IDs already saved in the resource.\",\"Use dependencyLoadOnChange=immediate and resetOnDependentChange when child lookups must refresh and clear stale values as soon as a parent changes.\",\"Use detail.hrefTemplate or routeTemplate only as navigation metadata; it must not change the submitted value.\"]}",
9904
10132
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9908,7 +10136,7 @@
9908
10136
  "corpusVersion": "1.0.0"
9909
10137
  },
9910
10138
  {
9911
- "chunkIndex": 71,
10139
+ "chunkIndex": 72,
9912
10140
  "chunkKind": "recipe",
9913
10141
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"renderingExpectations\",\"renderingExpectations\":{\"inline\":\"Default rendering uses an input-like trigger, search dropdown and rich rows with code, label, description, status and blocked reasons.\",\"selectedCard\":\"After selection, show the canonical entity identity with code, label, description, status badges and actions such as detail, change, copy code and clear.\",\"readonly\":\"Readonly mode rehydrates the saved ID and renders label, status and disabled reason without allowing changes.\",\"compact\":\"Compact mode is intended for table filters and dense forms: preserve label, code and status while reducing secondary text.\",\"dialog\":\"Dialog/value-help mode reuses the same optionSource contract and can add table search, column filters, preview panel and selection confirmation.\"}}",
9914
10142
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9918,7 +10146,7 @@
9918
10146
  "corpusVersion": "1.0.0"
9919
10147
  },
9920
10148
  {
9921
- "chunkIndex": 72,
10149
+ "chunkIndex": 73,
9922
10150
  "chunkKind": "recipe",
9923
10151
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"metadata\",\"metadata\":{\"version\":\"2.0\",\"resourcePath\":\"procurement/purchase-orders\",\"resourceKey\":\"procurement.purchase-orders\",\"operation\":\"create\"}}",
9924
10152
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9928,7 +10156,7 @@
9928
10156
  "corpusVersion": "1.0.0"
9929
10157
  },
9930
10158
  {
9931
- "chunkIndex": 73,
10159
+ "chunkIndex": 74,
9932
10160
  "chunkKind": "recipe",
9933
10161
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"fieldMetadata\",\"fieldMetadata\":[{\"name\":\"companyId\",\"label\":\"Empresa\",\"placeholder\":\"Buscar empresa...\",\"controlType\":\"entityLookup\",\"required\":true,\"endpoint\":\"/api/procurement/companies/option-sources/company/options/filter\",\"displayField\":\"label\",\"valueField\":\"id\",\"optionSource\":{\"key\":\"company\",\"type\":\"RESOURCE_ENTITY\",\"entityKey\":\"company\",\"resourcePath\":\"/api/procurement/companies\",\"filterField\":\"companyId\",\"propertyPath\":\"id\",\"valuePropertyPath\":\"id\",\"labelPropertyPath\":\"legalName\",\"codePropertyPath\":\"code\",\"descriptionPropertyPaths\":[\"documentNumber\",\"city\",\"state\"],\"statusPropertyPath\":\"status\",\"disabledReasonPropertyPath\":\"disabledReason\",\"searchPropertyPaths\":[\"code\",\"legalName\",\"documentNumber\"],\"searchMode\":\"contains\",\"pageSize\":25,\"includeIds\":true,\"selectionPolicy\":{\"statusPropertyPath\":\"status\",\"allowedStatuses\":[\"ACTIVE\"],\"blockedStatuses\":[\"INACTIVE\",\"BLOCKED\"],\"allowRetainInvalidExistingValue\":true},\"capabilities\":{\"filter\":true,\"byIds\":true,\"detail\":true,\"navigateToDetail\":true,\"auditSnapshot\":true},\"detail\":{\"hrefTemplate\":\"/api/procurement/companies/{id}\",\"routeTemplate\":\"/procurement/companies/{id}\",\"openDetailMode\":\"route\"}}},{\"name\":\"supplierId\",\"label\":\"Fornecedor\",\"placeholder\":\"Buscar fornecedor homologado...\",\"controlType\":\"entityLookup\",\"required\":true,\"endpoint\":\"/api/procurement/suppliers/option-sources/supplier/options/filter\",\"displayField\":\"label\",\"valueField\":\"id\",\"dependentField\":\"companyId\",\"dependencyLoadOnChange\":\"immediate\",\"resetOnDependentChange\":true,\"optionSource\":{\"key\":\"supplier\",\"type\":\"RESOURCE_ENTITY\",\"entityKey\":\"supplier\",\"resourcePath\":\"/api/procurement/suppliers\",\"filterField\":\"supplierId\",\"dependsOn\":[\"companyId\"],\"propertyPath\":\"id\",\"valuePropertyPath\":\"id\",\"labelPropertyPath\":\"legalName\",\"codePropertyPath\":\"code\",\"descriptionPropertyPaths\":[\"documentNumber\",\"homologationStatus\",\"riskLevel\"],\"statusPropertyPath\":\"status\",\"disabledReasonPropertyPath\":\"disabledReason\",\"searchPropertyPaths\":[\"code\",\"legalName\",\"documentNumber\"],\"searchMode\":\"contains\",\"pageSize\":25,\"includeIds\":true,\"selectionPolicy\":{\"statusPropertyPath\":\"status\",\"allowedStatuses\":[\"ACTIVE\",\"APPROVED\"],\"blockedStatuses\":[\"INACTIVE\",\"BLOCKED\"],\"allowRetainInvalidExistingValue\":true},\"capabilities\":{\"filter\":true,\"byIds\":true,\"detail\":true,\"navigateToDetail\":true,\"auditSnapshot\":true},\"detail\":{\"hrefTemplate\":\"/api/procurement/suppliers/{id}\",\"routeTemplate\":\"/procurement/suppliers/{id}\",\"openDetailMode\":\"route\"}}},{\"name\":\"contractId\",\"label\":\"Contrato\",\"placeholder\":\"Buscar contrato vigente...\",\"controlType\":\"entityLookup\",\"endpoint\":\"/api/procurement/contracts/option-sources/contract/options/filter\",\"displayField\":\"label\",\"valueField\":\"id\",\"dependentField\":\"supplierId\",\"dependencyLoadOnChange\":\"immediate\",\"resetOnDependentChange\":true,\"optionSource\":{\"key\":\"contract\",\"type\":\"RESOURCE_ENTITY\",\"entityKey\":\"contract\",\"resourcePath\":\"/api/procurement/contracts\",\"filterField\":\"contractId\",\"dependsOn\":[\"companyId\",\"supplierId\"],\"propertyPath\":\"id\",\"valuePropertyPath\":\"id\",\"labelPropertyPath\":\"number\",\"descriptionPropertyPaths\":[\"supplierName\",\"validUntil\",\"currency\"],\"statusPropertyPath\":\"status\",\"disabledReasonPropertyPath\":\"disabledReason\",\"searchPropertyPaths\":[\"number\",\"supplierName\",\"currency\"],\"searchMode\":\"contains\",\"pageSize\":25,\"includeIds\":true,\"selectionPolicy\":{\"statusPropertyPath\":\"status\",\"allowedStatuses\":[\"ACTIVE\",\"SIGNED\"],\"blockedStatuses\":[\"EXPIRED\",\"CANCELLED\"],\"allowRetainInvalidExistingValue\":true},\"capabilities\":{\"filter\":true,\"byIds\":true,\"detail\":true,\"navigateToDetail\":true,\"auditSnapshot\":true},\"detail\":{\"hrefTemplate\":\"/api/procurement/contracts/{id}\",\"routeTemplate\":\"/procurement/contracts/{id}\",\"openDetailMode\":\"route\"}}},{\"name\":\"productId\",\"label\":\"Produto\",\"placeholder\":\"Buscar produto disponivel...\",\"controlType\":\"entityLookup\",\"required\":true,\"endpoint\":\"/api/procurement/products/option-sources/product/options/filter\",\"displayField\":\"label\",\"valueField\":\"id\",\"dependentField\":\"contractId\",\"dependencyLoadOnChange\":\"immediate\",\"resetOnDependentChange\":true,\"optionSource\":{\"key\":\"product\",\"type\":\"RESOURCE_ENTITY\",\"entityKey\":\"product\",\"resourcePath\":\"/api/procurement/products\",\"filterField\":\"productId\",\"dependsOn\":[\"companyId\",\"contractId\"],\"propertyPath\":\"id\",\"valuePropertyPath\":\"id\",\"labelPropertyPath\":\"name\",\"codePropertyPath\":\"sku\",\"descriptionPropertyPaths\":[\"categoryName\",\"stockAvailable\",\"unitOfMeasure\"],\"statusPropertyPath\":\"status\",\"disabledReasonPropertyPath\":\"disabledReason\",\"searchPropertyPaths\":[\"sku\",\"name\",\"categoryName\"],\"searchMode\":\"contains\",\"pageSize\":25,\"includeIds\":true,\"selectionPolicy\":{\"statusPropertyPath\":\"status\",\"allowedStatuses\":[\"ACTIVE\",\"AVAILABLE\"],\"blockedStatuses\":[\"INACTIVE\",\"BLOCKED\"],\"allowRetainInvalidExistingValue\":true},\"capabilities\":{\"filter\":true,\"byIds\":true,\"detail\":true,\"navigateToDetail\":true,\"auditSnapshot\":true},\"detail\":{\"hrefTemplate\":\"/api/procurement/products/{id}\",\"routeTemplate\":\"/procurement/products/{id}\",\"openDetailMode\":\"route\"}}},{\"name\":\"orderDate\",\"label\":\"Data do pedido\",\"controlType\":\"date\"},{\"name\":\"currency\",\"label\":\"Moeda\",\"controlType\":\"select\",\"options\":[{\"label\":\"BRL\",\"value\":\"BRL\"},{\"label\":\"USD\",\"value\":\"USD\"}]},{\"name\":\"quantity\",\"label\":\"Quantidade\",\"controlType\":\"numericTextBox\",\"validators\":{\"min\":1}}]}",
9934
10162
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9938,7 +10166,7 @@
9938
10166
  "corpusVersion": "1.0.0"
9939
10167
  },
9940
10168
  {
9941
- "chunkIndex": 74,
10169
+ "chunkIndex": 75,
9942
10170
  "chunkKind": "recipe",
9943
10171
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"sections\",\"sections\":[{\"id\":\"commercial-context\",\"title\":\"Commercial context\",\"rows\":[{\"id\":\"commercial-context-row\",\"columns\":[{\"id\":\"company-column\",\"fields\":[\"companyId\",\"orderDate\"]},{\"id\":\"currency-column\",\"fields\":[\"currency\",\"quantity\"]}]}]},{\"id\":\"purchase-entities\",\"title\":\"Purchase entities\",\"rows\":[{\"id\":\"purchase-entities-row-1\",\"columns\":[{\"id\":\"supplier-column\",\"fields\":[\"supplierId\"]},{\"id\":\"contract-column\",\"fields\":[\"contractId\"]}]},{\"id\":\"purchase-entities-row-2\",\"columns\":[{\"id\":\"product-column\",\"fields\":[\"productId\"]}]}]}]}",
9944
10172
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9948,7 +10176,7 @@
9948
10176
  "corpusVersion": "1.0.0"
9949
10177
  },
9950
10178
  {
9951
- "chunkIndex": 75,
10179
+ "chunkIndex": 76,
9952
10180
  "chunkKind": "recipe",
9953
10181
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"initialData\",\"initialData\":{\"companyId\":1,\"supplierId\":10,\"contractId\":20,\"productId\":30,\"orderDate\":\"2026-04-15\",\"currency\":\"BRL\",\"quantity\":2}}",
9954
10182
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9958,7 +10186,7 @@
9958
10186
  "corpusVersion": "1.0.0"
9959
10187
  },
9960
10188
  {
9961
- "chunkIndex": 76,
10189
+ "chunkIndex": 77,
9962
10190
  "chunkKind": "recipe",
9963
10191
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"expectedLookupRequests\",\"expectedLookupRequests\":{\"filterSupplier\":{\"method\":\"POST\",\"url\":\"/api/procurement/suppliers/option-sources/supplier/options/filter\",\"body\":{\"query\":\"acme\",\"filters\":{\"companyId\":1},\"page\":0,\"size\":25}},\"filterContract\":{\"method\":\"POST\",\"url\":\"/api/procurement/contracts/option-sources/contract/options/filter\",\"body\":{\"query\":\"2026\",\"filters\":{\"companyId\":1,\"supplierId\":10},\"page\":0,\"size\":25}},\"filterProduct\":{\"method\":\"POST\",\"url\":\"/api/procurement/products/option-sources/product/options/filter\",\"body\":{\"filters\":{\"companyId\":1,\"contractId\":20},\"page\":0,\"size\":25}},\"rehydrateSavedValues\":{\"method\":\"GET\",\"urls\":[\"/api/procurement/companies/option-sources/company/options/by-ids?ids=1\",\"/api/procurement/suppliers/option-sources/supplier/options/by-ids?ids=10\",\"/api/procurement/contracts/option-sources/contract/options/by-ids?ids=20\",\"/api/procurement/products/option-sources/product/options/by-ids?ids=30\"]}}}",
9964
10192
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9968,7 +10196,7 @@
9968
10196
  "corpusVersion": "1.0.0"
9969
10197
  },
9970
10198
  {
9971
- "chunkIndex": 77,
10199
+ "chunkIndex": 78,
9972
10200
  "chunkKind": "recipe",
9973
10201
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"expectedOptionShape\",\"expectedOptionShape\":{\"id\":10,\"label\":\"ACME Suprimentos Ltda\",\"extra\":{\"code\":\"FOR-8742\",\"description\":\"12.345.678/0001-90 - APPROVED - LOW\",\"status\":\"ACTIVE\",\"selectable\":true,\"disabledReason\":null,\"detailHref\":\"/api/procurement/suppliers/10\",\"detailRoute\":\"/procurement/suppliers/10\",\"resourcePath\":\"/api/procurement/suppliers\",\"entityKey\":\"supplier\"}}}",
9974
10202
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9978,7 +10206,7 @@
9978
10206
  "corpusVersion": "1.0.0"
9979
10207
  },
9980
10208
  {
9981
- "chunkIndex": 78,
10209
+ "chunkIndex": 79,
9982
10210
  "chunkKind": "recipe",
9983
10211
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"expectedSubmitPayload\",\"expectedSubmitPayload\":{\"companyId\":1,\"supplierId\":10,\"contractId\":20,\"productId\":30,\"orderDate\":\"2026-04-15\",\"currency\":\"BRL\",\"quantity\":2}}",
9984
10212
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.entity-lookup-procurement.json",
@@ -9988,7 +10216,7 @@
9988
10216
  "corpusVersion": "1.0.0"
9989
10217
  },
9990
10218
  {
9991
- "chunkIndex": 79,
10219
+ "chunkIndex": 80,
9992
10220
  "chunkKind": "recipe",
9993
10221
  "content": "{\"_comment\":\"Showcase de campos variados com props específicas (validação, máscaras, sliders, cores).\",\"templateMeta\":{\"variantId\":\"fields\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"tags\":[\"fields\",\"metadata\"],\"useWhen\":\"mostrar apenas fieldMetadata e exemplos de campos\",\"examplePrompts\":[\"gere somente a lista de campos\",\"adicione novos campos ao formulario\"]},\"metadata\":{\"version\":\"2.0\"},\"fieldMetadata\":[{\"name\":\"fullName\",\"label\":\"Nome completo\",\"controlType\":\"input\",\"validators\":{\"maxLength\":120}},{\"name\":\"email\",\"label\":\"Email\",\"controlType\":\"email\",\"validators\":{\"required\":true,\"email\":true}},{\"name\":\"password\",\"label\":\"Senha\",\"controlType\":\"password\",\"validators\":{\"minLength\":8}},{\"name\":\"profileColor\",\"label\":\"Cor do perfil\",\"controlType\":\"colorPicker\",\"format\":\"hex\"},{\"name\":\"salary\",\"label\":\"Salário\",\"controlType\":\"currency\",\"currencyCode\":\"BRL\",\"validators\":{\"min\":0}},{\"name\":\"birthDate\",\"label\":\"Nascimento\",\"controlType\":\"date\",\"validators\":{\"min\":\"1900-01-01\",\"max\":\"2025-12-31\"}},{\"name\":\"availability\",\"label\":\"Disponibilidade\",\"controlType\":\"dateRange\"},{\"name\":\"workload\",\"label\":\"Carga horária\",\"controlType\":\"slider\",\"validators\":{\"min\":0,\"max\":40}},{\"name\":\"skills\",\"label\":\"Habilidades\",\"controlType\":\"multiSelect\",\"options\":[{\"text\":\"Angular\",\"value\":\"ANG\"},{\"text\":\"React\",\"value\":\"RE\"}]},{\"name\":\"manager\",\"label\":\"Gestor\",\"controlType\":\"autoComplete\",\"endpoint\":\"/api/managers\"},{\"name\":\"document\",\"label\":\"CPF/CNPJ\",\"controlType\":\"cpfCnpjInput\",\"unmaskOnSubmit\":true},{\"name\":\"avatar\",\"label\":\"Avatar\",\"controlType\":\"avatar\",\"imageSrc\":\"https://picsum.photos/80\",\"materialDesign\":{\"shape\":\"circle\"}},{\"name\":\"attachments\",\"label\":\"Anexos\",\"controlType\":\"upload\",\"multiple\":true,\"accept\":\".pdf,.png,.jpg\"}],\"sections\":[{\"id\":\"sec1\",\"title\":\"Perfil\",\"rows\":[{\"id\":\"r1\",\"columns\":[{\"id\":\"c1\",\"fields\":[\"fullName\",\"email\",\"password\"]}]}]},{\"id\":\"sec2\",\"title\":\"Detalhes\",\"rows\":[{\"id\":\"r2\",\"columns\":[{\"id\":\"c2\",\"fields\":[\"profileColor\",\"salary\",\"birthDate\",\"availability\",\"workload\"]}]}]},{\"id\":\"sec3\",\"title\":\"Outros\",\"rows\":[{\"id\":\"r3\",\"columns\":[{\"id\":\"c3\",\"fields\":[\"skills\",\"manager\",\"document\",\"avatar\",\"attachments\"]}]}]}]}",
9994
10222
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.fields.json",
@@ -9998,7 +10226,7 @@
9998
10226
  "corpusVersion": "1.0.0"
9999
10227
  },
10000
10228
  {
10001
- "chunkIndex": 80,
10229
+ "chunkIndex": 81,
10002
10230
  "chunkKind": "recipe",
10003
10231
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_comment\",\"_comment\":\"Generic recipe for PraxisDynamicForm (FormConfig). Values are placeholders for AI examples.\"}",
10004
10232
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10008,7 +10236,7 @@
10008
10236
  "corpusVersion": "1.0.0"
10009
10237
  },
10010
10238
  {
10011
- "chunkIndex": 81,
10239
+ "chunkIndex": 82,
10012
10240
  "chunkKind": "recipe",
10013
10241
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"templateMeta\",\"templateMeta\":{\"variantId\":\"form-config\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"tags\":[\"full\",\"config\"],\"useWhen\":\"gerar form completo com layout, campos e regras\",\"examplePrompts\":[\"gere um formulario completo com campos e layout\",\"crie um form completo baseado no schema\"]}}",
10014
10242
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10018,7 +10246,7 @@
10018
10246
  "corpusVersion": "1.0.0"
10019
10247
  },
10020
10248
  {
10021
- "chunkIndex": 82,
10249
+ "chunkIndex": 83,
10022
10250
  "chunkKind": "recipe",
10023
10251
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"metadata\",\"metadata\":{\"version\":\"2.0.0\",\"lastUpdated\":\"2024-02-01T12:00:00Z\",\"source\":\"local\",\"serverHash\":\"hash-abc-123\",\"schemaId\":\"path:/api/employees#request\",\"schemaContext\":{\"path\":\"/api/employees\",\"operation\":\"POST\",\"schemaType\":\"request\",\"internal\":false,\"tenant\":\"default\",\"locale\":\"pt-BR\"},\"customizations\":[{\"fieldName\":\"salary\",\"property\":\"label\",\"oldValue\":\"Salary\",\"newValue\":\"Salario\",\"timestamp\":\"2024-01-20T10:00:00Z\",\"source\":\"user\"}]}}",
10024
10252
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10028,7 +10256,7 @@
10028
10256
  "corpusVersion": "1.0.0"
10029
10257
  },
10030
10258
  {
10031
- "chunkIndex": 83,
10259
+ "chunkIndex": 84,
10032
10260
  "chunkKind": "recipe",
10033
10261
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"api\",\"api\":{\"saveEndpoint\":\"/api/employees\",\"loadEndpoint\":\"/api/employees/${id}\",\"saveMethod\":\"POST\",\"timeout\":15000,\"headers\":{\"X-Module\":\"HR\",\"X-Request-Source\":\"dynamic-form\"},\"idField\":\"id\",\"beforeSave\":\"sanitizeEmployee\",\"afterLoad\":\"mapEmployee\"}}",
10034
10262
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10038,7 +10266,7 @@
10038
10266
  "corpusVersion": "1.0.0"
10039
10267
  },
10040
10268
  {
10041
- "chunkIndex": 84,
10269
+ "chunkIndex": 85,
10042
10270
  "chunkKind": "recipe",
10043
10271
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"behavior\",\"behavior\":{\"confirmOnUnsavedChanges\":true,\"trackHistory\":true,\"focusFirstError\":true,\"scrollToErrors\":true,\"clearAfterSave\":false,\"redirectAfterSave\":\"/employees\",\"reactiveValidation\":true,\"reactiveValidationDebounceMs\":200}}",
10044
10272
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10048,7 +10276,7 @@
10048
10276
  "corpusVersion": "1.0.0"
10049
10277
  },
10050
10278
  {
10051
- "chunkIndex": 85,
10279
+ "chunkIndex": 86,
10052
10280
  "chunkKind": "recipe",
10053
10281
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"messages\",\"messages\":{\"createRegistrySuccess\":\"Registro criado com sucesso.\",\"updateRegistrySuccess\":\"Registro atualizado com sucesso.\",\"createRegistryError\":\"Falha ao criar registro.\",\"updateRegistryError\":\"Falha ao atualizar registro.\",\"confirmations\":{\"submit\":\"Salvar alteracoes?\",\"cancel\":\"Descartar alteracoes?\",\"reset\":\"Limpar o formulario?\",\"archive\":\"Arquivar este registro?\"},\"customActions\":{\"archive\":{\"success\":\"Registro arquivado.\",\"error\":\"Falha ao arquivar.\",\"confirmation\":\"Arquivar registro agora?\"},\"preview\":{\"confirmation\":\"Gerar pre-visualizacao?\"}},\"loading\":{\"submit\":\"Salvando...\",\"cancel\":\"Cancelando...\",\"reset\":\"Limpando...\",\"archive\":\"Arquivando...\"}}}",
10054
10282
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10058,7 +10286,7 @@
10058
10286
  "corpusVersion": "1.0.0"
10059
10287
  },
10060
10288
  {
10061
- "chunkIndex": 86,
10289
+ "chunkIndex": 87,
10062
10290
  "chunkKind": "recipe",
10063
10291
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"hints\",\"hints\":{\"dataModes\":{\"create\":\"Preencha os dados para criar um novo registro.\",\"edit\":\"Atualize os dados e salve as alteracoes.\",\"view\":\"Visualize os dados do registro.\"},\"uiModes\":{\"presentation\":\"Modo apresentacao exibe apenas leitura.\",\"readonly\":\"Modo leitura bloqueia edicao.\",\"disabled\":\"Campos desabilitados nao permitem interacao.\",\"visible\":\"Controle de visibilidade sem destruir controles.\"}}}",
10064
10292
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10068,7 +10296,7 @@
10068
10296
  "corpusVersion": "1.0.0"
10069
10297
  },
10070
10298
  {
10071
- "chunkIndex": 87,
10299
+ "chunkIndex": 88,
10072
10300
  "chunkKind": "recipe",
10073
10301
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"hooks\",\"hooks\":{\"beforeInit\":[{\"priority\":100,\"timeoutMs\":1500,\"args\":{\"source\":\"cache\"},\"id\":\"load-static-options\"}],\"afterInit\":[{\"priority\":50,\"timeoutMs\":1200,\"args\":{\"enable\":true},\"id\":\"attach-shortcuts\"}],\"beforeValidate\":[{\"priority\":80,\"timeoutMs\":1200,\"args\":{\"country\":\"BR\"},\"id\":\"normalize-phones\"}],\"afterValidate\":[{\"priority\":10,\"timeoutMs\":1000,\"args\":{\"report\":\"warnings\"},\"id\":\"collect-warnings\"}],\"beforeSubmit\":[{\"priority\":100,\"timeoutMs\":2000,\"args\":{\"trimStrings\":true},\"id\":\"sanitize-employee\"}],\"afterSubmit\":[{\"priority\":20,\"timeoutMs\":1500,\"args\":{\"messageKey\":\"employeeSaved\"},\"id\":\"notify-success\"}],\"onError\":[{\"priority\":0,\"timeoutMs\":1500,\"args\":{\"messageKey\":\"employeeSaveError\"},\"id\":\"notify-error\"}]}}",
10074
10302
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10078,7 +10306,7 @@
10078
10306
  "corpusVersion": "1.0.0"
10079
10307
  },
10080
10308
  {
10081
- "chunkIndex": 88,
10309
+ "chunkIndex": 89,
10082
10310
  "chunkKind": "recipe",
10083
10311
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"fieldMetadata\",\"fieldMetadata\":[{\"name\":\"id\",\"label\":\"ID\",\"controlType\":\"numericTextBox\",\"dataType\":\"number\",\"hidden\":true,\"readOnly\":true,\"description\":\"Backend generated identifier.\"},{\"name\":\"fullName\",\"label\":\"Full name\",\"controlType\":\"input\",\"dataType\":\"text\",\"placeholder\":\"Example: Ana Souza\",\"prefixIcon\":\"person\",\"iconPosition\":\"start\",\"iconSize\":\"small\",\"validators\":{\"required\":true,\"minLength\":3,\"maxLength\":120,\"requiredMessage\":\"Name is required\",\"minLengthMessage\":\"Min 3 chars\",\"minWords\":2},\"validationMode\":\"blur\",\"debounceTime\":200,\"materialDesign\":{\"appearance\":\"outline\",\"color\":\"primary\",\"floatLabel\":\"auto\",\"density\":\"comfortable\",\"subscriptSizing\":\"dynamic\",\"hideRequiredMarker\":false,\"disableRipple\":true,\"customPalette\":{\"primary\":\"#005f73\",\"accent\":\"#0a9396\",\"warn\":\"#bb3e03\"},\"animations\":{\"disabled\":false,\"duration\":\"150ms\",\"easing\":\"ease-out\"}},\"group\":\"identity\",\"order\":1,\"width\":\"50%\",\"isFlex\":true,\"id\":\"field-full-name\",\"version\":\"1.0.0\",\"context\":\"form\",\"createdAt\":\"2024-01-01T00:00:00Z\",\"updatedAt\":\"2024-02-01T00:00:00Z\",\"tags\":[\"identity\",\"employee\"],\"cssClass\":\"field-full-name\",\"style\":{\"maxWidth\":\"480px\"},\"dataAttributes\":{\"data-qa\":\"full-name\"},\"required\":true},{\"name\":\"email\",\"label\":\"Email\",\"controlType\":\"email\",\"dataType\":\"email\",\"placeholder\":\"name@company.com\",\"validators\":{\"required\":true,\"email\":true,\"emailMessage\":\"Use a valid email.\"},\"unique\":true,\"ariaLabel\":\"Email address\",\"ariaDescribedBy\":\"email-help\",\"tabIndex\":2,\"accessKey\":\"e\"},{\"name\":\"phone\",\"label\":\"Phone\",\"controlType\":\"maskedTextBox\",\"dataType\":\"text\",\"mask\":\"(99) 99999-9999\",\"validators\":{\"pattern\":\"^\\\\(\\\\d{2}\\\\) \\\\d{4,5}-\\\\d{4}$\",\"patternMessage\":\"Use (11) 99999-9999\"},\"hint\":\"Include area code.\"},{\"name\":\"status\",\"label\":\"Status\",\"controlType\":\"select\",\"options\":[{\"text\":\"Active\",\"value\":\"ACTIVE\",\"icon\":\"check_circle\"},{\"text\":\"Inactive\",\"value\":\"INACTIVE\",\"icon\":\"block\"},{\"text\":\"On leave\",\"value\":\"ON_LEAVE\",\"icon\":\"schedule\"}],\"defaultValue\":\"ACTIVE\",\"validators\":{\"required\":true},\"materialDesign\":{\"appearance\":\"outline\",\"color\":\"accent\"}},{\"name\":\"departmentId\",\"label\":\"Department\",\"controlType\":\"select\",\"endpoint\":\"/api/departments\",\"valueField\":\"id\",\"displayField\":\"name\",\"queryParams\":{\"active\":true},\"cacheDuration\":300000,\"validators\":{\"required\":true},\"resourcePath\":\"/api/departments\",\"filterCriteria\":{\"active\":true},\"optionLabelKey\":\"name\",\"optionValueKey\":\"id\",\"searchable\":true},{\"name\":\"teamId\",\"label\":\"Team\",\"controlType\":\"select\",\"endpoint\":\"/api/teams\",\"valueField\":\"id\",\"displayField\":\"name\",\"dependencyFields\":[\"departmentId\"],\"dependencyFilterMap\":{\"departmentId\":\"departmentId\"},\"dependencyValuePath\":\"id\",\"dependencyLoadOnChange\":\"immediate\",\"dependencyMergeStrategy\":\"replace\",\"dependencyDebounceMs\":200,\"resetOnDependentChange\":true,\"enableDependencyCascade\":true,\"suppressInlineErrorsOnCascade\":true},{\"name\":\"managerId\",\"label\":\"Manager\",\"controlType\":\"autoComplete\",\"endpoint\":\"/api/employees\",\"queryParams\":{\"role\":\"manager\"},\"valueField\":\"id\",\"displayField\":\"name\",\"filterField\":\"name\",\"dependencyFields\":[\"departmentId\"],\"dependencyFilterMap\":{\"departmentId\":\"departmentId\"},\"dependencyLoadOnChange\":\"respectLoadOn\",\"disabled\":false},{\"name\":\"hireDate\",\"label\":\"Hire date\",\"controlType\":\"date\",\"dataType\":\"date\",\"validators\":{\"required\":true},\"minDate\":\"2020-01-01\",\"maxDate\":\"2030-12-31\",\"startView\":\"multi-year\",\"datepickerTogglePosition\":\"suffix\",\"touchUi\":true},{\"name\":\"terminationDate\",\"label\":\"Termination date\",\"controlType\":\"date\",\"conditionalDisplay\":{\"==\":[{\"var\":\"status\"},\"INACTIVE\"]},\"conditionalRequired\":{\"==\":[{\"var\":\"status\"},\"INACTIVE\"]}},{\"name\":\"salary\",\"label\":\"Salary\",\"controlType\":\"currency\",\"dataType\":\"number\",\"format\":\"BRL|symbol|2\",\"validators\":{\"min\":0,\"max\":999999,\"minMessage\":\"Salary must be >= 0\"},\"min\":0,\"max\":999999,\"step\":100,\"precision\":\"fixed\",\"currencyCode\":\"BRL\",\"currencyDisplay\":\"symbol\",\"prefix\":\"R$\",\"suffix\":\"bruto\",\"inlineEditing\":true,\"transformDisplayValue\":\"formatCurrency\",\"transformSaveValue\":\"parseCurrency\"},{\"name\":\"bonusPercent\",\"label\":\"Bonus %\",\"controlType\":\"slider\",\"dataType\":\"number\",\"defaultValue\":10,\"validators\":{\"min\":0,\"max\":50},\"suffixIcon\":\"percent\",\"min\":0,\"max\":50,\"step\":5,\"thumbLabel\":true,\"showTicks\":true,\"vertical\":false,\"invert\":false},{\"name\":\"workMode\",\"label\":\"Work mode\",\"controlType\":\"radio\",\"options\":[{\"text\":\"CLT\",\"value\":\"CLT\"},{\"text\":\"PJ\",\"value\":\"PJ\"},{\"text\":\"Intern\",\"value\":\"INTERN\"}],\"defaultValue\":\"CLT\"},{\"name\":\"skills\",\"label\":\"Skills\",\"controlType\":\"multiSelect\",\"options\":[{\"text\":\"Angular\",\"value\":\"ANG\"},{\"text\":\"React\",\"value\":\"RE\"},{\"text\":\"Node\",\"value\":\"NODE\"}],\"visibleIn\":[\"form\",\"filter\"],\"multiple\":true,\"searchable\":true,\"clearable\":true,\"selectAll\":true,\"maxSelections\":5,\"virtualScroll\":true,\"emptyOptionText\":\"None\"},{\"name\":\"availability\",\"label\":\"Availability\",\"controlType\":\"dateRange\",\"rangeSeparator\":\" to \"},{\"name\":\"notes\",\"label\":\"Notes\",\"controlType\":\"textarea\",\"validators\":{\"maxLength\":500},\"hint\":\"Add relevant notes.\",\"textTransformApply\":\"displayOnly\",\"rows\":4,\"minRows\":3,\"maxRows\":8,\"resize\":\"vertical\",\"spellcheck\":true,\"inputMode\":\"text\",\"textTransform\":\"uppercase\",\"readonly\":false,\"formHidden\":false,\"tableHidden\":true,\"filterHidden\":false},{\"name\":\"isActive\",\"label\":\"Active\",\"controlType\":\"toggle\",\"dataType\":\"boolean\",\"defaultValue\":true},{\"name\":\"avatar\",\"label\":\"Photo\",\"controlType\":\"upload\",\"accept\":\".png,.jpg,.jpeg\",\"multiple\":false,\"materialDesign\":{\"appearance\":\"outline\"},\"uploadUrl\":\"/api/uploads/avatars\",\"autoUpload\":true,\"maxFileSize\":5242880,\"maxFiles\":2,\"fileRestrictions\":{\"minResolution\":\"128x128\",\"maxResolution\":\"2048x2048\"},\"chunkSize\":1048576,\"withCredentials\":false,\"headers\":{\"X-Upload-Source\":\"dynamic-form\"},\"method\":\"POST\",\"saveField\":\"file\"},{\"name\":\"terms\",\"label\":\"Accept terms\",\"controlType\":\"checkbox\",\"validators\":{\"requiredChecked\":true},\"tooltip\":\"Required to submit.\"},{\"name\":\"username\",\"label\":\"Username\",\"controlType\":\"input\",\"dataType\":\"text\",\"type\":\"text\",\"minLength\":3,\"maxLength\":20,\"pattern\":\"^[a-zA-Z0-9_]+$\",\"validators\":{\"required\":true,\"patternMessage\":\"Use letters, numbers, underscore\"},\"inputMode\":\"text\",\"autoComplete\":\"username\",\"readonly\":false,\"spellcheck\":false,\"textTransform\":\"lowercase\",\"placeholder\":\"user_name\"},{\"name\":\"password\",\"label\":\"Password\",\"controlType\":\"password\",\"dataType\":\"text\",\"type\":\"password\",\"showPasswordToggle\":true,\"autoComplete\":\"current-password\",\"validators\":{\"required\":true,\"minLength\":8}},{\"name\":\"country\",\"label\":\"Country\",\"controlType\":\"select\",\"dataType\":\"text\",\"options\":[{\"text\":\"Brazil\",\"value\":\"BR\"},{\"text\":\"United States\",\"value\":\"US\"},{\"text\":\"Canada\",\"value\":\"CA\"}],\"optionLabelKey\":\"text\",\"optionValueKey\":\"value\",\"emptyOptionText\":\"Select a country\",\"searchable\":true,\"clearable\":true,\"resourcePath\":\"/api/countries\",\"filterCriteria\":{\"active\":true},\"multiple\":false},{\"name\":\"orgTree\",\"label\":\"Organization\",\"controlType\":\"treeSelect\",\"treeConfig\":{\"expandByDefault\":true,\"selectionMode\":\"single\"},\"nodes\":[{\"label\":\"HQ\",\"value\":\"hq\",\"children\":[{\"label\":\"Finance\",\"value\":\"finance\"}]},{\"label\":\"Branch\",\"value\":\"branch\"}],\"multiple\":false},{\"name\":\"ratingScore\",\"label\":\"Satisfaction\",\"controlType\":\"rating\",\"value\":3,\"max\":5,\"ratingMax\":5,\"ratingPrecision\":0.5,\"ratingIcon\":\"star\",\"ratingEmptyIcon\":\"star_border\",\"ratingAllowHalf\":true},{\"name\":\"progress\",\"label\":\"Progress\",\"controlType\":\"slider\",\"min\":0,\"max\":100,\"step\":5,\"defaultValue\":65,\"thumbLabel\":true,\"showTicks\":true},{\"name\":\"avatarDisplay\",\"label\":\"Avatar display\",\"controlType\":\"avatar\",\"imageSrc\":\"https://cdn.example.com/avatars/ana.png\",\"imageAlt\":\"User avatar\",\"initials\":\"AS\",\"avatarShape\":\"circle\",\"avatarSize\":\"medium\"},{\"name\":\"ctaButton\",\"label\":\"Request access\",\"controlType\":\"button\",\"icon\":\"send\",\"color\":\"primary\",\"variant\":\"raised\",\"size\":\"medium\",\"disabled\":false,\"loading\":false,\"action\":\"requestAccess\",\"actionPayload\":{\"role\":\"manager\"}}]}",
10084
10312
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10088,7 +10316,7 @@
10088
10316
  "corpusVersion": "1.0.0"
10089
10317
  },
10090
10318
  {
10091
- "chunkIndex": 89,
10319
+ "chunkIndex": 90,
10092
10320
  "chunkKind": "recipe",
10093
10321
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"fieldMetadata\",\"fieldMetadata\":[{\"name\":\"aiAssist\",\"label\":\"AI assist\",\"controlType\":\"button\",\"icon\":\"smart_toy\",\"color\":\"accent\",\"variant\":\"stroked\",\"size\":\"medium\",\"action\":\"aiAssist\",\"actionPayload\":{\"prompt\":\"Summarize the candidate profile\",\"history\":[{\"role\":\"user\",\"content\":\"Summarize this CV.\"},{\"role\":\"assistant\",\"content\":\"Summary goes here.\"}]},\"tooltip\":\"Ask AI to summarize the candidate profile\"},{\"name\":\"themeColor\",\"label\":\"Theme color\",\"controlType\":\"colorPicker\",\"format\":\"hex\",\"views\":[\"palette\",\"gradient\"],\"activeView\":\"palette\",\"preview\":true,\"clearButton\":true,\"actionsLayout\":\"end\",\"adaptiveMode\":true,\"adaptiveTitle\":\"Pick a color\",\"adaptiveSubtitle\":\"Brand palette\",\"popupSettings\":{\"width\":320},\"gradientSettings\":{\"opacity\":true},\"paletteSettings\":{\"columns\":8},\"fillMode\":\"solid\",\"rounded\":\"medium\",\"size\":\"medium\",\"icon\":\"palette\",\"iconClass\":\"color-icon\",\"svgIcon\":\"custom-palette\",\"tabindex\":0},{\"name\":\"cpf\",\"label\":\"CPF/CNPJ\",\"controlType\":\"cpfCnpjInput\",\"maskType\":\"cpf-cnpj\",\"unmaskOnSubmit\":true,\"validators\":{\"cpf\":true,\"cnpj\":true}},{\"name\":\"meetingTime\",\"label\":\"Meeting time\",\"controlType\":\"timePicker\",\"enableSeconds\":true,\"stepMinute\":15,\"stepSecond\":30}]}",
10094
10322
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10098,7 +10326,7 @@
10098
10326
  "corpusVersion": "1.0.0"
10099
10327
  },
10100
10328
  {
10101
- "chunkIndex": 90,
10329
+ "chunkIndex": 91,
10102
10330
  "chunkKind": "recipe",
10103
10331
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"sections\",\"sections\":[{\"id\":\"basic\",\"title\":\"Basic data\",\"description\":\"Primary profile and status fields.\",\"icon\":\"person\",\"collapsible\":true,\"collapsed\":false,\"gapBottom\":16,\"titleGapBottom\":6,\"descriptionGapBottom\":8,\"titleStyle\":\"titleMedium\",\"descriptionStyle\":\"bodyMedium\",\"titleColor\":\"#1a1a1a\",\"descriptionColor\":\"#666666\",\"headerAlign\":\"start\",\"headerTooltip\":\"Main data\",\"rows\":[{\"id\":\"row-basic-1\",\"gap\":16,\"rowGap\":12,\"columns\":[{\"id\":\"col-basic-1\",\"fields\":[\"fullName\",\"email\"],\"span\":{\"xs\":12,\"sm\":12,\"md\":6,\"lg\":6,\"xl\":6},\"padding\":8,\"className\":\"col-basic-main\",\"testId\":\"col-basic-main\",\"title\":\"Identity\"},{\"id\":\"col-basic-2\",\"fields\":[\"status\",\"hireDate\"],\"span\":{\"md\":6,\"lg\":6},\"hidden\":{\"xs\":true,\"sm\":false,\"md\":false,\"lg\":false,\"xl\":false},\"order\":{\"xs\":2,\"sm\":1,\"md\":2,\"lg\":2,\"xl\":1}}],\"title\":\"Core fields\"},{\"id\":\"row-basic-2\",\"gap\":16,\"columns\":[{\"id\":\"col-basic-3\",\"fields\":[\"phone\",\"isActive\"],\"span\":{\"md\":6,\"lg\":6},\"offset\":{\"xs\":0,\"sm\":0,\"md\":1,\"lg\":0,\"xl\":0}},{\"id\":\"col-basic-4\",\"fields\":[\"departmentId\",\"teamId\"],\"span\":{\"md\":6,\"lg\":6}}]},{\"id\":\"row-basic-3\",\"columns\":[{\"id\":\"col-basic-5\",\"fields\":[\"managerId\"],\"span\":{\"md\":6,\"lg\":6}}]}]},{\"id\":\"employment\",\"title\":\"Employment\",\"description\":\"Contract and compensation.\",\"icon\":\"badge\",\"collapsible\":true,\"collapsed\":false,\"rows\":[{\"id\":\"row-employment-1\",\"gap\":16,\"columns\":[{\"id\":\"col-employment-1\",\"fields\":[\"salary\",\"bonusPercent\"],\"span\":{\"md\":6,\"lg\":6}},{\"id\":\"col-employment-2\",\"fields\":[\"workMode\",\"terminationDate\"],\"span\":{\"md\":6,\"lg\":6}}]},{\"id\":\"row-employment-2\",\"rowGap\":16,\"columns\":[{\"id\":\"col-employment-3\",\"fields\":[\"skills\",\"availability\"],\"span\":{\"md\":12,\"lg\":12}}]}]},{\"id\":\"extras\",\"title\":\"Extras\",\"description\":\"Additional notes and context.\",\"collapsible\":true,\"collapsed\":false,\"rows\":[{\"id\":\"row-extras-1\",\"columns\":[{\"id\":\"col-extras-1\",\"fields\":[\"notes\"],\"span\":{\"md\":12,\"lg\":12},\"align\":\"stretch\",\"padding\":8}]}]},{\"id\":\"attachments\",\"title\":\"Attachments\",\"description\":\"Files and confirmations.\",\"collapsible\":true,\"collapsed\":true,\"rows\":[{\"id\":\"row-attachments-1\",\"columns\":[{\"id\":\"col-attachments-1\",\"fields\":[\"avatar\",\"terms\"],\"span\":{\"md\":12,\"lg\":12},\"align\":\"center\"}]}]},{\"id\":\"advanced\",\"title\":\"Advanced\",\"description\":\"Extra controls and integrations.\",\"collapsible\":true,\"collapsed\":true,\"rows\":[{\"id\":\"row-advanced-1\",\"gap\":16,\"columns\":[{\"id\":\"col-advanced-1\",\"fields\":[\"username\",\"password\"],\"span\":{\"md\":6,\"lg\":6}},{\"id\":\"col-advanced-2\",\"fields\":[\"country\",\"orgTree\"],\"span\":{\"md\":6,\"lg\":6}}]},{\"id\":\"row-advanced-2\",\"gap\":16,\"columns\":[{\"id\":\"col-advanced-3\",\"fields\":[\"themeColor\",\"cpf\"],\"span\":{\"md\":6,\"lg\":6}},{\"id\":\"col-advanced-4\",\"fields\":[\"meetingTime\",\"ratingScore\"],\"span\":{\"md\":6,\"lg\":6}}]},{\"id\":\"row-advanced-3\",\"gap\":16,\"columns\":[{\"id\":\"col-advanced-5\",\"fields\":[\"progress\",\"avatarDisplay\"],\"span\":{\"md\":6,\"lg\":6}},{\"id\":\"col-advanced-6\",\"fields\":[\"ctaButton\",\"aiAssist\"],\"span\":{\"md\":6,\"lg\":6}}]}]}]}",
10104
10332
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10108,7 +10336,7 @@
10108
10336
  "corpusVersion": "1.0.0"
10109
10337
  },
10110
10338
  {
10111
- "chunkIndex": 91,
10339
+ "chunkIndex": 92,
10112
10340
  "chunkKind": "recipe",
10113
10341
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"actions\",\"actions\":{\"submit\":{\"visible\":true,\"label\":\"Save\",\"icon\":\"save\",\"color\":\"primary\",\"variant\":\"raised\",\"size\":\"medium\",\"type\":\"submit\",\"shortcut\":\"Ctrl+S\",\"tooltip\":\"Save changes\",\"className\":\"action-submit\",\"style\":{\"letterSpacing\":\"0.5px\"},\"disabled\":false,\"loading\":false},\"cancel\":{\"visible\":true,\"label\":\"Cancel\",\"icon\":\"close\",\"type\":\"button\",\"color\":\"basic\"},\"reset\":{\"visible\":true,\"label\":\"Reset\",\"type\":\"reset\",\"color\":\"basic\"},\"custom\":[{\"id\":\"archive\",\"visible\":true,\"label\":\"Archive\",\"icon\":\"archive\",\"color\":\"warn\",\"variant\":\"stroked\",\"action\":\"archive\",\"tooltip\":\"Archive record\"},{\"id\":\"preview\",\"visible\":true,\"label\":\"Preview\",\"icon\":\"visibility\",\"color\":\"accent\",\"variant\":\"flat\",\"action\":\"preview\"}],\"position\":\"right\",\"orientation\":\"horizontal\",\"spacing\":\"normal\",\"sticky\":true,\"divider\":true,\"placement\":\"afterSections\",\"containerClassName\":\"form-actions-container\",\"containerStyles\":{\"background\":\"var(--md-sys-color-surface-container)\",\"border\":\"1px solid var(--md-sys-color-outline-variant)\",\"borderRadius\":\"12px\",\"padding\":\"12px 16px\"},\"mobile\":{\"position\":\"center\",\"orientation\":\"vertical\",\"collapseToMenu\":true}}}",
10114
10342
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10118,7 +10346,7 @@
10118
10346
  "corpusVersion": "1.0.0"
10119
10347
  },
10120
10348
  {
10121
- "chunkIndex": 92,
10349
+ "chunkIndex": 93,
10122
10350
  "chunkKind": "recipe",
10123
10351
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"formRules\",\"formRules\":[{\"id\":\"hide-comp-for-intern\",\"name\":\"Hide compensation for interns\",\"targetType\":\"field\",\"targets\":[\"salary\",\"bonusPercent\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"workMode\"},\"INTERN\"]},\"properties\":{\"visible\":false,\"required\":false},\"propertiesWhenFalse\":{\"visible\":true}},\"description\":\"Rule for coverage of description field.\",\"targetFields\":[\"salary\",\"bonusPercent\"],\"context\":\"visibility\"},{\"id\":\"require-termination-date\",\"name\":\"Require termination date when inactive\",\"targetType\":\"field\",\"targets\":[\"terminationDate\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"status\"},\"INACTIVE\"]},\"properties\":{\"visible\":true,\"required\":true}}},{\"id\":\"collapse-employment-section\",\"name\":\"Collapse employment when active\",\"targetType\":\"section\",\"targets\":[\"employment\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"status\"},\"ACTIVE\"]},\"properties\":{\"collapsed\":false},\"propertiesWhenFalse\":{\"collapsed\":true}}},{\"id\":\"disable-archive-when-inactive\",\"name\":\"Disable archive when not active\",\"targetType\":\"action\",\"targets\":[\"archive\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"isActive\"},true]},\"properties\":{\"disabled\":false},\"propertiesWhenFalse\":{\"disabled\":true}}},{\"id\":\"hide-extras-row\",\"name\":\"Hide extras when intern\",\"targetType\":\"row\",\"targets\":[\"row-extras-1\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"workMode\"},\"INTERN\"]},\"properties\":{\"visible\":false},\"propertiesWhenFalse\":{\"visible\":true,\"rowGap\":16}}},{\"id\":\"expand-notes-column\",\"name\":\"Expand notes column when inactive\",\"targetType\":\"column\",\"targets\":[\"col-extras-1\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"status\"},\"INACTIVE\"]},\"properties\":{\"span\":{\"md\":12,\"lg\":12}}}},{\"id\":\"rule-field-all\",\"name\":\"Field properties coverage\",\"targetType\":\"field\",\"targets\":[\"fullName\"],\"effect\":{\"condition\":true,\"properties\":{\"visible\":true,\"required\":true,\"readonly\":false,\"disabled\":false,\"className\":\"rule-field\",\"style\":{\"color\":\"#333333\"},\"label\":\"Rule label\",\"description\":\"Rule description\",\"placeholder\":\"Rule placeholder\",\"hint\":\"Rule hint\",\"tooltip\":\"Rule tooltip\",\"prefixIcon\":\"info\",\"suffixIcon\":\"check\",\"prefixText\":\"R$\",\"suffixText\":\"USD\",\"defaultValue\":{\"value\":\"default\"},\"options\":[{\"text\":\"A\",\"value\":\"A\"}],\"appearance\":\"outline\",\"color\":\"primary\",\"floatLabel\":\"always\",\"hintPosition\":\"end\",\"validators\":{\"required\":true}},\"propertiesWhenFalse\":{\"visible\":false,\"required\":false,\"readonly\":true,\"disabled\":true,\"className\":\"rule-field-off\",\"style\":{\"color\":\"#999999\"},\"label\":\"Rule label off\",\"description\":\"Rule description off\",\"placeholder\":\"Rule placeholder off\",\"hint\":\"Rule hint off\",\"tooltip\":\"Rule tooltip off\",\"prefixIcon\":\"block\",\"suffixIcon\":\"close\",\"prefixText\":\"OFF\",\"suffixText\":\"OFF\",\"defaultValue\":{\"value\":null},\"options\":[{\"text\":\"B\",\"value\":\"B\"}],\"appearance\":\"fill\",\"color\":\"accent\",\"floatLabel\":\"never\",\"hintPosition\":\"start\",\"validators\":{\"required\":false}}}},{\"id\":\"rule-section-all\",\"name\":\"Section properties coverage\",\"targetType\":\"section\",\"targets\":[\"basic\"],\"effect\":{\"condition\":true,\"properties\":{\"visible\":true,\"title\":\"Rule section title\",\"description\":\"Rule section description\",\"icon\":\"settings\",\"className\":\"rule-section\",\"style\":{\"borderRadius\":\"8px\"},\"borderColor\":\"#cccccc\",\"borderStyle\":\"solid\",\"borderWidth\":1,\"collapsible\":true,\"collapsed\":false,\"headerTooltip\":\"Section tooltip\",\"headerAlign\":\"start\",\"gapBottom\":12,\"titleGapBottom\":4,\"descriptionGapBottom\":6,\"titleColor\":\"#222222\",\"descriptionColor\":\"#555555\",\"titleStyle\":\"titleSmall\",\"descriptionStyle\":\"bodySmall\",\"appearance\":\"outlined\"},\"propertiesWhenFalse\":{\"visible\":false,\"title\":\"Rule section title off\",\"description\":\"Rule section description off\",\"icon\":\"block\",\"className\":\"rule-section-off\",\"style\":{\"borderRadius\":\"0px\"},\"borderColor\":\"#eeeeee\",\"borderStyle\":\"dashed\",\"borderWidth\":0,\"collapsible\":false,\"collapsed\":true,\"headerTooltip\":\"Section tooltip off\",\"headerAlign\":\"center\",\"gapBottom\":0,\"titleGapBottom\":0,\"descriptionGapBottom\":0,\"titleColor\":\"#999999\",\"descriptionColor\":\"#999999\",\"titleStyle\":\"titleMedium\",\"descriptionStyle\":\"bodyMedium\",\"appearance\":\"flat\"}}},{\"id\":\"rule-action-all\",\"name\":\"Action properties coverage\",\"targetType\":\"action\",\"targets\":[\"archive\"],\"effect\":{\"condition\":true,\"properties\":{\"visible\":true,\"disabled\":false,\"loading\":false,\"label\":\"Rule action\",\"icon\":\"archive\",\"tooltip\":\"Rule tooltip\",\"color\":\"warn\",\"variant\":\"stroked\",\"size\":\"medium\",\"className\":\"rule-action\",\"style\":{\"minWidth\":\"120px\"}},\"propertiesWhenFalse\":{\"visible\":false,\"disabled\":true,\"loading\":true,\"label\":\"Rule action off\",\"icon\":\"block\",\"tooltip\":\"Rule tooltip off\",\"color\":\"basic\",\"variant\":\"flat\",\"size\":\"small\",\"className\":\"rule-action-off\",\"style\":{\"minWidth\":\"80px\"}}}},{\"id\":\"rule-row-all\",\"name\":\"Row properties coverage\",\"targetType\":\"row\",\"targets\":[\"row-basic-1\"],\"effect\":{\"condition\":true,\"properties\":{\"visible\":true,\"gap\":12,\"rowGap\":8,\"className\":\"rule-row\",\"style\":{\"marginBottom\":\"12px\"}},\"propertiesWhenFalse\":{\"visible\":false,\"gap\":0,\"rowGap\":0,\"className\":\"rule-row-off\",\"style\":{\"marginBottom\":\"0px\"}}}},{\"id\":\"rule-column-all\",\"name\":\"Column properties coverage\",\"targetType\":\"column\",\"targets\":[\"col-basic-1\"],\"effect\":{\"condition\":true,\"properties\":{\"visible\":true,\"span\":{\"xs\":12,\"sm\":12,\"md\":6,\"lg\":6,\"xl\":6},\"offset\":{\"xs\":0,\"sm\":0,\"md\":0,\"lg\":0,\"xl\":0},\"order\":{\"xs\":1,\"sm\":1,\"md\":1,\"lg\":1,\"xl\":1},\"hidden\":{\"xs\":false,\"sm\":false,\"md\":false,\"lg\":false,\"xl\":false},\"align\":\"stretch\",\"padding\":8,\"className\":\"rule-column\",\"style\":{\"backgroundColor\":\"#f6f6f6\"}},\"propertiesWhenFalse\":{\"visible\":false,\"span\":{\"xs\":12,\"sm\":12,\"md\":12,\"lg\":12,\"xl\":12},\"offset\":{\"xs\":0,\"sm\":0,\"md\":0,\"lg\":0,\"xl\":0},\"order\":{\"xs\":2,\"sm\":2,\"md\":2,\"lg\":2,\"xl\":2},\"hidden\":{\"xs\":true,\"sm\":true,\"md\":true,\"lg\":true,\"xl\":true},\"align\":\"center\",\"padding\":0,\"className\":\"rule-column-off\",\"style\":{\"backgroundColor\":\"#ffffff\"}}}}]}",
10124
10352
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10128,7 +10356,7 @@
10128
10356
  "corpusVersion": "1.0.0"
10129
10357
  },
10130
10358
  {
10131
- "chunkIndex": 93,
10359
+ "chunkIndex": 94,
10132
10360
  "chunkKind": "recipe",
10133
10361
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"formRulesState\",\"formRulesState\":{\"nodes\":{},\"rootNodes\":[],\"selectedNodeId\":null,\"currentDSL\":\"\",\"currentJSON\":[],\"validationErrors\":[],\"mode\":\"visual\",\"isDirty\":false,\"history\":[],\"historyPosition\":0}}",
10134
10362
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10138,7 +10366,7 @@
10138
10366
  "corpusVersion": "1.0.0"
10139
10367
  },
10140
10368
  {
10141
- "chunkIndex": 94,
10369
+ "chunkIndex": 95,
10142
10370
  "chunkKind": "recipe",
10143
10371
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"_variants\",\"_variants\":[{\"id\":\"actions-legacy-flags\",\"description\":\"Legacy actions flags.\",\"patch\":{\"actions\":{\"showSaveButton\":true,\"submitButtonLabel\":\"Save\",\"showCancelButton\":true,\"cancelButtonLabel\":\"Back\",\"showResetButton\":false}}},{\"id\":\"layout-minimal\",\"description\":\"Minimal layout with one section and two fields.\",\"patch\":{\"sections\":[{\"id\":\"simple\",\"title\":\"Simple\",\"rows\":[{\"id\":\"row-simple-1\",\"columns\":[{\"id\":\"col-simple-1\",\"fields\":[\"fullName\",\"email\"]}]}]}]}},{\"id\":\"rules-clear-override\",\"description\":\"Clear rule overrides with null.\",\"patch\":{\"formRules\":[{\"id\":\"hide-comp-for-intern\",\"name\":\"Hide compensation for interns\",\"targetType\":\"field\",\"targets\":[\"salary\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"workMode\"},\"INTERN\"]},\"properties\":{\"visible\":null}}}]}}]}",
10144
10372
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10148,7 +10376,7 @@
10148
10376
  "corpusVersion": "1.0.0"
10149
10377
  },
10150
10378
  {
10151
- "chunkIndex": 95,
10379
+ "chunkIndex": 96,
10152
10380
  "chunkKind": "recipe",
10153
10381
  "content": "{\"componentId\":\"praxis-dynamic-form\",\"chunkSection\":\"presentation\",\"presentation\":{\"labelFontSize\":12,\"valueFontSize\":14,\"labelPosition\":\"left\",\"compact\":false,\"density\":\"cozy\",\"labelWidth\":140,\"labelAlign\":\"start\",\"valueAlign\":\"end\"}}",
10154
10382
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.form-config.json",
@@ -10158,7 +10386,7 @@
10158
10386
  "corpusVersion": "1.0.0"
10159
10387
  },
10160
10388
  {
10161
- "chunkIndex": 96,
10389
+ "chunkIndex": 97,
10162
10390
  "chunkKind": "recipe",
10163
10391
  "content": "{\"_comment\":\"Component-level recipe for PraxisDynamicForm. Values are placeholders for AI examples.\",\"templateMeta\":{\"defaultVariantId\":\"form-config\",\"variants\":[{\"id\":\"form-config\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"form-config\",\"aiDescription\":\"FormConfig completo com layout, validacoes e hooks.\",\"tags\":[\"full\",\"config\"],\"useWhen\":\"usuario pede formulario completo ou gerado a partir do schema\",\"examplePrompts\":[\"gere um formulario completo para cadastro de funcionario\",\"crie um form completo com layout e validacoes\"]},{\"id\":\"fields\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"fields\",\"aiDescription\":\"Lista completa de FieldMetadata e sections.\",\"tags\":[\"fields\",\"metadata\"],\"useWhen\":\"usuario pede apenas campos ou metadados\",\"examplePrompts\":[\"adicione campos para endereco e contato\",\"gere somente a lista de campos\"]},{\"id\":\"layout\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"layout\",\"aiDescription\":\"Layout de secoes/linhas/colunas com exemplos de acoes.\",\"tags\":[\"layout\",\"sections\"],\"useWhen\":\"usuario pede reorganizacao visual do formulario\",\"examplePrompts\":[\"organize o layout em duas colunas\",\"crie secoes e linhas para o formulario\"]},{\"id\":\"validation\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"validation\",\"aiDescription\":\"Validacoes complexas e regras condicionais.\",\"tags\":[\"validation\",\"rules\"],\"useWhen\":\"usuario pede validacoes avancadas ou regras condicionais\",\"examplePrompts\":[\"adicione validacao cruzada de email\",\"crie validacoes condicionais para empresa\"]},{\"id\":\"local-transient\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"local-transient\",\"aiDescription\":\"Campos locais/transient que participam da UI mas ficam fora do payload backend por padrao.\",\"tags\":[\"fields\",\"local\",\"transient\",\"submit\"],\"useWhen\":\"usuario precisa de campos auxiliares no formulario que nao devem participar do payload persistido\",\"examplePrompts\":[\"adicione um campo local que nao seja enviado ao backend\",\"crie campos auxiliares transient para ajudar no preenchimento\"]},{\"id\":\"entity-lookup-procurement\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"entity-lookup-procurement\",\"aiDescription\":\"Formulario de pedido de compra com Entity Lookup corporativo, RESOURCE_ENTITY, cascata, reidratacao e politica de selecao.\",\"tags\":[\"entity-lookup\",\"resource-entity\",\"option-source\",\"cascading\",\"rehydration\",\"procurement\"],\"useWhen\":\"usuario precisa selecionar entidades reais do dominio com status, permissao, navegacao, dependsOn e by-ids\",\"examplePrompts\":[\"crie um pedido de compra com lookup de fornecedor contrato e produto\",\"gere entityLookup com dependsOn e dependencyFilterMap\",\"mostre um formulario com RESOURCE_ENTITY e reidratacao por by-ids\"]},{\"id\":\"visual-block-domain-rules\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"visual-block-domain-rules\",\"aiDescription\":\"Regras de dominio que alteram visualBlock text/title/message/style sem criar campos nem payload.\",\"tags\":[\"visual-block\",\"form-rules\",\"domain-rules\",\"rich-content\",\"llm-authoring\"],\"useWhen\":\"usuario precisa de avisos, orientacoes e copy operacional condicionais sem alterar submit payload\",\"examplePrompts\":[\"crie regras de dominio para alterar avisos visuais do formulario\",\"adicione visualBlock rules para LGPD compliance ou risco de fornecedor\",\"mostre regras de texto para blocos visuais sem criar campos\"]},{\"id\":\"command-rules\",\"registryKey\":\"praxis-dynamic-form\",\"variantId\":\"command-rules\",\"aiDescription\":\"Regras condicionais governadas que executam GlobalActionRef depois que valores calculados estabilizam.\",\"tags\":[\"formCommandRules\",\"global-action\",\"computed-values\",\"business-rules\"],\"useWhen\":\"usuario precisa disparar alertas, confirmacoes ou comandos host-mediated por regra declarativa do formulario\",\"examplePrompts\":[\"crie uma regra que alerta quando idade calculada for menor que 18\",\"confirme quando o periodo de ferias iniciar em uma sexta-feira\",\"mostre formCommandRules com dialog.alert e dialog.confirm\"]}]},\"component\":\"praxis-dynamic-form\",\"inputs\":{\"resourcePath\":\"/api/employees\",\"resourceId\":\"123\",\"mode\":\"edit\",\"config\":{\"_comment\":\"Use praxis-dynamic-form.form-config.json for a full FormConfig example.\",\"sections\":[{\"id\":\"minimal\",\"rows\":[]}],\"presentation\":{\"labelFontSize\":12,\"valueFontSize\":14,\"labelPosition\":\"left\",\"compact\":false,\"density\":\"cozy\",\"labelWidth\":140,\"labelAlign\":\"start\",\"valueAlign\":\"end\"}},\"schemaSource\":\"resource\",\"enableCustomization\":true,\"formId\":\"employee-form\",\"layout\":{\"formTitle\":\"Legacy layout example\",\"formDescription\":\"Fieldsets-based layout (legacy)\",\"fieldsets\":[{\"id\":\"legacy-basic\",\"title\":\"Legacy\",\"orientation\":\"vertical\",\"rows\":[{\"id\":\"legacy-row-1\",\"orientation\":\"horizontal\",\"fields\":[{\"name\":\"legacyField\",\"label\":\"Legacy field\",\"controlType\":\"input\"}]}]}]},\"backConfig\":{\"strategy\":\"navigate\",\"returnTo\":\"/employees\",\"confirmOnDirty\":true},\"hooks\":{\"beforeInit\":[{\"id\":\"load-static-options\",\"priority\":100,\"timeoutMs\":2000,\"args\":{\"source\":\"cache\"}}],\"afterInit\":[],\"beforeValidate\":[],\"afterValidate\":[],\"beforeSubmit\":[],\"afterSubmit\":[{\"id\":\"notify-success\",\"priority\":10}],\"onError\":[]},\"removeEmptyContainersOnSave\":true,\"reactiveValidation\":true,\"reactiveValidationDebounceMs\":250,\"notifyIfOutdated\":\"snackbar\",\"snoozeMs\":86400000,\"autoOpenSettingsOnOutdated\":false,\"readonlyModeGlobal\":false,\"disabledModeGlobal\":false,\"presentationModeGlobal\":false,\"visibleGlobal\":true,\"customEndpoints\":{\"getAll\":\"/api/employees\",\"getById\":\"/api/employees/{id}\",\"create\":\"/api/employees\",\"update\":\"/api/employees/{id}\",\"delete\":\"/api/employees/{id}\",\"filter\":\"/api/employees/filter\",\"schema\":\"/api/employees/schemas\"}},\"outputs\":{\"formSubmit\":{\"payload\":{\"stage\":\"after\",\"formData\":{\"id\":123,\"fullName\":\"Ana Souza\"},\"rawFormData\":{\"id\":123,\"fullName\":\"Ana Souza\",\"approvalComment\":\"Conferido com o solicitante\"},\"isValid\":true,\"validationErrors\":[],\"entityId\":123,\"operation\":\"update\",\"result\":{\"status\":\"ok\"}}},\"formCancel\":{\"payload\":null},\"formReset\":{\"payload\":null},\"configChange\":{\"payload\":{\"sections\":[{\"id\":\"minimal\",\"rows\":[]}]}},\"formReady\":{\"payload\":{\"formGroup\":\"[FormGroup]\",\"fieldsMetadata\":[{\"name\":\"fullName\",\"label\":\"Full name\",\"controlType\":\"input\"}],\"layout\":{\"formTitle\":\"Employee\"},\"hasEntity\":true,\"entityId\":123}},\"valueChange\":{\"payload\":{\"formData\":{\"email\":\"ana@example.com\"},\"changedField\":\"email\",\"previousValue\":\"old@example.com\",\"currentValue\":\"ana@example.com\",\"changedFields\":[\"email\"],\"isValid\":true,\"entityId\":123}},\"syncCompleted\":{\"payload\":{\"hasChanges\":true,\"addedFields\":[{\"name\":\"nickname\",\"label\":\"Nickname\",\"controlType\":\"input\"}],\"removedFields\":[\"legacyField\"],\"modifiedFields\":[{\"fieldName\":\"email\",\"property\":\"label\",\"localValue\":\"Email\",\"serverValue\":\"E-mail\"}],\"conflicts\":[{\"fieldName\":\"salary\",\"reason\":\"user-customized\",\"resolution\":\"keep-local\"}]}},\"initializationError\":{\"payload\":{\"stage\":\"schema-fetch\",\"error\":{\"message\":\"Schema failed to load\"},\"context\":{\"formId\":\"employee-form\",\"resourcePath\":\"/api/employees\",\"hasLocalConfig\":true},\"recoverable\":true,\"userMessage\":\"Unable to load form schema.\"}},\"enableCustomizationChange\":{\"payload\":true},\"customAction\":{\"payload\":{\"actionId\":\"archive\",\"formData\":{\"id\":123},\"isValid\":true,\"source\":\"button\"}},\"actionConfirmation\":{\"payload\":{\"actionId\":\"archive\",\"message\":\"Confirm archive?\",\"confirmed\":true}},\"schemaStatusChange\":{\"payload\":{\"outdated\":false,\"serverHash\":\"hash-abc-123\",\"lastVerifiedAt\":\"2024-02-02T10:00:00Z\",\"formId\":\"employee-form\"}}}}",
10164
10392
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.json",
@@ -10168,7 +10396,7 @@
10168
10396
  "corpusVersion": "1.0.0"
10169
10397
  },
10170
10398
  {
10171
- "chunkIndex": 97,
10399
+ "chunkIndex": 98,
10172
10400
  "chunkKind": "recipe",
10173
10401
  "content": "{\"_comment\":\"Receita de layout complexo com múltiplas seções, colunas assimétricas (2/3 + 1/3) e ações posicionadas explicitamente.\",\"templateMeta\":{\"variantId\":\"layout\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"tags\":[\"layout\",\"sections\"],\"useWhen\":\"ajustar layout, secoes, linhas e colunas\",\"examplePrompts\":[\"organize o layout em colunas\",\"divida o formulario em secoes\"]},\"metadata\":{\"name\":\"Complex Layout Example\",\"version\":\"v1\"},\"sections\":[{\"id\":\"summary\",\"title\":\"Resumo\",\"description\":\"Informações principais em colunas assimétricas.\",\"rows\":[{\"id\":\"summary-row-1\",\"columns\":[{\"id\":\"summary-main\",\"span\":{\"md\":8,\"lg\":8},\"fields\":[\"title\",\"description\"],\"_comment\":\"Coluna principal ocupando 2/3 da largura.\"},{\"id\":\"summary-side\",\"span\":{\"md\":4,\"lg\":4},\"fields\":[\"status\",\"priority\",\"owner\"],\"_comment\":\"Coluna lateral ocupando 1/3 da largura.\"}]}]},{\"id\":\"dates\",\"title\":\"Datas\",\"rows\":[{\"id\":\"dates-row-1\",\"columns\":[{\"id\":\"dates-start\",\"span\":{\"md\":4,\"lg\":4},\"fields\":[\"startDate\"]},{\"id\":\"dates-due\",\"span\":{\"md\":4,\"lg\":4},\"fields\":[\"dueDate\"]},{\"id\":\"dates-sla\",\"span\":{\"md\":4,\"lg\":4},\"fields\":[\"slaDays\"]}],\"_comment\":\"Linha com 3 colunas de largura igual (automatico).\"}]},{\"id\":\"attachments\",\"title\":\"Anexos e Comentários\",\"rows\":[{\"id\":\"attachments-row-1\",\"columns\":[{\"id\":\"attachments-col\",\"fields\":[\"attachments\"]}]},{\"id\":\"attachments-row-2\",\"columns\":[{\"id\":\"notes-col\",\"fields\":[\"notes\"]}]}]}],\"fieldMetadata\":[{\"name\":\"title\",\"label\":\"Título\",\"controlType\":\"input\",\"validators\":{\"required\":true}},{\"name\":\"description\",\"label\":\"Descrição\",\"controlType\":\"textarea\",\"rows\":3},{\"name\":\"status\",\"label\":\"Status\",\"controlType\":\"select\",\"options\":[{\"label\":\"Aberto\",\"value\":\"OPEN\"},{\"label\":\"Fechado\",\"value\":\"CLOSED\"}]},{\"name\":\"priority\",\"label\":\"Prioridade\",\"controlType\":\"select\",\"options\":[{\"label\":\"Alta\",\"value\":\"HIGH\"},{\"label\":\"Média\",\"value\":\"MEDIUM\"},{\"label\":\"Baixa\",\"value\":\"LOW\"}]},{\"name\":\"owner\",\"label\":\"Responsável\",\"controlType\":\"autoComplete\",\"searchable\":true},{\"name\":\"startDate\",\"label\":\"Início\",\"controlType\":\"date\"},{\"name\":\"dueDate\",\"label\":\"Entrega\",\"controlType\":\"date\"},{\"name\":\"slaDays\",\"label\":\"SLA (dias)\",\"controlType\":\"numericTextBox\"},{\"name\":\"attachments\",\"label\":\"Anexos\",\"controlType\":\"upload\"},{\"name\":\"notes\",\"label\":\"Notas\",\"controlType\":\"textarea\",\"rows\":4}],\"actions\":{\"submit\":{\"id\":\"save\",\"label\":\"Salvar\",\"color\":\"primary\",\"visible\":true,\"type\":\"submit\"},\"cancel\":{\"id\":\"cancel\",\"label\":\"Cancelar\",\"color\":\"basic\",\"visible\":true,\"type\":\"button\"},\"reset\":{\"id\":\"reset\",\"label\":\"Limpar\",\"color\":\"basic\",\"visible\":false,\"type\":\"reset\"},\"position\":\"right\",\"placement\":\"afterSections\"}}",
10174
10402
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.layout.json",
@@ -10178,7 +10406,7 @@
10178
10406
  "corpusVersion": "1.0.0"
10179
10407
  },
10180
10408
  {
10181
- "chunkIndex": 98,
10409
+ "chunkIndex": 99,
10182
10410
  "chunkKind": "recipe",
10183
10411
  "content": "{\"_comment\":\"Recipe for host local/transient fields in PraxisDynamicForm. These fields participate in UI state but are omitted from backend payloads by default.\",\"templateMeta\":{\"variantId\":\"local-transient\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"tags\":[\"fields\",\"local\",\"transient\",\"submit\"],\"useWhen\":\"campos auxiliares do host devem ajudar no preenchimento sem entrar no payload enviado ao backend\",\"examplePrompts\":[\"adicione campos locais que nao sejam enviados ao backend\",\"crie campos transient para calculo ou confirmacao visual\",\"mostre formData filtrado e rawFormData completo no submit\"]},\"metadata\":{\"version\":\"2.0.0\",\"source\":\"local\",\"schemaId\":\"path:/api/employees#request\"},\"fieldMetadata\":[{\"name\":\"fullName\",\"label\":\"Nome completo\",\"controlType\":\"input\",\"validators\":{\"required\":true,\"minLength\":3}},{\"name\":\"email\",\"label\":\"Email\",\"controlType\":\"email\",\"validators\":{\"required\":true,\"email\":true}},{\"name\":\"approvalComment\",\"label\":\"Comentario interno de aprovacao\",\"controlType\":\"textarea\",\"source\":\"local\",\"submitPolicy\":\"omit\",\"description\":\"Campo auxiliar do host. Participa da UI e de regras locais, mas nao entra em formSubmit.formData.\"},{\"name\":\"calculatedRiskScore\",\"label\":\"Score calculado\",\"controlType\":\"numericTextBox\",\"transient\":true,\"readOnly\":true,\"description\":\"Valor calculado no cliente para orientar o preenchimento. Omitido do payload por padrao.\"},{\"name\":\"manualOverrideReason\",\"label\":\"Justificativa de ajuste manual\",\"controlType\":\"textarea\",\"source\":\"local\",\"submitPolicy\":\"includeWhenDirty\",\"description\":\"Exemplo de excecao: campo local enviado somente se o usuario alterar o controle.\"}],\"sections\":[{\"id\":\"employee-data\",\"title\":\"Dados do funcionario\",\"rows\":[{\"id\":\"identity-row\",\"columns\":[{\"id\":\"identity-column\",\"fields\":[\"fullName\",\"email\"]}]}]},{\"id\":\"host-assistance\",\"title\":\"Apoio ao preenchimento\",\"rows\":[{\"id\":\"local-row\",\"columns\":[{\"id\":\"local-column\",\"fields\":[\"approvalComment\",\"calculatedRiskScore\",\"manualOverrideReason\"]}]}]}],\"submitExample\":{\"rawFormData\":{\"fullName\":\"Ana Souza\",\"email\":\"ana@example.com\",\"approvalComment\":\"Validado com RH\",\"calculatedRiskScore\":82,\"manualOverrideReason\":\"Ajuste autorizado\"},\"formData\":{\"fullName\":\"Ana Souza\",\"email\":\"ana@example.com\",\"manualOverrideReason\":\"Ajuste autorizado\"},\"notes\":[\"approvalComment usa submitPolicy omit e fica somente em rawFormData.\",\"calculatedRiskScore usa transient true e fica somente em rawFormData.\",\"manualOverrideReason usa includeWhenDirty e entra em formData apenas quando o controle estiver dirty.\"]}}",
10184
10412
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.local-transient.json",
@@ -10188,7 +10416,7 @@
10188
10416
  "corpusVersion": "1.0.0"
10189
10417
  },
10190
10418
  {
10191
- "chunkIndex": 99,
10419
+ "chunkIndex": 100,
10192
10420
  "chunkKind": "recipe",
10193
10421
  "content": "{\"_comment\":\"Receita focada em validações complexas: campos dependentes, validação cruzada (matchField), assíncrona (unique) e regras condicionais.\",\"templateMeta\":{\"variantId\":\"validation\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"tags\":[\"validation\",\"rules\"],\"useWhen\":\"criar validacoes avancadas e regras condicionais\",\"examplePrompts\":[\"adicione validacao cruzada de email\",\"crie regras condicionais por tipo de conta\"]},\"metadata\":{\"name\":\"Advanced Validation Form\",\"version\":\"v1\"},\"fieldMetadata\":[{\"name\":\"username\",\"label\":\"Usuário\",\"controlType\":\"input\",\"unique\":true,\"validators\":{\"required\":true,\"minLength\":4,\"pattern\":\"^[a-z0-9_]+$\",\"patternMessage\":\"Apenas letras minúsculas, números e underline.\",\"uniqueValidator\":\"checkUsernameUnique\",\"uniqueMessage\":\"Este usuário já está em uso.\"},\"_comment\":\"Validação de pattern regex e unicidade simulada.\"},{\"name\":\"email\",\"label\":\"E-mail\",\"controlType\":\"email\",\"validators\":{\"required\":true,\"email\":true}},{\"name\":\"confirmEmail\",\"label\":\"Confirmar E-mail\",\"controlType\":\"email\",\"validators\":{\"required\":true,\"matchField\":\"email\",\"matchFieldMessage\":\"Os e-mails não conferem.\"},\"_comment\":\"Validação cruzada: deve ser igual ao campo 'email'.\"},{\"name\":\"password\",\"label\":\"Senha\",\"controlType\":\"password\",\"validators\":{\"required\":true,\"minLength\":8,\"customValidator\":\"passwordStrength\"}},{\"name\":\"age\",\"label\":\"Idade\",\"controlType\":\"numericTextBox\",\"validators\":{\"required\":true,\"min\":18,\"max\":120,\"minMessage\":\"É necessário ser maior de 18 anos.\"}},{\"name\":\"accountType\",\"label\":\"Tipo de Conta\",\"controlType\":\"select\",\"options\":[{\"label\":\"Pessoal\",\"value\":\"PERSONAL\"},{\"label\":\"Empresarial\",\"value\":\"BUSINESS\"}],\"defaultValue\":\"PERSONAL\"},{\"name\":\"cnpj\",\"label\":\"CNPJ\",\"controlType\":\"cpfCnpjInput\",\"maskType\":\"cnpj\",\"conditionalRequired\":{\"==\":[{\"var\":\"accountType\"},\"BUSINESS\"]},\"conditionalDisplay\":{\"==\":[{\"var\":\"accountType\"},\"BUSINESS\"]},\"_comment\":\"Campo condicional: só aparece e é obrigatório se accountType for 'BUSINESS'.\"},{\"name\":\"bio\",\"label\":\"Biografia\",\"controlType\":\"textarea\",\"validators\":{\"minWords\":10,\"maxLength\":500},\"hint\":\"Conte-nos um pouco sobre você (mínimo 10 palavras).\"},{\"name\":\"terms\",\"label\":\"Aceito os termos de uso\",\"controlType\":\"checkbox\",\"validators\":{\"requiredChecked\":true}}],\"sections\":[{\"id\":\"credentials\",\"title\":\"Credenciais\",\"rows\":[{\"id\":\"credentials-row-1\",\"columns\":[{\"id\":\"username-col\",\"fields\":[\"username\"]}]},{\"id\":\"credentials-row-2\",\"columns\":[{\"id\":\"email-col\",\"fields\":[\"email\",\"confirmEmail\"]}]},{\"id\":\"credentials-row-3\",\"columns\":[{\"id\":\"password-col\",\"fields\":[\"password\"]}]}]},{\"id\":\"profile\",\"title\":\"Perfil\",\"rows\":[{\"id\":\"profile-row-1\",\"columns\":[{\"id\":\"age-col\",\"fields\":[\"age\",\"accountType\"]}]},{\"id\":\"profile-row-2\",\"columns\":[{\"id\":\"cnpj-col\",\"fields\":[\"cnpj\"]}]},{\"id\":\"profile-row-3\",\"columns\":[{\"id\":\"bio-col\",\"fields\":[\"bio\"]}]}]},{\"id\":\"terms\",\"rows\":[{\"id\":\"terms-row-1\",\"columns\":[{\"id\":\"terms-col\",\"fields\":[\"terms\"]}]}]}],\"actions\":{\"submit\":{\"id\":\"submit\",\"label\":\"Cadastrar\",\"color\":\"primary\",\"visible\":true,\"type\":\"submit\"},\"cancel\":{\"id\":\"cancel\",\"label\":\"Cancelar\",\"color\":\"basic\",\"visible\":false,\"type\":\"button\"},\"reset\":{\"id\":\"reset\",\"label\":\"Limpar\",\"color\":\"basic\",\"visible\":false,\"type\":\"reset\"}}}",
10194
10422
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.validation.json",
@@ -10198,7 +10426,7 @@
10198
10426
  "corpusVersion": "1.0.0"
10199
10427
  },
10200
10428
  {
10201
- "chunkIndex": 100,
10429
+ "chunkIndex": 101,
10202
10430
  "chunkKind": "recipe",
10203
10431
  "content": "{\"_comment\":\"Official Praxis Dynamic Form recipe for derived visualBlock materializations.\",\"_comment2\":\"Use this when governed semantic decisions already need conditional UI guidance, compliance copy or operational warnings without creating fields or changing submit payload.\",\"templateMeta\":{\"variantId\":\"visual-block-domain-rules\",\"variantOf\":\"praxis-dynamic-form\",\"registryKey\":\"praxis-dynamic-form\",\"status\":\"public-example\",\"tags\":[\"visual-block\",\"form-rules\",\"domain-rules\",\"rich-content\",\"llm-authoring\"],\"useWhen\":\"Materialize governed semantic decisions as Dynamic Form visual guidance while keeping visual blocks outside fieldMetadata, FormControl and payload.\",\"examplePrompts\":[\"materialize governed employee status supplier risk and support priority decisions as visual block guidance\",\"project conditional compliance guidance without changing submit payload\",\"show how LLMs should materialize visualBlock text title message projections with node ids\"]},\"platformValue\":{\"canonicalOwner\":\"praxis-config-starter owns governed semantic decisions; @praxisui/dynamic-form owns derived formRules and FormColumn.items.\",\"visualBlockRuntime\":\"@praxisui/rich-content owns RichContentDocument rendering.\",\"safeRuleContract\":\"visualBlock rules may update visible, hidden, text, title, message, className, rootClassName, layout and style through RULE_PROPERTY_SCHEMA.\",\"payloadBoundary\":\"visualBlock is visual-only: never put visual blocks in fieldMetadata and never read them from formData.\",\"llmContract\":\"LLMs should author business rules through governed domain-rules/shared_rule_authoring. Use operationId rule.visualBlockGuidance.add or equivalent formRules only as a derived UI materialization; formRulesState is generated by Praxis internals after review.\"},\"authoringGuidance\":[\"Do not use visualBlockGuidance as the canonical business-rule authoring path.\",\"Prefer domain-rules/shared_rule_authoring for business-rule, policy, eligibility, validation, compliance or shared decisions.\",\"Use operationId rule.visualBlockGuidance.add only when a governed decision needs a derived Dynamic Form visual projection.\",\"Use targetType visualBlock and target the richContent item id from sections[].rows[].columns[].items[].id.\",\"Set type visualBlockGuidance, context notification and metadata.origin llm with metadata.reviewStatus pending.\",\"Use textNodeId, titleNodeId or messageNodeId when the target document has more than one editable textual node.\",\"Keep condition in canonical Json Logic.\",\"Do not write document, HTML, event handlers, arbitrary URLs or field-like metadata from a rule.\",\"Use the editor diagnostics and Corrigir action when a property is rejected or partially sanitized.\",\"Ask an LLM for semantic correction only when the desired replacement needs business meaning.\"],\"teaches\":[\"formRules.visualBlock\",\"visualBlock.text\",\"visualBlock.title\",\"visualBlock.message\",\"visualBlock.textNodeId\",\"visualBlock.titleNodeId\",\"visualBlock.messageNodeId\",\"visualBlock.visual-only\",\"llm-generated-pending-review\"],\"config\":{\"fieldMetadata\":[{\"name\":\"ativo\",\"label\":\"Ativo\",\"controlType\":\"checkbox\",\"source\":\"schema\"},{\"name\":\"cargoId\",\"label\":\"Cargo\",\"controlType\":\"select\",\"source\":\"schema\",\"options\":[{\"label\":\"Analista\",\"value\":\"analista\"},{\"label\":\"Gestor\",\"value\":\"gestor\"}]},{\"name\":\"riscoFornecedor\",\"label\":\"Risco do fornecedor\",\"controlType\":\"select\",\"source\":\"schema\",\"options\":[{\"label\":\"Baixo\",\"value\":\"baixo\"},{\"label\":\"Alto\",\"value\":\"alto\"},{\"label\":\"Critico\",\"value\":\"critico\"}]},{\"name\":\"prioridade\",\"label\":\"Prioridade\",\"controlType\":\"select\",\"source\":\"schema\",\"options\":[{\"label\":\"Normal\",\"value\":\"normal\"},{\"label\":\"Alta\",\"value\":\"alta\"}]}],\"sections\":[{\"id\":\"domain-guidance\",\"title\":\"Domain guidance examples\",\"rows\":[{\"id\":\"domain-guidance-row\",\"columns\":[{\"id\":\"domain-guidance-column\",\"items\":[{\"kind\":\"richContent\",\"id\":\"profile-status-card\",\"layout\":\"block\",\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"card\",\"id\":\"profile-status-title\",\"title\":\"Employee active\",\"content\":[{\"type\":\"text\",\"id\":\"profile-status-message\",\"text\":\"Keep assignment, department and contact details current.\"}]}]}},{\"kind\":\"field\",\"id\":\"field-ativo\",\"fieldName\":\"ativo\"},{\"kind\":\"field\",\"id\":\"field-cargoId\",\"fieldName\":\"cargoId\"},{\"kind\":\"richContent\",\"id\":\"supplier-risk-notice\",\"layout\":\"block\",\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"id\":\"message\",\"text\":\"Supplier has no critical blocks for this order.\"}]}},{\"kind\":\"field\",\"id\":\"field-riscoFornecedor\",\"fieldName\":\"riscoFornecedor\"},{\"kind\":\"richContent\",\"id\":\"ticket-sla-guidance\",\"layout\":\"block\",\"document\":{\"kind\":\"praxis.rich-content\",\"version\":\"1.0.0\",\"nodes\":[{\"type\":\"text\",\"id\":\"text\",\"text\":\"Register enough context for triage and follow-up.\"}]}},{\"kind\":\"field\",\"id\":\"field-prioridade\",\"fieldName\":\"prioridade\"}],\"fields\":[\"ativo\",\"cargoId\",\"riscoFornecedor\",\"prioridade\"]}]}]}],\"formRules\":[{\"id\":\"employee-inactive-guidance\",\"name\":\"Employee inactive guidance\",\"type\":\"visualBlockGuidance\",\"targetType\":\"visualBlock\",\"context\":\"notification\",\"targets\":[\"profile-status-card\"],\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"},\"effect\":{\"condition\":{\"===\":[{\"var\":\"ativo\"},false]},\"properties\":{\"title\":\"Employee inactive\",\"titleNodeId\":\"profile-status-title\",\"message\":\"Review offboarding, access revocation and justification before saving.\",\"messageNodeId\":\"profile-status-message\",\"className\":\"employee-status-card employee-status-card--warning\"},\"propertiesWhenFalse\":{\"title\":\"Employee active\",\"titleNodeId\":\"profile-status-title\",\"message\":\"Keep assignment, department and contact details current.\",\"messageNodeId\":\"profile-status-message\",\"className\":\"employee-status-card employee-status-card--ok\"}}},{\"id\":\"supplier-risk-guidance\",\"name\":\"Supplier risk guidance\",\"type\":\"visualBlockGuidance\",\"targetType\":\"visualBlock\",\"context\":\"notification\",\"targets\":[\"supplier-risk-notice\"],\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"},\"effect\":{\"condition\":{\"in\":[{\"var\":\"riscoFornecedor\"},[\"alto\",\"critico\"]]},\"properties\":{\"message\":\"Supplier requires compliance approval before issuing the order.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--critical\"},\"propertiesWhenFalse\":{\"message\":\"Supplier has no critical blocks for this order.\",\"messageNodeId\":\"message\",\"className\":\"supplier-risk-notice supplier-risk-notice--neutral\"}}},{\"id\":\"ticket-priority-copy\",\"name\":\"Ticket priority copy\",\"type\":\"visualBlockGuidance\",\"targetType\":\"visualBlock\",\"context\":\"notification\",\"targets\":[\"ticket-sla-guidance\"],\"metadata\":{\"origin\":\"llm\",\"reviewStatus\":\"pending\"},\"effect\":{\"condition\":{\"===\":[{\"var\":\"prioridade\"},\"alta\"]},\"properties\":{\"text\":\"High priority: confirm impact, SLA deadline and escalation owner.\",\"textNodeId\":\"text\",\"rootClassName\":\"ticket-sla-guidance ticket-sla-guidance--high\"},\"propertiesWhenFalse\":{\"text\":\"Register enough context for triage and follow-up.\",\"textNodeId\":\"text\",\"rootClassName\":\"ticket-sla-guidance ticket-sla-guidance--standard\"}}}]},\"diagnosticExpectations\":{\"validTargets\":[\"profile-status-card\",\"supplier-risk-notice\",\"ticket-sla-guidance\"],\"visualOnly\":true,\"formRulesStateAuthoredByRecipe\":false,\"reviewRequired\":[\"employee-inactive-guidance\",\"supplier-risk-guidance\",\"ticket-priority-copy\"]}}",
10204
10432
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-form.visual-block-domain-rules.json",
@@ -10232,9 +10460,23 @@
10232
10460
  "name": "resourcePath",
10233
10461
  "type": "string",
10234
10462
  "required": false,
10235
- "description": "Resource path used by filter schema.",
10463
+ "description": "Resource path or catalog resourceKey used to resolve the filter schema.",
10236
10464
  "label": "Resource"
10237
10465
  },
10466
+ {
10467
+ "name": "endpointKey",
10468
+ "type": "ApiEndpoint",
10469
+ "required": false,
10470
+ "description": "Canonical endpoint key used to resolve the filter schema in multi-endpoint hosts.",
10471
+ "label": "Endpoint Key"
10472
+ },
10473
+ {
10474
+ "name": "apiUrlEntry",
10475
+ "type": "ApiUrlEntry | null",
10476
+ "required": false,
10477
+ "description": "Explicit API URL entry for detached hosts that render the filter form outside the route injector.",
10478
+ "label": "API URL Entry"
10479
+ },
10238
10480
  {
10239
10481
  "name": "mode",
10240
10482
  "type": "string",
@@ -10354,7 +10596,6 @@
10354
10596
  }
10355
10597
  ],
10356
10598
  "configEditor": {
10357
- "component": "[ref:PraxisFilterFormWidgetConfigEditor]",
10358
10599
  "title": "Configurar filtro"
10359
10600
  },
10360
10601
  "authoringManifestRef": {
@@ -13100,6 +13341,185 @@
13100
13341
  "responsive em card"
13101
13342
  ]
13102
13343
  },
13344
+ {
13345
+ "path": "fieldMetadata[].presentation.visualization.scaleScope",
13346
+ "category": "layout",
13347
+ "valueKind": "enum",
13348
+ "allowedValues": [
13349
+ "row",
13350
+ "page"
13351
+ ],
13352
+ "description": "Escopo de normalizacao de escala para series e valores em colecoes: row (local por linha) ou page (sincronizado na pagina visivel).",
13353
+ "intentExamples": [
13354
+ "sincronizar escala de sparklines na pagina",
13355
+ "comparar amplitude entre linhas"
13356
+ ]
13357
+ },
13358
+ {
13359
+ "path": "fieldMetadata[].presentation.visualization.tone",
13360
+ "category": "appearance",
13361
+ "valueKind": "enum",
13362
+ "allowedValues": [
13363
+ "neutral",
13364
+ "info",
13365
+ "success",
13366
+ "warning",
13367
+ "danger",
13368
+ "critical"
13369
+ ],
13370
+ "description": "Tom semantico estatico da micro visualizacao.",
13371
+ "intentExamples": [
13372
+ "neutral",
13373
+ "success",
13374
+ "warning",
13375
+ "danger",
13376
+ "critical"
13377
+ ]
13378
+ },
13379
+ {
13380
+ "path": "fieldMetadata[].presentation.visualization.toneExpr",
13381
+ "category": "appearance",
13382
+ "valueKind": "object",
13383
+ "description": "Expressao Json Logic ou caminho row.<campo> para resolver dinamicamente o tom semantico da micro visualizacao.",
13384
+ "safetyNotes": "Deve retornar apenas um dos tons permitidos em presentationVisualizationTone."
13385
+ },
13386
+ {
13387
+ "path": "fieldMetadata[].presentation.visualization.valueExpr",
13388
+ "category": "behavior",
13389
+ "valueKind": "object",
13390
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter o valor principal da micro visualizacao.",
13391
+ "intentExamples": [
13392
+ "row.slaValue",
13393
+ "row.progresso"
13394
+ ]
13395
+ },
13396
+ {
13397
+ "path": "fieldMetadata[].presentation.visualization.valueSuffix",
13398
+ "category": "appearance",
13399
+ "valueKind": "string",
13400
+ "description": "Sufixo de unidade anexado ao valor numerico formatado (ex: \"%\", \" pts\", \" ms\", \" d\").",
13401
+ "intentExamples": [
13402
+ "mostrar % no bullet",
13403
+ "adicionar sufixo pts no radial"
13404
+ ]
13405
+ },
13406
+ {
13407
+ "path": "fieldMetadata[].presentation.visualization.compactValue",
13408
+ "category": "appearance",
13409
+ "valueKind": "boolean",
13410
+ "description": "Formata valores numericos em notacao compacta (ex: 1.2M, 45.3K) para celulas densas.",
13411
+ "intentExamples": [
13412
+ "compactar valores financeiros grandes",
13413
+ "mostrar 1.2M em comparison"
13414
+ ]
13415
+ },
13416
+ {
13417
+ "path": "fieldMetadata[].presentation.visualization.min",
13418
+ "category": "behavior",
13419
+ "valueKind": "number",
13420
+ "description": "Limite minimo explicito da escala numerica."
13421
+ },
13422
+ {
13423
+ "path": "fieldMetadata[].presentation.visualization.max",
13424
+ "category": "behavior",
13425
+ "valueKind": "number",
13426
+ "description": "Limite maximo explicito da escala numerica."
13427
+ },
13428
+ {
13429
+ "path": "fieldMetadata[].presentation.visualization.total",
13430
+ "category": "behavior",
13431
+ "valueKind": "number",
13432
+ "description": "Total explicito para proporcionalidade em stackedBar ou radial."
13433
+ },
13434
+ {
13435
+ "path": "fieldMetadata[].presentation.visualization.target",
13436
+ "category": "behavior",
13437
+ "valueKind": "number",
13438
+ "description": "Meta fixa para comparacao em bullet."
13439
+ },
13440
+ {
13441
+ "path": "fieldMetadata[].presentation.visualization.targetExpr",
13442
+ "category": "behavior",
13443
+ "valueKind": "object",
13444
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter a meta por linha em bullet.",
13445
+ "intentExamples": [
13446
+ "row.metaSla",
13447
+ "row.target"
13448
+ ]
13449
+ },
13450
+ {
13451
+ "path": "fieldMetadata[].presentation.visualization.baseline",
13452
+ "category": "behavior",
13453
+ "valueKind": "number",
13454
+ "description": "Valor de referencia fixo para comparison ou delta."
13455
+ },
13456
+ {
13457
+ "path": "fieldMetadata[].presentation.visualization.baselineExpr",
13458
+ "category": "behavior",
13459
+ "valueKind": "object",
13460
+ "description": "Caminho row.<campo> ou expressao Json Logic para obter o valor de referencia (baseline) por linha em comparison ou delta.",
13461
+ "intentExamples": [
13462
+ "row.orcamentoPrevisto",
13463
+ "row.indenizacoesTotal"
13464
+ ]
13465
+ },
13466
+ {
13467
+ "path": "fieldMetadata[].presentation.visualization.pointsExpr",
13468
+ "category": "behavior",
13469
+ "valueKind": "object",
13470
+ "description": "Caminho row.<campo> ou expressao Json Logic para serie de pontos em line, area ou column.",
13471
+ "intentExamples": [
13472
+ "row.trend",
13473
+ "row.historicoMensal"
13474
+ ]
13475
+ },
13476
+ {
13477
+ "path": "fieldMetadata[].presentation.visualization.segmentsExpr",
13478
+ "category": "behavior",
13479
+ "valueKind": "object",
13480
+ "description": "Caminho row.<campo> ou expressao Json Logic para lista de segmentos em stackedBar.",
13481
+ "intentExamples": [
13482
+ "row.capacitySegments",
13483
+ "row.distribuicao"
13484
+ ]
13485
+ },
13486
+ {
13487
+ "path": "fieldMetadata[].presentation.visualization.itemsExpr",
13488
+ "category": "behavior",
13489
+ "valueKind": "object",
13490
+ "description": "Caminho row.<campo> ou expressao Json Logic para lista de etapas em processFlow.",
13491
+ "intentExamples": [
13492
+ "row.flowSteps",
13493
+ "row.etapasAprovacao"
13494
+ ]
13495
+ },
13496
+ {
13497
+ "path": "fieldMetadata[].presentation.visualization.thresholds",
13498
+ "category": "appearance",
13499
+ "valueKind": "array",
13500
+ "description": "Faixas e limiares semanticos declarativos ({ value, min, max, tone, label }) para coloracao automatica e faixas qualitativas de bullet.",
13501
+ "intentExamples": [
13502
+ "[{ \"value\": 0, \"tone\": \"danger\" }, { \"value\": 60, \"tone\": \"warning\" }, { \"value\": 85, \"tone\": \"success\" }]"
13503
+ ]
13504
+ },
13505
+ {
13506
+ "path": "fieldMetadata[].presentation.visualization.stepLabelLineClamp",
13507
+ "category": "layout",
13508
+ "valueKind": "number",
13509
+ "description": "Numero maximo de linhas (1 ou 2) para rotulos de etapas em processFlow."
13510
+ },
13511
+ {
13512
+ "path": "fieldMetadata[].presentation.visualization.ariaLabel",
13513
+ "category": "accessibility",
13514
+ "valueKind": "string",
13515
+ "description": "Rotulo acessivel explicito da micro visualizacao."
13516
+ },
13517
+ {
13518
+ "path": "fieldMetadata[].presentation.visualization.ariaLabelExpr",
13519
+ "category": "accessibility",
13520
+ "valueKind": "object",
13521
+ "description": "Caminho row.<campo> ou expressao Json Logic para compor o rotulo acessivel por linha."
13522
+ },
13103
13523
  {
13104
13524
  "path": "fieldMetadata[].presentation.visualization.fallbackText",
13105
13525
  "category": "accessibility",
@@ -13107,6 +13527,12 @@
13107
13527
  "description": "Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.",
13108
13528
  "safetyNotes": "Deve explicar valor, unidade, meta, tendencia ou estado quando aplicavel."
13109
13529
  },
13530
+ {
13531
+ "path": "fieldMetadata[].presentation.visualization.fallbackTextExpr",
13532
+ "category": "accessibility",
13533
+ "valueKind": "object",
13534
+ "description": "Caminho row.<campo> ou expressao Json Logic para gerar o fallback textual dinamico por linha."
13535
+ },
13110
13536
  {
13111
13537
  "path": "fieldMetadata[].presentationRules",
13112
13538
  "category": "appearance",
@@ -13155,6 +13581,30 @@
13155
13581
  "exibir como porcentagem"
13156
13582
  ]
13157
13583
  },
13584
+ {
13585
+ "path": "fieldMetadata[].inlineVisualStyle",
13586
+ "category": "appearance",
13587
+ "valueKind": "enum",
13588
+ "allowedValues": [
13589
+ "compact",
13590
+ "graphic"
13591
+ ],
13592
+ "description": "Estilo visual para controles numericos percentuais inline (compact: pilula liquida com micro-anel e popover; graphic: card expandido com donut, trilho graduado e presets).",
13593
+ "intentExamples": [
13594
+ "usar percentual compacto na barra",
13595
+ "exibir card grafico de percentual"
13596
+ ]
13597
+ },
13598
+ {
13599
+ "path": "fieldMetadata[].percentPresets",
13600
+ "category": "data",
13601
+ "valueKind": "array",
13602
+ "description": "Lista de percentuais rapidos exibidos nos botoes de preset do Percent Studio (ex.: [0, 25, 50, 75, 100]).",
13603
+ "intentExamples": [
13604
+ "atalhos de percentual 10, 25, 50 e 100%",
13605
+ "definir presets de porcentagem"
13606
+ ]
13607
+ },
13158
13608
  {
13159
13609
  "path": "fieldMetadata[].validators",
13160
13610
  "category": "validation",
@@ -16090,9 +16540,11 @@
16090
16540
  "allowedValues": [
16091
16541
  "create",
16092
16542
  "edit",
16093
- "view"
16543
+ "view",
16544
+ "presentation",
16545
+ "dossier"
16094
16546
  ],
16095
- "description": "Modo de operação"
16547
+ "description": "Modos nativos preservados em documentos. Em novos fluxos, prefira view com presentationModeGlobal para separar operação dos dados e apresentação."
16096
16548
  }
16097
16549
  ],
16098
16550
  "editableTargets": [
@@ -17160,9 +17612,9 @@
17160
17612
  {
17161
17613
  "chunkIndex": 0,
17162
17614
  "chunkKind": "summary",
17163
- "content": "Component ID: praxis-filter-form\nSelector: praxis-filter-form\nFriendly Name: Praxis Filter Form\nDescription: Filter form driven by FormConfig and fieldMetadata.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, filter, configurable\nInputs:\n - config (FormConfig)\n - formId (string)\n - resourcePath (string)\n - mode (string)\nOutputs:\n - formReady ({ formGroup: FormGroup<Record<string, unknown>> })\n - valueChange ({ formData: Record<string, unknown> })\n - submit ({ formData: Record<string, unknown> })\n - validityChange (boolean)\n",
17615
+ "content": "Component ID: praxis-filter-form\nSelector: praxis-filter-form\nFriendly Name: Praxis Filter Form\nDescription: Filter form driven by FormConfig and fieldMetadata.\nCategory: form\nLib/Package: @praxisui/dynamic-form\nTags: widget, form, filter, configurable\nInputs:\n - config (FormConfig)\n - formId (string)\n - resourcePath (string)\n - endpointKey (ApiEndpoint)\n - apiUrlEntry (ApiUrlEntry | null)\n - mode (string)\nOutputs:\n - formReady ({ formGroup: FormGroup<Record<string, unknown>> })\n - valueChange ({ formData: Record<string, unknown> })\n - submit ({ formData: Record<string, unknown> })\n - validityChange (boolean)\n",
17164
17616
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/filter-form/praxis-filter-form.metadata.ts",
17165
- "contentHash": "a4b5375a63cfd32a3ec2cea1a357b5d0333d644b6fd91ea24ff02430dc1d994e",
17617
+ "contentHash": "da46a472f73093abeae12137ce3a6af4306e9e9b7e9bf3e6065ba772e46289a6",
17166
17618
  "sourceKind": "component_definition",
17167
17619
  "sourceId": "praxis-filter-form",
17168
17620
  "corpusVersion": "1.0.0"
@@ -17240,9 +17692,9 @@
17240
17692
  {
17241
17693
  "chunkIndex": 8,
17242
17694
  "chunkKind": "capabilities",
17243
- "content": "Schema Capability:\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n\nSchema Capability:\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n\nSchema Capability:\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n\nSchema Capability:\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n\nSchema Capability:\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.",
17695
+ "content": "Schema Capability:\n - Path: fieldMetadata[].iconFontSize\n Category: appearance\n Kind: string\n Description: Tamanho tipográfico do ícone principal.\n\nSchema Capability:\n - Path: fieldMetadata[].valuePresentation\n Category: appearance\n Kind: object\n Description: Formato canonico de exibicao em superficies readonly/display, como moeda, numero, percentual, data, datetime, time e boolean.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation\n Category: appearance\n Kind: object\n Description: Estado visual semantico base para presentationMode, incluindo presenter, tone, icon, label, badge, tooltip, appearance e formatter opcional.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.presenter\n Category: appearance\n Kind: enum\n Description: Tipo semantico de renderizacao em modo apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico mapeado pelo consumidor para tokens de tema.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.appearance\n Category: appearance\n Kind: enum\n Description: Nivel de enfase visual do apresentador.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.icon\n Category: appearance\n Kind: string\n Description: Nome de icone Material Symbols usado pelo apresentador semantico.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.label\n Category: identity\n Kind: string\n Description: Rotulo semantico exibido por apresentadores como status, badge ou chip.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.badge\n Category: appearance\n Kind: string\n Description: Marcador secundario opcional exibido junto ao valor em superficies de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.prefix\n Category: appearance\n Kind: string\n Description: Prefixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.suffix\n Category: appearance\n Kind: string\n Description: Sufixo visual readonly aplicado ao valor apresentado, sem alterar payload, filtros, ordenacao ou exportacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.valuePresentation\n Category: appearance\n Kind: object\n Description: Override de formatacao aplicado apenas pela superficie de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization\n Category: appearance\n Kind: object\n Description: Micro visualizacao renderer-neutral para superficies compactas como tabela, lista, header, card e form read-only.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.kind\n Category: appearance\n Kind: enum\n Description: Tipo semantico da micro visualizacao de apresentacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.surface\n Category: layout\n Kind: enum\n Description: Superficie alvo usada para aplicar regras de densidade e fallback.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.size\n Category: layout\n Kind: enum\n Description: Tamanho semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.scaleScope\n Category: layout\n Kind: enum\n Description: Escopo de normalizacao de escala para series e valores em colecoes: row (local por linha) ou page (sincronizado na pagina visivel).\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.tone\n Category: appearance\n Kind: enum\n Description: Tom semantico estatico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.toneExpr\n Category: appearance\n Kind: object\n Description: Expressao Json Logic ou caminho row.<campo> para resolver dinamicamente o tom semantico da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.valueExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter o valor principal da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.valueSuffix\n Category: appearance\n Kind: string\n Description: Sufixo de unidade anexado ao valor numerico formatado (ex: \"%\", \" pts\", \" ms\", \" d\").\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.compactValue\n Category: appearance\n Kind: boolean\n Description: Formata valores numericos em notacao compacta (ex: 1.2M, 45.3K) para celulas densas.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.min\n Category: behavior\n Kind: number\n Description: Limite minimo explicito da escala numerica.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.max\n Category: behavior\n Kind: number\n Description: Limite maximo explicito da escala numerica.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.total\n Category: behavior\n Kind: number\n Description: Total explicito para proporcionalidade em stackedBar ou radial.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.target\n Category: behavior\n Kind: number\n Description: Meta fixa para comparacao em bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.targetExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter a meta por linha em bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.baseline\n Category: behavior\n Kind: number\n Description: Valor de referencia fixo para comparison ou delta.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.baselineExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para obter o valor de referencia (baseline) por linha em comparison ou delta.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.pointsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para serie de pontos em line, area ou column.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.segmentsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para lista de segmentos em stackedBar.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.itemsExpr\n Category: behavior\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para lista de etapas em processFlow.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.thresholds\n Category: appearance\n Kind: array\n Description: Faixas e limiares semanticos declarativos ({ value, min, max, tone, label }) para coloracao automatica e faixas qualitativas de bullet.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.stepLabelLineClamp\n Category: layout\n Kind: number\n Description: Numero maximo de linhas (1 ou 2) para rotulos de etapas em processFlow.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.ariaLabel\n Category: accessibility\n Kind: string\n Description: Rotulo acessivel explicito da micro visualizacao.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.ariaLabelExpr\n Category: accessibility\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para compor o rotulo acessivel por linha.\n\nSchema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackText\n Category: accessibility\n Kind: string\n Description: Texto equivalente obrigatorio para fallback, exportacao e leitores de tela.",
17244
17696
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17245
- "contentHash": "680baee6a38106f22c4710309b6d65ef7e59d1ee08bb65cca97f004070a99d0c",
17697
+ "contentHash": "dc6be0dc67a901095196573bc7a8f81c4cae31110aa85265ef4ff6e1646b940b",
17246
17698
  "sourceKind": "component_definition",
17247
17699
  "sourceId": "praxis-filter-form",
17248
17700
  "corpusVersion": "1.0.0"
@@ -17250,9 +17702,9 @@
17250
17702
  {
17251
17703
  "chunkIndex": 9,
17252
17704
  "chunkKind": "capabilities",
17253
- "content": "Schema Capability:\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n\nSchema Capability:\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n\nSchema Capability:\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n\nSchema Capability:\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n\nSchema Capability:\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n\nSchema Capability:\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n\nSchema Capability:\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n\nSchema Capability:\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n\nSchema Capability:\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n\nSchema Capability:\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.",
17705
+ "content": "Schema Capability:\n - Path: fieldMetadata[].presentation.visualization.fallbackTextExpr\n Category: accessibility\n Kind: object\n Description: Caminho row.<campo> ou expressao Json Logic para gerar o fallback textual dinamico por linha.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules\n Category: appearance\n Kind: array\n Description: Regras Json Logic ordenadas que sobrescrevem presentation em modo readonly/display; regras posteriores que casam vencem.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].when\n Category: behavior\n Kind: object\n Description: Guarda Json Logic avaliada contra o contexto de apresentacao do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].presentationRules[].set\n Category: appearance\n Kind: object\n Description: Patch semantico aplicado sobre presentation quando a guarda for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].mask\n Category: appearance\n Kind: string\n Description: Máscara de input (padrão do componente).\n\nSchema Capability:\n - Path: fieldMetadata[].format\n Category: appearance\n Kind: string\n Description: Formato de exibição (ex: pipes).\n\nSchema Capability:\n - Path: fieldMetadata[].inlineVisualStyle\n Category: appearance\n Kind: enum\n Description: Estilo visual para controles numericos percentuais inline (compact: pilula liquida com micro-anel e popover; graphic: card expandido com donut, trilho graduado e presets).\n\nSchema Capability:\n - Path: fieldMetadata[].percentPresets\n Category: data\n Kind: array\n Description: Lista de percentuais rapidos exibidos nos botoes de preset do Percent Studio (ex.: [0, 25, 50, 75, 100]).\n\nSchema Capability:\n - Path: fieldMetadata[].validators\n Category: validation\n Kind: object\n Description: Objeto contendo todas as regras de validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório.\n\nSchema Capability:\n - Path: fieldMetadata[].required\n Category: validation\n Kind: boolean\n Description: Campo obrigatório (alias rápido do validators.required).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para required.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.email\n Category: validation\n Kind: boolean\n Description: Validação de formato de e-mail.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.emailMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para validação de email.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLength\n Category: validation\n Kind: number\n Description: Comprimento mínimo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para minLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLength\n Category: validation\n Kind: number\n Description: Comprimento máximo do texto.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxLengthMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para maxLength.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.min\n Category: validation\n Kind: number\n Description: Valor numérico mínimo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para min.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.max\n Category: validation\n Kind: number\n Description: Valor numérico máximo.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.maxMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para max.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.pattern\n Category: validation\n Kind: string\n Description: Regex para validação.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.patternMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para pattern.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpf\n Category: validation\n Kind: boolean\n Description: Validador de CPF (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpj\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfCnpj\n Category: validation\n Kind: boolean\n Description: Validador automatico CPF/CNPJ (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlpha\n Category: validation\n Kind: boolean\n Description: Validador de CNPJ alfanumerico (legado).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cpfMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CPF.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.cnpjAlphaMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para CNPJ alfanumerico.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.url\n Category: validation\n Kind: boolean\n Description: Validador de URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.urlMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para URL.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.minWords\n Category: validation\n Kind: number\n Description: Mínimo de palavras.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.requiredChecked\n Category: validation\n Kind: boolean\n Description: Exige checkbox marcado (ex: termos de uso).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.customValidator\n Category: validation\n Kind: expression\n Description: Validador customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.asyncValidator\n Category: validation\n Kind: expression\n Description: Validador async customizado (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchField\n Category: validation\n Kind: string\n Description: Campo que deve coincidir (cross-field).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.matchFieldMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para matchField.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueValidator\n Category: validation\n Kind: expression\n Description: Validador de unicidade via API (função).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.uniqueMessage\n Category: validation\n Kind: string\n Description: Mensagem customizada para unicidade.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation\n Category: validation\n Kind: array\n Description: Regras de validação condicional.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].condition\n Category: validation\n Kind: expression\n Description: Condicao para aplicar validadores.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.conditionalValidation[].validators\n Category: validation\n Kind: object\n Description: Conjunto de validadores aplicados quando a condicao for verdadeira.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationTrigger\n Category: validation\n Kind: enum\n Description: Gatilho de validação no validator.\n\nSchema Capability:\n - Path: fieldMetadata[].validators.validationDebounce\n Category: validation\n Kind: number\n Description: Debounce de validação no validator (ms).",
17254
17706
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17255
- "contentHash": "02f3921c10fb0dd88775888b7143c2cad0a14ccd228d35ea95cdb587a28b3c3f",
17707
+ "contentHash": "1e418f6ed02cbfa86ec339516bc55adf540acfabcf2fa04fda54ccf2e15c1843",
17256
17708
  "sourceKind": "component_definition",
17257
17709
  "sourceId": "praxis-filter-form",
17258
17710
  "corpusVersion": "1.0.0"
@@ -17260,9 +17712,9 @@
17260
17712
  {
17261
17713
  "chunkIndex": 10,
17262
17714
  "chunkKind": "capabilities",
17263
- "content": "Schema Capability:\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n\nSchema Capability:\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n\nSchema Capability:\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n\nSchema Capability:\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n\nSchema Capability:\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n\nSchema Capability:\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n\nSchema Capability:\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n\nSchema Capability:\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n\nSchema Capability:\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\n\nComponent Capability:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n\nComponent Capability:\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n\nComponent Capability:\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n\nComponent Capability:\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n\nComponent Capability:\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n\nComponent Capability:\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitIdempotencyKey\n Category: inputs\n Kind: string\n Description: Identidade estavel da tentativa de comando, materializada a partir da politica execution da action.\n\nComponent Capability:\n - Path: inputs.submitCorrelationId\n Category: inputs\n Kind: string\n Description: Identificador de correlacao governado para rastreabilidade ponta a ponta do comando.\n\nComponent Capability:\n - Path: inputs.submitResourceVersion\n Category: inputs\n Kind: string\n Description: Versao persistida esperada, transportada como If-Match quando exigida pela action.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetResourceKey\n Category: inputs\n Kind: string\n Description: Resource key canônico materializado pela action para resolver o ETag de outro agregado no momento do submit.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetIdField\n Category: inputs\n Kind: string\n Description: Campo exato do request que identifica o agregado cujo ETag governa a action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.configPersistenceStrategy\n Category: inputs\n Kind: enum\n Description: Define se preferências locais persistidas ou o contrato explícito do host governam a materialização corrente.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.orphanFieldExpansion\n Category: inputs\n Kind: enum\n Description: Define como uma linha groupedCommand com um unico campo usa o espaco restante. O default medium-and-wide expande spans 6 ou 8 e preserva campos compactos.",
17715
+ "content": "Schema Capability:\n - Path: fieldMetadata[].validators.showInlineErrors\n Category: validation\n Kind: boolean\n Description: Exibe erros inline (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validators.errorPosition\n Category: validation\n Kind: enum\n Description: Posicao do erro (validator).\n\nSchema Capability:\n - Path: fieldMetadata[].validationMode\n Category: validation\n Kind: enum\n Description: Gatilho da validação (change/blur/submit).\n\nSchema Capability:\n - Path: fieldMetadata[].debounceTime\n Category: validation\n Kind: number\n Description: Debounce para validação em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].options\n Category: data\n Kind: array\n Description: Array de opções conforme controlType (ex.: { key, value } ou { value, text/display }).\n\nSchema Capability:\n - Path: fieldMetadata[].endpoint\n Category: data\n Kind: string\n Description: URL para carregar opções remotas.\n\nSchema Capability:\n - Path: fieldMetadata[].valueField\n Category: data\n Kind: string\n Description: Nome da propriedade de valor nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].displayField\n Category: data\n Kind: string\n Description: Nome da propriedade de texto nas opções.\n\nSchema Capability:\n - Path: fieldMetadata[].filterField\n Category: data\n Kind: string\n Description: Campo para filtragem no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].queryParams\n Category: data\n Kind: object\n Description: Parâmetros fixos para a query do endpoint.\n\nSchema Capability:\n - Path: fieldMetadata[].cacheDuration\n Category: data\n Kind: number\n Description: Duração do cache de dados em ms.\n\nSchema Capability:\n - Path: fieldMetadata[].hidden\n Category: behavior\n Kind: boolean\n Description: Oculta o campo globalmente.\n\nSchema Capability:\n - Path: fieldMetadata[].visibleIn\n Category: behavior\n Kind: array\n Description: Contextos onde o campo é visível.\n\nSchema Capability:\n - Path: fieldMetadata[].formHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no formulário.\n\nSchema Capability:\n - Path: fieldMetadata[].tableHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas na tabela.\n\nSchema Capability:\n - Path: fieldMetadata[].filterHidden\n Category: behavior\n Kind: boolean\n Description: Oculta apenas no filtro.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess\n Category: behavior\n Kind: object\n Description: Politica canonica de UX para visibilidade/edicao por authorities publicadas pelo backend.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.visibleForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem ver o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.editableForAuthorities\n Category: behavior\n Kind: array\n Description: Authorities que podem editar o campo no runtime quando a UX tiver claims explicitas.\n\nSchema Capability:\n - Path: fieldMetadata[].fieldAccess.reason\n Category: misc\n Kind: string\n Description: Justificativa explicativa/auditavel da politica de acesso do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFields\n Category: dependency\n Kind: array\n Description: Campos dos quais este campo depende.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalRequired\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para obrigatoriedade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].conditionalDisplay\n Category: dependency\n Kind: expression\n Description: Condição Json Logic para visibilidade declarativa.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyFilterMap\n Category: dependency\n Kind: object\n Description: Mapeamento de filtro baseado na dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyValuePath\n Category: dependency\n Kind: string\n Description: Caminho no valor da dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyMergeStrategy\n Category: dependency\n Kind: enum\n Description: Estratégia de merge dos dados carregados.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyLoadOnChange\n Category: dependency\n Kind: enum\n Description: Quando recarregar dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].resetOnDependentChange\n Category: dependency\n Kind: boolean\n Description: Zera valor se dependência mudar.\n\nSchema Capability:\n - Path: fieldMetadata[].enableDependencyCascade\n Category: dependency\n Kind: boolean\n Description: Habilita/desabilita cascata nativa de dependências entre campos.\n\nSchema Capability:\n - Path: fieldMetadata[].dependencyDebounceMs\n Category: dependency\n Kind: number\n Description: Delay para reagir à mudança de dependência.\n\nSchema Capability:\n - Path: fieldMetadata[].suppressInlineErrorsOnCascade\n Category: dependency\n Kind: boolean\n Description: Suprime erros inline durante cascata.\n\nSchema Capability:\n - Path: fieldMetadata[].transformDisplayValue\n Category: transform\n Kind: expression\n Description: Transforma valor para exibição.\n\nSchema Capability:\n - Path: fieldMetadata[].transformSaveValue\n Category: transform\n Kind: expression\n Description: Transforma valor para salvar.\n\nSchema Capability:\n - Path: fieldMetadata[].textTransformApply\n Category: transform\n Kind: enum\n Description: Quando aplicar transformação de texto.\n\nSchema Capability:\n - Path: fieldMetadata[].inlineEditing\n Category: behavior\n Kind: boolean\n Description: Permite edição inline (tabelas).\n\nSchema Capability:\n - Path: fieldMetadata[].unique\n Category: validation\n Kind: boolean\n Description: Valida unicidade no backend.\n\nSchema Capability:\n - Path: fieldMetadata[].readOnly\n Category: behavior\n Kind: boolean\n Description: Campo somente leitura.\n\nSchema Capability:\n - Path: fieldMetadata[].disabled\n Category: behavior\n Kind: boolean\n Description: Campo desabilitado.\n\nSchema Capability:\n - Path: fieldMetadata[].defaultValue\n Category: data\n Kind: object\n Description: Valor inicial do campo.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaLabel\n Category: accessibility\n Kind: string\n Description: Label para leitores de tela.\n\nSchema Capability:\n - Path: fieldMetadata[].ariaDescribedBy\n Category: accessibility\n Kind: string\n Description: IDs de descrição acessível.\n\nSchema Capability:\n - Path: fieldMetadata[].tabIndex\n Category: accessibility\n Kind: number\n Description: Ordem de tabulacao para teclado.\n\nSchema Capability:\n - Path: fieldMetadata[].accessKey\n Category: accessibility\n Kind: string\n Description: Atalho de teclado (accessKey).\n\nComponent Capability:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n\nComponent Capability:\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n\nComponent Capability:\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n\nComponent Capability:\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n\nComponent Capability:\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n\nComponent Capability:\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).",
17264
17716
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17265
- "contentHash": "26b2dfdc858e1b0af8adbd4557dec1561120af335ab33688421d1dda98a4281e",
17717
+ "contentHash": "f5e8c17c1a6e0f3ab98cc132d55ffcf4067ebed9ff5d23daf3d63dbc9072f4ca",
17266
17718
  "sourceKind": "component_definition",
17267
17719
  "sourceId": "praxis-filter-form",
17268
17720
  "corpusVersion": "1.0.0"
@@ -17270,9 +17722,9 @@
17270
17722
  {
17271
17723
  "chunkIndex": 11,
17272
17724
  "chunkKind": "capabilities",
17273
- "content": "Component Capability:\n - Path: inputs.layoutPolicy.groupedCommand.contextFields\n Category: inputs\n Kind: array\n Description: Campos canônicos do request cujo valor vem do contexto da surface. Eles permanecem no FormGroup e no payload, sem renderizar controles redundantes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.partialRowStrategy\n Category: inputs\n Kind: enum\n Description: Define se cada linha visual parcial, depois de resolver visibilidade responsiva, CSS order e wrap, preserva os spans canônicos ou redistribui apenas campos compatíveis para completar 12 colunas no breakpoint atual.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n\nComponent Capability:\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n\nComponent Capability:\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n\nComponent Capability:\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n\nComponent Capability:\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n\nComponent Capability:\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n\nComponent Capability:\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n\nComponent Capability:\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n\nComponent Capability:\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n\nComponent Capability:\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n\nComponent Capability:\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n\nComponent Capability:\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n\nComponent Capability:\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n\nComponent Capability:\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n\nComponent Capability:\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n\nComponent Capability:\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n\nComponent Capability:\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n\nComponent Capability:\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n\nComponent Capability:\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n\nComponent Capability:\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n\nComponent Capability:\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n\nComponent Capability:\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.",
17725
+ "content": "Component Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.submitIdempotencyKey\n Category: inputs\n Kind: string\n Description: Identidade estavel da tentativa de comando, materializada a partir da politica execution da action.\n\nComponent Capability:\n - Path: inputs.submitCorrelationId\n Category: inputs\n Kind: string\n Description: Identificador de correlacao governado para rastreabilidade ponta a ponta do comando.\n\nComponent Capability:\n - Path: inputs.submitResourceVersion\n Category: inputs\n Kind: string\n Description: Versao persistida esperada, transportada como If-Match quando exigida pela action.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetResourceKey\n Category: inputs\n Kind: string\n Description: Resource key canônico materializado pela action para resolver o ETag de outro agregado no momento do submit.\n\nComponent Capability:\n - Path: inputs.submitResourceVersionTargetIdField\n Category: inputs\n Kind: string\n Description: Campo exato do request que identifica o agregado cujo ETag governa a action.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.configPersistenceStrategy\n Category: inputs\n Kind: enum\n Description: Define se preferências locais persistidas ou o contrato explícito do host governam a materialização corrente.\n\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.intent\n Category: inputs\n Kind: enum\n Description: Intencao da surface: detalhe/apresentacao ou comando/editavel.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.lifecycle\n Category: inputs\n Kind: enum\n Description: Ciclo de materializacao do layout schema-driven.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.orphanFieldExpansion\n Category: inputs\n Kind: enum\n Description: Define como uma linha groupedCommand com um unico campo usa o espaco restante. O default medium-and-wide expande spans 6 ou 8 e preserva campos compactos.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.contextFields\n Category: inputs\n Kind: array\n Description: Campos canônicos do request cujo valor vem do contexto da surface. Eles permanecem no FormGroup e no payload, sem renderizar controles redundantes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.groupedCommand.partialRowStrategy\n Category: inputs\n Kind: enum\n Description: Define se cada linha visual parcial, depois de resolver visibilidade responsiva, CSS order e wrap, preserva os spans canônicos ou redistribui apenas campos compatíveis para completar 12 colunas no breakpoint atual.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary\n Category: inputs\n Kind: object\n Description: Politica declarativa para resumo read-only compacto em compactPresentation, sem FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeFields\n Category: inputs\n Kind: array\n Description: Lista de campos canônicos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeGroups\n Category: inputs\n Kind: array\n Description: Lista de grupos do schema que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.includeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem entrar no resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.excludeRoles\n Category: inputs\n Kind: array\n Description: Lista de papeis semanticos de campo que devem ficar fora do resumo read-only compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.maxFields\n Category: inputs\n Kind: number\n Description: Limite maximo de campos materializados no primeiro painel compacto.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.fieldPriority\n Category: inputs\n Kind: object\n Description: Mapa campo -> prioridade para ordenar campos do resumo quando o schema publica candidatos suficientes.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.groupPriority\n Category: inputs\n Kind: object\n Description: Mapa grupo -> prioridade para ordenar grupos do resumo quando o schema publica agrupamento semantico.",
17274
17726
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17275
- "contentHash": "d8a5bd44a76042ef92898e9140289bc09495b4ae07573b497e95c9abdc1ab4a7",
17727
+ "contentHash": "fb0074203e0a6e14fec64b7a21f0d85f815714122bb49a18404c5e5c64904c4c",
17276
17728
  "sourceKind": "component_definition",
17277
17729
  "sourceId": "praxis-filter-form",
17278
17730
  "corpusVersion": "1.0.0"
@@ -17280,15 +17732,25 @@
17280
17732
  {
17281
17733
  "chunkIndex": 12,
17282
17734
  "chunkKind": "capabilities",
17283
- "content": "Component Capability:\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n\nComponent Capability:\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n\nComponent Capability:\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n\nComponent Capability:\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n\nComponent Capability:\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n\nComponent Capability:\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n\nComponent Capability:\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n\nComponent Capability:\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n\nComponent Capability:\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n\nComponent Capability:\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n\nComponent Capability:\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n\nComponent Capability:\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n\nComponent Capability:\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n\nComponent Capability:\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n\nComponent Capability:\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n\nComponent Capability:\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n\nComponent Capability:\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\n\nCapability Note:\n - Este catalogo descreve inputs e outputs do componente.\n\nCapability Note:\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n\nCapability Note:\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n\nCapability Note:\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n\nCapability Note:\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n\nCapability Note:\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.",
17735
+ "content": "Component Capability:\n - Path: inputs.layoutPolicy.detailSummary.columns\n Category: inputs\n Kind: number\n Description: Quantidade base de colunas para distribuir campos de resumo schema-driven sem criar FormConfig.sections locais.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.responsiveColumns\n Category: inputs\n Kind: object\n Description: Mapa de colunas por breakpoint xs/sm/md/lg/xl para detalhes read-only compactos em drawers, side sheets e desktop largo.\n\nComponent Capability:\n - Path: inputs.layoutPolicy.detailSummary.widthPrecedence\n Category: inputs\n Kind: enum\n Description: Define se larguras explicitas do schema ou a densidade do resumo controlam os spans no compactPresentation read-only.\n\nComponent Capability:\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\nComponent Capability:\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n\nComponent Capability:\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n\nComponent Capability:\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n\nComponent Capability:\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n\nComponent Capability:\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n\nComponent Capability:\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n\nComponent Capability:\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n\nComponent Capability:\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n\nComponent Capability:\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n\nComponent Capability:\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n\nComponent Capability:\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n\nComponent Capability:\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n\nComponent Capability:\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n\nComponent Capability:\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n\nComponent Capability:\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n\nComponent Capability:\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n\nComponent Capability:\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n\nComponent Capability:\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n\nComponent Capability:\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n\nComponent Capability:\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n\nComponent Capability:\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n\nComponent Capability:\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n\nComponent Capability:\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n\nComponent Capability:\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n\nComponent Capability:\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n\nComponent Capability:\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n\nComponent Capability:\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n\nComponent Capability:\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n\nComponent Capability:\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n\nComponent Capability:\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n\nComponent Capability:\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n\nComponent Capability:\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n\nComponent Capability:\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n\nComponent Capability:\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n\nComponent Capability:\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n\nComponent Capability:\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.",
17284
17736
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17285
- "contentHash": "8cde02bbb0100a17feb34ecf1e03642b852a82d237170763ad456693ee7b8789",
17737
+ "contentHash": "581cd896c206465873181d72b074d69d2bacefd3bae0bca8cc3db46a378af5d3",
17286
17738
  "sourceKind": "component_definition",
17287
17739
  "sourceId": "praxis-filter-form",
17288
17740
  "corpusVersion": "1.0.0"
17289
17741
  },
17290
17742
  {
17291
17743
  "chunkIndex": 13,
17744
+ "chunkKind": "capabilities",
17745
+ "content": "Component Capability:\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n\nComponent Capability:\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n\nComponent Capability:\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n\nComponent Capability:\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n\nComponent Capability:\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n\nComponent Capability:\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n\nComponent Capability:\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\n\nCapability Note:\n - Este catalogo descreve inputs e outputs do componente.\n\nCapability Note:\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n\nCapability Note:\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n\nCapability Note:\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n\nCapability Note:\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n\nCapability Note:\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.",
17746
+ "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts",
17747
+ "contentHash": "2ce7f5421defeaee7239892584b36760cd38d627750678d49068eaee9ecfd09c",
17748
+ "sourceKind": "component_definition",
17749
+ "sourceId": "praxis-filter-form",
17750
+ "corpusVersion": "1.0.0"
17751
+ },
17752
+ {
17753
+ "chunkIndex": 14,
17292
17754
  "chunkKind": "authoring_manifest",
17293
17755
  "content": "{\"operationId\":\"field.label.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar rótulo do campo Effects: merge-by-key. Mudar o label do campo email para \\\"E-mail Corporativo\\\" Alterar o label do campo \\\"campoInexistente\\\" Salvar e reabrir o formulário editado sem drift de configuração\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"label\"],\"properties\":[\"label\"],\"semanticTerms\":[\"label\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].label\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"relabel-schema-backed-field\",\"request\":\"Mudar o label do campo email para \\\"E-mail Corporativo\\\"\",\"operationId\":\"field.label.set\",\"target\":\"email\",\"params\":{\"label\":\"E-mail Corporativo\"},\"isPositive\":true},{\"id\":\"round-trip-no-drift\",\"request\":\"Salvar e reabrir o formulário editado sem drift de configuração\",\"operationId\":\"field.label.set\",\"target\":\"nome\",\"params\":{\"label\":\"Nome Completo\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unknown-field\",\"request\":\"Alterar o label do campo \\\"campoInexistente\\\"\",\"operationId\":\"field.label.set\",\"target\":\"campoInexistente\",\"params\":{\"label\":\"Novo Label\"},\"isPositive\":false}]}",
17294
17756
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17298,7 +17760,7 @@
17298
17760
  "corpusVersion": "1.0.0"
17299
17761
  },
17300
17762
  {
17301
- "chunkIndex": 14,
17763
+ "chunkIndex": 15,
17302
17764
  "chunkKind": "authoring_manifest",
17303
17765
  "content": "{\"operationId\":\"field.placeholder.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar placeholder do campo Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"placeholder\"],\"properties\":[\"placeholder\"],\"semanticTerms\":[\"placeholder\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].placeholder\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17304
17766
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17308,7 +17770,7 @@
17308
17770
  "corpusVersion": "1.0.0"
17309
17771
  },
17310
17772
  {
17311
- "chunkIndex": 15,
17773
+ "chunkIndex": 16,
17312
17774
  "chunkKind": "authoring_manifest",
17313
17775
  "content": "{\"operationId\":\"field.required.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir obrigatoriedade Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"required\"],\"properties\":[\"required\"],\"semanticTerms\":[\"required\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].required\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17314
17776
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17318,7 +17780,7 @@
17318
17780
  "corpusVersion": "1.0.0"
17319
17781
  },
17320
17782
  {
17321
- "chunkIndex": 16,
17783
+ "chunkIndex": 17,
17322
17784
  "chunkKind": "authoring_manifest",
17323
17785
  "content": "{\"operationId\":\"field.readOnly.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir campo como somente leitura Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"readOnly\"],\"properties\":[\"readOnly\"],\"semanticTerms\":[\"readOnly\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].readOnly\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17324
17786
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17328,7 +17790,7 @@
17328
17790
  "corpusVersion": "1.0.0"
17329
17791
  },
17330
17792
  {
17331
- "chunkIndex": 17,
17793
+ "chunkIndex": 18,
17332
17794
  "chunkKind": "authoring_manifest",
17333
17795
  "content": "{\"operationId\":\"field.disabled.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir campo como desabilitado Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"disabled\"],\"properties\":[\"disabled\"],\"semanticTerms\":[\"disabled\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].disabled\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17334
17796
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17338,7 +17800,7 @@
17338
17800
  "corpusVersion": "1.0.0"
17339
17801
  },
17340
17802
  {
17341
- "chunkIndex": 18,
17803
+ "chunkIndex": 19,
17342
17804
  "chunkKind": "authoring_manifest",
17343
17805
  "content": "{\"operationId\":\"field.hidden.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir visibilidade inicial Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"hidden\"],\"properties\":[\"hidden\"],\"semanticTerms\":[\"hidden\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].hidden\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17344
17806
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17348,7 +17810,7 @@
17348
17810
  "corpusVersion": "1.0.0"
17349
17811
  },
17350
17812
  {
17351
- "chunkIndex": 19,
17813
+ "chunkIndex": 20,
17352
17814
  "chunkKind": "authoring_manifest",
17353
17815
  "content": "{\"operationId\":\"field.controlType.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Alterar tipo de controle Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"controlType\"],\"properties\":[\"controlType\"],\"semanticTerms\":[\"controlType\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].controlType\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"control-type-compatible\",\"level\":\"error\",\"code\":\"DF017\",\"description\":\"O tipo de controle deve ser compatível com o tipo de dado do campo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17354
17816
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17358,7 +17820,7 @@
17358
17820
  "corpusVersion": "1.0.0"
17359
17821
  },
17360
17822
  {
17361
- "chunkIndex": 20,
17823
+ "chunkIndex": 21,
17362
17824
  "chunkKind": "authoring_manifest",
17363
17825
  "content": "{\"operationId\":\"field.optionSource.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Definir fonte de opções do campo Effects: merge-by-key.\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"optionSource\"],\"properties\":[\"optionSource\"],\"semanticTerms\":[\"optionSource\",\"optionSource.key\",\"optionSource.type\",\"optionSource.resourcePath\",\"optionSource.valuePropertyPath\",\"optionSource.labelPropertyPath\",\"optionSource.dependsOn\",\"optionSource.dependencyFilterMap\",\"optionSource.includeIds\",\"optionSource.capabilities\",\"optionSource.display\",\"optionSource.selectionPolicy\",\"RESOURCE_ENTITY\",\"DISTINCT_DIMENSION\",\"CATEGORICAL_BUCKET\",\"LIGHT_LOOKUP\",\"STATIC_CANONICAL\",\"optionSource.capabilities.filter\",\"optionSource.capabilities.byIds\",\"optionSource.capabilities.detail\",\"optionSource.capabilities.create\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"fieldMetadata[].optionSource\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"option-source-valid\",\"level\":\"error\",\"code\":\"DF018\",\"description\":\"A fonte de opções deve ser válida para o tipo de controle especificado.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17364
17826
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17368,7 +17830,7 @@
17368
17830
  "corpusVersion": "1.0.0"
17369
17831
  },
17370
17832
  {
17371
- "chunkIndex": 21,
17833
+ "chunkIndex": 22,
17372
17834
  "chunkKind": "authoring_manifest",
17373
17835
  "content": "{\"operationId\":\"field.local.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar campo local Effects: append-unique. Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"scope\":\"global\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"required\":false},\"inputContract\":{\"required\":[\"name\",\"label\",\"controlType\",\"source\"],\"properties\":[\"name\",\"label\",\"controlType\",\"source\",\"transient\",\"submitPolicy\"],\"semanticTerms\":[\"name\",\"label\",\"controlType\",\"source\",\"transient\",\"submitPolicy\",\"local\",\"omit\",\"include\",\"includeWhenDirty\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"fieldMetadata[]\"],\"validators\":[{\"validatorId\":\"field-name-unique\",\"level\":\"error\",\"code\":\"DF002\",\"description\":\"Nomes de campos devem ser únicos em fieldMetadata.\"},{\"validatorId\":\"local-schema-name-no-collision\",\"level\":\"error\",\"code\":\"DF006\",\"description\":\"Nome de campo local não pode colidir com campo schema-backed existente.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-local-transient-field\",\"request\":\"Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"operationId\":\"field.local.add\",\"params\":{\"name\":\"notasInternas\",\"label\":\"Notas Internas\",\"controlType\":\"textarea\",\"source\":\"local\",\"transient\":true,\"submitPolicy\":\"omit\"},\"isPositive\":true}],\"negativeExamples\":[]}",
17374
17836
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17378,7 +17840,7 @@
17378
17840
  "corpusVersion": "1.0.0"
17379
17841
  },
17380
17842
  {
17381
- "chunkIndex": 22,
17843
+ "chunkIndex": 23,
17382
17844
  "chunkKind": "authoring_manifest",
17383
17845
  "content": "{\"operationId\":\"field.local.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover campo local Effects: remove-by-key, compile-domain-patch. Remover o campo auxiliar \\\"notasInternas\\\"\",\"scope\":\"field\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"remove-by-key\",\"compile-domain-patch\"],\"affectedPaths\":[\"fieldMetadata[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"field-is-local\",\"level\":\"error\",\"code\":\"DF007\",\"description\":\"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"require-confirmation-remove-field\",\"request\":\"Remover o campo auxiliar \\\"notasInternas\\\"\",\"operationId\":\"field.local.remove\",\"target\":\"notasInternas\",\"isPositive\":true}],\"negativeExamples\":[]}",
17384
17846
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17388,7 +17850,7 @@
17388
17850
  "corpusVersion": "1.0.0"
17389
17851
  },
17390
17852
  {
17391
- "chunkIndex": 23,
17853
+ "chunkIndex": 24,
17392
17854
  "chunkKind": "authoring_manifest",
17393
17855
  "content": "{\"operationId\":\"layout.section.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar nova seção Effects: append-unique.\",\"scope\":\"global\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"title\"],\"properties\":[\"id\",\"title\",\"icon\",\"collapsible\"],\"semanticTerms\":[\"id\",\"title\",\"icon\",\"collapsible\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[]\"],\"validators\":[{\"validatorId\":\"section-id-unique\",\"level\":\"error\",\"code\":\"DF003\",\"description\":\"IDs de seções devem ser únicos em sections[].\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17394
17856
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17398,7 +17860,7 @@
17398
17860
  "corpusVersion": "1.0.0"
17399
17861
  },
17400
17862
  {
17401
- "chunkIndex": 24,
17863
+ "chunkIndex": 25,
17402
17864
  "chunkKind": "authoring_manifest",
17403
17865
  "content": "{\"operationId\":\"layout.section.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remover seção Effects: remove-by-key, compile-domain-patch. Remover a seção \\\"Dados Adicionais\\\"\",\"scope\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[],\"semanticTerms\":[]},\"effects\":[\"remove-by-key\",\"compile-domain-patch\"],\"affectedPaths\":[\"sections[]\",\"sections[].rows[]\",\"sections[].rows[].columns[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"require-confirmation-remove-section\",\"request\":\"Remover a seção \\\"Dados Adicionais\\\"\",\"operationId\":\"layout.section.remove\",\"target\":\"secao-dados-adicionais\",\"isPositive\":true}],\"negativeExamples\":[]}",
17404
17866
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17408,7 +17870,7 @@
17408
17870
  "corpusVersion": "1.0.0"
17409
17871
  },
17410
17872
  {
17411
- "chunkIndex": 25,
17873
+ "chunkIndex": 26,
17412
17874
  "chunkKind": "authoring_manifest",
17413
17875
  "content": "{\"operationId\":\"layout.row.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar linha numa seção Effects: append-unique.\",\"scope\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"columns\"],\"semanticTerms\":[\"id\",\"columns\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[].rows[]\"],\"validators\":[{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"},{\"validatorId\":\"row-id-unique-in-section\",\"level\":\"error\",\"code\":\"DF015\",\"description\":\"O id da nova linha deve ser único dentro da seção alvo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17414
17876
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17418,7 +17880,7 @@
17418
17880
  "corpusVersion": "1.0.0"
17419
17881
  },
17420
17882
  {
17421
- "chunkIndex": 26,
17883
+ "chunkIndex": 27,
17422
17884
  "chunkKind": "authoring_manifest",
17423
17885
  "content": "{\"operationId\":\"layout.column.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Adicionar coluna numa linha Effects: append-unique.\",\"scope\":\"row\",\"target\":{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"required\":true},\"inputContract\":{\"required\":[\"id\"],\"properties\":[\"id\",\"span\"],\"semanticTerms\":[\"id\",\"span\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"sections[].rows[].columns[]\"],\"validators\":[{\"validatorId\":\"row-exists\",\"level\":\"error\",\"code\":\"DF014\",\"description\":\"A linha alvo deve existir na seção especificada.\"},{\"validatorId\":\"column-id-unique-in-row\",\"level\":\"error\",\"code\":\"DF016\",\"description\":\"O id da nova coluna deve ser único dentro da linha alvo.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
17424
17886
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17428,7 +17890,7 @@
17428
17890
  "corpusVersion": "1.0.0"
17429
17891
  },
17430
17892
  {
17431
- "chunkIndex": 27,
17893
+ "chunkIndex": 28,
17432
17894
  "chunkKind": "authoring_manifest",
17433
17895
  "content": "{\"operationId\":\"layout.field.move\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Mover campo no layout Effects: compile-domain-patch. Mover campo telefone para a primeira coluna da seção de contato\",\"scope\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"required\":true},\"inputContract\":{\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"],\"semanticTerms\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\",\"index\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"no-index-as-identity\",\"level\":\"error\",\"code\":\"DF013\",\"description\":\"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"},{\"validatorId\":\"field-exists-in-layout\",\"level\":\"warning\",\"code\":\"DF005\",\"description\":\"Campo definido em fieldMetadata mas ausente no layout.\"}],\"preconditions\":[\"config-initialized\",\"target-exists\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"move-field-to-column\",\"request\":\"Mover campo telefone para a primeira coluna da seção de contato\",\"operationId\":\"layout.field.move\",\"target\":\"telefone\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-1\"},\"isPositive\":true}],\"negativeExamples\":[]}",
17434
17896
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17438,7 +17900,7 @@
17438
17900
  "corpusVersion": "1.0.0"
17439
17901
  },
17440
17902
  {
17441
- "chunkIndex": 28,
17903
+ "chunkIndex": 29,
17442
17904
  "chunkKind": "authoring_manifest",
17443
17905
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"identity\"}",
17444
17906
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17448,17 +17910,17 @@
17448
17910
  "corpusVersion": "1.0.0"
17449
17911
  },
17450
17912
  {
17451
- "chunkIndex": 29,
17913
+ "chunkIndex": 30,
17452
17914
  "chunkKind": "authoring_manifest",
17453
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"config\",\"type\":\"FormConfig\",\"description\":\"Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.\"},{\"name\":\"formId\",\"type\":\"string\",\"description\":\"Identidade estável usada pelo runtime para persistência local da configuração.\"},{\"name\":\"resourcePath\",\"type\":\"string\",\"description\":\"Caminho do recurso (API)\"},{\"name\":\"mode\",\"type\":\"string\",\"allowedValues\":[\"create\",\"edit\",\"view\"],\"description\":\"Modo de operação\"}]}",
17915
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"config\",\"type\":\"FormConfig\",\"description\":\"Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.\"},{\"name\":\"formId\",\"type\":\"string\",\"description\":\"Identidade estável usada pelo runtime para persistência local da configuração.\"},{\"name\":\"resourcePath\",\"type\":\"string\",\"description\":\"Caminho do recurso (API)\"},{\"name\":\"mode\",\"type\":\"string\",\"allowedValues\":[\"create\",\"edit\",\"view\",\"presentation\",\"dossier\"],\"description\":\"Modos nativos preservados em documentos. Em novos fluxos, prefira view com presentationModeGlobal para separar operação dos dados e apresentação.\"}]}",
17454
17916
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
17455
- "contentHash": "e87e0eebe5c750ff0bf9624b953e5ad603ae63ca2584702c9618500202fbed00",
17917
+ "contentHash": "87565432bc9d9f832bcd7f5d85001fe6d2eca9009c4f211468588e358ef89239",
17456
17918
  "sourceKind": "component_definition",
17457
17919
  "sourceId": "praxis-filter-form",
17458
17920
  "corpusVersion": "1.0.0"
17459
17921
  },
17460
17922
  {
17461
- "chunkIndex": 30,
17923
+ "chunkIndex": 31,
17462
17924
  "chunkKind": "authoring_manifest",
17463
17925
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"description\":\"Campos do formulário (metadados schema-backed ou local; use para ops de propriedade)\"},{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"description\":\"Campos locais com source:\\\"local\\\"; adicionados/removidos via authoring\"},{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"description\":\"Seções de layout identificadas por id estável\"},{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"description\":\"Linhas dentro de seções, identificadas por id estável\"}]}",
17464
17926
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17468,7 +17930,7 @@
17468
17930
  "corpusVersion": "1.0.0"
17469
17931
  },
17470
17932
  {
17471
- "chunkIndex": 31,
17933
+ "chunkIndex": 32,
17472
17934
  "chunkKind": "authoring_manifest",
17473
17935
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"field.label.set\",\"title\":\"Alterar rótulo do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"label\"],\"properties\":{\"label\":{\"type\":\"string\",\"minLength\":1}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].label\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.placeholder.set\",\"title\":\"Alterar placeholder do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"placeholder\"],\"properties\":{\"placeholder\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].placeholder\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.required.set\",\"title\":\"Definir obrigatoriedade\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"required\"],\"properties\":{\"required\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].required\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.readOnly.set\",\"title\":\"Definir campo como somente leitura\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"readOnly\"],\"properties\":{\"readOnly\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].readOnly\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.disabled.set\",\"title\":\"Definir campo como desabilitado\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"disabled\"],\"properties\":{\"disabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].disabled\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.hidden.set\",\"title\":\"Definir visibilidade inicial\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"hidden\"],\"properties\":{\"hidden\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\"],\"affectedPaths\":[\"fieldMetadata[].hidden\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.controlType.set\",\"title\":\"Alterar tipo de controle\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"controlType\"],\"properties\":{\"controlType\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"field-exists\",\"control-type-compatible\"],\"affectedPaths\":[\"fieldMetadata[].controlType\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.optionSource.set\",\"title\":\"Definir fonte de opções do campo\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"optionSource\"],\"properties\":{\"optionSource\":{\"type\":\"object\",\"required\":[\"key\",\"type\",\"resourcePath\"],\"properties\":{\"key\":{\"type\":\"string\"},\"type\":{\"enum\":[\"RESOURCE_ENTITY\",\"DISTINCT_DIMENSION\",\"CATEGORICAL_BUCKET\",\"LIGHT_LOOKUP\",\"STATIC_CANONICAL\"]},\"resourcePath\":{\"type\":\"string\"},\"valuePropertyPath\":{\"type\":\"string\"},\"labelPropertyPath\":{\"type\":\"string\"},\"dependsOn\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dependencyFilterMap\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}},\"includeIds\":{\"type\":\"boolean\"},\"capabilities\":{\"type\":\"object\",\"properties\":{\"filter\":{\"type\":\"boolean\"},\"byIds\":{\"type\":\"boolean\"},\"detail\":{\"type\":\"boolean\"},\"create\":{\"type\":\"boolean\"}}},\"display\":{\"type\":\"object\"},\"selectionPolicy\":{\"type\":\"object\"}}}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-exists\",\"option-source-valid\"],\"affectedPaths\":[\"fieldMetadata[].optionSource\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"field.local.add\",\"title\":\"Adicionar campo local\",\"scope\":\"global\",\"targetKind\":\"localField\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"name\",\"label\",\"controlType\",\"source\"],\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"controlType\":{\"type\":\"string\"},\"source\":{\"const\":\"local\",\"description\":\"Obrigatório. Discriminador que distingue campos locais de schema-backed.\"},\"transient\":{\"type\":\"boolean\",\"default\":false,\"description\":\"Se true, o valor não persiste entre navegações.\"},\"submitPolicy\":{\"enum\":[\"omit\",\"include\",\"includeWhenDirty\"],\"default\":\"omit\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"}],\"validators\":[\"field-name-unique\",\"local-schema-name-no-collision\"],\"affectedPaths\":[\"fieldMetadata[]\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"field.local.remove\",\"title\":\"Remover campo local\",\"scope\":\"field\",\"targetKind\":\"localField\",\"target\":{\"kind\":\"localField\",\"resolver\":\"field-by-name\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"fieldMetadata[]\",\"key\":\"name\"},{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-field-cleanup\",\"handlerContract\":{\"reads\":[\"fieldMetadata[].name\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"identityKeys\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.name\"],\"properties\":{\"target.name\":{\"type\":\"string\"}}},\"failureModes\":[\"target-field-not-found\",\"target-field-not-local\",\"layout-reference-conflict\"],\"description\":\"Remove every layout placement that references the removed local field by fieldMetadata[].name.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"field-exists\",\"field-is-local\"],\"affectedPaths\":[\"fieldMetadata[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\",\"target-exists\"]}]}",
17474
17936
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17478,7 +17940,7 @@
17478
17940
  "corpusVersion": "1.0.0"
17479
17941
  },
17480
17942
  {
17481
- "chunkIndex": 32,
17943
+ "chunkIndex": 33,
17482
17944
  "chunkKind": "authoring_manifest",
17483
17945
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"layout.section.add\",\"title\":\"Adicionar nova seção\",\"scope\":\"global\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"title\"],\"properties\":{\"id\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"collapsible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[]\",\"key\":\"id\"}],\"validators\":[\"section-id-unique\"],\"affectedPaths\":[\"sections[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"layout.section.remove\",\"title\":\"Remover seção\",\"scope\":\"section\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"sections[]\",\"key\":\"id\"},{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-section-cleanup\",\"handlerContract\":{\"reads\":[\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[]\"],\"identityKeys\":[\"sections[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.id\"],\"properties\":{\"target.id\":{\"type\":\"string\"}}},\"failureModes\":[\"target-section-not-found\",\"ambiguous-section-target\"],\"description\":\"Removes the target section and its nested rows, columns, and field placements without deleting fieldMetadata records.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"section-exists\"],\"affectedPaths\":[\"sections[]\",\"sections[].rows[]\",\"sections[].rows[].columns[]\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.row.add\",\"title\":\"Adicionar linha numa seção\",\"scope\":\"section\",\"targetKind\":\"section\",\"target\":{\"kind\":\"section\",\"resolver\":\"section-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"columns\":{\"type\":\"number\",\"minimum\":1,\"maximum\":12,\"default\":1}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[].rows[]\",\"key\":\"id\"}],\"validators\":[\"section-exists\",\"row-id-unique-in-section\"],\"affectedPaths\":[\"sections[].rows[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.column.add\",\"title\":\"Adicionar coluna numa linha\",\"scope\":\"row\",\"targetKind\":\"row\",\"target\":{\"kind\":\"row\",\"resolver\":\"row-by-id-in-section\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\"],\"properties\":{\"id\":{\"type\":\"string\"},\"span\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":12,\"default\":6}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"sections[].rows[].columns[]\",\"key\":\"id\"}],\"validators\":[\"row-exists\",\"column-id-unique-in-row\"],\"affectedPaths\":[\"sections[].rows[].columns[]\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]},{\"operationId\":\"layout.field.move\",\"title\":\"Mover campo no layout\",\"scope\":\"field\",\"targetKind\":\"field\",\"target\":{\"kind\":\"field\",\"resolver\":\"field-by-name-or-label\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"form-layout-reconciler\",\"handlerContract\":{\"reads\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\",\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"writes\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"identityKeys\":[\"fieldMetadata[].name\",\"sections[].id\",\"sections[].rows[].id\",\"sections[].rows[].columns[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"target.name\",\"targetSectionId\",\"targetRowId\",\"targetColumnId\"],\"properties\":{\"target.name\":{\"type\":\"string\"},\"targetSectionId\":{\"type\":\"string\"},\"targetRowId\":{\"type\":\"string\"},\"targetColumnId\":{\"type\":\"string\"},\"index\":{\"type\":\"number\"}}},\"failureModes\":[\"target-field-not-found\",\"target-layout-location-not-found\",\"ambiguous-field-target\",\"duplicate-field-placement\"],\"description\":\"Moves a field placement by stable section, row, column, and field ids; index is insertion position only.\"}}],\"validators\":[\"field-exists\",\"layout-target-exists\",\"no-index-as-identity\",\"field-exists-in-layout\"],\"affectedPaths\":[\"sections[].rows[].columns[].items\",\"sections[].rows[].columns[].fields\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\",\"target-exists\"]}]}",
17484
17946
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17488,7 +17950,7 @@
17488
17950
  "corpusVersion": "1.0.0"
17489
17951
  },
17490
17952
  {
17491
- "chunkIndex": 33,
17953
+ "chunkIndex": 34,
17492
17954
  "chunkKind": "authoring_manifest",
17493
17955
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"field-exists\",\"level\":\"error\",\"code\":\"DF001\",\"description\":\"O campo alvo deve existir em fieldMetadata.\"},{\"validatorId\":\"control-type-compatible\",\"level\":\"error\",\"code\":\"DF017\",\"description\":\"O tipo de controle deve ser compatível com o tipo de dado do campo.\"},{\"validatorId\":\"option-source-valid\",\"level\":\"error\",\"code\":\"DF018\",\"description\":\"A fonte de opções deve ser válida para o tipo de controle especificado.\"},{\"validatorId\":\"field-name-unique\",\"level\":\"error\",\"code\":\"DF002\",\"description\":\"Nomes de campos devem ser únicos em fieldMetadata.\"},{\"validatorId\":\"local-schema-name-no-collision\",\"level\":\"error\",\"code\":\"DF006\",\"description\":\"Nome de campo local não pode colidir com campo schema-backed existente.\"},{\"validatorId\":\"field-is-local\",\"level\":\"error\",\"code\":\"DF007\",\"description\":\"Operação restrita a campos locais (source:\\\"local\\\"). Campo schema-backed não pode ser removido ou ter submitPolicy alterada.\"},{\"validatorId\":\"section-id-unique\",\"level\":\"error\",\"code\":\"DF003\",\"description\":\"IDs de seções devem ser únicos em sections[].\"},{\"validatorId\":\"section-exists\",\"level\":\"error\",\"code\":\"DF004\",\"description\":\"A seção alvo deve existir em sections[].\"},{\"validatorId\":\"row-id-unique-in-section\",\"level\":\"error\",\"code\":\"DF015\",\"description\":\"O id da nova linha deve ser único dentro da seção alvo.\"},{\"validatorId\":\"row-exists\",\"level\":\"error\",\"code\":\"DF014\",\"description\":\"A linha alvo deve existir na seção especificada.\"},{\"validatorId\":\"column-id-unique-in-row\",\"level\":\"error\",\"code\":\"DF016\",\"description\":\"O id da nova coluna deve ser único dentro da linha alvo.\"},{\"validatorId\":\"layout-target-exists\",\"level\":\"error\",\"code\":\"DF012\",\"description\":\"A seção/linha/coluna de destino devem existir antes de mover o campo.\"},{\"validatorId\":\"no-index-as-identity\",\"level\":\"error\",\"code\":\"DF013\",\"description\":\"Operações de layout não devem usar índice de array como identidade canônica; use IDs estáveis.\"},{\"validatorId\":\"field-exists-in-layout\",\"level\":\"warning\",\"code\":\"DF005\",\"description\":\"Campo definido em fieldMetadata mas ausente no layout.\"}]}",
17494
17956
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17498,7 +17960,7 @@
17498
17960
  "corpusVersion": "1.0.0"
17499
17961
  },
17500
17962
  {
17501
- "chunkIndex": 34,
17963
+ "chunkIndex": 35,
17502
17964
  "chunkKind": "authoring_manifest",
17503
17965
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"strip-undefined\",\"stable-field-order\",\"preserve-local-field-source\",\"preserve-section-row-column-ids\"]}",
17504
17966
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17508,7 +17970,7 @@
17508
17970
  "corpusVersion": "1.0.0"
17509
17971
  },
17510
17972
  {
17511
- "chunkIndex": 35,
17973
+ "chunkIndex": 36,
17512
17974
  "chunkKind": "authoring_manifest",
17513
17975
  "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-filter-form\",\"ownerPackage\":\"@praxisui/dynamic-form\",\"configSchemaId\":\"FormConfig\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"add-local-transient-field\",\"request\":\"Adicionar campo auxiliar local \\\"notasInternas\\\" que não deve aparecer no payload de envio\",\"operationId\":\"field.local.add\",\"params\":{\"name\":\"notasInternas\",\"label\":\"Notas Internas\",\"controlType\":\"textarea\",\"source\":\"local\",\"transient\":true,\"submitPolicy\":\"omit\"},\"isPositive\":true},{\"id\":\"relabel-schema-backed-field\",\"request\":\"Mudar o label do campo email para \\\"E-mail Corporativo\\\"\",\"operationId\":\"field.label.set\",\"target\":\"email\",\"params\":{\"label\":\"E-mail Corporativo\"},\"isPositive\":true},{\"id\":\"move-field-to-column\",\"request\":\"Mover campo telefone para a primeira coluna da seção de contato\",\"operationId\":\"layout.field.move\",\"target\":\"telefone\",\"params\":{\"targetSectionId\":\"secao-contato\",\"targetRowId\":\"row-1\",\"targetColumnId\":\"col-1\"},\"isPositive\":true},{\"id\":\"reject-unknown-field\",\"request\":\"Alterar o label do campo \\\"campoInexistente\\\"\",\"operationId\":\"field.label.set\",\"target\":\"campoInexistente\",\"params\":{\"label\":\"Novo Label\"},\"isPositive\":false},{\"id\":\"require-confirmation-remove-field\",\"request\":\"Remover o campo auxiliar \\\"notasInternas\\\"\",\"operationId\":\"field.local.remove\",\"target\":\"notasInternas\",\"isPositive\":true},{\"id\":\"require-confirmation-remove-section\",\"request\":\"Remover a seção \\\"Dados Adicionais\\\"\",\"operationId\":\"layout.section.remove\",\"target\":\"secao-dados-adicionais\",\"isPositive\":true},{\"id\":\"round-trip-no-drift\",\"request\":\"Salvar e reabrir o formulário editado sem drift de configuração\",\"operationId\":\"field.label.set\",\"target\":\"nome\",\"params\":{\"label\":\"Nome Completo\"},\"isPositive\":true}]}",
17514
17976
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/praxis-filter-form-authoring-manifest.ts",
@@ -17518,7 +17980,7 @@
17518
17980
  "corpusVersion": "1.0.0"
17519
17981
  },
17520
17982
  {
17521
- "chunkIndex": 36,
17983
+ "chunkIndex": 37,
17522
17984
  "chunkKind": "context_pack",
17523
17985
  "content": "{\"componentId\":\"praxis-filter-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"fieldMetadata[].controlType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"input\",\"label\":\"Input\"},{\"value\":\"textarea\",\"label\":\"Textarea\"},{\"value\":\"email\",\"label\":\"Email\"},{\"value\":\"password\",\"label\":\"Password\"},{\"value\":\"search\",\"label\":\"Search\"},{\"value\":\"url\",\"label\":\"URL\"},{\"value\":\"phone\",\"label\":\"Phone\"},{\"value\":\"cpfCnpjInput\",\"label\":\"CPF/CNPJ\"},{\"value\":\"numericTextBox\",\"label\":\"Number\"},{\"value\":\"currency\",\"label\":\"Currency\"},{\"value\":\"priceRange\",\"label\":\"Price range\"},{\"value\":\"date\",\"label\":\"Date picker\"},{\"value\":\"dateRange\",\"label\":\"Date range\"},{\"value\":\"dateInput\",\"label\":\"Date input\"},{\"value\":\"dateTime\",\"label\":\"Datetime\"},{\"value\":\"dateTimeRange\",\"label\":\"Datetime range\"},{\"value\":\"dateTimeLocal\",\"label\":\"Datetime local\"},{\"value\":\"time\",\"label\":\"Time input\"},{\"value\":\"timePicker\",\"label\":\"Time picker\"},{\"value\":\"timeRange\",\"label\":\"Time range\"},{\"value\":\"week\",\"label\":\"Week input\"},{\"value\":\"month\",\"label\":\"Month input\"},{\"value\":\"year\",\"label\":\"Year input\"},{\"value\":\"select\",\"label\":\"Select\"},{\"value\":\"multiSelect\",\"label\":\"Multi select\"},{\"value\":\"multiSelectTree\",\"label\":\"Multi select tree\"},{\"value\":\"treeSelect\",\"label\":\"Tree select\"},{\"value\":\"transferList\",\"label\":\"Transfer list\"},{\"value\":\"autoComplete\",\"label\":\"Autocomplete\"},{\"value\":\"searchable-select\",\"label\":\"Searchable select\"},{\"value\":\"async-select\",\"label\":\"Async select\"},{\"value\":\"radio\",\"label\":\"Radio group\"},{\"value\":\"checkbox\",\"label\":\"Checkbox group\"},{\"value\":\"selectionList\",\"label\":\"Selection list\"},{\"value\":\"toggle\",\"label\":\"Toggle\"},{\"value\":\"buttonToggle\",\"label\":\"Button toggle\"},{\"value\":\"slider\",\"label\":\"Slider\"},{\"value\":\"rangeSlider\",\"label\":\"Range slider\"},{\"value\":\"rating\",\"label\":\"Rating\"},{\"value\":\"chipInput\",\"label\":\"Chips\"},{\"value\":\"chipList\",\"label\":\"Chip list\"},{\"value\":\"upload\",\"label\":\"File upload\"},{\"value\":\"color\",\"label\":\"Color input\"},{\"value\":\"colorPicker\",\"label\":\"Color picker\"},{\"value\":\"cronBuilder\",\"label\":\"Cron builder\"}]},\"fieldMetadata[].source\":{\"mode\":\"enum\",\"options\":[{\"value\":\"schema\",\"label\":\"Schema field\"},{\"value\":\"local\",\"label\":\"Local field\"}]},\"fieldMetadata[].submitPolicy\":{\"mode\":\"enum\",\"options\":[{\"value\":\"omit\",\"label\":\"Omit from submit payload\"},{\"value\":\"include\",\"label\":\"Include in submit payload\"},{\"value\":\"includeWhenDirty\",\"label\":\"Include only when dirty\"}]},\"fieldMetadata[].materialDesign.appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"fill\",\"label\":\"Fill\"},{\"value\":\"outline\",\"label\":\"Outline\"}]},\"fieldMetadata[].materialDesign.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"}]},\"fieldMetadata[].materialDesign.floatLabel\":{\"mode\":\"enum\",\"options\":[{\"value\":\"auto\",\"label\":\"Auto\"},{\"value\":\"always\",\"label\":\"Always\"}]},\"fieldMetadata[].materialDesign.density\":{\"mode\":\"enum\",\"options\":[{\"value\":\"comfortable\",\"label\":\"Comfortable\"},{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"dense\",\"label\":\"Dense\"}]},\"actions.position\":{\"mode\":\"enum\",\"options\":[{\"value\":\"left\",\"label\":\"Left\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"right\",\"label\":\"Right\"},{\"value\":\"justified\",\"label\":\"Justified\"},{\"value\":\"split\",\"label\":\"Split\"}]},\"actions.orientation\":{\"mode\":\"enum\",\"options\":[{\"value\":\"horizontal\",\"label\":\"Horizontal\"},{\"value\":\"vertical\",\"label\":\"Vertical\"}]},\"actions.spacing\":{\"mode\":\"enum\",\"options\":[{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"normal\",\"label\":\"Normal\"},{\"value\":\"spacious\",\"label\":\"Spacious\"}]},\"actions.placement\":{\"mode\":\"enum\",\"options\":[{\"value\":\"insideLastSection\",\"label\":\"Inside last section\"},{\"value\":\"afterSections\",\"label\":\"After sections\"},{\"value\":\"top\",\"label\":\"Top\"}]},\"actions.submit.type\":{\"mode\":\"enum\",\"options\":[{\"value\":\"button\",\"label\":\"Button\"},{\"value\":\"submit\",\"label\":\"Submit\"},{\"value\":\"reset\",\"label\":\"Reset\"}]},\"actions.submit.variant\":{\"mode\":\"enum\",\"options\":[{\"value\":\"raised\",\"label\":\"Raised\"},{\"value\":\"stroked\",\"label\":\"Stroked\"},{\"value\":\"flat\",\"label\":\"Flat\"},{\"value\":\"fab\",\"label\":\"Fab\"}]},\"actions.submit.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"small\",\"label\":\"Small\"},{\"value\":\"medium\",\"label\":\"Medium\"},{\"value\":\"large\",\"label\":\"Large\"}]},\"actions.submit.color\":{\"mode\":\"enum\",\"options\":[{\"value\":\"primary\",\"label\":\"Primary\"},{\"value\":\"accent\",\"label\":\"Accent\"},{\"value\":\"warn\",\"label\":\"Warn\"},{\"value\":\"basic\",\"label\":\"Basic\"}]},\"sections[].headerAlign\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"}]},\"sections[].appearance\":{\"mode\":\"enum\",\"options\":[{\"value\":\"card\",\"label\":\"Card\"},{\"value\":\"plain\",\"label\":\"Plain\"},{\"value\":\"step\",\"label\":\"Step\"}]},\"sections[].sectionHeader.mode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"icon\",\"label\":\"Icon\"},{\"value\":\"avatar-image\",\"label\":\"Avatar image\"},{\"value\":\"avatar-initials\",\"label\":\"Avatar initials\"},{\"value\":\"auto\",\"label\":\"Auto\"}]},\"sections[].sectionHeader.emptyState\":{\"mode\":\"enum\",\"options\":[{\"value\":\"placeholder-avatar\",\"label\":\"Neutral placeholder\"},{\"value\":\"fallback-icon\",\"label\":\"Fallback icon\"},{\"value\":\"none\",\"label\":\"None\"}]},\"sections[].sectionHeader.size\":{\"mode\":\"enum\",\"options\":[{\"value\":\"sm\",\"label\":\"Small\"},{\"value\":\"md\",\"label\":\"Medium\"},{\"value\":\"lg\",\"label\":\"Large\"}]},\"sections[].stepLabel\":{\"mode\":\"suggested\",\"options\":[{\"value\":\"Dados básicos\",\"label\":\"Dados básicos\"},{\"value\":\"Detalhes\",\"label\":\"Detalhes\"},{\"value\":\"Confirmação\",\"label\":\"Confirmação\"}]},\"sections[].titleStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"titleLarge\",\"label\":\"Title large\"},{\"value\":\"titleMedium\",\"label\":\"Title medium\"},{\"value\":\"titleSmall\",\"label\":\"Title small\"},{\"value\":\"headlineSmall\",\"label\":\"Headline small\"}]},\"sections[].descriptionStyle\":{\"mode\":\"enum\",\"options\":[{\"value\":\"bodyLarge\",\"label\":\"Body large\"},{\"value\":\"bodyMedium\",\"label\":\"Body medium\"},{\"value\":\"bodySmall\",\"label\":\"Body small\"}]},\"sections[].rows[].columns[].align\":{\"mode\":\"enum\",\"options\":[{\"value\":\"start\",\"label\":\"Start\"},{\"value\":\"center\",\"label\":\"Center\"},{\"value\":\"end\",\"label\":\"End\"},{\"value\":\"stretch\",\"label\":\"Stretch\"}]},\"sections[].rows[].columns[].items[].kind\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"richContent\",\"label\":\"Rich content\"}]},\"sections[].rows[].columns[].items[].layout\":{\"mode\":\"enum\",\"options\":[{\"value\":\"block\",\"label\":\"Block\"},{\"value\":\"inline\",\"label\":\"Inline\"}]},\"formRules[].targetType\":{\"mode\":\"enum\",\"options\":[{\"value\":\"field\",\"label\":\"Field\"},{\"value\":\"section\",\"label\":\"Section\"},{\"value\":\"row\",\"label\":\"Row\"},{\"value\":\"column\",\"label\":\"Column\"},{\"value\":\"action\",\"label\":\"Action\"},{\"value\":\"visualBlock\",\"label\":\"Visual block\"}]},\"formRules[].context\":{\"mode\":\"enum\",\"options\":[{\"value\":\"visibility\",\"label\":\"Visibility\"},{\"value\":\"readOnly\",\"label\":\"Read only\"},{\"value\":\"style\",\"label\":\"Style\"},{\"value\":\"validation\",\"label\":\"Validation\"},{\"value\":\"notification\",\"label\":\"Notification\"}]}}}}",
17524
17986
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
@@ -17528,7 +17990,7 @@
17528
17990
  "corpusVersion": "1.0.0"
17529
17991
  },
17530
17992
  {
17531
- "chunkIndex": 37,
17993
+ "chunkIndex": 38,
17532
17994
  "chunkKind": "context_pack",
17533
17995
  "content": "{\"componentId\":\"praxis-filter-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"field.visibility.hide\",\"intentExamples\":[\"hide field\",\"ocultar campo\",\"esconder campo\",\"invisible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":true}]}},{\"id\":\"field.visibility.show\",\"intentExamples\":[\"show field\",\"mostrar campo\",\"exibir campo\",\"visible\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"hidden\":false}]}},{\"id\":\"field.label.set\",\"intentExamples\":[\"label\",\"rename field\",\"renomear campo\",\"titulo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"label\":\"{{value}}\"}]}},{\"id\":\"field.placeholder.set\",\"intentExamples\":[\"placeholder\",\"hint text\",\"texto de ajuda\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"placeholder\":\"{{value}}\"}]}},{\"id\":\"field.required.enable\",\"intentExamples\":[\"required\",\"obrigatorio\",\"mandatory\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":true}]}},{\"id\":\"field.required.disable\",\"intentExamples\":[\"optional\",\"nao obrigatorio\",\"opcional\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"required\":false}]}},{\"id\":\"field.readonly.enable\",\"intentExamples\":[\"readonly\",\"somente leitura\",\"read only\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":true}]}},{\"id\":\"field.readonly.disable\",\"intentExamples\":[\"editable\",\"editavel\",\"read write\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"readOnly\":false}]}},{\"id\":\"field.disabled.enable\",\"intentExamples\":[\"disable field\",\"desabilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":true}]}},{\"id\":\"field.disabled.disable\",\"intentExamples\":[\"enable field\",\"habilitar campo\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"disabled\":false}]}},{\"id\":\"field.controlType.set\",\"intentExamples\":[\"control type\",\"tipo de campo\",\"controlType\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"controlType\":\"{{value}}\"}]}},{\"id\":\"field.icon.prefix.set\",\"intentExamples\":[\"prefix icon\",\"icone prefixo\",\"icon before\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"prefixIcon\":\"{{value}}\"}]}},{\"id\":\"field.icon.suffix.set\",\"intentExamples\":[\"suffix icon\",\"icone sufixo\",\"icon after\"],\"patchTemplate\":{\"fieldMetadata\":[{\"name\":\"{{target}}\",\"suffixIcon\":\"{{value}}\"}]}},{\"id\":\"section.title.set\",\"intentExamples\":[\"section title\",\"titulo da secao\",\"section name\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"title\":\"{{value}}\"}]}},{\"id\":\"section.description.set\",\"intentExamples\":[\"section description\",\"descricao da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"description\":\"{{value}}\"}]}},{\"id\":\"section.add\",\"intentExamples\":[\"add section\",\"adicionar secao\",\"nova secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{value}}\",\"title\":\"{{value}}\",\"rows\":[]}]},\"safetyNotes\":\"Certifique-se de que o ID da seção é único e relevante.\"},{\"id\":\"section.remove\",\"intentExamples\":[\"remove section\",\"remover secao\",\"excluir secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover uma seção é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"section.order.set\",\"intentExamples\":[\"order section\",\"reordenar secao\",\"mover secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"_order\":\"{{value}}\"}]},\"safetyNotes\":\"A reordenação de seções é uma operação que deve ser revisada.\"},{\"id\":\"row.add\",\"intentExamples\":[\"add row\",\"adicionar linha\",\"nova linha na secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"columns\":[]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da linha é único e relevante na seção.\"},{\"id\":\"row.remove\",\"intentExamples\":[\"remove row\",\"remover linha\",\"excluir linha da secao\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target}}\",\"rows\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]},\"safetyNotes\":\"Remover uma linha é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.add\",\"intentExamples\":[\"add column\",\"adicionar coluna\",\"nova coluna na linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"items\":[]}]}]}]},\"safetyNotes\":\"Certifique-se de que o ID da coluna é único e relevante na linha.\"},{\"id\":\"column.remove\",\"intentExamples\":[\"remove column\",\"remover coluna\",\"excluir coluna da linha\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{value}}\",\"_delete\":true}]}]}]},\"safetyNotes\":\"Remover uma coluna é uma ação destrutiva. Confirme com o usuário.\"},{\"id\":\"column.field.add\",\"intentExamples\":[\"add field to column\",\"adicionar campo a coluna\",\"colocar campo na coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"id\":\"field-{{value}}\",\"fieldName\":\"{{value}}\"}]}]}]}]},\"safetyNotes\":\"Verifique se o campo adicionado existe em fieldMetadata e se o posicionamento é lógico.\"},{\"id\":\"column.field.remove\",\"intentExamples\":[\"remove field from column\",\"remover campo da coluna\",\"tirar campo da coluna\"],\"patchTemplate\":{\"sections\":[{\"id\":\"{{target.sectionId}}\",\"rows\":[{\"id\":\"{{target.rowId}}\",\"columns\":[{\"id\":\"{{target.columnId}}\",\"items\":[{\"kind\":\"field\",\"fieldName\":\"{{value}}\",\"_remove\":true}]}]}]}]},\"safetyNotes\":\"Remover um campo de uma coluna pode alterar o layout do formulário.\"},{\"id\":\"actions.submit.label.set\",\"intentExamples\":[\"submit label\",\"rotulo salvar\",\"texto botao enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.submit.visible.set\",\"intentExamples\":[\"show submit\",\"esconder salvar\",\"visibilidade enviar\"],\"patchTemplate\":{\"actions\":{\"submit\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.label.set\",\"intentExamples\":[\"cancel label\",\"rotulo cancelar\",\"texto botao cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.cancel.visible.set\",\"intentExamples\":[\"show cancel\",\"esconder cancelar\",\"visibilidade cancelar\"],\"patchTemplate\":{\"actions\":{\"cancel\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"actions.reset.label.set\",\"intentExamples\":[\"reset label\",\"rotulo resetar\",\"texto botao limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"label\":\"{{value}}\"}}}},{\"id\":\"actions.reset.visible.set\",\"intentExamples\":[\"show reset\",\"esconder reset\",\"visibilidade limpar\"],\"patchTemplate\":{\"actions\":{\"reset\":{\"visible\":\"{{value}}\"}}}},{\"id\":\"rule.add.visibility\",\"intentExamples\":[\"add visibility rule\",\"regra de visibilidade\",\"campo condicional\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{value.id}}\",\"name\":\"{{value.name}}\",\"targetType\":\"field\",\"targets\":[\"{{target}}\"],\"effect\":{\"condition\":\"{{value.condition}}\",\"properties\":{\"hidden\":false},\"propertiesWhenFalse\":{\"hidden\":true}}}]},\"safetyNotes\":\"Criacao de regras requer Json Logic canonico em effect.condition, atencao a IDs de campos e teste apos a criacao.\"},{\"id\":\"rule.remove\",\"intentExamples\":[\"remove rule\",\"excluir regra\",\"apagar regra\"],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{target}}\",\"_delete\":true}]},\"safetyNotes\":\"Remover regras pode ter efeitos inesperados no comportamento do formulário.\"}]}}",
17534
17996
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
@@ -17538,7 +18000,7 @@
17538
18000
  "corpusVersion": "1.0.0"
17539
18001
  },
17540
18002
  {
17541
- "chunkIndex": 38,
18003
+ "chunkIndex": 39,
17542
18004
  "chunkKind": "context_pack",
17543
18005
  "content": "{\"componentId\":\"praxis-filter-form\",\"chunkSection\":\"componentContext.actionCatalog\",\"componentContext\":{\"actionCatalog\":[{\"id\":\"rule.add.dependency\",\"intentExamples\":[\"adicionar dependencia\",\"campo depende de\",\"mostrar se\",\"obrigatorio se\",\"desabilitar se\",\"campo condicional\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"triggerField\",\"type\":\"STRING\",\"description\":\"Campo que controla a regra (ex: tipoPessoa)\"},{\"name\":\"conditionValue\",\"type\":\"STRING\",\"description\":\"Valor do trigger para ativar a regra (ex: \\\"Jurídica\\\")\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado pela regra (ex: cnpj)\"},{\"name\":\"effectType\",\"type\":\"ENUM\",\"options\":[\"visibility\",\"required\",\"disabled\"],\"description\":\"Tipo de efeito (visibility=mostrar, required=obrigatório, disabled=desabilitar)\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"rule_{{params.triggerField}}_{{params.targetField}}\",\"name\":\"Dependência: {{params.targetField}} depende de {{params.triggerField}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":{\"==\":[{\"var\":\"{{params.triggerField}}\"},\"{{params.conditionValue}}\"]},\"properties\":{\"hidden\":\"{{params.effectType === 'visibility' ? false : undefined}}\",\"required\":\"{{params.effectType === 'required' ? true : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? true : undefined}}\"},\"propertiesWhenFalse\":{\"hidden\":\"{{params.effectType === 'visibility' ? true : undefined}}\",\"required\":\"{{params.effectType === 'required' ? false : undefined}}\",\"disabled\":\"{{params.effectType === 'disabled' ? false : undefined}}\"}}}]},\"safetyNotes\":\"Verifique se os nomes dos campos (trigger e target) existem. Ajuste a condição se o valor não for string simples.\"},{\"id\":\"rule.add.custom\",\"intentExamples\":[\"adicionar regra customizada\",\"regra complexa\",\"logica de formulario\"],\"scope\":\"GLOBAL\",\"valueType\":\"OBJECT\",\"operation\":\"create\",\"params\":[{\"name\":\"id\",\"type\":\"STRING\",\"description\":\"ID único da regra\"},{\"name\":\"condition\",\"type\":\"STRING\",\"description\":\"Objeto Json Logic canonico serializado, nunca DSL textual (ex: { \\\"and\\\": [{ \\\">\\\": [{ \\\"var\\\": \\\"idade\\\" }, 18] }, { \\\"==\\\": [{ \\\"var\\\": \\\"possuiHabilitacao\\\" }, true] }] })\"},{\"name\":\"targetField\",\"type\":\"STRING\",\"description\":\"Campo afetado\"},{\"name\":\"propertyName\",\"type\":\"STRING\",\"description\":\"Propriedade afetada (hidden, required, disabled, readOnly)\"},{\"name\":\"valueIfTrue\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for verdadeira\"},{\"name\":\"valueIfFalse\",\"type\":\"BOOLEAN\",\"description\":\"Valor se a condição for falsa\"}],\"patchTemplate\":{\"formRules\":[{\"id\":\"{{params.id}}\",\"name\":\"Regra Customizada: {{params.id}}\",\"targetType\":\"field\",\"targets\":[\"{{params.targetField}}\"],\"effect\":{\"condition\":\"{{params.condition}}\",\"properties\":{\"{{params.propertyName}}\":\"{{params.valueIfTrue}}\"},\"propertiesWhenFalse\":{\"{{params.propertyName}}\":\"{{params.valueIfFalse}}\"}}}]}}]}}",
17544
18006
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",
@@ -17548,7 +18010,7 @@
17548
18010
  "corpusVersion": "1.0.0"
17549
18011
  },
17550
18012
  {
17551
- "chunkIndex": 39,
18013
+ "chunkIndex": 40,
17552
18014
  "chunkKind": "context_pack",
17553
18015
  "content": "{\"componentId\":\"praxis-filter-form\",\"chunkSection\":\"componentContext\",\"componentContext\":{\"fieldResolvers\":{\"fieldMetadata[]\":[\"name\",\"label\"],\"sections[]\":[\"id\",\"title\"],\"sections[].rows[].columns[].items[]\":[\"id\",\"fieldName\"],\"sections[].rows[].columns[].fields[]\":[]},\"hints\":[\"Use fieldMetadata[].name as the canonical field id; avoid array indexes.\",\"Local fields are real form controls. Create them in fieldMetadata[] with source:\\\"local\\\", usually transient:true and submitPolicy:\\\"omit\\\", then place them as kind:\\\"field\\\" layout items.\",\"submitPolicy accepts only \\\"omit\\\", \\\"include\\\", or \\\"includeWhenDirty\\\". If legacy prompt text says \\\"never\\\", normalize it to \\\"omit\\\" before persisting.\",\"Visual blocks are not fields. Store them only as kind:\\\"richContent\\\" layout items and never in fieldMetadata[].\",\"Use sections[].rows[].columns[].items[] as the canonical mixed layout order. kind:\\\"field\\\" items reference fieldMetadata; kind:\\\"richContent\\\" items are visual blocks outside submit payload.\",\"Keep sections[].rows[].columns[].fields[] only as a field projection/migration path; do not create visual blocks there.\",\"For visualBlock formRules that change text, title, or message in a composed richContent document, use textNodeId, titleNodeId, or messageNodeId from the rule authoring context.\",\"For field formRules that must calculate a FormControl value, use effect.properties.value with the closed envelope { expression: <JSON Logic> }, such as { expression: { yearsSince: [{ var: \\\"birthDate\\\" }] } }. Use the closed envelope { literal: <value> } for structured literal objects; do not add extra keys and do not generate TypeScript functions.\",\"For conditional side effects, use formCommandRules with effects[].kind:\\\"global-action\\\" and a structured globalAction ref. The visual editor authors the primary effect and preserves secondary effects from advanced JSON. Do not put alert/modal/navigation commands inside formRules[].effect.properties.\",\"LLM-created formRules must include metadata.origin:\\\"llm\\\" and metadata.reviewStatus:\\\"pending\\\"; never write generated formRulesState.\",\"Domain guidance rules should usually target visualBlock when they only change advisory copy, compliance warnings, or operational instructions without changing submitted data.\",\"For layout edits, prefer adding or merging sections/rows/columns instead of replacing arrays. Use _delete: true for removal.\",\"Avoid non-serializable hooks or functions in patches; use plain strings or ask for manual edits.\",\"When adding sections/rows/columns, provide a unique \\\"id\\\" for each new element.\",\"For nested layout changes (column within a row within a section), explicitly define \\\"target.sectionId\\\", \\\"target.rowId\\\", \\\"target.columnId\\\" in user prompt for clarity.\",\"DOC: Widget purpose: dynamic form driven by FormConfig (layout + fields).\",\"DOC: Host inputs: config (optional, defaults to { sections: [] }) and resourcePath (optional). mode is optional (create/edit/view).\",\"DOC: When config is provided, sections[] define layout; fieldMetadata[] defines fields referenced by sections.\",\"DOC: If the form should be schema-driven, resourcePath + schemaSource are needed to fetch schema.\",\"DOC: resourcePath must be the base resource path only (no /filter, /all, /{id}). CRUD endpoints are handled internally.\"]}}",
17554
18016
  "sourcePointer": "projects/praxis-dynamic-form/src/lib/ai/filter-form-context-pack.ts",