@praxisui/crud 9.0.0-beta.2 → 9.0.0-beta.21

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.
@@ -0,0 +1,3414 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "generatedAt": "2026-06-25T18:12:49.520Z",
4
+ "packageName": "@praxisui/crud",
5
+ "packageVersion": "9.0.0-beta.21",
6
+ "sourceRegistry": "praxis-component-registry-ingestion",
7
+ "sourceRegistryVersion": "1.0.0",
8
+ "componentCount": 2,
9
+ "components": {
10
+ "praxis-crud": {
11
+ "id": "praxis-crud",
12
+ "description": "Tabela com operações de CRUD via metadados.",
13
+ "inputs": [
14
+ {
15
+ "name": "metadata",
16
+ "type": "CrudMetadata | string",
17
+ "required": false
18
+ },
19
+ {
20
+ "name": "crudId",
21
+ "type": "string",
22
+ "required": false
23
+ },
24
+ {
25
+ "name": "componentInstanceId",
26
+ "type": "string",
27
+ "required": false
28
+ },
29
+ {
30
+ "name": "context",
31
+ "type": "Record<string, unknown>",
32
+ "required": false
33
+ },
34
+ {
35
+ "name": "metadata.queryContext",
36
+ "type": "PraxisDataQueryContext | null",
37
+ "required": false
38
+ },
39
+ {
40
+ "name": "metadata.filterCriteria",
41
+ "type": "Record<string, unknown> | null",
42
+ "required": false
43
+ },
44
+ {
45
+ "name": "metadata.actions[].form",
46
+ "type": "CrudActionFormContract",
47
+ "required": false
48
+ },
49
+ {
50
+ "name": "enableCustomization",
51
+ "type": "boolean",
52
+ "required": false
53
+ }
54
+ ],
55
+ "outputs": [
56
+ {
57
+ "name": "afterOpen",
58
+ "type": "{ mode: FormOpenMode; action: string }",
59
+ "required": false
60
+ },
61
+ {
62
+ "name": "afterClose",
63
+ "type": "void",
64
+ "required": false
65
+ },
66
+ {
67
+ "name": "afterSave",
68
+ "type": "{ id: string | number; data: unknown }",
69
+ "required": false
70
+ },
71
+ {
72
+ "name": "afterDelete",
73
+ "type": "{ id: string | number }",
74
+ "required": false
75
+ },
76
+ {
77
+ "name": "rowClick",
78
+ "type": "{ row: unknown; index: number }",
79
+ "required": false
80
+ },
81
+ {
82
+ "name": "selectionChange",
83
+ "type": "unknown",
84
+ "required": false
85
+ },
86
+ {
87
+ "name": "error",
88
+ "type": "unknown",
89
+ "required": false
90
+ },
91
+ {
92
+ "name": "configureRequested",
93
+ "type": "void",
94
+ "required": false
95
+ },
96
+ {
97
+ "name": "crudAuthoringDocumentApplied",
98
+ "type": "CrudAuthoringWidgetPersistenceEvent",
99
+ "required": false
100
+ },
101
+ {
102
+ "name": "crudAuthoringDocumentSaved",
103
+ "type": "CrudAuthoringWidgetPersistenceEvent",
104
+ "required": false
105
+ }
106
+ ],
107
+ "configSchemaId": null,
108
+ "selector": "praxis-crud",
109
+ "friendlyName": "Praxis CRUD",
110
+ "icon": "table_chart",
111
+ "tags": [
112
+ "widget",
113
+ "crud",
114
+ "configurable",
115
+ "hasWizard",
116
+ "stable"
117
+ ],
118
+ "lib": "@praxisui/crud",
119
+ "source": "projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
120
+ "exportName": "PRAXIS_CRUD_COMPONENT_METADATA",
121
+ "componentCapabilities": [
122
+ {
123
+ "path": "component",
124
+ "category": "meta",
125
+ "valueKind": "enum",
126
+ "allowedValues": [
127
+ "praxis-crud"
128
+ ],
129
+ "description": "Identificador fixo do componente.",
130
+ "critical": true
131
+ },
132
+ {
133
+ "path": "resource",
134
+ "category": "resource",
135
+ "valueKind": "object",
136
+ "description": "Recurso principal do CRUD."
137
+ },
138
+ {
139
+ "path": "resource.path",
140
+ "category": "resource",
141
+ "valueKind": "string",
142
+ "description": "Endpoint base do recurso."
143
+ },
144
+ {
145
+ "path": "resource.idField",
146
+ "category": "resource",
147
+ "valueKind": "string",
148
+ "description": "Campo identificador do recurso."
149
+ },
150
+ {
151
+ "path": "resource.endpointKey",
152
+ "category": "resource",
153
+ "valueKind": "string",
154
+ "description": "Chave de endpoint (ApiEndpoint)."
155
+ },
156
+ {
157
+ "path": "queryContext.meta.domainCatalog",
158
+ "category": "resource",
159
+ "valueKind": "object",
160
+ "description": "Referencia leve para contexto semantico/governanca resolvido via Domain Catalog; nao materializa regras em FormConfig."
161
+ },
162
+ {
163
+ "path": "queryContext.meta.domainCatalog.schemaVersion",
164
+ "category": "resource",
165
+ "valueKind": "string",
166
+ "description": "Versao do contrato DomainCatalogContextHint usado em runtime e prompts."
167
+ },
168
+ {
169
+ "path": "queryContext.meta.domainCatalog.resourceKey",
170
+ "category": "resource",
171
+ "valueKind": "string",
172
+ "description": "ResourceKey semantico estavel usado para resolver vocabulario/governanca de dominio."
173
+ },
174
+ {
175
+ "path": "queryContext.meta.domainCatalog.releaseId",
176
+ "category": "resource",
177
+ "valueKind": "string",
178
+ "description": "Release opcional do Domain Catalog usada como fonte do contexto."
179
+ },
180
+ {
181
+ "path": "queryContext.meta.domainCatalog.query",
182
+ "category": "resource",
183
+ "valueKind": "string",
184
+ "description": "Probe de campo/conceito usado para buscar itens relevantes, como cpf, salario ou status."
185
+ },
186
+ {
187
+ "path": "queryContext.meta.domainCatalog.intent",
188
+ "category": "resource",
189
+ "valueKind": "enum",
190
+ "allowedValues": [
191
+ "authoring",
192
+ "explain",
193
+ "validate",
194
+ "ai-access-control"
195
+ ],
196
+ "description": "Intencao de uso do contexto para orientar LLMs e validadores sem expor dados alem do necessario."
197
+ },
198
+ {
199
+ "path": "table",
200
+ "category": "table",
201
+ "valueKind": "object",
202
+ "description": "TableConfig completo (usar catalogo de tabela)."
203
+ },
204
+ {
205
+ "path": "form",
206
+ "category": "form",
207
+ "valueKind": "object",
208
+ "description": "FormConfig completo (usar catalogo de formulario)."
209
+ },
210
+ {
211
+ "path": "defaults",
212
+ "category": "defaults",
213
+ "valueKind": "object",
214
+ "description": "Defaults aplicados a acoes e UI."
215
+ },
216
+ {
217
+ "path": "defaults.openMode",
218
+ "category": "defaults",
219
+ "valueKind": "enum",
220
+ "allowedValues": [
221
+ "route",
222
+ "modal",
223
+ "drawer"
224
+ ],
225
+ "description": "Modo padrao de abertura (route/modal/drawer)."
226
+ },
227
+ {
228
+ "path": "defaults.modal",
229
+ "category": "defaults",
230
+ "valueKind": "object",
231
+ "description": "Config de dialog (DialogConfig)."
232
+ },
233
+ {
234
+ "path": "defaults.back",
235
+ "category": "navigation",
236
+ "valueKind": "object",
237
+ "description": "Config de retorno (BackConfig)."
238
+ },
239
+ {
240
+ "path": "defaults.back.strategy",
241
+ "category": "navigation",
242
+ "valueKind": "enum",
243
+ "allowedValues": [
244
+ "auto",
245
+ "close",
246
+ "navigate"
247
+ ],
248
+ "description": "Estrategia de retorno."
249
+ },
250
+ {
251
+ "path": "defaults.back.returnTo",
252
+ "category": "navigation",
253
+ "valueKind": "string",
254
+ "description": "Rota de retorno quando strategy=navigate."
255
+ },
256
+ {
257
+ "path": "defaults.back.confirmOnDirty",
258
+ "category": "navigation",
259
+ "valueKind": "boolean",
260
+ "description": "Confirmar ao sair com alteracoes."
261
+ },
262
+ {
263
+ "path": "defaults.header",
264
+ "category": "defaults",
265
+ "valueKind": "object",
266
+ "description": "Config do header do CRUD."
267
+ },
268
+ {
269
+ "path": "defaults.header.showBack",
270
+ "category": "defaults",
271
+ "valueKind": "boolean",
272
+ "description": "Exibir botao voltar."
273
+ },
274
+ {
275
+ "path": "defaults.header.backLabel",
276
+ "category": "defaults",
277
+ "valueKind": "string",
278
+ "description": "Label do botao voltar."
279
+ },
280
+ {
281
+ "path": "defaults.header.variant",
282
+ "category": "defaults",
283
+ "valueKind": "enum",
284
+ "allowedValues": [
285
+ "ghost",
286
+ "tonal",
287
+ "outlined"
288
+ ],
289
+ "description": "Variante visual do header."
290
+ },
291
+ {
292
+ "path": "defaults.header.sticky",
293
+ "category": "defaults",
294
+ "valueKind": "boolean",
295
+ "description": "Header fixo."
296
+ },
297
+ {
298
+ "path": "defaults.header.breadcrumbs",
299
+ "category": "defaults",
300
+ "valueKind": "boolean",
301
+ "description": "Exibir breadcrumbs."
302
+ },
303
+ {
304
+ "path": "defaults.header.divider",
305
+ "category": "defaults",
306
+ "valueKind": "boolean",
307
+ "description": "Exibir divisor no header."
308
+ },
309
+ {
310
+ "path": "actions",
311
+ "category": "actions",
312
+ "valueKind": "array",
313
+ "description": "Acoes disponiveis no CRUD."
314
+ },
315
+ {
316
+ "path": "actions[].id",
317
+ "category": "actions",
318
+ "valueKind": "string",
319
+ "description": "ID da acao (RowAction/ToolbarAction)."
320
+ },
321
+ {
322
+ "path": "actions[].label",
323
+ "category": "actions",
324
+ "valueKind": "string",
325
+ "description": "Label da acao."
326
+ },
327
+ {
328
+ "path": "actions[].icon",
329
+ "category": "actions",
330
+ "valueKind": "string",
331
+ "description": "Icone da acao."
332
+ },
333
+ {
334
+ "path": "actions[].color",
335
+ "category": "actions",
336
+ "valueKind": "string",
337
+ "description": "Cor da acao."
338
+ },
339
+ {
340
+ "path": "actions[].disabled",
341
+ "category": "actions",
342
+ "valueKind": "boolean",
343
+ "description": "Acao desabilitada."
344
+ },
345
+ {
346
+ "path": "actions[].action",
347
+ "category": "actions",
348
+ "valueKind": "string",
349
+ "description": "Nome da acao emitida."
350
+ },
351
+ {
352
+ "path": "actions[].tooltip",
353
+ "category": "actions",
354
+ "valueKind": "string",
355
+ "description": "Tooltip da acao."
356
+ },
357
+ {
358
+ "path": "actions[].requiresConfirmation",
359
+ "category": "actions",
360
+ "valueKind": "boolean",
361
+ "description": "Exige confirmacao."
362
+ },
363
+ {
364
+ "path": "actions[].visibleWhen",
365
+ "category": "actions",
366
+ "valueKind": "expression",
367
+ "description": "Condicao de visibilidade (RowAction/ToolbarAction)."
368
+ },
369
+ {
370
+ "path": "actions[].separator",
371
+ "category": "actions",
372
+ "valueKind": "boolean",
373
+ "description": "Separador apos a acao (RowAction)."
374
+ },
375
+ {
376
+ "path": "actions[].autoDelete",
377
+ "category": "actions",
378
+ "valueKind": "boolean",
379
+ "description": "Habilita auto delete (RowAction)."
380
+ },
381
+ {
382
+ "path": "actions[].deleteEndpoint",
383
+ "category": "actions",
384
+ "valueKind": "string",
385
+ "description": "Endpoint custom para delete (RowAction)."
386
+ },
387
+ {
388
+ "path": "actions[].type",
389
+ "category": "actions",
390
+ "valueKind": "enum",
391
+ "allowedValues": [
392
+ "button",
393
+ "icon",
394
+ "fab",
395
+ "menu"
396
+ ],
397
+ "description": "Tipo de acao (ToolbarAction)."
398
+ },
399
+ {
400
+ "path": "actions[].appearance",
401
+ "category": "actions",
402
+ "valueKind": "enum",
403
+ "allowedValues": [
404
+ "filled",
405
+ "outlined",
406
+ "elevated",
407
+ "text",
408
+ "tonal"
409
+ ],
410
+ "description": "Aparencia do botao (ToolbarAction)."
411
+ },
412
+ {
413
+ "path": "actions[].position",
414
+ "category": "actions",
415
+ "valueKind": "enum",
416
+ "allowedValues": [
417
+ "start",
418
+ "end"
419
+ ],
420
+ "description": "Posicao da acao (ToolbarAction)."
421
+ },
422
+ {
423
+ "path": "actions[].order",
424
+ "category": "actions",
425
+ "valueKind": "number",
426
+ "description": "Ordem de exibicao (ToolbarAction)."
427
+ },
428
+ {
429
+ "path": "actions[].shortcut",
430
+ "category": "actions",
431
+ "valueKind": "string",
432
+ "description": "Atalho de teclado (ToolbarAction)."
433
+ },
434
+ {
435
+ "path": "actions[].children",
436
+ "category": "actions",
437
+ "valueKind": "array",
438
+ "description": "Sub-acoes (menu)."
439
+ },
440
+ {
441
+ "path": "actions[].openMode",
442
+ "category": "actions",
443
+ "valueKind": "enum",
444
+ "allowedValues": [
445
+ "route",
446
+ "modal",
447
+ "drawer"
448
+ ],
449
+ "description": "Modo de abertura da acao."
450
+ },
451
+ {
452
+ "path": "actions[].route",
453
+ "category": "actions",
454
+ "valueKind": "string",
455
+ "description": "Rota para openMode=route."
456
+ },
457
+ {
458
+ "path": "actions[].formId",
459
+ "category": "actions",
460
+ "valueKind": "string",
461
+ "description": "FormId canonico para modal/drawer; se ausente, o host precisa resolve-lo por override por acao antes da abertura."
462
+ },
463
+ {
464
+ "path": "actions[].params",
465
+ "category": "actions",
466
+ "valueKind": "array",
467
+ "description": "Mapeamento de parametros."
468
+ },
469
+ {
470
+ "path": "actions[].params[].from",
471
+ "category": "actions",
472
+ "valueKind": "string",
473
+ "description": "Origem do parametro."
474
+ },
475
+ {
476
+ "path": "actions[].params[].to",
477
+ "category": "actions",
478
+ "valueKind": "enum",
479
+ "allowedValues": [
480
+ "routeParam",
481
+ "query",
482
+ "input"
483
+ ],
484
+ "description": "Destino do parametro."
485
+ },
486
+ {
487
+ "path": "actions[].params[].name",
488
+ "category": "actions",
489
+ "valueKind": "string",
490
+ "description": "Nome do parametro no destino."
491
+ },
492
+ {
493
+ "path": "actions[].form.initialValue",
494
+ "category": "actions",
495
+ "valueKind": "object",
496
+ "description": "Seed fixo do formulario injetado em inputs.initialValue antes da abertura."
497
+ },
498
+ {
499
+ "path": "actions[].back",
500
+ "category": "navigation",
501
+ "valueKind": "object",
502
+ "description": "BackConfig por acao."
503
+ },
504
+ {
505
+ "path": "actions[].back.strategy",
506
+ "category": "navigation",
507
+ "valueKind": "enum",
508
+ "allowedValues": [
509
+ "auto",
510
+ "close",
511
+ "navigate"
512
+ ],
513
+ "description": "Estrategia de retorno da acao (auto, close, navigate)."
514
+ },
515
+ {
516
+ "path": "actions[].back.returnTo",
517
+ "category": "navigation",
518
+ "valueKind": "string",
519
+ "description": "Rota ou destino usado quando a estrategia de retorno for navigate."
520
+ },
521
+ {
522
+ "path": "actions[].back.confirmOnDirty",
523
+ "category": "navigation",
524
+ "valueKind": "boolean",
525
+ "description": "Solicita confirmacao antes de sair com alteracoes nao salvas."
526
+ },
527
+ {
528
+ "path": "i18n",
529
+ "category": "i18n",
530
+ "valueKind": "object",
531
+ "description": "Mensagens i18n do CRUD."
532
+ },
533
+ {
534
+ "path": "i18n.crudDialog",
535
+ "category": "i18n",
536
+ "valueKind": "object",
537
+ "description": "Mapa de textos do dialog."
538
+ }
539
+ ],
540
+ "componentCapabilityNotes": [
541
+ "CrudMetadata agrega TableConfig e FormConfig; use os catalogos de tabela e formulario para detalhes.",
542
+ "actions[] herda campos de RowAction e ToolbarAction; combine com openMode/route/formId quando aplicavel."
543
+ ],
544
+ "componentContext": {
545
+ "version": "v1",
546
+ "optionsByPath": {
547
+ "defaults.openMode": {
548
+ "mode": "enum",
549
+ "options": [
550
+ {
551
+ "value": "route",
552
+ "label": "Route"
553
+ },
554
+ {
555
+ "value": "modal",
556
+ "label": "Modal"
557
+ },
558
+ {
559
+ "value": "drawer",
560
+ "label": "Drawer"
561
+ }
562
+ ]
563
+ },
564
+ "actions[].openMode": {
565
+ "mode": "enum",
566
+ "options": [
567
+ {
568
+ "value": "route",
569
+ "label": "Route"
570
+ },
571
+ {
572
+ "value": "modal",
573
+ "label": "Modal"
574
+ },
575
+ {
576
+ "value": "drawer",
577
+ "label": "Drawer"
578
+ }
579
+ ]
580
+ },
581
+ "actions[].params[].to": {
582
+ "mode": "enum",
583
+ "options": [
584
+ {
585
+ "value": "routeParam",
586
+ "label": "Route param"
587
+ },
588
+ {
589
+ "value": "query",
590
+ "label": "Query param"
591
+ },
592
+ {
593
+ "value": "input",
594
+ "label": "Dialog input"
595
+ }
596
+ ]
597
+ },
598
+ "defaults.header.variant": {
599
+ "mode": "enum",
600
+ "options": [
601
+ {
602
+ "value": "ghost",
603
+ "label": "Ghost"
604
+ },
605
+ {
606
+ "value": "tonal",
607
+ "label": "Tonal"
608
+ },
609
+ {
610
+ "value": "outlined",
611
+ "label": "Outlined"
612
+ }
613
+ ]
614
+ },
615
+ "actions[].type": {
616
+ "mode": "enum",
617
+ "options": [
618
+ {
619
+ "value": "button",
620
+ "label": "Button"
621
+ },
622
+ {
623
+ "value": "icon",
624
+ "label": "Icon"
625
+ },
626
+ {
627
+ "value": "fab",
628
+ "label": "Fab"
629
+ },
630
+ {
631
+ "value": "menu",
632
+ "label": "Menu"
633
+ }
634
+ ]
635
+ },
636
+ "actions[].appearance": {
637
+ "mode": "enum",
638
+ "options": [
639
+ {
640
+ "value": "filled",
641
+ "label": "Filled"
642
+ },
643
+ {
644
+ "value": "outlined",
645
+ "label": "Outlined"
646
+ },
647
+ {
648
+ "value": "elevated",
649
+ "label": "Elevated"
650
+ },
651
+ {
652
+ "value": "text",
653
+ "label": "Text"
654
+ },
655
+ {
656
+ "value": "tonal",
657
+ "label": "Tonal"
658
+ }
659
+ ]
660
+ },
661
+ "actions[].position": {
662
+ "mode": "enum",
663
+ "options": [
664
+ {
665
+ "value": "start",
666
+ "label": "Start"
667
+ },
668
+ {
669
+ "value": "end",
670
+ "label": "End"
671
+ }
672
+ ]
673
+ },
674
+ "defaults.back.strategy": {
675
+ "mode": "enum",
676
+ "options": [
677
+ {
678
+ "value": "auto",
679
+ "label": "Auto"
680
+ },
681
+ {
682
+ "value": "close",
683
+ "label": "Close"
684
+ },
685
+ {
686
+ "value": "navigate",
687
+ "label": "Navigate"
688
+ }
689
+ ]
690
+ },
691
+ "actions[].back.strategy": {
692
+ "mode": "enum",
693
+ "options": [
694
+ {
695
+ "value": "auto",
696
+ "label": "Auto"
697
+ },
698
+ {
699
+ "value": "close",
700
+ "label": "Close"
701
+ },
702
+ {
703
+ "value": "navigate",
704
+ "label": "Navigate"
705
+ }
706
+ ]
707
+ },
708
+ "resource.endpointKey": {
709
+ "mode": "enum",
710
+ "options": [
711
+ {
712
+ "value": "default",
713
+ "label": "Default"
714
+ },
715
+ {
716
+ "value": "humanResources",
717
+ "label": "Human resources"
718
+ },
719
+ {
720
+ "value": "uiWrappersTest",
721
+ "label": "UI wrappers test"
722
+ }
723
+ ]
724
+ }
725
+ },
726
+ "actionCatalog": [
727
+ {
728
+ "id": "resource.path.set",
729
+ "intentExamples": [
730
+ "resource",
731
+ "endpoint",
732
+ "api",
733
+ "path",
734
+ "rota"
735
+ ],
736
+ "patchTemplate": {
737
+ "resource": {
738
+ "path": "{{value}}"
739
+ }
740
+ }
741
+ },
742
+ {
743
+ "id": "resource.idField.set",
744
+ "intentExamples": [
745
+ "id field",
746
+ "chave",
747
+ "primary key"
748
+ ],
749
+ "patchTemplate": {
750
+ "resource": {
751
+ "idField": "{{value}}"
752
+ }
753
+ }
754
+ },
755
+ {
756
+ "id": "defaults.openMode.set",
757
+ "intentExamples": [
758
+ "open mode",
759
+ "open",
760
+ "route",
761
+ "modal",
762
+ "drawer"
763
+ ],
764
+ "patchTemplate": {
765
+ "defaults": {
766
+ "openMode": "{{value}}"
767
+ }
768
+ }
769
+ },
770
+ {
771
+ "id": "defaults.header.variant.set",
772
+ "intentExamples": [
773
+ "header",
774
+ "variant",
775
+ "style",
776
+ "back button"
777
+ ],
778
+ "patchTemplate": {
779
+ "defaults": {
780
+ "header": {
781
+ "variant": "{{value}}"
782
+ }
783
+ }
784
+ }
785
+ },
786
+ {
787
+ "id": "defaults.header.backLabel.set",
788
+ "intentExamples": [
789
+ "back label",
790
+ "voltar",
791
+ "header label"
792
+ ],
793
+ "patchTemplate": {
794
+ "defaults": {
795
+ "header": {
796
+ "backLabel": "{{value}}"
797
+ }
798
+ }
799
+ }
800
+ },
801
+ {
802
+ "id": "defaults.header.showBack.enable",
803
+ "intentExamples": [
804
+ "show back",
805
+ "back button",
806
+ "enable back"
807
+ ],
808
+ "patchTemplate": {
809
+ "defaults": {
810
+ "header": {
811
+ "showBack": true
812
+ }
813
+ }
814
+ }
815
+ },
816
+ {
817
+ "id": "defaults.header.showBack.disable",
818
+ "intentExamples": [
819
+ "hide back",
820
+ "disable back"
821
+ ],
822
+ "patchTemplate": {
823
+ "defaults": {
824
+ "header": {
825
+ "showBack": false
826
+ }
827
+ }
828
+ }
829
+ },
830
+ {
831
+ "id": "defaults.back.strategy.set",
832
+ "intentExamples": [
833
+ "back",
834
+ "return",
835
+ "navigation"
836
+ ],
837
+ "patchTemplate": {
838
+ "defaults": {
839
+ "back": {
840
+ "strategy": "{{value}}"
841
+ }
842
+ }
843
+ }
844
+ },
845
+ {
846
+ "id": "defaults.back.returnTo.set",
847
+ "intentExamples": [
848
+ "return to",
849
+ "back route",
850
+ "navigate back"
851
+ ],
852
+ "patchTemplate": {
853
+ "defaults": {
854
+ "back": {
855
+ "returnTo": "{{value}}"
856
+ }
857
+ }
858
+ }
859
+ },
860
+ {
861
+ "id": "defaults.back.confirmOnDirty.enable",
862
+ "intentExamples": [
863
+ "confirm",
864
+ "dirty",
865
+ "unsaved",
866
+ "confirm exit"
867
+ ],
868
+ "patchTemplate": {
869
+ "defaults": {
870
+ "back": {
871
+ "confirmOnDirty": true
872
+ }
873
+ }
874
+ }
875
+ },
876
+ {
877
+ "id": "defaults.back.confirmOnDirty.disable",
878
+ "intentExamples": [
879
+ "no confirm",
880
+ "disable confirm"
881
+ ],
882
+ "patchTemplate": {
883
+ "defaults": {
884
+ "back": {
885
+ "confirmOnDirty": false
886
+ }
887
+ }
888
+ }
889
+ },
890
+ {
891
+ "id": "action.add",
892
+ "intentExamples": [
893
+ "add action",
894
+ "new action",
895
+ "create action"
896
+ ],
897
+ "patchTemplate": {
898
+ "actions": [
899
+ {
900
+ "id": "{{target}}",
901
+ "action": "{{params.action}}",
902
+ "label": "{{value}}",
903
+ "icon": "{{params.icon}}"
904
+ }
905
+ ]
906
+ }
907
+ },
908
+ {
909
+ "id": "action.label.set",
910
+ "intentExamples": [
911
+ "label",
912
+ "rename action",
913
+ "titulo"
914
+ ],
915
+ "patchTemplate": {
916
+ "actions": [
917
+ {
918
+ "id": "{{target}}",
919
+ "label": "{{value}}"
920
+ }
921
+ ]
922
+ }
923
+ },
924
+ {
925
+ "id": "action.icon.set",
926
+ "intentExamples": [
927
+ "icon",
928
+ "icone"
929
+ ],
930
+ "patchTemplate": {
931
+ "actions": [
932
+ {
933
+ "id": "{{target}}",
934
+ "icon": "{{value}}"
935
+ }
936
+ ]
937
+ }
938
+ },
939
+ {
940
+ "id": "action.openMode.set",
941
+ "intentExamples": [
942
+ "open mode",
943
+ "route",
944
+ "modal",
945
+ "drawer"
946
+ ],
947
+ "patchTemplate": {
948
+ "actions": [
949
+ {
950
+ "id": "{{target}}",
951
+ "openMode": "{{value}}"
952
+ }
953
+ ]
954
+ }
955
+ },
956
+ {
957
+ "id": "action.route.set",
958
+ "intentExamples": [
959
+ "route",
960
+ "url",
961
+ "navigate"
962
+ ],
963
+ "patchTemplate": {
964
+ "actions": [
965
+ {
966
+ "id": "{{target}}",
967
+ "route": "{{value}}"
968
+ }
969
+ ]
970
+ }
971
+ },
972
+ {
973
+ "id": "action.formId.set",
974
+ "intentExamples": [
975
+ "form",
976
+ "formId",
977
+ "dialog",
978
+ "drawer"
979
+ ],
980
+ "patchTemplate": {
981
+ "actions": [
982
+ {
983
+ "id": "{{target}}",
984
+ "formId": "{{value}}"
985
+ }
986
+ ]
987
+ }
988
+ },
989
+ {
990
+ "id": "action.params.add",
991
+ "intentExamples": [
992
+ "param",
993
+ "params",
994
+ "query",
995
+ "route param"
996
+ ],
997
+ "patchTemplate": {
998
+ "actions": [
999
+ {
1000
+ "id": "{{target}}",
1001
+ "params": [
1002
+ {
1003
+ "from": "{{params.from}}",
1004
+ "to": "{{params.to}}",
1005
+ "name": "{{params.name}}"
1006
+ }
1007
+ ]
1008
+ }
1009
+ ]
1010
+ }
1011
+ },
1012
+ {
1013
+ "id": "action.initialValue.set",
1014
+ "intentExamples": [
1015
+ "initial value",
1016
+ "seed",
1017
+ "default form values",
1018
+ "prefill"
1019
+ ],
1020
+ "patchTemplate": {
1021
+ "actions": [
1022
+ {
1023
+ "id": "{{target}}",
1024
+ "form": {
1025
+ "initialValue": "{{value}}"
1026
+ }
1027
+ }
1028
+ ]
1029
+ }
1030
+ },
1031
+ {
1032
+ "id": "action.confirmation.enable",
1033
+ "intentExamples": [
1034
+ "confirm",
1035
+ "confirmation",
1036
+ "requires confirmation"
1037
+ ],
1038
+ "patchTemplate": {
1039
+ "actions": [
1040
+ {
1041
+ "id": "{{target}}",
1042
+ "requiresConfirmation": true
1043
+ }
1044
+ ]
1045
+ }
1046
+ },
1047
+ {
1048
+ "id": "action.confirmation.disable",
1049
+ "intentExamples": [
1050
+ "no confirm",
1051
+ "disable confirmation"
1052
+ ],
1053
+ "patchTemplate": {
1054
+ "actions": [
1055
+ {
1056
+ "id": "{{target}}",
1057
+ "requiresConfirmation": false
1058
+ }
1059
+ ]
1060
+ }
1061
+ },
1062
+ {
1063
+ "id": "action.visibleWhen.set",
1064
+ "intentExamples": [
1065
+ "visible when",
1066
+ "visibility",
1067
+ "show when"
1068
+ ],
1069
+ "patchTemplate": {
1070
+ "actions": [
1071
+ {
1072
+ "id": "{{target}}",
1073
+ "visibleWhen": "{{value}}"
1074
+ }
1075
+ ]
1076
+ }
1077
+ },
1078
+ {
1079
+ "id": "action.type.set",
1080
+ "intentExamples": [
1081
+ "type",
1082
+ "button type",
1083
+ "toolbar"
1084
+ ],
1085
+ "patchTemplate": {
1086
+ "actions": [
1087
+ {
1088
+ "id": "{{target}}",
1089
+ "type": "{{value}}"
1090
+ }
1091
+ ]
1092
+ }
1093
+ },
1094
+ {
1095
+ "id": "action.appearance.set",
1096
+ "intentExamples": [
1097
+ "appearance",
1098
+ "variant",
1099
+ "style"
1100
+ ],
1101
+ "patchTemplate": {
1102
+ "actions": [
1103
+ {
1104
+ "id": "{{target}}",
1105
+ "appearance": "{{value}}"
1106
+ }
1107
+ ]
1108
+ }
1109
+ },
1110
+ {
1111
+ "id": "action.position.set",
1112
+ "intentExamples": [
1113
+ "position",
1114
+ "start",
1115
+ "end"
1116
+ ],
1117
+ "patchTemplate": {
1118
+ "actions": [
1119
+ {
1120
+ "id": "{{target}}",
1121
+ "position": "{{value}}"
1122
+ }
1123
+ ]
1124
+ }
1125
+ },
1126
+ {
1127
+ "id": "action.back.strategy.set",
1128
+ "intentExamples": [
1129
+ "back",
1130
+ "return",
1131
+ "navigation"
1132
+ ],
1133
+ "patchTemplate": {
1134
+ "actions": [
1135
+ {
1136
+ "id": "{{target}}",
1137
+ "back": {
1138
+ "strategy": "{{value}}"
1139
+ }
1140
+ }
1141
+ ]
1142
+ }
1143
+ },
1144
+ {
1145
+ "id": "ADD_CONDITIONAL_RENDERER",
1146
+ "intentExamples": [
1147
+ "conditional renderer",
1148
+ "renderer condicional",
1149
+ "badge condicional",
1150
+ "chip condicional",
1151
+ "badge se",
1152
+ "chip se",
1153
+ "conditional badge",
1154
+ "conditional chip"
1155
+ ],
1156
+ "patchTemplate": {
1157
+ "table": {
1158
+ "columns": [
1159
+ {
1160
+ "field": "{{target}}",
1161
+ "conditionalRenderers": [
1162
+ {
1163
+ "condition": "{{params.condition}}",
1164
+ "renderer": "{{params.renderer}}"
1165
+ }
1166
+ ]
1167
+ }
1168
+ ]
1169
+ }
1170
+ }
1171
+ }
1172
+ ],
1173
+ "fieldResolvers": {
1174
+ "actions[]": [
1175
+ "id",
1176
+ "label",
1177
+ "action"
1178
+ ],
1179
+ "resource.path": [],
1180
+ "table.columns[].field": [
1181
+ "field",
1182
+ "header"
1183
+ ]
1184
+ },
1185
+ "hints": [
1186
+ "Use actions[].id as the canonical action key; avoid array indexes.",
1187
+ "When adding actions, include params.action to describe the underlying CRUD action.",
1188
+ "openMode route requires actions[].route; modal or drawer require actions[].formId unless the host completes bindings via per-action override before opening.",
1189
+ "Table and form are full configs; patch nested fields instead of replacing the whole object.",
1190
+ "Use ADD_CONDITIONAL_RENDERER for table conditional badges/chips (table.columns[].conditionalRenderers).",
1191
+ "CRUD agrega TableConfig e FormConfig; siga o contrato da tabela para columns/conditionalRenderers.",
1192
+ "DOC: Widget purpose: CRUD shell that composes a table + optional form from metadata.",
1193
+ "DOC: Host inputs: metadata (required) and crudId (required). componentInstanceId/context/enableCustomization are optional.",
1194
+ "DOC: CrudMetadata requires component='praxis-crud' and table (TableConfig).",
1195
+ "DOC: inner table renders with resource.path (remote) or metadata.data (local). If both are provided, resource.path takes precedence.",
1196
+ "DOC: If actions open modal/drawer, actions[].formId is required unless a per-action override resolves it before opening; for route mode, actions[].route is required unless override resolves it."
1197
+ ]
1198
+ },
1199
+ "authoringManifest": {
1200
+ "schemaVersion": "1.0.0",
1201
+ "componentId": "praxis-crud",
1202
+ "ownerPackage": "@praxisui/crud",
1203
+ "configSchemaId": "CrudMetadata",
1204
+ "manifestVersion": "1.0.0",
1205
+ "runtimeInputs": [
1206
+ {
1207
+ "name": "metadata",
1208
+ "type": "CrudMetadata | string",
1209
+ "description": "Canonical CRUD metadata or serialized metadata document."
1210
+ },
1211
+ {
1212
+ "name": "crudId",
1213
+ "type": "string",
1214
+ "description": "Stable CRUD instance id used for table/form identity and persistence."
1215
+ },
1216
+ {
1217
+ "name": "componentInstanceId",
1218
+ "type": "string",
1219
+ "description": "Optional stable host instance id for multiple CRUD widgets on the same route."
1220
+ },
1221
+ {
1222
+ "name": "context",
1223
+ "type": "Record<string, unknown>",
1224
+ "description": "Opaque host context used for authoring seeds and launcher inputs."
1225
+ },
1226
+ {
1227
+ "name": "afterOpen",
1228
+ "type": "{ mode: FormOpenMode; action: string }",
1229
+ "description": "Emitted after a CRUD action opens."
1230
+ },
1231
+ {
1232
+ "name": "afterSave",
1233
+ "type": "{ id: string | number; data: unknown }",
1234
+ "description": "Emitted after save; CRUD refetches the list."
1235
+ },
1236
+ {
1237
+ "name": "afterDelete",
1238
+ "type": "{ id: string | number }",
1239
+ "description": "Emitted after delete; CRUD refetches the list."
1240
+ }
1241
+ ],
1242
+ "editableTargets": [
1243
+ {
1244
+ "kind": "resourceBinding",
1245
+ "resolver": "crud-resource-by-path-or-key",
1246
+ "description": "Resource path/key, id field, endpoint key and query context owned by CRUD orchestration."
1247
+ },
1248
+ {
1249
+ "kind": "listSurface",
1250
+ "resolver": "crud-list-surface",
1251
+ "description": "CRUD-hosted list surface and table delegation boundary."
1252
+ },
1253
+ {
1254
+ "kind": "createSurface",
1255
+ "resolver": "crud-action-by-id:create",
1256
+ "description": "Create action open mode, route/form binding and launcher inputs."
1257
+ },
1258
+ {
1259
+ "kind": "editSurface",
1260
+ "resolver": "crud-action-by-id:edit",
1261
+ "description": "Edit action open mode, route/form binding and launcher inputs."
1262
+ },
1263
+ {
1264
+ "kind": "viewSurface",
1265
+ "resolver": "crud-action-by-id:view",
1266
+ "description": "View action open mode, route/form binding and launcher inputs."
1267
+ },
1268
+ {
1269
+ "kind": "deleteBehavior",
1270
+ "resolver": "crud-action-by-id:delete",
1271
+ "description": "Delete action enablement, confirmation, endpoint and capability policy."
1272
+ },
1273
+ {
1274
+ "kind": "dialogHost",
1275
+ "resolver": "crud-dialog-host-defaults",
1276
+ "description": "Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent."
1277
+ },
1278
+ {
1279
+ "kind": "formBinding",
1280
+ "resolver": "crud-action-form-contract-by-action-id",
1281
+ "description": "CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue."
1282
+ },
1283
+ {
1284
+ "kind": "permissions",
1285
+ "resolver": "crud-resource-capabilities",
1286
+ "description": "CRUD action availability derived from resource capabilities and action permissions."
1287
+ },
1288
+ {
1289
+ "kind": "domainGovernanceContext",
1290
+ "resolver": "domain-catalog-context-by-resource-key",
1291
+ "description": "Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta."
1292
+ },
1293
+ {
1294
+ "kind": "childOperation",
1295
+ "resolver": "child-authoring-manifest-operation",
1296
+ "description": "Delegated form/table/dialog/settings-panel operation owned by the child component manifest."
1297
+ }
1298
+ ],
1299
+ "operations": [
1300
+ {
1301
+ "operationId": "resource.bind",
1302
+ "title": "Bind CRUD resource",
1303
+ "scope": "dataBinding",
1304
+ "targetKind": "resourceBinding",
1305
+ "target": {
1306
+ "kind": "resourceBinding",
1307
+ "resolver": "crud-resource-by-path-or-key",
1308
+ "ambiguityPolicy": "fail",
1309
+ "required": true
1310
+ },
1311
+ "inputSchema": {
1312
+ "type": "object",
1313
+ "required": [
1314
+ "resourcePath"
1315
+ ],
1316
+ "properties": {
1317
+ "resourcePath": {
1318
+ "type": "string"
1319
+ },
1320
+ "resourceKey": {
1321
+ "type": "string"
1322
+ },
1323
+ "idField": {
1324
+ "type": [
1325
+ "string",
1326
+ "number"
1327
+ ]
1328
+ },
1329
+ "endpointKey": {
1330
+ "type": "string"
1331
+ },
1332
+ "queryContext": {
1333
+ "type": "object"
1334
+ }
1335
+ }
1336
+ },
1337
+ "effects": [
1338
+ {
1339
+ "kind": "compile-domain-patch",
1340
+ "handler": "crud-resource-bind",
1341
+ "handlerContract": {
1342
+ "reads": [
1343
+ "CrudMetadata.resource",
1344
+ "api_metadata",
1345
+ "ResourceDiscoveryService",
1346
+ "GET /{resource}/capabilities"
1347
+ ],
1348
+ "writes": [
1349
+ "CrudMetadata.resource",
1350
+ "CrudMetadata.queryContext",
1351
+ "PraxisCrudComponent.tableCrudContext"
1352
+ ],
1353
+ "identityKeys": [
1354
+ "resourcePath",
1355
+ "resourceKey"
1356
+ ],
1357
+ "failureModes": [
1358
+ "resource-not-found",
1359
+ "schema-url-not-canonical",
1360
+ "capabilities-unavailable",
1361
+ "id-field-missing"
1362
+ ],
1363
+ "description": "Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use."
1364
+ }
1365
+ }
1366
+ ],
1367
+ "validators": [
1368
+ "resource-exists-in-api-metadata",
1369
+ "resource-path-canonical",
1370
+ "resource-key-stable",
1371
+ "id-field-known",
1372
+ "resource-capabilities-resolvable"
1373
+ ],
1374
+ "affectedPaths": [
1375
+ "resource.path",
1376
+ "resource.idField",
1377
+ "resource.endpointKey",
1378
+ "queryContext",
1379
+ "filterCriteria"
1380
+ ],
1381
+ "submissionImpact": "affects-remote-binding",
1382
+ "preconditions": [
1383
+ "crud-metadata-loaded",
1384
+ "api-metadata-available"
1385
+ ]
1386
+ },
1387
+ {
1388
+ "operationId": "domain.governanceContext.attach",
1389
+ "title": "Attach Domain Catalog governance context",
1390
+ "scope": "dataBinding",
1391
+ "targetKind": "domainGovernanceContext",
1392
+ "target": {
1393
+ "kind": "domainGovernanceContext",
1394
+ "resolver": "domain-catalog-context-by-resource-key",
1395
+ "ambiguityPolicy": "fail",
1396
+ "required": true
1397
+ },
1398
+ "inputSchema": {
1399
+ "type": "object",
1400
+ "required": [
1401
+ "resourceKey",
1402
+ "query"
1403
+ ],
1404
+ "properties": {
1405
+ "resourceKey": {
1406
+ "type": "string"
1407
+ },
1408
+ "releaseId": {
1409
+ "type": "string"
1410
+ },
1411
+ "query": {
1412
+ "type": "string"
1413
+ },
1414
+ "itemTypes": {
1415
+ "type": "array",
1416
+ "items": {
1417
+ "enum": [
1418
+ "governance",
1419
+ "vocabulary",
1420
+ "relationship"
1421
+ ]
1422
+ }
1423
+ },
1424
+ "intent": {
1425
+ "enum": [
1426
+ "authoring",
1427
+ "explain",
1428
+ "validate",
1429
+ "ai-access-control"
1430
+ ]
1431
+ }
1432
+ }
1433
+ },
1434
+ "effects": [
1435
+ {
1436
+ "kind": "compile-domain-patch",
1437
+ "handler": "crud-domain-governance-context-attach",
1438
+ "handlerContract": {
1439
+ "reads": [
1440
+ "CrudMetadata.resource",
1441
+ "CrudMetadata.queryContext",
1442
+ "DomainCatalogService.getGovernanceContext",
1443
+ "DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK",
1444
+ "api_metadata"
1445
+ ],
1446
+ "writes": [
1447
+ "CrudMetadata.queryContext.meta.domainCatalog"
1448
+ ],
1449
+ "identityKeys": [
1450
+ "resourceKey",
1451
+ "releaseId",
1452
+ "query"
1453
+ ],
1454
+ "failureModes": [
1455
+ "resource-key-missing",
1456
+ "domain-catalog-release-not-found",
1457
+ "governance-context-empty",
1458
+ "ai-usage-forbidden"
1459
+ ],
1460
+ "description": "Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog."
1461
+ }
1462
+ }
1463
+ ],
1464
+ "validators": [
1465
+ "resource-key-stable",
1466
+ "domain-catalog-context-resolvable",
1467
+ "domain-catalog-read-only",
1468
+ "ai-usage-visibility-respected",
1469
+ "no-form-config-rule-materialization"
1470
+ ],
1471
+ "affectedPaths": [
1472
+ "queryContext.meta.domainCatalog"
1473
+ ],
1474
+ "submissionImpact": "config-only",
1475
+ "preconditions": [
1476
+ "crud-metadata-loaded",
1477
+ "api-metadata-available",
1478
+ "domain-catalog-service-available"
1479
+ ]
1480
+ },
1481
+ {
1482
+ "operationId": "list.surface.configure",
1483
+ "title": "Configure CRUD list surface",
1484
+ "scope": "interaction",
1485
+ "targetKind": "listSurface",
1486
+ "target": {
1487
+ "kind": "listSurface",
1488
+ "resolver": "crud-list-surface",
1489
+ "ambiguityPolicy": "fail",
1490
+ "required": true
1491
+ },
1492
+ "inputSchema": {
1493
+ "type": "object",
1494
+ "properties": {
1495
+ "tablePatch": {
1496
+ "type": "object"
1497
+ },
1498
+ "queryContext": {
1499
+ "type": "object"
1500
+ },
1501
+ "filterCriteria": {
1502
+ "type": "object"
1503
+ }
1504
+ }
1505
+ },
1506
+ "effects": [
1507
+ {
1508
+ "kind": "compile-domain-patch",
1509
+ "handler": "crud-list-surface-configure",
1510
+ "handlerContract": {
1511
+ "reads": [
1512
+ "CrudMetadata.table",
1513
+ "CrudMetadata.queryContext",
1514
+ "PRAXIS_TABLE_AUTHORING_MANIFEST",
1515
+ "CRUD_AI_CAPABILITIES"
1516
+ ],
1517
+ "writes": [
1518
+ "CrudMetadata.table",
1519
+ "CrudMetadata.queryContext",
1520
+ "CrudMetadata.filterCriteria"
1521
+ ],
1522
+ "identityKeys": [
1523
+ "crudId"
1524
+ ],
1525
+ "failureModes": [
1526
+ "table-operation-not-delegated",
1527
+ "table-patch-not-supported",
1528
+ "query-context-invalid"
1529
+ ],
1530
+ "description": "Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest."
1531
+ }
1532
+ }
1533
+ ],
1534
+ "validators": [
1535
+ "table-child-operation-delegated",
1536
+ "query-context-valid",
1537
+ "filter-criteria-bridge-valid",
1538
+ "crud-context-stable"
1539
+ ],
1540
+ "affectedPaths": [
1541
+ "table",
1542
+ "queryContext",
1543
+ "filterCriteria"
1544
+ ],
1545
+ "submissionImpact": "config-only",
1546
+ "preconditions": [
1547
+ "crud-metadata-loaded",
1548
+ "praxis-table-manifest-available"
1549
+ ]
1550
+ },
1551
+ {
1552
+ "operationId": "surface.create.configure",
1553
+ "title": "Configure create surface",
1554
+ "scope": "interaction",
1555
+ "targetKind": "createSurface",
1556
+ "target": {
1557
+ "kind": "createSurface",
1558
+ "resolver": "crud-action-by-id:create",
1559
+ "ambiguityPolicy": "fail",
1560
+ "required": true
1561
+ },
1562
+ "inputSchema": {
1563
+ "type": "object",
1564
+ "required": [
1565
+ "actionId",
1566
+ "openMode"
1567
+ ],
1568
+ "properties": {
1569
+ "actionId": {
1570
+ "enum": [
1571
+ "create",
1572
+ "edit",
1573
+ "view"
1574
+ ]
1575
+ },
1576
+ "openMode": {
1577
+ "enum": [
1578
+ "route",
1579
+ "modal",
1580
+ "drawer"
1581
+ ]
1582
+ },
1583
+ "route": {
1584
+ "type": "string"
1585
+ },
1586
+ "formId": {
1587
+ "type": "string"
1588
+ },
1589
+ "form": {
1590
+ "type": "object",
1591
+ "properties": {
1592
+ "schemaUrl": {
1593
+ "type": "string"
1594
+ },
1595
+ "submitUrl": {
1596
+ "type": "string"
1597
+ },
1598
+ "submitMethod": {
1599
+ "enum": [
1600
+ "post",
1601
+ "put",
1602
+ "patch",
1603
+ "delete"
1604
+ ]
1605
+ },
1606
+ "apiEndpointKey": {
1607
+ "type": "string"
1608
+ },
1609
+ "initialValue": {
1610
+ "type": "object"
1611
+ }
1612
+ }
1613
+ },
1614
+ "params": {
1615
+ "type": "array",
1616
+ "items": {
1617
+ "type": "object",
1618
+ "required": [
1619
+ "from",
1620
+ "to",
1621
+ "name"
1622
+ ],
1623
+ "properties": {
1624
+ "from": {
1625
+ "type": "string"
1626
+ },
1627
+ "to": {
1628
+ "enum": [
1629
+ "routeParam",
1630
+ "query",
1631
+ "input"
1632
+ ]
1633
+ },
1634
+ "name": {
1635
+ "type": "string"
1636
+ }
1637
+ }
1638
+ }
1639
+ },
1640
+ "back": {
1641
+ "type": "object"
1642
+ }
1643
+ }
1644
+ },
1645
+ "effects": [
1646
+ {
1647
+ "kind": "compile-domain-patch",
1648
+ "handler": "crud-create-surface-configure",
1649
+ "handlerContract": {
1650
+ "reads": [
1651
+ "CrudMetadata.actions",
1652
+ "CrudLauncherService.resolveOpenMode",
1653
+ "DynamicFormDialogHostComponent",
1654
+ "api_metadata"
1655
+ ],
1656
+ "writes": [
1657
+ "CrudMetadata.actions[]",
1658
+ "CrudMetadata.actions[].form",
1659
+ "CrudMetadata.actions[].params",
1660
+ "CrudMetadata.actions[].back"
1661
+ ],
1662
+ "identityKeys": [
1663
+ "actionId"
1664
+ ],
1665
+ "failureModes": [
1666
+ "action-not-found",
1667
+ "open-mode-binding-incomplete",
1668
+ "schema-url-not-canonical",
1669
+ "submit-url-not-canonical",
1670
+ "resource-create-not-supported"
1671
+ ],
1672
+ "description": "Configures create action binding and launcher inputs without editing the child FormConfig."
1673
+ }
1674
+ }
1675
+ ],
1676
+ "validators": [
1677
+ "action-exists",
1678
+ "open-mode-binding-complete",
1679
+ "schema-url-canonical",
1680
+ "submit-url-canonical",
1681
+ "resource-create-supported",
1682
+ "form-child-operation-delegated"
1683
+ ],
1684
+ "affectedPaths": [
1685
+ "actions[].openMode",
1686
+ "actions[].route",
1687
+ "actions[].formId",
1688
+ "actions[].form",
1689
+ "actions[].params",
1690
+ "actions[].back"
1691
+ ],
1692
+ "submissionImpact": "affects-schema-backed-data",
1693
+ "preconditions": [
1694
+ "crud-metadata-loaded",
1695
+ "resource-capabilities-resolved"
1696
+ ]
1697
+ },
1698
+ {
1699
+ "operationId": "surface.edit.configure",
1700
+ "title": "Configure edit surface",
1701
+ "scope": "interaction",
1702
+ "targetKind": "editSurface",
1703
+ "target": {
1704
+ "kind": "editSurface",
1705
+ "resolver": "crud-action-by-id:edit",
1706
+ "ambiguityPolicy": "fail",
1707
+ "required": true
1708
+ },
1709
+ "effects": [
1710
+ {
1711
+ "kind": "compile-domain-patch",
1712
+ "handler": "crud-edit-surface-configure",
1713
+ "handlerContract": {
1714
+ "reads": [
1715
+ "CrudMetadata.actions",
1716
+ "CrudMetadata.resource.idField",
1717
+ "CrudLauncherService.resolveOpenMode",
1718
+ "api_metadata"
1719
+ ],
1720
+ "writes": [
1721
+ "CrudMetadata.actions[]",
1722
+ "CrudMetadata.actions[].form",
1723
+ "CrudMetadata.actions[].params",
1724
+ "CrudMetadata.actions[].back"
1725
+ ],
1726
+ "identityKeys": [
1727
+ "actionId"
1728
+ ],
1729
+ "failureModes": [
1730
+ "action-not-found",
1731
+ "id-param-missing",
1732
+ "open-mode-binding-incomplete",
1733
+ "resource-edit-not-supported",
1734
+ "submit-url-not-canonical"
1735
+ ],
1736
+ "description": "Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher."
1737
+ }
1738
+ }
1739
+ ],
1740
+ "validators": [
1741
+ "action-exists",
1742
+ "id-field-known",
1743
+ "id-param-mapping-valid",
1744
+ "open-mode-binding-complete",
1745
+ "schema-url-canonical",
1746
+ "submit-url-canonical",
1747
+ "resource-edit-supported",
1748
+ "form-child-operation-delegated"
1749
+ ],
1750
+ "affectedPaths": [
1751
+ "actions[].openMode",
1752
+ "actions[].route",
1753
+ "actions[].formId",
1754
+ "actions[].form",
1755
+ "actions[].params",
1756
+ "actions[].back"
1757
+ ],
1758
+ "submissionImpact": "affects-schema-backed-data",
1759
+ "preconditions": [
1760
+ "crud-metadata-loaded",
1761
+ "resource-capabilities-resolved"
1762
+ ]
1763
+ },
1764
+ {
1765
+ "operationId": "surface.view.configure",
1766
+ "title": "Configure view surface",
1767
+ "scope": "interaction",
1768
+ "targetKind": "viewSurface",
1769
+ "target": {
1770
+ "kind": "viewSurface",
1771
+ "resolver": "crud-action-by-id:view",
1772
+ "ambiguityPolicy": "fail",
1773
+ "required": true
1774
+ },
1775
+ "effects": [
1776
+ {
1777
+ "kind": "compile-domain-patch",
1778
+ "handler": "crud-view-surface-configure",
1779
+ "handlerContract": {
1780
+ "reads": [
1781
+ "CrudMetadata.actions",
1782
+ "CrudLauncherService.resolveOpenMode",
1783
+ "DynamicFormDialogHostComponent",
1784
+ "api_metadata"
1785
+ ],
1786
+ "writes": [
1787
+ "CrudMetadata.actions[]",
1788
+ "CrudMetadata.actions[].form",
1789
+ "CrudMetadata.actions[].params",
1790
+ "CrudMetadata.actions[].back"
1791
+ ],
1792
+ "identityKeys": [
1793
+ "actionId"
1794
+ ],
1795
+ "failureModes": [
1796
+ "action-not-found",
1797
+ "open-mode-binding-incomplete",
1798
+ "resource-view-not-supported",
1799
+ "readonly-form-delegation-missing"
1800
+ ],
1801
+ "description": "Configures view action binding and delegates readonly form behavior to the dynamic-form manifest."
1802
+ }
1803
+ }
1804
+ ],
1805
+ "validators": [
1806
+ "action-exists",
1807
+ "open-mode-binding-complete",
1808
+ "schema-url-canonical",
1809
+ "resource-view-supported",
1810
+ "form-child-operation-delegated",
1811
+ "readonly-form-delegation-valid"
1812
+ ],
1813
+ "affectedPaths": [
1814
+ "actions[].openMode",
1815
+ "actions[].route",
1816
+ "actions[].formId",
1817
+ "actions[].form",
1818
+ "actions[].params",
1819
+ "actions[].back"
1820
+ ],
1821
+ "submissionImpact": "config-only",
1822
+ "preconditions": [
1823
+ "crud-metadata-loaded",
1824
+ "resource-capabilities-resolved"
1825
+ ]
1826
+ },
1827
+ {
1828
+ "operationId": "delete.enabled.set",
1829
+ "title": "Configure delete behavior",
1830
+ "scope": "interaction",
1831
+ "targetKind": "deleteBehavior",
1832
+ "target": {
1833
+ "kind": "deleteBehavior",
1834
+ "resolver": "crud-action-by-id:delete",
1835
+ "ambiguityPolicy": "fail",
1836
+ "required": true
1837
+ },
1838
+ "inputSchema": {
1839
+ "type": "object",
1840
+ "required": [
1841
+ "enabled"
1842
+ ],
1843
+ "properties": {
1844
+ "enabled": {
1845
+ "type": "boolean"
1846
+ },
1847
+ "actionId": {
1848
+ "type": "string"
1849
+ },
1850
+ "requiresConfirmation": {
1851
+ "type": "boolean"
1852
+ },
1853
+ "autoDelete": {
1854
+ "type": "boolean"
1855
+ },
1856
+ "form": {
1857
+ "type": "object",
1858
+ "properties": {
1859
+ "submitUrl": {
1860
+ "type": "string"
1861
+ },
1862
+ "submitMethod": {
1863
+ "enum": [
1864
+ "delete"
1865
+ ]
1866
+ },
1867
+ "apiEndpointKey": {
1868
+ "type": "string"
1869
+ }
1870
+ }
1871
+ }
1872
+ }
1873
+ },
1874
+ "effects": [
1875
+ {
1876
+ "kind": "compile-domain-patch",
1877
+ "handler": "crud-delete-behavior-set",
1878
+ "handlerContract": {
1879
+ "reads": [
1880
+ "CrudMetadata.actions",
1881
+ "CrudMetadata.resource",
1882
+ "GET /{resource}/{id}/capabilities"
1883
+ ],
1884
+ "writes": [
1885
+ "CrudMetadata.actions[]",
1886
+ "CrudMetadata.actions[].requiresConfirmation",
1887
+ "CrudMetadata.actions[].autoDelete",
1888
+ "CrudMetadata.actions[].form"
1889
+ ],
1890
+ "identityKeys": [
1891
+ "actionId"
1892
+ ],
1893
+ "failureModes": [
1894
+ "delete-action-not-found",
1895
+ "resource-delete-not-supported",
1896
+ "destructive-delete-not-confirmed",
1897
+ "delete-submit-url-not-canonical"
1898
+ ],
1899
+ "description": "Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes."
1900
+ }
1901
+ }
1902
+ ],
1903
+ "destructive": true,
1904
+ "requiresConfirmation": true,
1905
+ "validators": [
1906
+ "delete-action-exists",
1907
+ "resource-delete-supported",
1908
+ "destructive-delete-confirmed",
1909
+ "submit-url-canonical",
1910
+ "permissions-delete-valid"
1911
+ ],
1912
+ "affectedPaths": [
1913
+ "actions[].disabled",
1914
+ "actions[].requiresConfirmation",
1915
+ "actions[].autoDelete",
1916
+ "actions[].form",
1917
+ "actions[].form.submitUrl",
1918
+ "actions[].form.submitMethod",
1919
+ "actions[].form.apiEndpointKey"
1920
+ ],
1921
+ "submissionImpact": "affects-schema-backed-data",
1922
+ "preconditions": [
1923
+ "crud-metadata-loaded",
1924
+ "resource-capabilities-resolved",
1925
+ "explicit-confirmation-provided"
1926
+ ]
1927
+ },
1928
+ {
1929
+ "operationId": "dialog.size.set",
1930
+ "title": "Configure CRUD dialog host defaults",
1931
+ "scope": "interaction",
1932
+ "targetKind": "dialogHost",
1933
+ "target": {
1934
+ "kind": "dialogHost",
1935
+ "resolver": "crud-dialog-host-defaults",
1936
+ "ambiguityPolicy": "fail",
1937
+ "required": true
1938
+ },
1939
+ "inputSchema": {
1940
+ "type": "object",
1941
+ "properties": {
1942
+ "defaultOpenMode": {
1943
+ "enum": [
1944
+ "route",
1945
+ "modal",
1946
+ "drawer"
1947
+ ]
1948
+ },
1949
+ "modal": {
1950
+ "type": "object",
1951
+ "properties": {
1952
+ "width": {
1953
+ "type": "string"
1954
+ },
1955
+ "height": {
1956
+ "type": "string"
1957
+ },
1958
+ "minWidth": {
1959
+ "type": "string"
1960
+ },
1961
+ "maxWidth": {
1962
+ "type": "string"
1963
+ },
1964
+ "density": {
1965
+ "type": "string"
1966
+ },
1967
+ "canMaximize": {
1968
+ "type": "boolean"
1969
+ },
1970
+ "rememberLastState": {
1971
+ "type": "boolean"
1972
+ },
1973
+ "startMaximized": {
1974
+ "type": "boolean"
1975
+ },
1976
+ "disableCloseOnEsc": {
1977
+ "type": "boolean"
1978
+ },
1979
+ "disableCloseOnBackdrop": {
1980
+ "type": "boolean"
1981
+ },
1982
+ "fullscreenBreakpoint": {
1983
+ "type": "string"
1984
+ }
1985
+ }
1986
+ },
1987
+ "back": {
1988
+ "type": "object"
1989
+ }
1990
+ }
1991
+ },
1992
+ "effects": [
1993
+ {
1994
+ "kind": "compile-domain-patch",
1995
+ "handler": "crud-dialog-host-set",
1996
+ "handlerContract": {
1997
+ "reads": [
1998
+ "CrudMetadata.defaults",
1999
+ "CrudLauncherService.resolveOpenMode",
2000
+ "DialogService",
2001
+ "CRUD_DRAWER_ADAPTER"
2002
+ ],
2003
+ "writes": [
2004
+ "CrudMetadata.defaults.openMode",
2005
+ "CrudMetadata.defaults.modal",
2006
+ "CrudMetadata.defaults.back"
2007
+ ],
2008
+ "identityKeys": [
2009
+ "crudId"
2010
+ ],
2011
+ "failureModes": [
2012
+ "open-mode-unsupported",
2013
+ "drawer-adapter-missing",
2014
+ "modal-size-invalid",
2015
+ "back-policy-invalid"
2016
+ ],
2017
+ "description": "Configures CRUD-owned route/modal/drawer defaults consumed by the launcher and dialog host."
2018
+ }
2019
+ }
2020
+ ],
2021
+ "validators": [
2022
+ "open-mode-supported",
2023
+ "modal-size-valid",
2024
+ "drawer-adapter-available-when-needed",
2025
+ "back-policy-valid",
2026
+ "settings-panel-shell-compatible"
2027
+ ],
2028
+ "affectedPaths": [
2029
+ "defaults.openMode",
2030
+ "defaults.modal",
2031
+ "defaults.back"
2032
+ ],
2033
+ "submissionImpact": "config-only",
2034
+ "preconditions": [
2035
+ "crud-metadata-loaded"
2036
+ ]
2037
+ },
2038
+ {
2039
+ "operationId": "permissions.set",
2040
+ "title": "Configure CRUD permissions",
2041
+ "scope": "interaction",
2042
+ "targetKind": "permissions",
2043
+ "target": {
2044
+ "kind": "permissions",
2045
+ "resolver": "crud-resource-capabilities",
2046
+ "ambiguityPolicy": "fail",
2047
+ "required": true
2048
+ },
2049
+ "inputSchema": {
2050
+ "type": "object",
2051
+ "properties": {
2052
+ "requiredCapabilities": {
2053
+ "type": "array",
2054
+ "items": {
2055
+ "enum": [
2056
+ "create",
2057
+ "view",
2058
+ "edit",
2059
+ "delete"
2060
+ ]
2061
+ }
2062
+ },
2063
+ "actionPermissions": {
2064
+ "type": "object"
2065
+ },
2066
+ "denyWhenMissingCapability": {
2067
+ "type": "boolean"
2068
+ }
2069
+ }
2070
+ },
2071
+ "effects": [
2072
+ {
2073
+ "kind": "compile-domain-patch",
2074
+ "handler": "crud-permissions-set",
2075
+ "handlerContract": {
2076
+ "reads": [
2077
+ "GET /{resource}/capabilities",
2078
+ "GET /{resource}/{id}/capabilities",
2079
+ "CrudMetadata.actions"
2080
+ ],
2081
+ "writes": [
2082
+ "CrudMetadata.actions[].disabled",
2083
+ "CrudMetadata.actions[].visibleWhen",
2084
+ "CrudMetadata.actions[].requiresConfirmation"
2085
+ ],
2086
+ "identityKeys": [
2087
+ "resourcePath"
2088
+ ],
2089
+ "failureModes": [
2090
+ "capability-not-found",
2091
+ "action-permission-conflict",
2092
+ "delete-permission-without-confirmation"
2093
+ ],
2094
+ "description": "Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source."
2095
+ }
2096
+ }
2097
+ ],
2098
+ "validators": [
2099
+ "resource-capabilities-resolvable",
2100
+ "action-permission-supported",
2101
+ "delete-permission-requires-confirmation",
2102
+ "permissions-do-not-shadow-backend"
2103
+ ],
2104
+ "affectedPaths": [
2105
+ "actions[].disabled",
2106
+ "actions[].visibleWhen",
2107
+ "actions[].requiresConfirmation"
2108
+ ],
2109
+ "submissionImpact": "config-only",
2110
+ "preconditions": [
2111
+ "crud-metadata-loaded",
2112
+ "resource-capabilities-resolved"
2113
+ ]
2114
+ },
2115
+ {
2116
+ "operationId": "form.childOperation.delegate",
2117
+ "title": "Delegate child form/table/dialog authoring operation",
2118
+ "scope": "global",
2119
+ "targetKind": "childOperation",
2120
+ "target": {
2121
+ "kind": "childOperation",
2122
+ "resolver": "child-authoring-manifest-operation",
2123
+ "ambiguityPolicy": "fail",
2124
+ "required": false
2125
+ },
2126
+ "inputSchema": {
2127
+ "type": "object",
2128
+ "required": [
2129
+ "childComponentId",
2130
+ "childOperationId",
2131
+ "reason"
2132
+ ],
2133
+ "properties": {
2134
+ "childComponentId": {
2135
+ "enum": [
2136
+ "praxis-dynamic-form",
2137
+ "praxis-table",
2138
+ "praxis-dialog",
2139
+ "praxis-settings-panel"
2140
+ ]
2141
+ },
2142
+ "childOperationId": {
2143
+ "type": "string"
2144
+ },
2145
+ "reason": {
2146
+ "type": "string"
2147
+ },
2148
+ "childTarget": {
2149
+ "type": "object"
2150
+ },
2151
+ "childParams": {
2152
+ "type": "object"
2153
+ }
2154
+ }
2155
+ },
2156
+ "effects": [
2157
+ {
2158
+ "kind": "compile-domain-patch",
2159
+ "handler": "crud-child-operation-delegate",
2160
+ "handlerContract": {
2161
+ "reads": [
2162
+ "PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST",
2163
+ "PRAXIS_TABLE_AUTHORING_MANIFEST",
2164
+ "PRAXIS_DIALOG_AUTHORING_MANIFEST",
2165
+ "PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST"
2166
+ ],
2167
+ "writes": [
2168
+ "delegatedAuthoringOperations[]"
2169
+ ],
2170
+ "identityKeys": [
2171
+ "childComponentId",
2172
+ "childOperationId"
2173
+ ],
2174
+ "failureModes": [
2175
+ "child-manifest-missing",
2176
+ "child-operation-not-found",
2177
+ "attempted-local-child-config-write"
2178
+ ],
2179
+ "description": "Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration."
2180
+ }
2181
+ }
2182
+ ],
2183
+ "validators": [
2184
+ "child-manifest-available",
2185
+ "child-operation-known",
2186
+ "no-local-form-config-write",
2187
+ "no-local-table-config-write",
2188
+ "delegation-target-valid"
2189
+ ],
2190
+ "affectedPaths": [
2191
+ "delegatedAuthoringOperations"
2192
+ ],
2193
+ "submissionImpact": "none",
2194
+ "preconditions": [
2195
+ "child-manifest-available"
2196
+ ]
2197
+ }
2198
+ ],
2199
+ "validators": [
2200
+ {
2201
+ "validatorId": "resource-exists-in-api-metadata",
2202
+ "level": "error",
2203
+ "code": "CRUD_RESOURCE_EXISTS",
2204
+ "description": "Resource must exist in api_metadata or resource discovery."
2205
+ },
2206
+ {
2207
+ "validatorId": "resource-path-canonical",
2208
+ "level": "error",
2209
+ "code": "CRUD_RESOURCE_PATH_CANONICAL",
2210
+ "description": "Resource path must be canonical and not a local alias."
2211
+ },
2212
+ {
2213
+ "validatorId": "resource-key-stable",
2214
+ "level": "error",
2215
+ "code": "CRUD_RESOURCE_KEY_STABLE",
2216
+ "description": "Resource key must remain stable for surfaces/actions/capabilities."
2217
+ },
2218
+ {
2219
+ "validatorId": "id-field-known",
2220
+ "level": "error",
2221
+ "code": "CRUD_ID_FIELD_KNOWN",
2222
+ "description": "CRUD id field must exist for edit/view/delete flows."
2223
+ },
2224
+ {
2225
+ "validatorId": "resource-capabilities-resolvable",
2226
+ "level": "error",
2227
+ "code": "CRUD_CAPABILITIES_RESOLVABLE",
2228
+ "description": "Resource capabilities must be resolvable before action enablement is authored."
2229
+ },
2230
+ {
2231
+ "validatorId": "domain-catalog-context-resolvable",
2232
+ "level": "error",
2233
+ "code": "CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE",
2234
+ "description": "Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it."
2235
+ },
2236
+ {
2237
+ "validatorId": "domain-catalog-read-only",
2238
+ "level": "error",
2239
+ "code": "CRUD_DOMAIN_CATALOG_READ_ONLY",
2240
+ "description": "Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules."
2241
+ },
2242
+ {
2243
+ "validatorId": "ai-usage-visibility-respected",
2244
+ "level": "error",
2245
+ "code": "CRUD_AI_USAGE_VISIBILITY_RESPECTED",
2246
+ "description": "Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches."
2247
+ },
2248
+ {
2249
+ "validatorId": "no-form-config-rule-materialization",
2250
+ "level": "error",
2251
+ "code": "CRUD_NO_FORM_RULE_MATERIALIZATION",
2252
+ "description": "Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it."
2253
+ },
2254
+ {
2255
+ "validatorId": "table-child-operation-delegated",
2256
+ "level": "error",
2257
+ "code": "CRUD_TABLE_CHILD_DELEGATED",
2258
+ "description": "Table semantics must be delegated to praxis-table."
2259
+ },
2260
+ {
2261
+ "validatorId": "query-context-valid",
2262
+ "level": "error",
2263
+ "code": "CRUD_QUERY_CONTEXT_VALID",
2264
+ "description": "Query context must be valid for the bound resource."
2265
+ },
2266
+ {
2267
+ "validatorId": "filter-criteria-bridge-valid",
2268
+ "level": "warning",
2269
+ "code": "CRUD_FILTER_CRITERIA_BRIDGE_VALID",
2270
+ "description": "filterCriteria is a bridge; prefer queryContext for new remote authoring."
2271
+ },
2272
+ {
2273
+ "validatorId": "crud-context-stable",
2274
+ "level": "error",
2275
+ "code": "CRUD_CONTEXT_STABLE",
2276
+ "description": "Authoring must not break stable crudContext references."
2277
+ },
2278
+ {
2279
+ "validatorId": "action-exists",
2280
+ "level": "error",
2281
+ "code": "CRUD_ACTION_EXISTS",
2282
+ "description": "Target action must exist or be created through CRUD action orchestration."
2283
+ },
2284
+ {
2285
+ "validatorId": "open-mode-binding-complete",
2286
+ "level": "error",
2287
+ "code": "CRUD_OPEN_MODE_BINDING_COMPLETE",
2288
+ "description": "route requires route; modal/drawer require formId unless resolved by governed overrides."
2289
+ },
2290
+ {
2291
+ "validatorId": "schema-url-canonical",
2292
+ "level": "error",
2293
+ "code": "CRUD_SCHEMA_URL_CANONICAL",
2294
+ "description": "Schema URLs must be canonical for the bound resource/action."
2295
+ },
2296
+ {
2297
+ "validatorId": "submit-url-canonical",
2298
+ "level": "error",
2299
+ "code": "CRUD_SUBMIT_URL_CANONICAL",
2300
+ "description": "Submit URL and method must be canonical and declared together."
2301
+ },
2302
+ {
2303
+ "validatorId": "resource-create-supported",
2304
+ "level": "error",
2305
+ "code": "CRUD_CREATE_SUPPORTED",
2306
+ "description": "Create surface requires resource create capability."
2307
+ },
2308
+ {
2309
+ "validatorId": "resource-edit-supported",
2310
+ "level": "error",
2311
+ "code": "CRUD_EDIT_SUPPORTED",
2312
+ "description": "Edit surface requires resource edit capability."
2313
+ },
2314
+ {
2315
+ "validatorId": "resource-view-supported",
2316
+ "level": "error",
2317
+ "code": "CRUD_VIEW_SUPPORTED",
2318
+ "description": "View surface requires resource view capability."
2319
+ },
2320
+ {
2321
+ "validatorId": "form-child-operation-delegated",
2322
+ "level": "error",
2323
+ "code": "CRUD_FORM_CHILD_DELEGATED",
2324
+ "description": "FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests."
2325
+ },
2326
+ {
2327
+ "validatorId": "id-param-mapping-valid",
2328
+ "level": "error",
2329
+ "code": "CRUD_ID_PARAM_MAPPING_VALID",
2330
+ "description": "Edit/view actions must map resource id into route/query/input as required."
2331
+ },
2332
+ {
2333
+ "validatorId": "readonly-form-delegation-valid",
2334
+ "level": "error",
2335
+ "code": "CRUD_READONLY_FORM_DELEGATED",
2336
+ "description": "Readonly form behavior belongs to the dynamic-form manifest."
2337
+ },
2338
+ {
2339
+ "validatorId": "delete-action-exists",
2340
+ "level": "error",
2341
+ "code": "CRUD_DELETE_ACTION_EXISTS",
2342
+ "description": "Delete behavior requires a delete action target."
2343
+ },
2344
+ {
2345
+ "validatorId": "resource-delete-supported",
2346
+ "level": "error",
2347
+ "code": "CRUD_DELETE_SUPPORTED",
2348
+ "description": "Delete behavior requires resource delete capability."
2349
+ },
2350
+ {
2351
+ "validatorId": "destructive-delete-confirmed",
2352
+ "level": "error",
2353
+ "code": "CRUD_DELETE_CONFIRMED",
2354
+ "description": "Destructive delete behavior requires explicit confirmation."
2355
+ },
2356
+ {
2357
+ "validatorId": "permissions-delete-valid",
2358
+ "level": "error",
2359
+ "code": "CRUD_DELETE_PERMISSION_VALID",
2360
+ "description": "Delete permission cannot bypass resource capabilities or confirmation policy."
2361
+ },
2362
+ {
2363
+ "validatorId": "open-mode-supported",
2364
+ "level": "error",
2365
+ "code": "CRUD_OPEN_MODE_SUPPORTED",
2366
+ "description": "Open mode must be route, modal or drawer."
2367
+ },
2368
+ {
2369
+ "validatorId": "modal-size-valid",
2370
+ "level": "error",
2371
+ "code": "CRUD_MODAL_SIZE_VALID",
2372
+ "description": "Modal sizing defaults must be valid DialogConfig values."
2373
+ },
2374
+ {
2375
+ "validatorId": "drawer-adapter-available-when-needed",
2376
+ "level": "error",
2377
+ "code": "CRUD_DRAWER_ADAPTER_AVAILABLE",
2378
+ "description": "Drawer open mode requires a host-provided drawer adapter."
2379
+ },
2380
+ {
2381
+ "validatorId": "back-policy-valid",
2382
+ "level": "error",
2383
+ "code": "CRUD_BACK_POLICY_VALID",
2384
+ "description": "Back policy must be valid for route/modal/drawer behavior."
2385
+ },
2386
+ {
2387
+ "validatorId": "settings-panel-shell-compatible",
2388
+ "level": "warning",
2389
+ "code": "CRUD_SETTINGS_PANEL_COMPATIBLE",
2390
+ "description": "Authoring shell must preserve apply/save/reset semantics."
2391
+ },
2392
+ {
2393
+ "validatorId": "action-permission-supported",
2394
+ "level": "error",
2395
+ "code": "CRUD_ACTION_PERMISSION_SUPPORTED",
2396
+ "description": "Action permissions must map to supported resource capabilities."
2397
+ },
2398
+ {
2399
+ "validatorId": "delete-permission-requires-confirmation",
2400
+ "level": "error",
2401
+ "code": "CRUD_DELETE_PERMISSION_CONFIRMATION",
2402
+ "description": "Delete permission enablement requires confirmation policy."
2403
+ },
2404
+ {
2405
+ "validatorId": "permissions-do-not-shadow-backend",
2406
+ "level": "error",
2407
+ "code": "CRUD_PERMISSIONS_NO_BACKEND_SHADOW",
2408
+ "description": "UI permissions must not shadow backend capability denial."
2409
+ },
2410
+ {
2411
+ "validatorId": "child-manifest-available",
2412
+ "level": "error",
2413
+ "code": "CRUD_CHILD_MANIFEST_AVAILABLE",
2414
+ "description": "Delegated child manifest must be available."
2415
+ },
2416
+ {
2417
+ "validatorId": "child-operation-known",
2418
+ "level": "error",
2419
+ "code": "CRUD_CHILD_OPERATION_KNOWN",
2420
+ "description": "Delegated operation must exist in the child manifest."
2421
+ },
2422
+ {
2423
+ "validatorId": "no-local-form-config-write",
2424
+ "level": "error",
2425
+ "code": "CRUD_NO_LOCAL_FORM_CONFIG_WRITE",
2426
+ "description": "CRUD must not locally redefine FormConfig semantics."
2427
+ },
2428
+ {
2429
+ "validatorId": "no-local-table-config-write",
2430
+ "level": "error",
2431
+ "code": "CRUD_NO_LOCAL_TABLE_CONFIG_WRITE",
2432
+ "description": "CRUD must not locally redefine TableConfig semantics."
2433
+ },
2434
+ {
2435
+ "validatorId": "delegation-target-valid",
2436
+ "level": "error",
2437
+ "code": "CRUD_DELEGATION_TARGET_VALID",
2438
+ "description": "Delegation target must be resolvable by the child manifest."
2439
+ }
2440
+ ],
2441
+ "roundTripRequirements": [
2442
+ "CrudMetadata is the canonical CRUD document shape.",
2443
+ "CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.",
2444
+ "Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.",
2445
+ "Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.",
2446
+ "Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.",
2447
+ "FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.",
2448
+ "TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.",
2449
+ "Delete behavior is destructive and requires explicit confirmation plus backend capability support.",
2450
+ "crudContext must remain reference-stable across change detection cycles."
2451
+ ],
2452
+ "examples": [
2453
+ {
2454
+ "id": "crud-bind-funcionarios-resource",
2455
+ "request": "Bind this CRUD to funcionarios using id as the identifier.",
2456
+ "operationId": "resource.bind",
2457
+ "target": "resource:funcionarios",
2458
+ "params": {
2459
+ "resourcePath": "/funcionarios",
2460
+ "resourceKey": "funcionarios",
2461
+ "idField": "id"
2462
+ },
2463
+ "isPositive": true
2464
+ },
2465
+ {
2466
+ "id": "crud-attach-lgpd-cpf-context",
2467
+ "request": "Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.",
2468
+ "operationId": "domain.governanceContext.attach",
2469
+ "target": "domainCatalog:human-resources.funcionarios:cpf",
2470
+ "params": {
2471
+ "resourceKey": "human-resources.funcionarios",
2472
+ "query": "cpf",
2473
+ "itemTypes": [
2474
+ "governance"
2475
+ ],
2476
+ "intent": "authoring"
2477
+ },
2478
+ "isPositive": true
2479
+ },
2480
+ {
2481
+ "id": "crud-list-query-context",
2482
+ "request": "Filter the list by active employees using the canonical query context.",
2483
+ "operationId": "list.surface.configure",
2484
+ "target": "listSurface",
2485
+ "params": {
2486
+ "queryContext": {
2487
+ "filters": [
2488
+ {
2489
+ "field": "active",
2490
+ "operator": "eq",
2491
+ "value": true
2492
+ }
2493
+ ]
2494
+ }
2495
+ },
2496
+ "isPositive": true
2497
+ },
2498
+ {
2499
+ "id": "crud-create-modal",
2500
+ "request": "Open create in a modal with the employee form.",
2501
+ "operationId": "surface.create.configure",
2502
+ "target": "action:create",
2503
+ "params": {
2504
+ "actionId": "create",
2505
+ "openMode": "modal",
2506
+ "formId": "employee-create"
2507
+ },
2508
+ "isPositive": true
2509
+ },
2510
+ {
2511
+ "id": "crud-edit-route-with-id",
2512
+ "request": "Edit should navigate to /employees/:id and map the row id.",
2513
+ "operationId": "surface.edit.configure",
2514
+ "target": "action:edit",
2515
+ "params": {
2516
+ "actionId": "edit",
2517
+ "openMode": "route",
2518
+ "route": "/employees/:id/edit",
2519
+ "params": [
2520
+ {
2521
+ "from": "id",
2522
+ "to": "routeParam",
2523
+ "name": "id"
2524
+ }
2525
+ ]
2526
+ },
2527
+ "isPositive": true
2528
+ },
2529
+ {
2530
+ "id": "crud-view-drawer-readonly",
2531
+ "request": "Open view in a drawer and keep the form readonly.",
2532
+ "operationId": "surface.view.configure",
2533
+ "target": "action:view",
2534
+ "params": {
2535
+ "actionId": "view",
2536
+ "openMode": "drawer",
2537
+ "formId": "employee-view"
2538
+ },
2539
+ "isPositive": true
2540
+ },
2541
+ {
2542
+ "id": "crud-delete-enable-confirmed",
2543
+ "request": "Enable delete but require confirmation.",
2544
+ "operationId": "delete.enabled.set",
2545
+ "target": "action:delete",
2546
+ "params": {
2547
+ "enabled": true,
2548
+ "actionId": "delete",
2549
+ "requiresConfirmation": true,
2550
+ "autoDelete": true
2551
+ },
2552
+ "isPositive": true
2553
+ },
2554
+ {
2555
+ "id": "crud-dialog-size-medium",
2556
+ "request": "Make CRUD modals 900px wide and remember their last state.",
2557
+ "operationId": "dialog.size.set",
2558
+ "target": "dialogHost",
2559
+ "params": {
2560
+ "defaultOpenMode": "modal",
2561
+ "modal": {
2562
+ "width": "900px",
2563
+ "rememberLastState": true
2564
+ }
2565
+ },
2566
+ "isPositive": true
2567
+ },
2568
+ {
2569
+ "id": "crud-permissions-no-delete",
2570
+ "request": "Hide delete when the resource capabilities do not allow it.",
2571
+ "operationId": "permissions.set",
2572
+ "target": "permissions:delete",
2573
+ "params": {
2574
+ "requiredCapabilities": [
2575
+ "delete"
2576
+ ],
2577
+ "denyWhenMissingCapability": true
2578
+ },
2579
+ "isPositive": true
2580
+ },
2581
+ {
2582
+ "id": "crud-delegate-form-layout",
2583
+ "request": "Add a new field to the create form.",
2584
+ "operationId": "form.childOperation.delegate",
2585
+ "target": "praxis-dynamic-form:field.add",
2586
+ "params": {
2587
+ "childComponentId": "praxis-dynamic-form",
2588
+ "childOperationId": "field.add",
2589
+ "reason": "Form field semantics belong to dynamic-form"
2590
+ },
2591
+ "isPositive": true
2592
+ },
2593
+ {
2594
+ "id": "crud-delegate-table-column",
2595
+ "request": "Add a salary column to the list table.",
2596
+ "operationId": "form.childOperation.delegate",
2597
+ "target": "praxis-table:column.add",
2598
+ "params": {
2599
+ "childComponentId": "praxis-table",
2600
+ "childOperationId": "column.add",
2601
+ "reason": "Table column semantics belong to praxis-table"
2602
+ },
2603
+ "isPositive": true
2604
+ },
2605
+ {
2606
+ "id": "crud-reject-local-form-rules",
2607
+ "request": "Put this dynamic-form validation rule directly inside CRUD.",
2608
+ "operationId": "form.childOperation.delegate",
2609
+ "target": "praxis-dynamic-form:rules.add",
2610
+ "params": {
2611
+ "childComponentId": "praxis-dynamic-form",
2612
+ "childOperationId": "rules.add",
2613
+ "reason": "CRUD must not redefine FormConfig rules"
2614
+ },
2615
+ "isPositive": false
2616
+ },
2617
+ {
2618
+ "id": "crud-reject-copy-domain-rule-to-formconfig",
2619
+ "request": "Copy the LGPD rule from Domain Catalog directly into the create form JSON.",
2620
+ "operationId": "domain.governanceContext.attach",
2621
+ "target": "domainCatalog:human-resources.funcionarios:cpf",
2622
+ "params": {
2623
+ "resourceKey": "human-resources.funcionarios",
2624
+ "query": "cpf",
2625
+ "itemTypes": [
2626
+ "governance"
2627
+ ],
2628
+ "intent": "authoring"
2629
+ },
2630
+ "isPositive": false
2631
+ },
2632
+ {
2633
+ "id": "crud-reject-delete-without-capability",
2634
+ "request": "Force delete even though the backend does not expose delete capability.",
2635
+ "operationId": "delete.enabled.set",
2636
+ "target": "action:delete",
2637
+ "params": {
2638
+ "enabled": true,
2639
+ "actionId": "delete",
2640
+ "requiresConfirmation": false
2641
+ },
2642
+ "isPositive": false
2643
+ }
2644
+ ]
2645
+ },
2646
+ "chunks": [
2647
+ {
2648
+ "chunkIndex": 0,
2649
+ "chunkKind": "summary",
2650
+ "content": "Component ID: praxis-crud\nSelector: praxis-crud\nFriendly Name: Praxis CRUD\nDescription: Tabela com operações de CRUD via metadados.\nLib/Package: @praxisui/crud\nTags: widget, crud, configurable, hasWizard, stable\nInputs:\n - metadata (CrudMetadata | string)\n - crudId (string)\n - componentInstanceId (string)\n - context (Record<string, unknown>)\n - metadata.queryContext (PraxisDataQueryContext | null)\n - metadata.filterCriteria (Record<string, unknown> | null)\n - metadata.actions[].form (CrudActionFormContract)\n - enableCustomization (boolean)\nOutputs:\n - afterOpen ({ mode: FormOpenMode; action: string })\n - afterClose (void)\n - afterSave ({ id: string | number; data: unknown })\n - afterDelete ({ id: string | number })\n - rowClick ({ row: unknown; index: number })\n - selectionChange (unknown)\n - error (unknown)\n - configureRequested (void)\n - crudAuthoringDocumentApplied (CrudAuthoringWidgetPersistenceEvent)\n - crudAuthoringDocumentSaved (CrudAuthoringWidgetPersistenceEvent)\n",
2651
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/praxis-crud.metadata.ts",
2652
+ "contentHash": "f28e0c10ced8b4a603921d2873facf7652f8d15a40a440eef547d2b1ef7405d8",
2653
+ "sourceKind": "component_definition",
2654
+ "sourceId": "praxis-crud",
2655
+ "corpusVersion": "1.0.0"
2656
+ },
2657
+ {
2658
+ "chunkIndex": 1,
2659
+ "chunkKind": "capabilities",
2660
+ "content": "Component Capabilities:\n - Path: component\n Category: meta\n Kind: enum\n Description: Identificador fixo do componente.\n - Path: resource\n Category: resource\n Kind: object\n Description: Recurso principal do CRUD.\n - Path: resource.path\n Category: resource\n Kind: string\n Description: Endpoint base do recurso.\n - Path: resource.idField\n Category: resource\n Kind: string\n Description: Campo identificador do recurso.\n - Path: resource.endpointKey\n Category: resource\n Kind: string\n Description: Chave de endpoint (ApiEndpoint).\n - Path: queryContext.meta.domainCatalog\n Category: resource\n Kind: object\n Description: Referencia leve para contexto semantico/governanca resolvido via Domain Catalog; nao materializa regras em FormConfig.\n - Path: queryContext.meta.domainCatalog.schemaVersion\n Category: resource\n Kind: string\n Description: Versao do contrato DomainCatalogContextHint usado em runtime e prompts.\n - Path: queryContext.meta.domainCatalog.resourceKey\n Category: resource\n Kind: string\n Description: ResourceKey semantico estavel usado para resolver vocabulario/governanca de dominio.\n - Path: queryContext.meta.domainCatalog.releaseId\n Category: resource\n Kind: string\n Description: Release opcional do Domain Catalog usada como fonte do contexto.\n - Path: queryContext.meta.domainCatalog.query\n Category: resource\n Kind: string\n Description: Probe de campo/conceito usado para buscar itens relevantes, como cpf, salario ou status.\n - Path: queryContext.meta.domainCatalog.intent\n Category: resource\n Kind: enum\n Description: Intencao de uso do contexto para orientar LLMs e validadores sem expor dados alem do necessario.\n - Path: table\n Category: table\n Kind: object\n Description: TableConfig completo (usar catalogo de tabela).\n - Path: form\n Category: form\n Kind: object\n Description: FormConfig completo (usar catalogo de formulario).\n - Path: defaults\n Category: defaults\n Kind: object\n Description: Defaults aplicados a acoes e UI.\n - Path: defaults.openMode\n Category: defaults\n Kind: enum\n Description: Modo padrao de abertura (route/modal/drawer).\n - Path: defaults.modal\n Category: defaults\n Kind: object\n Description: Config de dialog (DialogConfig).\n - Path: defaults.back\n Category: navigation\n Kind: object\n Description: Config de retorno (BackConfig).\n - Path: defaults.back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno.\n - Path: defaults.back.returnTo\n Category: navigation\n Kind: string\n Description: Rota de retorno quando strategy=navigate.\n - Path: defaults.back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Confirmar ao sair com alteracoes.\n - Path: defaults.header\n Category: defaults\n Kind: object\n Description: Config do header do CRUD.\n - Path: defaults.header.showBack\n Category: defaults\n Kind: boolean\n Description: Exibir botao voltar.\n - Path: defaults.header.backLabel\n Category: defaults\n Kind: string\n Description: Label do botao voltar.\n - Path: defaults.header.variant\n Category: defaults\n Kind: enum\n Description: Variante visual do header.\n - Path: defaults.header.sticky\n Category: defaults\n Kind: boolean\n Description: Header fixo.\n - Path: defaults.header.breadcrumbs\n Category: defaults\n Kind: boolean\n Description: Exibir breadcrumbs.\n - Path: defaults.header.divider\n Category: defaults\n Kind: boolean\n Description: Exibir divisor no header.\n - Path: actions\n Category: actions\n Kind: array\n Description: Acoes disponiveis no CRUD.\n - Path: actions[].id\n Category: actions\n Kind: string\n Description: ID da acao (RowAction/ToolbarAction).\n - Path: actions[].label\n Category: actions\n Kind: string\n Description: Label da acao.\n - Path: actions[].icon\n Category: actions\n Kind: string\n Description: Icone da acao.\n - Path: actions[].color\n Category: actions\n Kind: string\n Description: Cor da acao.\n - Path: actions[].disabled\n Category: actions\n Kind: boolean\n Description: Acao desabilitada.\n - Path: actions[].action\n Category: actions\n Kind: string\n Description: Nome da acao emitida.\n - Path: actions[].tooltip\n Category: actions\n Kind: string\n Description: Tooltip da acao.\n - Path: actions[].requiresConfirmation\n Category: actions\n Kind: boolean\n Description: Exige confirmacao.\n - Path: actions[].visibleWhen\n Category: actions\n Kind: expression\n Description: Condicao de visibilidade (RowAction/ToolbarAction).\n - Path: actions[].separator\n Category: actions\n Kind: boolean\n Description: Separador apos a acao (RowAction).\n - Path: actions[].autoDelete\n Category: actions\n Kind: boolean\n Description: Habilita auto delete (RowAction).\n - Path: actions[].deleteEndpoint\n Category: actions\n Kind: string\n Description: Endpoint custom para delete (RowAction).\n - Path: actions[].type\n Category: actions\n Kind: enum\n Description: Tipo de acao (ToolbarAction).\n - Path: actions[].appearance\n Category: actions\n Kind: enum\n Description: Aparencia do botao (ToolbarAction).\n - Path: actions[].position\n Category: actions\n Kind: enum\n Description: Posicao da acao (ToolbarAction).\n - Path: actions[].order\n Category: actions\n Kind: number\n Description: Ordem de exibicao (ToolbarAction).\n - Path: actions[].shortcut\n Category: actions\n Kind: string\n Description: Atalho de teclado (ToolbarAction).\n - Path: actions[].children\n Category: actions\n Kind: array\n Description: Sub-acoes (menu).\n - Path: actions[].openMode\n Category: actions\n Kind: enum\n Description: Modo de abertura da acao.\n - Path: actions[].route\n Category: actions\n Kind: string\n Description: Rota para openMode=route.\n - Path: actions[].formId\n Category: actions\n Kind: string\n Description: FormId canonico para modal/drawer; se ausente, o host precisa resolve-lo por override por acao antes da abertura.\n - Path: actions[].params\n Category: actions\n Kind: array\n Description: Mapeamento de parametros.\n - Path: actions[].params[].from\n Category: actions\n Kind: string\n Description: Origem do parametro.\n - Path: actions[].params[].to\n Category: actions\n Kind: enum\n Description: Destino do parametro.\n - Path: actions[].params[].name\n Category: actions\n Kind: string\n Description: Nome do parametro no destino.\n - Path: actions[].form.initialValue\n Category: actions\n Kind: object\n Description: Seed fixo do formulario injetado em inputs.initialValue antes da abertura.\n - Path: actions[].back\n Category: navigation\n Kind: object\n Description: BackConfig por acao.\n - Path: actions[].back.strategy\n Category: navigation\n Kind: enum\n Description: Estrategia de retorno da acao (auto, close, navigate).\n - Path: actions[].back.returnTo\n Category: navigation\n Kind: string\n Description: Rota ou destino usado quando a estrategia de retorno for navigate.\n - Path: actions[].back.confirmOnDirty\n Category: navigation\n Kind: boolean\n Description: Solicita confirmacao antes de sair com alteracoes nao salvas.\n - Path: i18n\n Category: i18n\n Kind: object\n Description: Mensagens i18n do CRUD.\n - Path: i18n.crudDialog\n Category: i18n\n Kind: object\n Description: Mapa de textos do dialog.\nCapability Notes:\n - CrudMetadata agrega TableConfig e FormConfig; use os catalogos de tabela e formulario para detalhes.\n - actions[] herda campos de RowAction e ToolbarAction; combine com openMode/route/formId quando aplicavel.\n",
2661
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/crud-ai-capabilities.ts",
2662
+ "contentHash": "7792a68d3ca4136609466cabac8414573c45ba46ecd89ac7653ff661a75f0f4f",
2663
+ "sourceKind": "component_definition",
2664
+ "sourceId": "praxis-crud",
2665
+ "corpusVersion": "1.0.0"
2666
+ },
2667
+ {
2668
+ "chunkIndex": 2,
2669
+ "chunkKind": "authoring_manifest",
2670
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-crud\",\n \"ownerPackage\": \"@praxisui/crud\",\n \"configSchemaId\": \"CrudMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"metadata\",\n \"type\": \"CrudMetadata | string\",\n \"description\": \"Canonical CRUD metadata or serialized metadata document.\"\n },\n {\n \"name\": \"crudId\",\n \"type\": \"string\",\n \"description\": \"Stable CRUD instance id used for table/form identity and persistence.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional stable host instance id for multiple CRUD widgets on the same route.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Opaque host context used for authoring seeds and launcher inputs.\"\n },\n {\n \"name\": \"afterOpen\",\n \"type\": \"{ mode: FormOpenMode; action: string }\",\n \"description\": \"Emitted after a CRUD action opens.\"\n },\n {\n \"name\": \"afterSave\",\n \"type\": \"{ id: string | number; data: unknown }\",\n \"description\": \"Emitted after save; CRUD refetches the list.\"\n },\n {\n \"name\": \"afterDelete\",\n \"type\": \"{ id: string | number }\",\n \"description\": \"Emitted after delete; CRUD refetches the list.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"description\": \"Resource path/key, id field, endpoint key and query context owned by CRUD orchestration.\"\n },\n {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"description\": \"CRUD-hosted list surface and table delegation boundary.\"\n },\n {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"description\": \"Create action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"description\": \"Edit action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"description\": \"View action open mode, route/form binding and launcher inputs.\"\n },\n {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"description\": \"Delete action enablement, confirmation, endpoint and capability policy.\"\n },\n {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"description\": \"Route/modal/drawer defaults consumed by CrudLauncherService and DynamicFormDialogHostComponent.\"\n },\n {\n \"kind\": \"formBinding\",\n \"resolver\": \"crud-action-form-contract-by-action-id\",\n \"description\": \"CRUD-owned form binding fields: formId, schemaUrl, submitUrl, submitMethod, params and initialValue.\"\n },\n {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"description\": \"CRUD action availability derived from resource capabilities and action permissions.\"\n },\n {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"description\": \"Read-only semantic/governance context resolved from Domain Catalog and referenced from CRUD queryContext.meta.\"\n },\n {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"description\": \"Delegated form/table/dialog/settings-panel operation owned by the child component manifest.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"resource.bind\",\n \"title\": \"Bind CRUD resource\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"resourceBinding\",\n \"target\": {\n \"kind\": \"resourceBinding\",\n \"resolver\": \"crud-resource-by-path-or-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourcePath\"\n ],\n \"properties\": {\n \"resourcePath\": {\n \"type\": \"string\"\n },\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"idField\": {\n \"type\": [\n \"string\",\n \"number\"\n ]\n },\n \"endpointKey\": {\n \"type\": \"string\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-resource-bind\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"api_metadata\",\n \"ResourceDiscoveryService\",\n \"GET /{resource}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"PraxisCrudComponent.tableCrudContext\"\n ],\n \"identityKeys\": [\n \"resourcePath\",\n \"resourceKey\"\n ],\n \"failureModes\": [\n \"resource-not-found\",\n \"schema-url-not-canonical\",\n \"capabilities-unavailable\",\n \"id-field-missing\"\n ],\n \"description\": \"Binds CRUD to a canonical resource and validates it against api_metadata/resource capabilities before runtime use.\"\n }\n }\n ],\n \"validators\": [\n \"resource-exists-in-api-metadata\",\n \"resource-path-canonical\",\n \"resource-key-stable\",\n \"id-field-known\",\n \"resource-capabilities-resolvable\"\n ],\n \"affectedPaths\": [\n \"resource.path\",\n \"resource.idField\",\n \"resource.endpointKey\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\"\n ]\n },\n {\n \"operationId\": \"domain.governanceContext.attach\",\n \"title\": \"Attach Domain Catalog governance context\",\n \"scope\": \"dataBinding\",\n \"targetKind\": \"domainGovernanceContext\",\n \"target\": {\n \"kind\": \"domainGovernanceContext\",\n \"resolver\": \"domain-catalog-context-by-resource-key\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"resourceKey\",\n \"query\"\n ],\n \"properties\": {\n \"resourceKey\": {\n \"type\": \"string\"\n },\n \"releaseId\": {\n \"type\": \"string\"\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"itemTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"governance\",\n \"vocabulary\",\n \"relationship\"\n ]\n }\n },\n \"intent\": {\n \"enum\": [\n \"authoring\",\n \"explain\",\n \"validate\",\n \"ai-access-control\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-domain-governance-context-attach\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.resource\",\n \"CrudMetadata.queryContext\",\n \"DomainCatalogService.getGovernanceContext\",\n \"DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.queryContext.meta.domainCatalog\"\n ],\n \"identityKeys\": [\n \"resourceKey\",\n \"releaseId\",\n \"query\"\n ],\n \"failureModes\": [\n \"resource-key-missing\",\n \"domain-catalog-release-not-found\",\n \"governance-context-empty\",\n \"ai-usage-forbidden\"\n ],\n \"description\": \"Resolves read-only domain vocabulary/governance context and stores only a lightweight reference/probe under queryContext.meta.domainCatalog.\"\n }\n }\n ],\n \"validators\": [\n \"resource-key-stable\",\n \"domain-catalog-context-resolvable\",\n \"domain-catalog-read-only\",\n \"ai-usage-visibility-respected\",\n \"no-form-config-rule-materialization\"\n ],\n \"affectedPaths\": [\n \"queryContext.meta.domainCatalog\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"api-metadata-available\",\n \"domain-catalog-service-available\"\n ]\n },\n {\n \"operationId\": \"list.surface.configure\",\n \"title\": \"Configure CRUD list surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"listSurface\",\n \"target\": {\n \"kind\": \"listSurface\",\n \"resolver\": \"crud-list-surface\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"tablePatch\": {\n \"type\": \"object\"\n },\n \"queryContext\": {\n \"type\": \"object\"\n },\n \"filterCriteria\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-list-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"CRUD_AI_CAPABILITIES\"\n ],\n \"writes\": [\n \"CrudMetadata.table\",\n \"CrudMetadata.queryContext\",\n \"CrudMetadata.filterCriteria\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"table-operation-not-delegated\",\n \"table-patch-not-supported\",\n \"query-context-invalid\"\n ],\n \"description\": \"Configures CRUD-owned list orchestration while routing table semantics to the praxis-table manifest.\"\n }\n }\n ],\n \"validators\": [\n \"table-child-operation-delegated\",\n \"query-context-valid\",\n \"filter-criteria-bridge-valid\",\n \"crud-context-stable\"\n ],\n \"affectedPaths\": [\n \"table\",\n \"queryContext\",\n \"filterCriteria\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"praxis-table-manifest-available\"\n ]\n },\n {\n \"operationId\": \"surface.create.configure\",\n \"title\": \"Configure create surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"createSurface\",\n \"target\": {\n \"kind\": \"createSurface\",\n \"resolver\": \"crud-action-by-id:create\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"actionId\",\n \"openMode\"\n ],\n \"properties\": {\n \"actionId\": {\n \"enum\": [\n \"create\",\n \"edit\",\n \"view\"\n ]\n },\n \"openMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"route\": {\n \"type\": \"string\"\n },\n \"formId\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"schemaUrl\": {\n \"type\": \"string\"\n },\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n },\n \"initialValue\": {\n \"type\": \"object\"\n }\n }\n },\n \"params\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"from\",\n \"to\",\n \"name\"\n ],\n \"properties\": {\n \"from\": {\n \"type\": \"string\"\n },\n \"to\": {\n \"enum\": [\n \"routeParam\",\n \"query\",\n \"input\"\n ]\n },\n \"name\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-create-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"schema-url-not-canonical\",\n \"submit-url-not-canonical\",\n \"resource-create-not-supported\"\n ],\n \"description\": \"Configures create action binding and launcher inputs without editing the child FormConfig.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-create-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.edit.configure\",\n \"title\": \"Configure edit surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"editSurface\",\n \"target\": {\n \"kind\": \"editSurface\",\n \"resolver\": \"crud-action-by-id:edit\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-edit-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource.idField\",\n \"CrudLauncherService.resolveOpenMode\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"id-param-missing\",\n \"open-mode-binding-incomplete\",\n \"resource-edit-not-supported\",\n \"submit-url-not-canonical\"\n ],\n \"description\": \"Configures edit action routing/form binding and ensures id parameter mapping is available to the launcher.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"id-field-known\",\n \"id-param-mapping-valid\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"submit-url-canonical\",\n \"resource-edit-supported\",\n \"form-child-operation-delegated\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"surface.view.configure\",\n \"title\": \"Configure view surface\",\n \"scope\": \"interaction\",\n \"targetKind\": \"viewSurface\",\n \"target\": {\n \"kind\": \"viewSurface\",\n \"resolver\": \"crud-action-by-id:view\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-view-surface-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DynamicFormDialogHostComponent\",\n \"api_metadata\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].form\",\n \"CrudMetadata.actions[].params\",\n \"CrudMetadata.actions[].back\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"action-not-found\",\n \"open-mode-binding-incomplete\",\n \"resource-view-not-supported\",\n \"readonly-form-delegation-missing\"\n ],\n \"description\": \"Configures view action binding and delegates readonly form behavior to the dynamic-form manifest.\"\n }\n }\n ],\n \"validators\": [\n \"action-exists\",\n \"open-mode-binding-complete\",\n \"schema-url-canonical\",\n \"resource-view-supported\",\n \"form-child-operation-delegated\",\n \"readonly-form-delegation-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].openMode\",\n \"actions[].route\",\n \"actions[].formId\",\n \"actions[].form\",\n \"actions[].params\",\n \"actions[].back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"delete.enabled.set\",\n \"title\": \"Configure delete behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"deleteBehavior\",\n \"target\": {\n \"kind\": \"deleteBehavior\",\n \"resolver\": \"crud-action-by-id:delete\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"actionId\": {\n \"type\": \"string\"\n },\n \"requiresConfirmation\": {\n \"type\": \"boolean\"\n },\n \"autoDelete\": {\n \"type\": \"boolean\"\n },\n \"form\": {\n \"type\": \"object\",\n \"properties\": {\n \"submitUrl\": {\n \"type\": \"string\"\n },\n \"submitMethod\": {\n \"enum\": [\n \"delete\"\n ]\n },\n \"apiEndpointKey\": {\n \"type\": \"string\"\n }\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-delete-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.actions\",\n \"CrudMetadata.resource\",\n \"GET /{resource}/{id}/capabilities\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[]\",\n \"CrudMetadata.actions[].requiresConfirmation\",\n \"CrudMetadata.actions[].autoDelete\",\n \"CrudMetadata.actions[].form\"\n ],\n \"identityKeys\": [\n \"actionId\"\n ],\n \"failureModes\": [\n \"delete-action-not-found\",\n \"resource-delete-not-supported\",\n \"destructive-delete-not-confirmed\",\n \"delete-submit-url-not-canonical\"\n ],\n \"description\": \"Enables or disables delete behavior with capability checks and explicit confirmation for destructive changes.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"delete-action-exists\",\n \"resource-delete-supported\",\n \"destructive-delete-confirmed\",\n \"submit-url-canonical\",\n \"permissions-delete-valid\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].requiresConfirmation\",\n \"actions[].autoDelete\",\n \"actions[].form\",\n \"actions[].form.submitUrl\",\n \"actions[].form.submitMethod\",\n \"actions[].form.apiEndpointKey\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\",\n \"explicit-confirmation-provided\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Configure CRUD dialog host defaults\",\n \"scope\": \"interaction\",\n \"targetKind\": \"dialogHost\",\n \"target\": {\n \"kind\": \"dialogHost\",\n \"resolver\": \"crud-dialog-host-defaults\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"defaultOpenMode\": {\n \"enum\": [\n \"route\",\n \"modal\",\n \"drawer\"\n ]\n },\n \"modal\": {\n \"type\": \"object\",\n \"properties\": {\n \"width\": {\n \"type\": \"string\"\n },\n \"height\": {\n \"type\": \"string\"\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"density\": {\n \"type\": \"string\"\n },\n \"canMaximize\": {\n \"type\": \"boolean\"\n },\n \"rememberLastState\": {\n \"type\": \"boolean\"\n },\n \"startMaximized\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnEsc\": {\n \"type\": \"boolean\"\n },\n \"disableCloseOnBackdrop\": {\n \"type\": \"boolean\"\n },\n \"fullscreenBreakpoint\": {\n \"type\": \"string\"\n }\n }\n },\n \"back\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-dialog-host-set\",\n \"handlerContract\": {\n \"reads\": [\n \"CrudMetadata.defaults\",\n \"CrudLauncherService.resolveOpenMode\",\n \"DialogService\",\n \"CRUD_DRAWER_ADAPTER\"\n ],\n \"writes\": [\n \"CrudMetadata.defaults.openMode\",\n \"CrudMetadata.defaults.modal\",\n \"CrudMetadata.defaults.back\"\n ],\n \"identityKeys\": [\n \"crudId\"\n ],\n \"failureModes\": [\n \"open-mode-unsupported\",\n \"drawer-adapter-missing\",\n \"modal-size-invalid\",\n \"back-policy-invalid\"\n ],\n \"description\": \"Configures CRUD-owned route/modal/drawer defaults consumed by the launcher and dialog host.\"\n }\n }\n ],\n \"validators\": [\n \"open-mode-supported\",\n \"modal-size-valid\",\n \"drawer-adapter-available-when-needed\",\n \"back-policy-valid\",\n \"settings-panel-shell-compatible\"\n ],\n \"affectedPaths\": [\n \"defaults.openMode\",\n \"defaults.modal\",\n \"defaults.back\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\"\n ]\n },\n {\n \"operationId\": \"permissions.set\",\n \"title\": \"Configure CRUD permissions\",\n \"scope\": \"interaction\",\n \"targetKind\": \"permissions\",\n \"target\": {\n \"kind\": \"permissions\",\n \"resolver\": \"crud-resource-capabilities\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requiredCapabilities\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"create\",\n \"view\",\n \"edit\",\n \"delete\"\n ]\n }\n },\n \"actionPermissions\": {\n \"type\": \"object\"\n },\n \"denyWhenMissingCapability\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-permissions-set\",\n \"handlerContract\": {\n \"reads\": [\n \"GET /{resource}/capabilities\",\n \"GET /{resource}/{id}/capabilities\",\n \"CrudMetadata.actions\"\n ],\n \"writes\": [\n \"CrudMetadata.actions[].disabled\",\n \"CrudMetadata.actions[].visibleWhen\",\n \"CrudMetadata.actions[].requiresConfirmation\"\n ],\n \"identityKeys\": [\n \"resourcePath\"\n ],\n \"failureModes\": [\n \"capability-not-found\",\n \"action-permission-conflict\",\n \"delete-permission-without-confirmation\"\n ],\n \"description\": \"Aligns CRUD action visibility/disablement with resource capabilities without inventing a second permission source.\"\n }\n }\n ],\n \"validators\": [\n \"resource-capabilities-resolvable\",\n \"action-permission-supported\",\n \"delete-permission-requires-confirmation\",\n \"permissions-do-not-shadow-backend\"\n ],\n \"affectedPaths\": [\n \"actions[].disabled\",\n \"actions[].visibleWhen\",\n \"actions[].requiresConfirmation\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"crud-metadata-loaded\",\n \"resource-capabilities-resolved\"\n ]\n },\n {\n \"operationId\": \"form.childOperation.delegate\",\n \"title\": \"Delegate child form/table/dialog authoring operation\",\n \"scope\": \"global\",\n \"targetKind\": \"childOperation\",\n \"target\": {\n \"kind\": \"childOperation\",\n \"resolver\": \"child-authoring-manifest-operation\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childComponentId\",\n \"childOperationId\",\n \"reason\"\n ],\n \"properties\": {\n \"childComponentId\": {\n \"enum\": [\n \"praxis-dynamic-form\",\n \"praxis-table\",\n \"praxis-dialog\",\n \"praxis-settings-panel\"\n ]\n },\n \"childOperationId\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n },\n \"childTarget\": {\n \"type\": \"object\"\n },\n \"childParams\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"crud-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST\",\n \"PRAXIS_TABLE_AUTHORING_MANIFEST\",\n \"PRAXIS_DIALOG_AUTHORING_MANIFEST\",\n \"PRAXIS_SETTINGS_PANEL_AUTHORING_MANIFEST\"\n ],\n \"writes\": [\n \"delegatedAuthoringOperations[]\"\n ],\n \"identityKeys\": [\n \"childComponentId\",\n \"childOperationId\"\n ],\n \"failureModes\": [\n \"child-manifest-missing\",\n \"child-operation-not-found\",\n \"attempted-local-child-config-write\"\n ],\n \"description\": \"Records explicit delegation when requested edits belong to child manifests instead of CRUD orchestration.\"\n }\n }\n ],\n \"validators\": [\n \"child-manifest-available\",\n \"child-operation-known\",\n \"no-local-form-config-write\",\n \"no-local-table-config-write\",\n \"delegation-target-valid\"\n ],\n \"affectedPaths\": [\n \"delegatedAuthoringOperations\"\n ],\n \"submissionImpact\": \"none\",\n \"preconditions\": [\n \"child-manifest-available\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"resource-exists-in-api-metadata\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_EXISTS\",\n \"description\": \"Resource must exist in api_metadata or resource discovery.\"\n },\n {\n \"validatorId\": \"resource-path-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_PATH_CANONICAL\",\n \"description\": \"Resource path must be canonical and not a local alias.\"\n },\n {\n \"validatorId\": \"resource-key-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_RESOURCE_KEY_STABLE\",\n \"description\": \"Resource key must remain stable for surfaces/actions/capabilities.\"\n },\n {\n \"validatorId\": \"id-field-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_FIELD_KNOWN\",\n \"description\": \"CRUD id field must exist for edit/view/delete flows.\"\n },\n {\n \"validatorId\": \"resource-capabilities-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CAPABILITIES_RESOLVABLE\",\n \"description\": \"Resource capabilities must be resolvable before action enablement is authored.\"\n },\n {\n \"validatorId\": \"domain-catalog-context-resolvable\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_CONTEXT_RESOLVABLE\",\n \"description\": \"Domain Catalog governance context must resolve for the resource key and requested probe before authoring uses it.\"\n },\n {\n \"validatorId\": \"domain-catalog-read-only\",\n \"level\": \"error\",\n \"code\": \"CRUD_DOMAIN_CATALOG_READ_ONLY\",\n \"description\": \"Domain Catalog is read-only semantic context; CRUD may reference a probe but must not persist copied catalog rules.\"\n },\n {\n \"validatorId\": \"ai-usage-visibility-respected\",\n \"level\": \"error\",\n \"code\": \"CRUD_AI_USAGE_VISIBILITY_RESPECTED\",\n \"description\": \"Authoring must respect Domain Catalog aiUsage.visibility before exposing field data, prompts or generated patches.\"\n },\n {\n \"validatorId\": \"no-form-config-rule-materialization\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_FORM_RULE_MATERIALIZATION\",\n \"description\": \"Shared domain governance must not be materialized into FormConfig rules unless a backend policy explicitly authorizes it.\"\n },\n {\n \"validatorId\": \"table-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_TABLE_CHILD_DELEGATED\",\n \"description\": \"Table semantics must be delegated to praxis-table.\"\n },\n {\n \"validatorId\": \"query-context-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_QUERY_CONTEXT_VALID\",\n \"description\": \"Query context must be valid for the bound resource.\"\n },\n {\n \"validatorId\": \"filter-criteria-bridge-valid\",\n \"level\": \"warning\",\n \"code\": \"CRUD_FILTER_CRITERIA_BRIDGE_VALID\",\n \"description\": \"filterCriteria is a bridge; prefer queryContext for new remote authoring.\"\n },\n {\n \"validatorId\": \"crud-context-stable\",\n \"level\": \"error\",\n \"code\": \"CRUD_CONTEXT_STABLE\",\n \"description\": \"Authoring must not break stable crudContext references.\"\n },\n {\n \"validatorId\": \"action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_EXISTS\",\n \"description\": \"Target action must exist or be created through CRUD action orchestration.\"\n },\n {\n \"validatorId\": \"open-mode-binding-complete\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_BINDING_COMPLETE\",\n \"description\": \"route requires route; modal/drawer require formId unless resolved by governed overrides.\"\n },\n {\n \"validatorId\": \"schema-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SCHEMA_URL_CANONICAL\",\n \"description\": \"Schema URLs must be canonical for the bound resource/action.\"\n },\n {\n \"validatorId\": \"submit-url-canonical\",\n \"level\": \"error\",\n \"code\": \"CRUD_SUBMIT_URL_CANONICAL\",\n \"description\": \"Submit URL and method must be canonical and declared together.\"\n },\n {\n \"validatorId\": \"resource-create-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_CREATE_SUPPORTED\",\n \"description\": \"Create surface requires resource create capability.\"\n },\n {\n \"validatorId\": \"resource-edit-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_EDIT_SUPPORTED\",\n \"description\": \"Edit surface requires resource edit capability.\"\n },\n {\n \"validatorId\": \"resource-view-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_VIEW_SUPPORTED\",\n \"description\": \"View surface requires resource view capability.\"\n },\n {\n \"validatorId\": \"form-child-operation-delegated\",\n \"level\": \"error\",\n \"code\": \"CRUD_FORM_CHILD_DELEGATED\",\n \"description\": \"FormConfig and FieldMetadata edits must delegate to dynamic-form/metadata-editor manifests.\"\n },\n {\n \"validatorId\": \"id-param-mapping-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_ID_PARAM_MAPPING_VALID\",\n \"description\": \"Edit/view actions must map resource id into route/query/input as required.\"\n },\n {\n \"validatorId\": \"readonly-form-delegation-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_READONLY_FORM_DELEGATED\",\n \"description\": \"Readonly form behavior belongs to the dynamic-form manifest.\"\n },\n {\n \"validatorId\": \"delete-action-exists\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_ACTION_EXISTS\",\n \"description\": \"Delete behavior requires a delete action target.\"\n },\n {\n \"validatorId\": \"resource-delete-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_SUPPORTED\",\n \"description\": \"Delete behavior requires resource delete capability.\"\n },\n {\n \"validatorId\": \"destructive-delete-confirmed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_CONFIRMED\",\n \"description\": \"Destructive delete behavior requires explicit confirmation.\"\n },\n {\n \"validatorId\": \"permissions-delete-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_VALID\",\n \"description\": \"Delete permission cannot bypass resource capabilities or confirmation policy.\"\n },\n {\n \"validatorId\": \"open-mode-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_OPEN_MODE_SUPPORTED\",\n \"description\": \"Open mode must be route, modal or drawer.\"\n },\n {\n \"validatorId\": \"modal-size-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_MODAL_SIZE_VALID\",\n \"description\": \"Modal sizing defaults must be valid DialogConfig values.\"\n },\n {\n \"validatorId\": \"drawer-adapter-available-when-needed\",\n \"level\": \"error\",\n \"code\": \"CRUD_DRAWER_ADAPTER_AVAILABLE\",\n \"description\": \"Drawer open mode requires a host-provided drawer adapter.\"\n },\n {\n \"validatorId\": \"back-policy-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_BACK_POLICY_VALID\",\n \"description\": \"Back policy must be valid for route/modal/drawer behavior.\"\n },\n {\n \"validatorId\": \"settings-panel-shell-compatible\",\n \"level\": \"warning\",\n \"code\": \"CRUD_SETTINGS_PANEL_COMPATIBLE\",\n \"description\": \"Authoring shell must preserve apply/save/reset semantics.\"\n },\n {\n \"validatorId\": \"action-permission-supported\",\n \"level\": \"error\",\n \"code\": \"CRUD_ACTION_PERMISSION_SUPPORTED\",\n \"description\": \"Action permissions must map to supported resource capabilities.\"\n },\n {\n \"validatorId\": \"delete-permission-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELETE_PERMISSION_CONFIRMATION\",\n \"description\": \"Delete permission enablement requires confirmation policy.\"\n },\n {\n \"validatorId\": \"permissions-do-not-shadow-backend\",\n \"level\": \"error\",\n \"code\": \"CRUD_PERMISSIONS_NO_BACKEND_SHADOW\",\n \"description\": \"UI permissions must not shadow backend capability denial.\"\n },\n {\n \"validatorId\": \"child-manifest-available\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_MANIFEST_AVAILABLE\",\n \"description\": \"Delegated child manifest must be available.\"\n },\n {\n \"validatorId\": \"child-operation-known\",\n \"level\": \"error\",\n \"code\": \"CRUD_CHILD_OPERATION_KNOWN\",\n \"description\": \"Delegated operation must exist in the child manifest.\"\n },\n {\n \"validatorId\": \"no-local-form-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_FORM_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine FormConfig semantics.\"\n },\n {\n \"validatorId\": \"no-local-table-config-write\",\n \"level\": \"error\",\n \"code\": \"CRUD_NO_LOCAL_TABLE_CONFIG_WRITE\",\n \"description\": \"CRUD must not locally redefine TableConfig semantics.\"\n },\n {\n \"validatorId\": \"delegation-target-valid\",\n \"level\": \"error\",\n \"code\": \"CRUD_DELEGATION_TARGET_VALID\",\n \"description\": \"Delegation target must be resolvable by the child manifest.\"\n }\n ],\n \"roundTripRequirements\": [\n \"CrudMetadata is the canonical CRUD document shape.\",\n \"CrudAuthoringDocument wraps CrudMetadata without introducing host-local aliases.\",\n \"Resource path and resource key have separate semantics: path is operational, key is discovery/capability identity.\",\n \"Domain Catalog context is referenced through resourceKey/release/probe and stays read-only; CRUD may attach queryContext.meta.domainCatalog but must not copy shared governance rules into FormConfig.\",\n \"Open mode round-trip must preserve route, formId, form contract, params, initialValue and back policy.\",\n \"FormConfig and FieldMetadata edits must delegate to dynamic-form or metadata-editor manifests.\",\n \"TableConfig edits must delegate to praxis-table; CRUD owns only shell orchestration and list surface binding.\",\n \"Delete behavior is destructive and requires explicit confirmation plus backend capability support.\",\n \"crudContext must remain reference-stable across change detection cycles.\"\n ],\n \"examples\": [\n {\n \"id\": \"crud-bind-funcionarios-resource\",\n \"request\": \"Bind this CRUD to funcionarios using id as the identifier.\",\n \"operationId\": \"resource.bind\",\n \"target\": \"resource:funcionarios\",\n \"params\": {\n \"resourcePath\": \"/funcionarios\",\n \"resourceKey\": \"funcionarios\",\n \"idField\": \"id\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-attach-lgpd-cpf-context\",\n \"request\": \"Use the Domain Catalog LGPD context for cpf before changing the employee CRUD.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-list-query-context\",\n \"request\": \"Filter the list by active employees using the canonical query context.\",\n \"operationId\": \"list.surface.configure\",\n \"target\": \"listSurface\",\n \"params\": {\n \"queryContext\": {\n \"filters\": [\n {\n \"field\": \"active\",\n \"operator\": \"eq\",\n \"value\": true\n }\n ]\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-create-modal\",\n \"request\": \"Open create in a modal with the employee form.\",\n \"operationId\": \"surface.create.configure\",\n \"target\": \"action:create\",\n \"params\": {\n \"actionId\": \"create\",\n \"openMode\": \"modal\",\n \"formId\": \"employee-create\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-edit-route-with-id\",\n \"request\": \"Edit should navigate to /employees/:id and map the row id.\",\n \"operationId\": \"surface.edit.configure\",\n \"target\": \"action:edit\",\n \"params\": {\n \"actionId\": \"edit\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n }\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-view-drawer-readonly\",\n \"request\": \"Open view in a drawer and keep the form readonly.\",\n \"operationId\": \"surface.view.configure\",\n \"target\": \"action:view\",\n \"params\": {\n \"actionId\": \"view\",\n \"openMode\": \"drawer\",\n \"formId\": \"employee-view\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delete-enable-confirmed\",\n \"request\": \"Enable delete but require confirmation.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": true,\n \"autoDelete\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-dialog-size-medium\",\n \"request\": \"Make CRUD modals 900px wide and remember their last state.\",\n \"operationId\": \"dialog.size.set\",\n \"target\": \"dialogHost\",\n \"params\": {\n \"defaultOpenMode\": \"modal\",\n \"modal\": {\n \"width\": \"900px\",\n \"rememberLastState\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-permissions-no-delete\",\n \"request\": \"Hide delete when the resource capabilities do not allow it.\",\n \"operationId\": \"permissions.set\",\n \"target\": \"permissions:delete\",\n \"params\": {\n \"requiredCapabilities\": [\n \"delete\"\n ],\n \"denyWhenMissingCapability\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-form-layout\",\n \"request\": \"Add a new field to the create form.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:field.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"field.add\",\n \"reason\": \"Form field semantics belong to dynamic-form\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-delegate-table-column\",\n \"request\": \"Add a salary column to the list table.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-table:column.add\",\n \"params\": {\n \"childComponentId\": \"praxis-table\",\n \"childOperationId\": \"column.add\",\n \"reason\": \"Table column semantics belong to praxis-table\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"crud-reject-local-form-rules\",\n \"request\": \"Put this dynamic-form validation rule directly inside CRUD.\",\n \"operationId\": \"form.childOperation.delegate\",\n \"target\": \"praxis-dynamic-form:rules.add\",\n \"params\": {\n \"childComponentId\": \"praxis-dynamic-form\",\n \"childOperationId\": \"rules.add\",\n \"reason\": \"CRUD must not redefine FormConfig rules\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-copy-domain-rule-to-formconfig\",\n \"request\": \"Copy the LGPD rule from Domain Catalog directly into the create form JSON.\",\n \"operationId\": \"domain.governanceContext.attach\",\n \"target\": \"domainCatalog:human-resources.funcionarios:cpf\",\n \"params\": {\n \"resourceKey\": \"human-resources.funcionarios\",\n \"query\": \"cpf\",\n \"itemTypes\": [\n \"governance\"\n ],\n \"intent\": \"authoring\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"crud-reject-delete-without-capability\",\n \"request\": \"Force delete even though the backend does not expose delete capability.\",\n \"operationId\": \"delete.enabled.set\",\n \"target\": \"action:delete\",\n \"params\": {\n \"enabled\": true,\n \"actionId\": \"delete\",\n \"requiresConfirmation\": false\n },\n \"isPositive\": false\n }\n ]\n}",
2671
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/praxis-crud-authoring-manifest.ts",
2672
+ "contentHash": "43df7d9c5aec116d96809115badffa2d2c6f8442eff3e1b8ff83887e59959ac6",
2673
+ "sourceKind": "component_definition",
2674
+ "sourceId": "praxis-crud",
2675
+ "corpusVersion": "1.0.0"
2676
+ },
2677
+ {
2678
+ "chunkIndex": 3,
2679
+ "chunkKind": "context_pack",
2680
+ "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"defaults.openMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"route\",\n \"label\": \"Route\"\n },\n {\n \"value\": \"modal\",\n \"label\": \"Modal\"\n },\n {\n \"value\": \"drawer\",\n \"label\": \"Drawer\"\n }\n ]\n },\n \"actions[].openMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"route\",\n \"label\": \"Route\"\n },\n {\n \"value\": \"modal\",\n \"label\": \"Modal\"\n },\n {\n \"value\": \"drawer\",\n \"label\": \"Drawer\"\n }\n ]\n },\n \"actions[].params[].to\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"routeParam\",\n \"label\": \"Route param\"\n },\n {\n \"value\": \"query\",\n \"label\": \"Query param\"\n },\n {\n \"value\": \"input\",\n \"label\": \"Dialog input\"\n }\n ]\n },\n \"defaults.header.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"ghost\",\n \"label\": \"Ghost\"\n },\n {\n \"value\": \"tonal\",\n \"label\": \"Tonal\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n }\n ]\n },\n \"actions[].type\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"button\",\n \"label\": \"Button\"\n },\n {\n \"value\": \"icon\",\n \"label\": \"Icon\"\n },\n {\n \"value\": \"fab\",\n \"label\": \"Fab\"\n },\n {\n \"value\": \"menu\",\n \"label\": \"Menu\"\n }\n ]\n },\n \"actions[].appearance\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"filled\",\n \"label\": \"Filled\"\n },\n {\n \"value\": \"outlined\",\n \"label\": \"Outlined\"\n },\n {\n \"value\": \"elevated\",\n \"label\": \"Elevated\"\n },\n {\n \"value\": \"text\",\n \"label\": \"Text\"\n },\n {\n \"value\": \"tonal\",\n \"label\": \"Tonal\"\n }\n ]\n },\n \"actions[].position\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n }\n ]\n },\n \"defaults.back.strategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"close\",\n \"label\": \"Close\"\n },\n {\n \"value\": \"navigate\",\n \"label\": \"Navigate\"\n }\n ]\n },\n \"actions[].back.strategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n },\n {\n \"value\": \"close\",\n \"label\": \"Close\"\n },\n {\n \"value\": \"navigate\",\n \"label\": \"Navigate\"\n }\n ]\n },\n \"resource.endpointKey\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"humanResources\",\n \"label\": \"Human resources\"\n },\n {\n \"value\": \"uiWrappersTest\",\n \"label\": \"UI wrappers test\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"resource.path.set\",\n \"intentExamples\": [\n \"resource\",\n \"endpoint\",\n \"api\",\n \"path\",\n \"rota\"\n ],\n \"patchTemplate\": {\n \"resource\": {\n \"path\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"resource.idField.set\",\n \"intentExamples\": [\n \"id field\",\n \"chave\",\n \"primary key\"\n ],\n \"patchTemplate\": {\n \"resource\": {\n \"idField\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"defaults.openMode.set\",\n \"intentExamples\": [\n \"open mode\",\n \"open\",\n \"route\",\n \"modal\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"openMode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"defaults.header.variant.set\",\n \"intentExamples\": [\n \"header\",\n \"variant\",\n \"style\",\n \"back button\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"variant\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.backLabel.set\",\n \"intentExamples\": [\n \"back label\",\n \"voltar\",\n \"header label\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"backLabel\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.showBack.enable\",\n \"intentExamples\": [\n \"show back\",\n \"back button\",\n \"enable back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"showBack\": true\n }\n }\n }\n },\n {\n \"id\": \"defaults.header.showBack.disable\",\n \"intentExamples\": [\n \"hide back\",\n \"disable back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"header\": {\n \"showBack\": false\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.strategy.set\",\n \"intentExamples\": [\n \"back\",\n \"return\",\n \"navigation\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"strategy\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.returnTo.set\",\n \"intentExamples\": [\n \"return to\",\n \"back route\",\n \"navigate back\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"returnTo\": \"{{value}}\"\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.confirmOnDirty.enable\",\n \"intentExamples\": [\n \"confirm\",\n \"dirty\",\n \"unsaved\",\n \"confirm exit\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"confirmOnDirty\": true\n }\n }\n }\n },\n {\n \"id\": \"defaults.back.confirmOnDirty.disable\",\n \"intentExamples\": [\n \"no confirm\",\n \"disable confirm\"\n ],\n \"patchTemplate\": {\n \"defaults\": {\n \"back\": {\n \"confirmOnDirty\": false\n }\n }\n }\n },\n {\n \"id\": \"action.add\",\n \"intentExamples\": [\n \"add action\",\n \"new action\",\n \"create action\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"action\": \"{{params.action}}\",\n \"label\": \"{{value}}\",\n \"icon\": \"{{params.icon}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.label.set\",\n \"intentExamples\": [\n \"label\",\n \"rename action\",\n \"titulo\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.icon.set\",\n \"intentExamples\": [\n \"icon\",\n \"icone\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"icon\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.openMode.set\",\n \"intentExamples\": [\n \"open mode\",\n \"route\",\n \"modal\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"openMode\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.route.set\",\n \"intentExamples\": [\n \"route\",\n \"url\",\n \"navigate\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"route\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.formId.set\",\n \"intentExamples\": [\n \"form\",\n \"formId\",\n \"dialog\",\n \"drawer\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"formId\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.params.add\",\n \"intentExamples\": [\n \"param\",\n \"params\",\n \"query\",\n \"route param\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"params\": [\n {\n \"from\": \"{{params.from}}\",\n \"to\": \"{{params.to}}\",\n \"name\": \"{{params.name}}\"\n }\n ]\n }\n ]\n }\n },\n {\n \"id\": \"action.initialValue.set\",\n \"intentExamples\": [\n \"initial value\",\n \"seed\",\n \"default form values\",\n \"prefill\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"form\": {\n \"initialValue\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"action.confirmation.enable\",\n \"intentExamples\": [\n \"confirm\",\n \"confirmation\",\n \"requires confirmation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"requiresConfirmation\": true\n }\n ]\n }\n },\n {\n \"id\": \"action.confirmation.disable\",\n \"intentExamples\": [\n \"no confirm\",\n \"disable confirmation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"requiresConfirmation\": false\n }\n ]\n }\n },\n {\n \"id\": \"action.visibleWhen.set\",\n \"intentExamples\": [\n \"visible when\",\n \"visibility\",\n \"show when\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"visibleWhen\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.type.set\",\n \"intentExamples\": [\n \"type\",\n \"button type\",\n \"toolbar\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"type\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.appearance.set\",\n \"intentExamples\": [\n \"appearance\",\n \"variant\",\n \"style\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"appearance\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.position.set\",\n \"intentExamples\": [\n \"position\",\n \"start\",\n \"end\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"position\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"action.back.strategy.set\",\n \"intentExamples\": [\n \"back\",\n \"return\",\n \"navigation\"\n ],\n \"patchTemplate\": {\n \"actions\": [\n {\n \"id\": \"{{target}}\",\n \"back\": {\n \"strategy\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"ADD_CONDITIONAL_RENDERER\",\n \"intentExamples\": [\n \"conditional renderer\",\n \"renderer condicional\",\n \"badge condicional\",\n \"chip condicional\",\n \"badge se\",\n \"chip se\",\n \"conditional badge\",\n \"conditional chip\"\n ],\n \"patchTemplate\": {\n \"table\": {\n \"columns\": [\n {\n \"field\": \"{{target}}\",\n \"conditionalRenderers\": [\n {\n \"condition\": \"{{params.condition}}\",\n \"renderer\": \"{{params.renderer}}\"\n }\n ]\n }\n ]\n }\n }\n }\n ],\n \"fieldResolvers\": {\n \"actions[]\": [\n \"id\",\n \"label\",\n \"action\"\n ],\n \"resource.path\": [],\n \"table.columns[].field\": [\n \"field\",\n \"header\"\n ]\n },\n \"hints\": [\n \"Use actions[].id as the canonical action key; avoid array indexes.\",\n \"When adding actions, include params.action to describe the underlying CRUD action.\",\n \"openMode route requires actions[].route; modal or drawer require actions[].formId unless the host completes bindings via per-action override before opening.\",\n \"Table and form are full configs; patch nested fields instead of replacing the whole object.\",\n \"Use ADD_CONDITIONAL_RENDERER for table conditional badges/chips (table.columns[].conditionalRenderers).\",\n \"CRUD agrega TableConfig e FormConfig; siga o contrato da tabela para columns/conditionalRenderers.\",\n \"DOC: Widget purpose: CRUD shell that composes a table + optional form from metadata.\",\n \"DOC: Host inputs: metadata (required) and crudId (required). componentInstanceId/context/enableCustomization are optional.\",\n \"DOC: CrudMetadata requires component='praxis-crud' and table (TableConfig).\",\n \"DOC: inner table renders with resource.path (remote) or metadata.data (local). If both are provided, resource.path takes precedence.\",\n \"DOC: If actions open modal/drawer, actions[].formId is required unless a per-action override resolves it before opening; for route mode, actions[].route is required unless override resolves it.\"\n ]\n }\n}",
2681
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/crud-context-pack.ts",
2682
+ "contentHash": "d84846e0e5ca29e261d8ea50aecf22bda4babb0338565f83c487612d9080690d",
2683
+ "sourceKind": "component_definition",
2684
+ "sourceId": "praxis-crud",
2685
+ "corpusVersion": "1.0.0"
2686
+ },
2687
+ {
2688
+ "chunkIndex": 4,
2689
+ "chunkKind": "recipe",
2690
+ "content": "{\n \"_comment\": \"Variant focused on CRUD actions and launcher behavior, using inferred canonical actions as the baseline.\",\n \"templateMeta\": {\n \"variantId\": \"actions\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"actions\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change CRUD actions or routes\",\n \"examplePrompts\": [\n \"add a custom action to archive records\",\n \"change the edit action to open a route\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"defaults\": {\n \"openMode\": \"modal\",\n \"modal\": {\n \"width\": \"860px\",\n \"maxWidth\": \"95vw\",\n \"panelClass\": \"crud-dialog\",\n \"backdropStyle\": \"blur\",\n \"autoFocus\": true,\n \"restoreFocus\": true\n },\n \"back\": {\n \"strategy\": \"auto\",\n \"returnTo\": \"/employees\",\n \"confirmOnDirty\": true\n },\n \"header\": {\n \"showBack\": true,\n \"backLabel\": \"Voltar\",\n \"variant\": \"outlined\",\n \"sticky\": true,\n \"breadcrumbs\": true,\n \"divider\": true\n }\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo colaborador\",\n \"icon\": \"add\",\n \"action\": \"create\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"view\",\n \"label\": \"Visualizar\",\n \"icon\": \"visibility\",\n \"action\": \"view\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\"\n },\n {\n \"id\": \"edit-route\",\n \"label\": \"Editar na rota\",\n \"icon\": \"open_in_new\",\n \"action\": \"edit-route\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n },\n {\n \"from\": \"name\",\n \"to\": \"query\",\n \"name\": \"name\"\n }\n ],\n \"back\": {\n \"strategy\": \"navigate\",\n \"returnTo\": \"/employees\"\n }\n }\n ]\n}\n",
2691
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.actions.json",
2692
+ "contentHash": "2b2c060e71c98f46d48e6f58a966414703faf545554c26639b4811f9f905ea48",
2693
+ "sourceKind": "component_definition",
2694
+ "sourceId": "praxis-crud",
2695
+ "corpusVersion": "1.0.0"
2696
+ },
2697
+ {
2698
+ "chunkIndex": 5,
2699
+ "chunkKind": "recipe",
2700
+ "content": "{\n \"_comment\": \"Variant focused on CRUD form configuration.\",\n \"templateMeta\": {\n \"variantId\": \"form\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"form\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change form layout or fields in CRUD\",\n \"examplePrompts\": [\n \"add a new field to the crud form\",\n \"update validation rules in the form\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"form\": {\n \"metadata\": {\n \"version\": \"2.0\",\n \"source\": \"local\",\n \"schemaId\": \"path:/api/employees#request\",\n \"schemaContext\": {\n \"path\": \"/api/employees\",\n \"operation\": \"POST\",\n \"schemaType\": \"request\",\n \"internal\": false,\n \"tenant\": \"default\",\n \"locale\": \"pt-BR\"\n }\n },\n \"api\": {\n \"saveEndpoint\": \"/api/employees\",\n \"loadEndpoint\": \"/api/employees/${id}\",\n \"saveMethod\": \"POST\",\n \"timeout\": 15000,\n \"headers\": {\n \"X-Module\": \"HR\"\n },\n \"idField\": \"id\",\n \"beforeSave\": \"sanitizeEmployee\",\n \"afterLoad\": \"mapEmployee\"\n },\n \"behavior\": {\n \"confirmOnUnsavedChanges\": true,\n \"trackHistory\": true,\n \"focusFirstError\": true,\n \"scrollToErrors\": true,\n \"clearAfterSave\": false,\n \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"messages\": {\n \"createRegistrySuccess\": \"Colaborador criado com sucesso.\",\n \"updateRegistrySuccess\": \"Colaborador atualizado com sucesso.\",\n \"createRegistryError\": \"Falha ao criar colaborador.\",\n \"updateRegistryError\": \"Falha ao atualizar colaborador.\",\n \"confirmations\": {\n \"submit\": \"Deseja salvar as alteracoes?\",\n \"cancel\": \"Descartar alteracoes?\",\n \"reset\": \"Limpar o formulario?\"\n },\n \"customActions\": {\n \"archive\": {\n \"confirmation\": \"Arquivar este colaborador?\"\n }\n },\n \"loading\": {\n \"submit\": \"Salvando...\",\n \"cancel\": \"Cancelando...\"\n }\n },\n \"hints\": {\n \"dataModes\": {\n \"create\": \"Preencha os dados para criar um novo colaborador.\",\n \"edit\": \"Atualize os dados e salve as alteracoes.\",\n \"view\": \"Visualize os dados do colaborador.\"\n },\n \"uiModes\": {\n \"presentation\": \"Modo apresentacao mostra somente leitura.\",\n \"readonly\": \"Modo leitura bloqueia edicao.\",\n \"disabled\": \"Campos desabilitados nao permitem interacao.\",\n \"visible\": \"Controle de visibilidade sem destruir controles.\"\n }\n },\n \"hooks\": {\n \"beforeSubmit\": [\n {\n \"id\": \"sanitize-employee\",\n \"priority\": 100,\n \"args\": {\n \"trimStrings\": true\n }\n }\n ],\n \"afterSubmit\": [\n {\n \"id\": \"notify-success\",\n \"args\": {\n \"messageKey\": \"employeeSaved\"\n }\n }\n ],\n \"onError\": [\n {\n \"id\": \"notify-error\",\n \"args\": {\n \"messageKey\": \"employeeSaveError\"\n }\n }\n ]\n },\n \"fieldMetadata\": [\n {\n \"name\": \"id\",\n \"label\": \"ID\",\n \"controlType\": \"numericTextBox\",\n \"dataType\": \"number\",\n \"hidden\": true,\n \"readOnly\": true,\n \"description\": \"Campo ID oculto, gerenciado pelo backend.\"\n },\n {\n \"name\": \"name\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"placeholder\": \"Ex.: Ana Souza\",\n \"prefixIcon\": \"person\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"dataType\": \"email\",\n \"placeholder\": \"nome@empresa.com\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"phone\",\n \"label\": \"Telefone\",\n \"controlType\": \"phone\",\n \"placeholder\": \"(11) 99999-0000\",\n \"mask\": \"(99) 99999-9999\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Ativo\",\n \"value\": \"ACTIVE\"\n },\n {\n \"text\": \"Inativo\",\n \"value\": \"INACTIVE\"\n },\n {\n \"text\": \"Afastado\",\n \"value\": \"ON_LEAVE\"\n }\n ],\n \"defaultValue\": \"ACTIVE\",\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n },\n {\n \"name\": \"hireDate\",\n \"label\": \"Data de admissao\",\n \"controlType\": \"date\",\n \"dataType\": \"date\"\n },\n {\n \"name\": \"terminationDate\",\n \"label\": \"Data de desligamento\",\n \"controlType\": \"date\",\n \"conditionalDisplay\": \"status == 'INACTIVE'\",\n \"conditionalRequired\": \"status == 'INACTIVE'\"\n },\n {\n \"name\": \"department\",\n \"label\": \"Departamento\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/departments\",\n \"valueField\": \"id\",\n \"displayField\": \"name\"\n },\n {\n \"name\": \"role\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Analista\",\n \"value\": \"ANALYST\"\n },\n {\n \"text\": \"Coordenador\",\n \"value\": \"COORD\"\n },\n {\n \"text\": \"Gerente\",\n \"value\": \"MANAGER\"\n }\n ]\n },\n {\n \"name\": \"managerId\",\n \"label\": \"Gestor\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/employees?role=manager\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"filterField\": \"name\"\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salario\",\n \"controlType\": \"currency\",\n \"dataType\": \"number\",\n \"format\": \"BRL|symbol|2\",\n \"validators\": {\n \"min\": 0\n }\n },\n {\n \"name\": \"workMode\",\n \"label\": \"Regime\",\n \"controlType\": \"radio\",\n \"options\": [\n {\n \"text\": \"CLT\",\n \"value\": \"CLT\"\n },\n {\n \"text\": \"PJ\",\n \"value\": \"PJ\"\n },\n {\n \"text\": \"Estagio\",\n \"value\": \"INTERN\"\n }\n ],\n \"defaultValue\": \"CLT\"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Observacoes\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"maxLength\": 500\n },\n \"hint\": \"Informacoes adicionais relevantes ao cadastro.\"\n },\n {\n \"name\": \"isActive\",\n \"label\": \"Ativo\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Foto\",\n \"controlType\": \"upload\",\n \"accept\": \".png,.jpg,.jpeg\",\n \"multiple\": false,\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"basic\",\n \"title\": \"Dados basicos\",\n \"description\": \"Informacoes pessoais e status.\",\n \"icon\": \"person\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"rows\": [\n {\n \"id\": \"row-basic-1\",\n \"columns\": [\n {\n \"id\": \"col-basic-1\",\n \"fields\": [\n \"name\",\n \"email\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"padding\": 8\n },\n {\n \"id\": \"col-basic-2\",\n \"fields\": [\n \"status\",\n \"hireDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-basic-2\",\n \"columns\": [\n {\n \"id\": \"col-basic-3\",\n \"fields\": [\n \"phone\",\n \"managerId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-basic-4\",\n \"fields\": [\n \"department\",\n \"role\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"employment\",\n \"title\": \"Contrato\",\n \"icon\": \"badge\",\n \"rows\": [\n {\n \"id\": \"row-employment-1\",\n \"columns\": [\n {\n \"id\": \"col-employment-1\",\n \"fields\": [\n \"salary\",\n \"workMode\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-employment-2\",\n \"fields\": [\n \"terminationDate\",\n \"notes\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Arquivos\",\n \"collapsible\": true,\n \"collapsed\": true,\n \"rows\": [\n {\n \"id\": \"row-attachments-1\",\n \"columns\": [\n {\n \"id\": \"col-attachments-1\",\n \"fields\": [\n \"avatar\"\n ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"center\"\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Salvar\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"type\": \"submit\",\n \"shortcut\": \"Ctrl+S\"\n },\n \"cancel\": {\n \"visible\": true,\n \"label\": \"Cancelar\",\n \"type\": \"button\"\n },\n \"reset\": {\n \"visible\": true,\n \"label\": \"Limpar\",\n \"type\": \"reset\"\n },\n \"custom\": [\n {\n \"id\": \"archive\",\n \"visible\": true,\n \"label\": \"Arquivar\",\n \"icon\": \"archive\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"action\": \"archive\"\n }\n ],\n \"position\": \"right\",\n \"orientation\": \"horizontal\",\n \"spacing\": \"normal\",\n \"sticky\": true,\n \"divider\": true,\n \"placement\": \"afterSections\",\n \"mobile\": {\n \"position\": \"center\",\n \"orientation\": \"vertical\",\n \"collapseToMenu\": true\n }\n },\n \"formRules\": [\n {\n \"id\": \"hide-salary-inactive\",\n \"name\": \"Ocultar salario para inativos\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\"\n ],\n \"effect\": {\n \"condition\": \"status == 'INACTIVE'\",\n \"properties\": {\n \"visible\": false\n }\n }\n },\n {\n \"id\": \"require-termination-date\",\n \"name\": \"Exigir data de desligamento\",\n \"targetType\": \"field\",\n \"targets\": [\n \"terminationDate\"\n ],\n \"effect\": {\n \"condition\": \"status == 'INACTIVE'\",\n \"properties\": {\n \"required\": true,\n \"visible\": true\n }\n }\n }\n ]\n }\n}\n",
2701
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.form.json",
2702
+ "contentHash": "1497bc6439979f7701a819ea3de6df43986f37b09eddc99812764bd2e50ea2c9",
2703
+ "sourceKind": "component_definition",
2704
+ "sourceId": "praxis-crud",
2705
+ "corpusVersion": "1.0.0"
2706
+ },
2707
+ {
2708
+ "chunkIndex": 6,
2709
+ "chunkKind": "recipe",
2710
+ "content": "{\n \"_comment\": \"Receita de CRUD alinhada ao PraxisCrud, usando acoes canonicas inferidas como baseline.\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-crud\",\n \"defaultVariantId\": \"table\",\n \"variants\": [\n {\n \"id\": \"table\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"table\",\n \"aiDescription\": \"CRUD table configuration only.\",\n \"tags\": [\n \"table\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change table columns or behavior inside CRUD\",\n \"examplePrompts\": [\n \"adjust the columns shown in the crud table\",\n \"enable selection in the crud table\"\n ]\n },\n {\n \"id\": \"form\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"form\",\n \"aiDescription\": \"CRUD form configuration only.\",\n \"tags\": [\n \"form\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change form layout or fields in CRUD\",\n \"examplePrompts\": [\n \"add a new field to the crud form\",\n \"update validation rules in the form\"\n ]\n },\n {\n \"id\": \"actions\",\n \"registryKey\": \"praxis-crud\",\n \"variantId\": \"actions\",\n \"aiDescription\": \"CRUD actions and modal behavior.\",\n \"tags\": [\n \"actions\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change CRUD actions or routes\",\n \"examplePrompts\": [\n \"add a custom action to archive records\",\n \"change the edit action to open a route\"\n ]\n }\n ]\n },\n \"component\": \"praxis-crud\",\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"defaults\": {\n \"openMode\": \"modal\",\n \"modal\": {\n \"width\": \"860px\",\n \"maxWidth\": \"95vw\",\n \"panelClass\": \"crud-dialog\",\n \"backdropStyle\": \"blur\",\n \"autoFocus\": true,\n \"restoreFocus\": true\n },\n \"back\": {\n \"strategy\": \"auto\",\n \"returnTo\": \"/employees\",\n \"confirmOnDirty\": true\n },\n \"header\": {\n \"showBack\": true,\n \"backLabel\": \"Voltar\",\n \"variant\": \"outlined\",\n \"sticky\": true,\n \"breadcrumbs\": true,\n \"divider\": true\n }\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo colaborador\",\n \"icon\": \"add\",\n \"action\": \"create\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"view\",\n \"label\": \"Visualizar\",\n \"icon\": \"visibility\",\n \"action\": \"view\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\",\n \"openMode\": \"modal\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\"\n },\n {\n \"id\": \"edit-route\",\n \"label\": \"Editar na rota\",\n \"icon\": \"open_in_new\",\n \"action\": \"edit-route\",\n \"openMode\": \"route\",\n \"route\": \"/employees/:id/edit\",\n \"params\": [\n {\n \"from\": \"id\",\n \"to\": \"routeParam\",\n \"name\": \"id\"\n },\n {\n \"from\": \"name\",\n \"to\": \"query\",\n \"name\": \"name\"\n }\n ],\n \"back\": {\n \"strategy\": \"navigate\",\n \"returnTo\": \"/employees\"\n }\n }\n ],\n \"table\": {\n \"meta\": {\n \"version\": \"2.0.0\",\n \"id\": \"employees-table\",\n \"name\": \"Colaboradores\",\n \"description\": \"Listagem de colaboradores ativos e inativos\",\n \"idField\": \"id\"\n },\n \"columns\": [\n {\n \"field\": \"id\",\n \"header\": \"ID\",\n \"type\": \"string\",\n \"width\": \"80px\",\n \"visible\": false\n },\n {\n \"field\": \"name\",\n \"header\": \"Nome\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"resizable\": true,\n \"sticky\": \"start\"\n },\n {\n \"field\": \"email\",\n \"header\": \"Email\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"status\",\n \"header\": \"Status\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"valueMapping\": {\n \"ACTIVE\": \"Ativo\",\n \"INACTIVE\": \"Inativo\",\n \"ON_LEAVE\": \"Afastado\"\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"textField\": \"statusLabel\",\n \"color\": \"success\",\n \"variant\": \"filled\"\n }\n },\n \"conditionalRenderers\": [\n {\n \"condition\": \"status == 'INACTIVE'\",\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"text\": \"Inativo\",\n \"color\": \"warn\",\n \"variant\": \"filled\"\n }\n },\n \"description\": \"Status inativo\",\n \"enabled\": true\n },\n {\n \"condition\": \"status == 'ON_LEAVE'\",\n \"renderer\": {\n \"type\": \"chip\",\n \"chip\": {\n \"text\": \"Afastado\",\n \"color\": \"accent\",\n \"variant\": \"outlined\"\n }\n },\n \"description\": \"Status afastado\",\n \"enabled\": true\n }\n ]\n },\n {\n \"field\": \"hireDate\",\n \"header\": \"Admissao\",\n \"type\": \"date\",\n \"format\": \"dd/MM/yyyy\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"salary\",\n \"header\": \"Salario\",\n \"type\": \"currency\",\n \"format\": \"BRL|symbol|2\",\n \"align\": \"right\",\n \"sortable\": true,\n \"filterable\": true\n }\n ],\n \"toolbar\": {\n \"visible\": true,\n \"position\": \"top\",\n \"title\": \"Colaboradores\",\n \"subtitle\": \"Gerencie cadastro, status e remuneracao\",\n \"layout\": {\n \"alignment\": \"space-between\",\n \"showSeparator\": true\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo\",\n \"icon\": \"add\",\n \"type\": \"button\",\n \"color\": \"primary\",\n \"position\": \"end\",\n \"action\": \"create\"\n },\n {\n \"id\": \"export\",\n \"label\": \"Exportar\",\n \"icon\": \"download\",\n \"type\": \"menu\",\n \"position\": \"end\",\n \"action\": \"export\",\n \"children\": [\n {\n \"id\": \"export-csv\",\n \"label\": \"CSV\",\n \"icon\": \"table_view\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportCsv\"\n },\n {\n \"id\": \"export-excel\",\n \"label\": \"Excel\",\n \"icon\": \"grid_on\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportExcel\"\n }\n ]\n }\n ],\n \"filters\": {\n \"enabled\": true,\n \"showAdvancedButton\": true\n },\n \"settingsMenu\": {\n \"enabled\": true,\n \"options\": [\n {\n \"id\": \"density\",\n \"label\": \"Densidade\",\n \"type\": \"select\",\n \"options\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n }\n ]\n }\n },\n \"behavior\": {\n \"pagination\": {\n \"enabled\": true,\n \"pageSize\": 20,\n \"pageSizeOptions\": [\n 10,\n 20,\n 50\n ],\n \"showFirstLastButtons\": true,\n \"showPageNumbers\": true,\n \"showPageInfo\": true,\n \"position\": \"bottom\",\n \"style\": \"default\",\n \"strategy\": \"server\"\n },\n \"sorting\": {\n \"enabled\": true,\n \"defaultSort\": {\n \"column\": \"name\",\n \"direction\": \"asc\"\n },\n \"multiSort\": false,\n \"strategy\": \"server\",\n \"showSortIndicators\": true,\n \"indicatorPosition\": \"end\",\n \"allowClearSort\": true\n },\n \"filtering\": {\n \"enabled\": true,\n \"columnFilters\": {\n \"enabled\": true,\n \"defaultType\": \"text\",\n \"position\": \"header\"\n },\n \"advancedFilters\": {\n \"enabled\": true,\n \"queryBuilder\": true,\n \"savePresets\": true\n },\n \"strategy\": \"server\",\n \"debounceTime\": 300\n },\n \"selection\": {\n \"enabled\": true,\n \"type\": \"multiple\",\n \"mode\": \"checkbox\",\n \"allowSelectAll\": true,\n \"checkboxPosition\": \"start\",\n \"persistSelection\": false,\n \"persistOnDataUpdate\": false\n },\n \"interaction\": {\n \"rowClick\": {\n \"enabled\": true,\n \"action\": \"view\"\n },\n \"rowDoubleClick\": {\n \"enabled\": true,\n \"action\": \"edit\"\n },\n \"hover\": {\n \"enabled\": true,\n \"highlightRow\": true,\n \"showActionsOnHover\": true\n },\n \"keyboard\": {\n \"enabled\": true\n }\n }\n },\n \"actions\": {\n \"row\": {\n \"enabled\": true,\n \"position\": \"end\",\n \"display\": \"icons\",\n \"trigger\": \"hover\",\n \"width\": \"140px\",\n \"actions\": [\n {\n \"id\": \"view\",\n \"label\": \"Ver\",\n \"icon\": \"visibility\",\n \"action\": \"view\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\",\n \"requiresConfirmation\": true\n }\n ],\n \"header\": {\n \"label\": \"Acoes\",\n \"align\": \"center\"\n }\n },\n \"bulk\": {\n \"enabled\": true,\n \"position\": \"toolbar\",\n \"actions\": [\n {\n \"id\": \"bulk-delete\",\n \"label\": \"Excluir selecionados\",\n \"icon\": \"delete\",\n \"action\": \"deleteSelected\",\n \"requiresConfirmation\": true,\n \"minSelections\": 1\n }\n ],\n \"floating\": {\n \"position\": \"bottom-right\",\n \"hideWhenEmpty\": true\n }\n },\n \"confirmations\": {\n \"default\": {\n \"title\": \"Confirmar acao\",\n \"message\": \"Deseja continuar?\",\n \"confirmText\": \"Confirmar\",\n \"cancelText\": \"Cancelar\"\n },\n \"specific\": {\n \"delete\": {\n \"title\": \"Excluir colaborador\",\n \"message\": \"Esta acao nao pode ser desfeita.\",\n \"confirmText\": \"Excluir\",\n \"cancelText\": \"Cancelar\"\n }\n }\n }\n },\n \"export\": {\n \"enabled\": true,\n \"formats\": [\n \"csv\",\n \"excel\"\n ],\n \"general\": {\n \"includeHeaders\": true,\n \"respectFilters\": true,\n \"applyFormatting\": true,\n \"defaultFileName\": \"colaboradores\",\n \"includeColumns\": [\n \"id\",\n \"name\",\n \"email\",\n \"status\",\n \"hireDate\",\n \"salary\"\n ]\n },\n \"excel\": {\n \"sheetName\": \"Colaboradores\",\n \"includeFormulas\": false,\n \"freezeHeaders\": true,\n \"autoFitColumns\": true\n },\n \"csv\": {\n \"delimiter\": \";\",\n \"escapeChar\": \"\\\"\",\n \"encoding\": \"utf-8\",\n \"includeBOM\": true\n }\n },\n \"messages\": {\n \"states\": {\n \"loading\": \"Carregando colaboradores...\",\n \"empty\": \"Nenhum colaborador encontrado.\",\n \"error\": \"Erro ao carregar dados.\",\n \"noResults\": \"Sem resultados para o filtro atual.\",\n \"loadingMore\": \"Carregando mais registros...\"\n },\n \"actions\": {\n \"confirmations\": {\n \"delete\": \"Excluir este colaborador?\",\n \"deleteMultiple\": \"Excluir os colaboradores selecionados?\",\n \"save\": \"Salvar alteracoes?\",\n \"cancel\": \"Cancelar edicao?\",\n \"export\": \"Exportar dados agora?\"\n },\n \"success\": {\n \"save\": \"Colaborador salvo com sucesso.\",\n \"delete\": \"Colaborador excluido.\",\n \"export\": \"Exportacao concluida.\"\n },\n \"errors\": {\n \"save\": \"Falha ao salvar.\",\n \"delete\": \"Falha ao excluir.\",\n \"export\": \"Falha ao exportar.\"\n }\n }\n },\n \"localization\": {\n \"locale\": \"pt-BR\",\n \"direction\": \"ltr\",\n \"dateTime\": {\n \"dateFormat\": \"dd/MM/yyyy\",\n \"timeFormat\": \"HH:mm\",\n \"dateTimeFormat\": \"dd/MM/yyyy HH:mm\",\n \"firstDayOfWeek\": 1\n }\n },\n \"appearance\": {\n \"density\": \"comfortable\",\n \"borders\": {\n \"showRowBorders\": true,\n \"showColumnBorders\": false,\n \"showOuterBorder\": true,\n \"style\": \"solid\",\n \"width\": 1,\n \"color\": \"#e0e0e0\"\n }\n }\n },\n \"form\": {\n \"metadata\": {\n \"version\": \"2.0\",\n \"source\": \"local\",\n \"schemaId\": \"path:/api/employees#request\",\n \"schemaContext\": {\n \"path\": \"/api/employees\",\n \"operation\": \"POST\",\n \"schemaType\": \"request\",\n \"internal\": false,\n \"tenant\": \"default\",\n \"locale\": \"pt-BR\"\n }\n },\n \"api\": {\n \"saveEndpoint\": \"/api/employees\",\n \"loadEndpoint\": \"/api/employees/${id}\",\n \"saveMethod\": \"POST\",\n \"timeout\": 15000,\n \"headers\": {\n \"X-Module\": \"HR\"\n },\n \"idField\": \"id\",\n \"beforeSave\": \"sanitizeEmployee\",\n \"afterLoad\": \"mapEmployee\"\n },\n \"behavior\": {\n \"confirmOnUnsavedChanges\": true,\n \"trackHistory\": true,\n \"focusFirstError\": true,\n \"scrollToErrors\": true,\n \"clearAfterSave\": false,\n \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"messages\": {\n \"createRegistrySuccess\": \"Colaborador criado com sucesso.\",\n \"updateRegistrySuccess\": \"Colaborador atualizado com sucesso.\",\n \"createRegistryError\": \"Falha ao criar colaborador.\",\n \"updateRegistryError\": \"Falha ao atualizar colaborador.\",\n \"confirmations\": {\n \"submit\": \"Deseja salvar as alteracoes?\",\n \"cancel\": \"Descartar alteracoes?\",\n \"reset\": \"Limpar o formulario?\"\n },\n \"customActions\": {\n \"archive\": {\n \"confirmation\": \"Arquivar este colaborador?\"\n }\n },\n \"loading\": {\n \"submit\": \"Salvando...\",\n \"cancel\": \"Cancelando...\"\n }\n },\n \"hints\": {\n \"dataModes\": {\n \"create\": \"Preencha os dados para criar um novo colaborador.\",\n \"edit\": \"Atualize os dados e salve as alteracoes.\",\n \"view\": \"Visualize os dados do colaborador.\"\n },\n \"uiModes\": {\n \"presentation\": \"Modo apresentacao mostra somente leitura.\",\n \"readonly\": \"Modo leitura bloqueia edicao.\",\n \"disabled\": \"Campos desabilitados nao permitem interacao.\",\n \"visible\": \"Controle de visibilidade sem destruir controles.\"\n }\n },\n \"hooks\": {\n \"beforeSubmit\": [\n {\n \"id\": \"sanitize-employee\",\n \"priority\": 100,\n \"args\": {\n \"trimStrings\": true\n }\n }\n ],\n \"afterSubmit\": [\n {\n \"id\": \"notify-success\",\n \"args\": {\n \"messageKey\": \"employeeSaved\"\n }\n }\n ],\n \"onError\": [\n {\n \"id\": \"notify-error\",\n \"args\": {\n \"messageKey\": \"employeeSaveError\"\n }\n }\n ]\n },\n \"fieldMetadata\": [\n {\n \"name\": \"id\",\n \"label\": \"ID\",\n \"controlType\": \"numericTextBox\",\n \"dataType\": \"number\",\n \"hidden\": true,\n \"readOnly\": true,\n \"description\": \"Campo ID oculto, gerenciado pelo backend.\"\n },\n {\n \"name\": \"name\",\n \"label\": \"Nome completo\",\n \"controlType\": \"input\",\n \"dataType\": \"text\",\n \"placeholder\": \"Ex.: Ana Souza\",\n \"prefixIcon\": \"person\",\n \"validators\": {\n \"required\": true,\n \"minLength\": 3\n }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"dataType\": \"email\",\n \"placeholder\": \"nome@empresa.com\",\n \"validators\": {\n \"required\": true,\n \"email\": true\n }\n },\n {\n \"name\": \"phone\",\n \"label\": \"Telefone\",\n \"controlType\": \"phone\",\n \"placeholder\": \"(11) 99999-0000\",\n \"mask\": \"(99) 99999-9999\"\n },\n {\n \"name\": \"status\",\n \"label\": \"Status\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Ativo\",\n \"value\": \"ACTIVE\"\n },\n {\n \"text\": \"Inativo\",\n \"value\": \"INACTIVE\"\n },\n {\n \"text\": \"Afastado\",\n \"value\": \"ON_LEAVE\"\n }\n ],\n \"defaultValue\": \"ACTIVE\",\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n },\n {\n \"name\": \"hireDate\",\n \"label\": \"Data de admissao\",\n \"controlType\": \"date\",\n \"dataType\": \"date\"\n },\n {\n \"name\": \"terminationDate\",\n \"label\": \"Data de desligamento\",\n \"controlType\": \"date\",\n \"conditionalDisplay\": \"status == 'INACTIVE'\",\n \"conditionalRequired\": \"status == 'INACTIVE'\"\n },\n {\n \"name\": \"department\",\n \"label\": \"Departamento\",\n \"controlType\": \"select\",\n \"endpoint\": \"/api/departments\",\n \"valueField\": \"id\",\n \"displayField\": \"name\"\n },\n {\n \"name\": \"role\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"options\": [\n {\n \"text\": \"Analista\",\n \"value\": \"ANALYST\"\n },\n {\n \"text\": \"Coordenador\",\n \"value\": \"COORD\"\n },\n {\n \"text\": \"Gerente\",\n \"value\": \"MANAGER\"\n }\n ]\n },\n {\n \"name\": \"managerId\",\n \"label\": \"Gestor\",\n \"controlType\": \"autoComplete\",\n \"endpoint\": \"/api/employees?role=manager\",\n \"valueField\": \"id\",\n \"displayField\": \"name\",\n \"filterField\": \"name\"\n },\n {\n \"name\": \"salary\",\n \"label\": \"Salario\",\n \"controlType\": \"currency\",\n \"dataType\": \"number\",\n \"format\": \"BRL|symbol|2\",\n \"validators\": {\n \"min\": 0\n }\n },\n {\n \"name\": \"workMode\",\n \"label\": \"Regime\",\n \"controlType\": \"radio\",\n \"options\": [\n {\n \"text\": \"CLT\",\n \"value\": \"CLT\"\n },\n {\n \"text\": \"PJ\",\n \"value\": \"PJ\"\n },\n {\n \"text\": \"Estagio\",\n \"value\": \"INTERN\"\n }\n ],\n \"defaultValue\": \"CLT\"\n },\n {\n \"name\": \"notes\",\n \"label\": \"Observacoes\",\n \"controlType\": \"textarea\",\n \"validators\": {\n \"maxLength\": 500\n },\n \"hint\": \"Informacoes adicionais relevantes ao cadastro.\"\n },\n {\n \"name\": \"isActive\",\n \"label\": \"Ativo\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true\n },\n {\n \"name\": \"avatar\",\n \"label\": \"Foto\",\n \"controlType\": \"upload\",\n \"accept\": \".png,.jpg,.jpeg\",\n \"multiple\": false,\n \"materialDesign\": {\n \"appearance\": \"outline\"\n }\n }\n ],\n \"sections\": [\n {\n \"id\": \"basic\",\n \"title\": \"Dados basicos\",\n \"description\": \"Informacoes pessoais e status.\",\n \"icon\": \"person\",\n \"collapsible\": true,\n \"collapsed\": false,\n \"titleStyle\": \"titleMedium\",\n \"descriptionStyle\": \"bodyMedium\",\n \"rows\": [\n {\n \"id\": \"row-basic-1\",\n \"columns\": [\n {\n \"id\": \"col-basic-1\",\n \"fields\": [\n \"name\",\n \"email\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n },\n \"padding\": 8\n },\n {\n \"id\": \"col-basic-2\",\n \"fields\": [\n \"status\",\n \"hireDate\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n },\n {\n \"id\": \"row-basic-2\",\n \"columns\": [\n {\n \"id\": \"col-basic-3\",\n \"fields\": [\n \"phone\",\n \"managerId\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-basic-4\",\n \"fields\": [\n \"department\",\n \"role\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"employment\",\n \"title\": \"Contrato\",\n \"icon\": \"badge\",\n \"rows\": [\n {\n \"id\": \"row-employment-1\",\n \"columns\": [\n {\n \"id\": \"col-employment-1\",\n \"fields\": [\n \"salary\",\n \"workMode\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n },\n {\n \"id\": \"col-employment-2\",\n \"fields\": [\n \"terminationDate\",\n \"notes\"\n ],\n \"span\": {\n \"md\": 6,\n \"lg\": 6\n }\n }\n ]\n }\n ]\n },\n {\n \"id\": \"attachments\",\n \"title\": \"Arquivos\",\n \"collapsible\": true,\n \"collapsed\": true,\n \"rows\": [\n {\n \"id\": \"row-attachments-1\",\n \"columns\": [\n {\n \"id\": \"col-attachments-1\",\n \"fields\": [\n \"avatar\"\n ],\n \"span\": {\n \"md\": 12,\n \"lg\": 12\n },\n \"align\": \"center\"\n }\n ]\n }\n ]\n }\n ],\n \"actions\": {\n \"submit\": {\n \"visible\": true,\n \"label\": \"Salvar\",\n \"color\": \"primary\",\n \"variant\": \"raised\",\n \"type\": \"submit\",\n \"shortcut\": \"Ctrl+S\"\n },\n \"cancel\": {\n \"visible\": true,\n \"label\": \"Cancelar\",\n \"type\": \"button\"\n },\n \"reset\": {\n \"visible\": true,\n \"label\": \"Limpar\",\n \"type\": \"reset\"\n },\n \"custom\": [\n {\n \"id\": \"archive\",\n \"visible\": true,\n \"label\": \"Arquivar\",\n \"icon\": \"archive\",\n \"color\": \"warn\",\n \"variant\": \"stroked\",\n \"action\": \"archive\"\n }\n ],\n \"position\": \"right\",\n \"orientation\": \"horizontal\",\n \"spacing\": \"normal\",\n \"sticky\": true,\n \"divider\": true,\n \"placement\": \"afterSections\",\n \"mobile\": {\n \"position\": \"center\",\n \"orientation\": \"vertical\",\n \"collapseToMenu\": true\n }\n },\n \"formRules\": [\n {\n \"id\": \"hide-salary-inactive\",\n \"name\": \"Ocultar salario para inativos\",\n \"targetType\": \"field\",\n \"targets\": [\n \"salary\"\n ],\n \"effect\": {\n \"condition\": \"status == 'INACTIVE'\",\n \"properties\": {\n \"visible\": false\n }\n }\n },\n {\n \"id\": \"require-termination-date\",\n \"name\": \"Exigir data de desligamento\",\n \"targetType\": \"field\",\n \"targets\": [\n \"terminationDate\"\n ],\n \"effect\": {\n \"condition\": \"status == 'INACTIVE'\",\n \"properties\": {\n \"required\": true,\n \"visible\": true\n }\n }\n }\n ]\n },\n \"i18n\": {\n \"crudDialog\": {\n \"createTitle\": \"Novo colaborador\",\n \"editTitle\": \"Editar colaborador\",\n \"viewTitle\": \"Detalhes do colaborador\",\n \"deleteTitle\": \"Confirmar exclusao\",\n \"deleteConfirm\": \"Tem certeza que deseja excluir este colaborador?\"\n }\n }\n}\n",
2711
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.json",
2712
+ "contentHash": "3512e837ac9b35c57bddd6ac4181f8ac060d4b6c23b8132d81566a9605c19247",
2713
+ "sourceKind": "component_definition",
2714
+ "sourceId": "praxis-crud",
2715
+ "corpusVersion": "1.0.0"
2716
+ },
2717
+ {
2718
+ "chunkIndex": 7,
2719
+ "chunkKind": "recipe",
2720
+ "content": "{\n \"_comment\": \"Variant focused on CRUD table configuration.\",\n \"templateMeta\": {\n \"variantId\": \"table\",\n \"variantOf\": \"praxis-crud\",\n \"registryKey\": \"praxis-crud\",\n \"tags\": [\n \"table\",\n \"crud\"\n ],\n \"useWhen\": \"user asks to change table columns or behavior inside CRUD\",\n \"examplePrompts\": [\n \"adjust the columns shown in the crud table\",\n \"enable selection in the crud table\"\n ]\n },\n \"resource\": {\n \"path\": \"/api/employees\",\n \"idField\": \"id\",\n \"endpointKey\": \"employees\"\n },\n \"table\": {\n \"meta\": {\n \"version\": \"2.0.0\",\n \"id\": \"employees-table\",\n \"name\": \"Colaboradores\",\n \"description\": \"Listagem de colaboradores ativos e inativos\",\n \"idField\": \"id\"\n },\n \"columns\": [\n {\n \"field\": \"id\",\n \"header\": \"ID\",\n \"type\": \"string\",\n \"width\": \"80px\",\n \"visible\": false\n },\n {\n \"field\": \"name\",\n \"header\": \"Nome\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"resizable\": true,\n \"sticky\": \"start\"\n },\n {\n \"field\": \"email\",\n \"header\": \"Email\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"status\",\n \"header\": \"Status\",\n \"type\": \"string\",\n \"sortable\": true,\n \"filterable\": true,\n \"valueMapping\": {\n \"ACTIVE\": \"Ativo\",\n \"INACTIVE\": \"Inativo\",\n \"ON_LEAVE\": \"Afastado\"\n },\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"textField\": \"statusLabel\",\n \"color\": \"success\",\n \"variant\": \"filled\"\n }\n },\n \"conditionalRenderers\": [\n {\n \"condition\": \"status == 'INACTIVE'\",\n \"renderer\": {\n \"type\": \"badge\",\n \"badge\": {\n \"text\": \"Inativo\",\n \"color\": \"warn\",\n \"variant\": \"filled\"\n }\n },\n \"description\": \"Status inativo\",\n \"enabled\": true\n },\n {\n \"condition\": \"status == 'ON_LEAVE'\",\n \"renderer\": {\n \"type\": \"chip\",\n \"chip\": {\n \"text\": \"Afastado\",\n \"color\": \"accent\",\n \"variant\": \"outlined\"\n }\n },\n \"description\": \"Status afastado\",\n \"enabled\": true\n }\n ]\n },\n {\n \"field\": \"hireDate\",\n \"header\": \"Admissao\",\n \"type\": \"date\",\n \"format\": \"dd/MM/yyyy\",\n \"sortable\": true,\n \"filterable\": true\n },\n {\n \"field\": \"salary\",\n \"header\": \"Salario\",\n \"type\": \"currency\",\n \"format\": \"BRL|symbol|2\",\n \"align\": \"right\",\n \"sortable\": true,\n \"filterable\": true\n }\n ],\n \"toolbar\": {\n \"visible\": true,\n \"position\": \"top\",\n \"title\": \"Colaboradores\",\n \"subtitle\": \"Gerencie cadastro, status e remuneracao\",\n \"layout\": {\n \"alignment\": \"space-between\",\n \"showSeparator\": true\n },\n \"actions\": [\n {\n \"id\": \"create\",\n \"label\": \"Novo\",\n \"icon\": \"add\",\n \"type\": \"button\",\n \"color\": \"primary\",\n \"position\": \"end\",\n \"action\": \"create\"\n },\n {\n \"id\": \"export\",\n \"label\": \"Exportar\",\n \"icon\": \"download\",\n \"type\": \"menu\",\n \"position\": \"end\",\n \"action\": \"export\",\n \"children\": [\n {\n \"id\": \"export-csv\",\n \"label\": \"CSV\",\n \"icon\": \"table_view\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportCsv\"\n },\n {\n \"id\": \"export-excel\",\n \"label\": \"Excel\",\n \"icon\": \"grid_on\",\n \"type\": \"button\",\n \"position\": \"end\",\n \"action\": \"exportExcel\"\n }\n ]\n }\n ],\n \"filters\": {\n \"enabled\": true,\n \"showAdvancedButton\": true\n },\n \"settingsMenu\": {\n \"enabled\": true,\n \"options\": [\n {\n \"id\": \"density\",\n \"label\": \"Densidade\",\n \"type\": \"select\",\n \"options\": [\n \"compact\",\n \"comfortable\",\n \"spacious\"\n ]\n }\n ]\n }\n },\n \"behavior\": {\n \"pagination\": {\n \"enabled\": true,\n \"pageSize\": 20,\n \"pageSizeOptions\": [\n 10,\n 20,\n 50\n ],\n \"showFirstLastButtons\": true,\n \"showPageNumbers\": true,\n \"showPageInfo\": true,\n \"position\": \"bottom\",\n \"style\": \"default\",\n \"strategy\": \"server\"\n },\n \"sorting\": {\n \"enabled\": true,\n \"defaultSort\": {\n \"column\": \"name\",\n \"direction\": \"asc\"\n },\n \"multiSort\": false,\n \"strategy\": \"server\",\n \"showSortIndicators\": true,\n \"indicatorPosition\": \"end\",\n \"allowClearSort\": true\n },\n \"filtering\": {\n \"enabled\": true,\n \"columnFilters\": {\n \"enabled\": true,\n \"defaultType\": \"text\",\n \"position\": \"header\"\n },\n \"advancedFilters\": {\n \"enabled\": true,\n \"queryBuilder\": true,\n \"savePresets\": true\n },\n \"strategy\": \"server\",\n \"debounceTime\": 300\n },\n \"selection\": {\n \"enabled\": true,\n \"type\": \"multiple\",\n \"mode\": \"checkbox\",\n \"allowSelectAll\": true,\n \"checkboxPosition\": \"start\",\n \"persistSelection\": false,\n \"persistOnDataUpdate\": false\n },\n \"interaction\": {\n \"rowClick\": {\n \"enabled\": true,\n \"action\": \"view\"\n },\n \"rowDoubleClick\": {\n \"enabled\": true,\n \"action\": \"edit\"\n },\n \"hover\": {\n \"enabled\": true,\n \"highlightRow\": true,\n \"showActionsOnHover\": true\n },\n \"keyboard\": {\n \"enabled\": true\n }\n }\n },\n \"actions\": {\n \"row\": {\n \"enabled\": true,\n \"position\": \"end\",\n \"display\": \"icons\",\n \"trigger\": \"hover\",\n \"width\": \"140px\",\n \"actions\": [\n {\n \"id\": \"view\",\n \"label\": \"Ver\",\n \"icon\": \"visibility\",\n \"action\": \"view\"\n },\n {\n \"id\": \"edit\",\n \"label\": \"Editar\",\n \"icon\": \"edit\",\n \"action\": \"edit\"\n },\n {\n \"id\": \"delete\",\n \"label\": \"Excluir\",\n \"icon\": \"delete\",\n \"action\": \"delete\",\n \"requiresConfirmation\": true\n }\n ],\n \"header\": {\n \"label\": \"Acoes\",\n \"align\": \"center\"\n }\n },\n \"bulk\": {\n \"enabled\": true,\n \"position\": \"toolbar\",\n \"actions\": [\n {\n \"id\": \"bulk-delete\",\n \"label\": \"Excluir selecionados\",\n \"icon\": \"delete\",\n \"action\": \"deleteSelected\",\n \"requiresConfirmation\": true,\n \"minSelections\": 1\n }\n ],\n \"floating\": {\n \"position\": \"bottom-right\",\n \"hideWhenEmpty\": true\n }\n },\n \"confirmations\": {\n \"default\": {\n \"title\": \"Confirmar acao\",\n \"message\": \"Deseja continuar?\",\n \"confirmText\": \"Confirmar\",\n \"cancelText\": \"Cancelar\"\n },\n \"specific\": {\n \"delete\": {\n \"title\": \"Excluir colaborador\",\n \"message\": \"Esta acao nao pode ser desfeita.\",\n \"confirmText\": \"Excluir\",\n \"cancelText\": \"Cancelar\"\n }\n }\n }\n },\n \"export\": {\n \"enabled\": true,\n \"formats\": [\n \"csv\",\n \"excel\"\n ],\n \"general\": {\n \"includeHeaders\": true,\n \"respectFilters\": true,\n \"applyFormatting\": true,\n \"defaultFileName\": \"colaboradores\",\n \"includeColumns\": [\n \"id\",\n \"name\",\n \"email\",\n \"status\",\n \"hireDate\",\n \"salary\"\n ]\n },\n \"excel\": {\n \"sheetName\": \"Colaboradores\",\n \"includeFormulas\": false,\n \"freezeHeaders\": true,\n \"autoFitColumns\": true\n },\n \"csv\": {\n \"delimiter\": \";\",\n \"escapeChar\": \"\\\"\",\n \"encoding\": \"utf-8\",\n \"includeBOM\": true\n }\n },\n \"messages\": {\n \"states\": {\n \"loading\": \"Carregando colaboradores...\",\n \"empty\": \"Nenhum colaborador encontrado.\",\n \"error\": \"Erro ao carregar dados.\",\n \"noResults\": \"Sem resultados para o filtro atual.\",\n \"loadingMore\": \"Carregando mais registros...\"\n },\n \"actions\": {\n \"confirmations\": {\n \"delete\": \"Excluir este colaborador?\",\n \"deleteMultiple\": \"Excluir os colaboradores selecionados?\",\n \"save\": \"Salvar alteracoes?\",\n \"cancel\": \"Cancelar edicao?\",\n \"export\": \"Exportar dados agora?\"\n },\n \"success\": {\n \"save\": \"Colaborador salvo com sucesso.\",\n \"delete\": \"Colaborador excluido.\",\n \"export\": \"Exportacao concluida.\"\n },\n \"errors\": {\n \"save\": \"Falha ao salvar.\",\n \"delete\": \"Falha ao excluir.\",\n \"export\": \"Falha ao exportar.\"\n }\n }\n },\n \"localization\": {\n \"locale\": \"pt-BR\",\n \"direction\": \"ltr\",\n \"dateTime\": {\n \"dateFormat\": \"dd/MM/yyyy\",\n \"timeFormat\": \"HH:mm\",\n \"dateTimeFormat\": \"dd/MM/yyyy HH:mm\",\n \"firstDayOfWeek\": 1\n }\n },\n \"appearance\": {\n \"density\": \"comfortable\",\n \"borders\": {\n \"showRowBorders\": true,\n \"showColumnBorders\": false,\n \"showOuterBorder\": true,\n \"style\": \"solid\",\n \"width\": 1,\n \"color\": \"#e0e0e0\"\n }\n }\n }\n}\n",
2721
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-crud.table.json",
2722
+ "contentHash": "dd87a30bbe43d4eda9b962d83bc53635dc0266bb274ff395f2543d511de86bf2",
2723
+ "sourceKind": "component_definition",
2724
+ "sourceId": "praxis-crud",
2725
+ "corpusVersion": "1.0.0"
2726
+ }
2727
+ ]
2728
+ },
2729
+ "praxis-dynamic-form-dialog-host": {
2730
+ "id": "praxis-dynamic-form-dialog-host",
2731
+ "description": "Dialog host that renders PraxisDynamicForm for CRUD actions.",
2732
+ "category": "form",
2733
+ "inputs": [
2734
+ {
2735
+ "name": "data",
2736
+ "type": "CrudDialogData",
2737
+ "required": false
2738
+ },
2739
+ {
2740
+ "name": "data.metadata",
2741
+ "type": "CrudMetadata",
2742
+ "required": false
2743
+ },
2744
+ {
2745
+ "name": "data.action",
2746
+ "type": "CrudAction",
2747
+ "required": false
2748
+ },
2749
+ {
2750
+ "name": "data.inputs",
2751
+ "type": "Record<string, unknown>",
2752
+ "required": false
2753
+ },
2754
+ {
2755
+ "name": "data.metadata.resource.path",
2756
+ "type": "string",
2757
+ "required": false
2758
+ },
2759
+ {
2760
+ "name": "data.metadata.resource.endpointKey",
2761
+ "type": "ApiEndpoint",
2762
+ "required": false
2763
+ },
2764
+ {
2765
+ "name": "data.metadata.resource.idField",
2766
+ "type": "string | number",
2767
+ "required": false
2768
+ },
2769
+ {
2770
+ "name": "data.metadata.defaults.modal",
2771
+ "type": "DialogConfig",
2772
+ "required": false
2773
+ },
2774
+ {
2775
+ "name": "data.metadata.defaults.back",
2776
+ "type": "BackConfig",
2777
+ "required": false
2778
+ },
2779
+ {
2780
+ "name": "data.action.formId",
2781
+ "type": "string",
2782
+ "required": false
2783
+ },
2784
+ {
2785
+ "name": "data.action.action",
2786
+ "type": "string",
2787
+ "required": false
2788
+ }
2789
+ ],
2790
+ "outputs": [],
2791
+ "configSchemaId": null,
2792
+ "selector": "praxis-dynamic-form-dialog-host",
2793
+ "friendlyName": "Praxis Dynamic Form Dialog Host",
2794
+ "icon": "dynamic_form",
2795
+ "tags": [
2796
+ "dialog",
2797
+ "crud",
2798
+ "form",
2799
+ "host"
2800
+ ],
2801
+ "lib": "@praxisui/crud",
2802
+ "source": "projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
2803
+ "exportName": "PRAXIS_DYNAMIC_FORM_DIALOG_HOST_COMPONENT_METADATA",
2804
+ "componentCapabilities": [
2805
+ {
2806
+ "path": "inputs.resourcePath",
2807
+ "category": "inputs",
2808
+ "valueKind": "string",
2809
+ "description": "Caminho do recurso para carregar/salvar dados via CRUD.",
2810
+ "intentExamples": [
2811
+ "definir recurso como /api/employees"
2812
+ ]
2813
+ },
2814
+ {
2815
+ "path": "inputs.resourceId",
2816
+ "category": "inputs",
2817
+ "valueKind": "string",
2818
+ "description": "ID do registro atual (string ou number)."
2819
+ },
2820
+ {
2821
+ "path": "inputs.initialValue",
2822
+ "category": "inputs",
2823
+ "valueKind": "object",
2824
+ "description": "Valores iniciais locais para campos host-authored ou complementares."
2825
+ },
2826
+ {
2827
+ "path": "inputs.mode",
2828
+ "category": "inputs",
2829
+ "valueKind": "enum",
2830
+ "allowedValues": [
2831
+ "create",
2832
+ "edit",
2833
+ "view"
2834
+ ],
2835
+ "description": "Modo do formulario (create/edit/view).",
2836
+ "intentExamples": [
2837
+ "abrir em modo view",
2838
+ "editar registro"
2839
+ ]
2840
+ },
2841
+ {
2842
+ "path": "inputs.config",
2843
+ "category": "inputs",
2844
+ "valueKind": "object",
2845
+ "description": "Configuracao completa do formulario (FormConfig).",
2846
+ "critical": true
2847
+ },
2848
+ {
2849
+ "path": "inputs.schemaSource",
2850
+ "category": "inputs",
2851
+ "valueKind": "enum",
2852
+ "allowedValues": [
2853
+ "resource",
2854
+ "filter"
2855
+ ],
2856
+ "description": "Fonte de schema para construcao automatica (resource/filter)."
2857
+ },
2858
+ {
2859
+ "path": "inputs.schemaUrl",
2860
+ "category": "inputs",
2861
+ "valueKind": "string",
2862
+ "description": "Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities."
2863
+ },
2864
+ {
2865
+ "path": "inputs.readUrl",
2866
+ "category": "inputs",
2867
+ "valueKind": "string",
2868
+ "description": "Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida."
2869
+ },
2870
+ {
2871
+ "path": "inputs.apiEndpointKey",
2872
+ "category": "inputs",
2873
+ "valueKind": "string",
2874
+ "description": "Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados."
2875
+ },
2876
+ {
2877
+ "path": "inputs.submitUrl",
2878
+ "category": "inputs",
2879
+ "valueKind": "string",
2880
+ "description": "Endpoint canonico de submit publicado por surface/action."
2881
+ },
2882
+ {
2883
+ "path": "inputs.submitMethod",
2884
+ "category": "inputs",
2885
+ "valueKind": "enum",
2886
+ "allowedValues": [
2887
+ "post",
2888
+ "put",
2889
+ "patch"
2890
+ ],
2891
+ "description": "Metodo HTTP canonico para o submit quando o backend publica operacao explicita."
2892
+ },
2893
+ {
2894
+ "path": "inputs.responseSchemaUrl",
2895
+ "category": "inputs",
2896
+ "valueKind": "string",
2897
+ "description": "Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host."
2898
+ },
2899
+ {
2900
+ "path": "inputs.enableCustomization",
2901
+ "category": "inputs",
2902
+ "valueKind": "boolean",
2903
+ "description": "Habilita a edicao de layout/configuracao no editor."
2904
+ },
2905
+ {
2906
+ "path": "inputs.showAiAssistant",
2907
+ "category": "inputs",
2908
+ "valueKind": "boolean",
2909
+ "description": "Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario."
2910
+ },
2911
+ {
2912
+ "path": "inputs.formId",
2913
+ "category": "inputs",
2914
+ "valueKind": "string",
2915
+ "description": "ID persistente para salvar configuracoes e preferencias."
2916
+ },
2917
+ {
2918
+ "path": "inputs.editorialContext",
2919
+ "category": "inputs",
2920
+ "valueKind": "object",
2921
+ "description": "Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.",
2922
+ "safetyNotes": "Trate como objeto imutavel; trocar a referencia ao atualizar valores."
2923
+ },
2924
+ {
2925
+ "path": "inputs.layout",
2926
+ "category": "inputs",
2927
+ "valueKind": "object",
2928
+ "description": "Layout legado (FormLayout). Preferir inputs.config + sections.",
2929
+ "safetyNotes": "Use apenas para formularios antigos baseados em fieldsets."
2930
+ },
2931
+ {
2932
+ "path": "inputs.generatedLayoutPreset",
2933
+ "category": "inputs",
2934
+ "valueKind": "enum",
2935
+ "allowedValues": [
2936
+ "default",
2937
+ "compactPresentation"
2938
+ ],
2939
+ "description": "Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.",
2940
+ "safetyNotes": "Nao reprocessa layouts ja persistidos ou authorados."
2941
+ },
2942
+ {
2943
+ "path": "inputs.backConfig",
2944
+ "category": "inputs",
2945
+ "valueKind": "object",
2946
+ "description": "Configuracao de navegacao/retorno (BackConfig)."
2947
+ },
2948
+ {
2949
+ "path": "inputs.backConfig.strategy",
2950
+ "category": "inputs",
2951
+ "valueKind": "enum",
2952
+ "allowedValues": [
2953
+ "auto",
2954
+ "close",
2955
+ "navigate"
2956
+ ],
2957
+ "description": "Estrategia de retorno (auto/close/navigate)."
2958
+ },
2959
+ {
2960
+ "path": "inputs.backConfig.returnTo",
2961
+ "category": "inputs",
2962
+ "valueKind": "string",
2963
+ "description": "Rota para retornar quando strategy=navigate."
2964
+ },
2965
+ {
2966
+ "path": "inputs.backConfig.confirmOnDirty",
2967
+ "category": "inputs",
2968
+ "valueKind": "boolean",
2969
+ "description": "Solicita confirmacao ao sair com mudancas nao salvas."
2970
+ },
2971
+ {
2972
+ "path": "inputs.hooks",
2973
+ "category": "inputs",
2974
+ "valueKind": "object",
2975
+ "description": "Declaracoes de hooks fornecidas diretamente ao componente."
2976
+ },
2977
+ {
2978
+ "path": "inputs.hooks.beforeInit[]",
2979
+ "category": "hooks",
2980
+ "valueKind": "array",
2981
+ "description": "Hooks executados antes da inicializacao."
2982
+ },
2983
+ {
2984
+ "path": "inputs.hooks.afterInit[]",
2985
+ "category": "hooks",
2986
+ "valueKind": "array",
2987
+ "description": "Hooks executados apos a inicializacao."
2988
+ },
2989
+ {
2990
+ "path": "inputs.hooks.beforeValidate[]",
2991
+ "category": "hooks",
2992
+ "valueKind": "array",
2993
+ "description": "Hooks executados antes da validacao."
2994
+ },
2995
+ {
2996
+ "path": "inputs.hooks.afterValidate[]",
2997
+ "category": "hooks",
2998
+ "valueKind": "array",
2999
+ "description": "Hooks executados apos a validacao."
3000
+ },
3001
+ {
3002
+ "path": "inputs.hooks.beforeSubmit[]",
3003
+ "category": "hooks",
3004
+ "valueKind": "array",
3005
+ "description": "Hooks executados antes do submit."
3006
+ },
3007
+ {
3008
+ "path": "inputs.hooks.afterSubmit[]",
3009
+ "category": "hooks",
3010
+ "valueKind": "array",
3011
+ "description": "Hooks executados apos o submit."
3012
+ },
3013
+ {
3014
+ "path": "inputs.hooks.onError[]",
3015
+ "category": "hooks",
3016
+ "valueKind": "array",
3017
+ "description": "Hooks executados em erros de submit/validacao."
3018
+ },
3019
+ {
3020
+ "path": "inputs.removeEmptyContainersOnSave",
3021
+ "category": "inputs",
3022
+ "valueKind": "boolean",
3023
+ "description": "Remove containers vazios ao salvar configuracao."
3024
+ },
3025
+ {
3026
+ "path": "inputs.reactiveValidation",
3027
+ "category": "inputs",
3028
+ "valueKind": "boolean",
3029
+ "description": "Ativa validacao reativa (afterValidate em valueChanges)."
3030
+ },
3031
+ {
3032
+ "path": "inputs.reactiveValidationDebounceMs",
3033
+ "category": "inputs",
3034
+ "valueKind": "number",
3035
+ "description": "Debounce em ms para validacao reativa."
3036
+ },
3037
+ {
3038
+ "path": "inputs.notifyIfOutdated",
3039
+ "category": "inputs",
3040
+ "valueKind": "enum",
3041
+ "allowedValues": [
3042
+ "inline",
3043
+ "snackbar",
3044
+ "both",
3045
+ "none"
3046
+ ],
3047
+ "description": "Canal de notificacao para schema desatualizado."
3048
+ },
3049
+ {
3050
+ "path": "inputs.snoozeMs",
3051
+ "category": "inputs",
3052
+ "valueKind": "number",
3053
+ "description": "Duracao do snooze para alertas de schema."
3054
+ },
3055
+ {
3056
+ "path": "inputs.autoOpenSettingsOnOutdated",
3057
+ "category": "inputs",
3058
+ "valueKind": "boolean",
3059
+ "description": "Abre automaticamente o editor ao detectar schema desatualizado."
3060
+ },
3061
+ {
3062
+ "path": "inputs.readonlyModeGlobal",
3063
+ "category": "inputs",
3064
+ "valueKind": "boolean",
3065
+ "description": "Forca modo somente leitura global."
3066
+ },
3067
+ {
3068
+ "path": "inputs.disabledModeGlobal",
3069
+ "category": "inputs",
3070
+ "valueKind": "boolean",
3071
+ "description": "Forca modo desabilitado global."
3072
+ },
3073
+ {
3074
+ "path": "inputs.presentationModeGlobal",
3075
+ "category": "inputs",
3076
+ "valueKind": "boolean",
3077
+ "description": "Ativa modo de apresentacao global (somente view)."
3078
+ },
3079
+ {
3080
+ "path": "inputs.visibleGlobal",
3081
+ "category": "inputs",
3082
+ "valueKind": "boolean",
3083
+ "description": "Forca visibilidade global dos campos."
3084
+ },
3085
+ {
3086
+ "path": "inputs.customEndpoints",
3087
+ "category": "inputs",
3088
+ "valueKind": "object",
3089
+ "description": "Override de endpoints CRUD (EndpointConfig)."
3090
+ },
3091
+ {
3092
+ "path": "inputs.customEndpoints.getAll",
3093
+ "category": "inputs",
3094
+ "valueKind": "string",
3095
+ "description": "Endpoint customizado para listar registros."
3096
+ },
3097
+ {
3098
+ "path": "inputs.customEndpoints.getById",
3099
+ "category": "inputs",
3100
+ "valueKind": "string",
3101
+ "description": "Endpoint customizado para obter registro por ID."
3102
+ },
3103
+ {
3104
+ "path": "inputs.customEndpoints.create",
3105
+ "category": "inputs",
3106
+ "valueKind": "string",
3107
+ "description": "Endpoint customizado para criar registro."
3108
+ },
3109
+ {
3110
+ "path": "inputs.customEndpoints.update",
3111
+ "category": "inputs",
3112
+ "valueKind": "string",
3113
+ "description": "Endpoint customizado para atualizar registro."
3114
+ },
3115
+ {
3116
+ "path": "inputs.customEndpoints.delete",
3117
+ "category": "inputs",
3118
+ "valueKind": "string",
3119
+ "description": "Endpoint customizado para deletar registro."
3120
+ },
3121
+ {
3122
+ "path": "inputs.customEndpoints.filter",
3123
+ "category": "inputs",
3124
+ "valueKind": "string",
3125
+ "description": "Endpoint customizado para filtro."
3126
+ },
3127
+ {
3128
+ "path": "inputs.customEndpoints.schema",
3129
+ "category": "inputs",
3130
+ "valueKind": "string",
3131
+ "description": "Endpoint customizado para schemas."
3132
+ },
3133
+ {
3134
+ "path": "inputs.config.presentation",
3135
+ "category": "appearance",
3136
+ "valueKind": "object",
3137
+ "description": "Preferencias visuais persistidas no config."
3138
+ },
3139
+ {
3140
+ "path": "inputs.config.presentation.labelFontSize",
3141
+ "category": "appearance",
3142
+ "valueKind": "number",
3143
+ "description": "Tamanho da fonte do label (px)."
3144
+ },
3145
+ {
3146
+ "path": "inputs.config.presentation.valueFontSize",
3147
+ "category": "appearance",
3148
+ "valueKind": "number",
3149
+ "description": "Tamanho da fonte do valor (px)."
3150
+ },
3151
+ {
3152
+ "path": "inputs.config.presentation.labelPosition",
3153
+ "category": "appearance",
3154
+ "valueKind": "enum",
3155
+ "allowedValues": [
3156
+ "above",
3157
+ "left"
3158
+ ],
3159
+ "description": "Posicionamento do label (above/left)."
3160
+ },
3161
+ {
3162
+ "path": "inputs.config.presentation.compact",
3163
+ "category": "appearance",
3164
+ "valueKind": "boolean",
3165
+ "description": "Modo compacto de apresentacao."
3166
+ },
3167
+ {
3168
+ "path": "inputs.config.presentation.density",
3169
+ "category": "appearance",
3170
+ "valueKind": "enum",
3171
+ "allowedValues": [
3172
+ "comfortable",
3173
+ "cozy",
3174
+ "compact"
3175
+ ],
3176
+ "description": "Densidade visual global."
3177
+ },
3178
+ {
3179
+ "path": "inputs.config.presentation.labelWidth",
3180
+ "category": "appearance",
3181
+ "valueKind": "number",
3182
+ "description": "Largura do label (px)."
3183
+ },
3184
+ {
3185
+ "path": "inputs.config.presentation.labelAlign",
3186
+ "category": "appearance",
3187
+ "valueKind": "enum",
3188
+ "allowedValues": [
3189
+ "start",
3190
+ "center",
3191
+ "end"
3192
+ ],
3193
+ "description": "Alinhamento do label."
3194
+ },
3195
+ {
3196
+ "path": "inputs.config.presentation.valueAlign",
3197
+ "category": "appearance",
3198
+ "valueKind": "enum",
3199
+ "allowedValues": [
3200
+ "start",
3201
+ "center",
3202
+ "end"
3203
+ ],
3204
+ "description": "Alinhamento do valor."
3205
+ },
3206
+ {
3207
+ "path": "outputs.formSubmit",
3208
+ "category": "outputs",
3209
+ "valueKind": "object",
3210
+ "description": "Evento emitido no submit do formulario."
3211
+ },
3212
+ {
3213
+ "path": "outputs.formCancel",
3214
+ "category": "outputs",
3215
+ "valueKind": "object",
3216
+ "description": "Evento emitido ao cancelar."
3217
+ },
3218
+ {
3219
+ "path": "outputs.formReset",
3220
+ "category": "outputs",
3221
+ "valueKind": "object",
3222
+ "description": "Evento emitido ao resetar o formulario."
3223
+ },
3224
+ {
3225
+ "path": "outputs.configChange",
3226
+ "category": "outputs",
3227
+ "valueKind": "object",
3228
+ "description": "Evento emitido quando a configuracao muda."
3229
+ },
3230
+ {
3231
+ "path": "outputs.formReady",
3232
+ "category": "outputs",
3233
+ "valueKind": "object",
3234
+ "description": "Evento emitido quando o formulario esta pronto."
3235
+ },
3236
+ {
3237
+ "path": "outputs.valueChange",
3238
+ "category": "outputs",
3239
+ "valueKind": "object",
3240
+ "description": "Evento emitido quando o valor do formulario muda."
3241
+ },
3242
+ {
3243
+ "path": "outputs.syncCompleted",
3244
+ "category": "outputs",
3245
+ "valueKind": "object",
3246
+ "description": "Evento emitido ao completar sincronizacao com schema."
3247
+ },
3248
+ {
3249
+ "path": "outputs.initializationError",
3250
+ "category": "outputs",
3251
+ "valueKind": "object",
3252
+ "description": "Evento emitido quando ocorre erro na inicializacao."
3253
+ },
3254
+ {
3255
+ "path": "outputs.enableCustomizationChange",
3256
+ "category": "outputs",
3257
+ "valueKind": "object",
3258
+ "description": "Evento emitido quando o modo de customizacao muda."
3259
+ },
3260
+ {
3261
+ "path": "outputs.customAction",
3262
+ "category": "outputs",
3263
+ "valueKind": "object",
3264
+ "description": "Evento emitido ao disparar acao customizada."
3265
+ },
3266
+ {
3267
+ "path": "outputs.actionConfirmation",
3268
+ "category": "outputs",
3269
+ "valueKind": "object",
3270
+ "description": "Evento emitido quando acao requer confirmacao."
3271
+ },
3272
+ {
3273
+ "path": "outputs.schemaStatusChange",
3274
+ "category": "outputs",
3275
+ "valueKind": "object",
3276
+ "description": "Evento emitido quando o status do schema muda."
3277
+ }
3278
+ ],
3279
+ "componentCapabilityNotes": [
3280
+ "Este catalogo descreve inputs e outputs do componente.",
3281
+ "O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).",
3282
+ "inputs.config.presentation e uma extensao de runtime aplicada pelo componente.",
3283
+ "Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).",
3284
+ "Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.",
3285
+ "rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after."
3286
+ ],
3287
+ "componentContext": {
3288
+ "version": "v1",
3289
+ "optionsByPath": {},
3290
+ "actionCatalog": [
3291
+ {
3292
+ "id": "inputs.formId.set",
3293
+ "intentExamples": [
3294
+ "form id",
3295
+ "formulario",
3296
+ "identificador"
3297
+ ],
3298
+ "patchTemplate": {
3299
+ "inputs": {
3300
+ "formId": "{{value}}"
3301
+ }
3302
+ }
3303
+ },
3304
+ {
3305
+ "id": "inputs.resourcePath.set",
3306
+ "intentExamples": [
3307
+ "resource path",
3308
+ "endpoint",
3309
+ "api"
3310
+ ],
3311
+ "patchTemplate": {
3312
+ "inputs": {
3313
+ "resourcePath": "{{value}}"
3314
+ }
3315
+ }
3316
+ },
3317
+ {
3318
+ "id": "inputs.mode.set",
3319
+ "intentExamples": [
3320
+ "modo",
3321
+ "mode",
3322
+ "create",
3323
+ "edit",
3324
+ "view"
3325
+ ],
3326
+ "patchTemplate": {
3327
+ "inputs": {
3328
+ "mode": "{{value}}"
3329
+ }
3330
+ }
3331
+ },
3332
+ {
3333
+ "id": "inputs.schemaSource.set",
3334
+ "intentExamples": [
3335
+ "schema source",
3336
+ "schema",
3337
+ "resource",
3338
+ "filter"
3339
+ ],
3340
+ "patchTemplate": {
3341
+ "inputs": {
3342
+ "schemaSource": "{{value}}"
3343
+ }
3344
+ }
3345
+ },
3346
+ {
3347
+ "id": "inputs.enableCustomization.enable",
3348
+ "intentExamples": [
3349
+ "enable edit",
3350
+ "modo edicao",
3351
+ "edit layout"
3352
+ ],
3353
+ "patchTemplate": {
3354
+ "inputs": {
3355
+ "enableCustomization": true
3356
+ }
3357
+ }
3358
+ },
3359
+ {
3360
+ "id": "inputs.enableCustomization.disable",
3361
+ "intentExamples": [
3362
+ "disable edit",
3363
+ "somente leitura",
3364
+ "no edit"
3365
+ ],
3366
+ "patchTemplate": {
3367
+ "inputs": {
3368
+ "enableCustomization": false
3369
+ }
3370
+ }
3371
+ }
3372
+ ],
3373
+ "fieldResolvers": {},
3374
+ "hints": [
3375
+ "Dialog host: patches operate over inputs.*.",
3376
+ "Use mode=create|edit|view and schemaSource=resource|filter."
3377
+ ]
3378
+ },
3379
+ "chunks": [
3380
+ {
3381
+ "chunkIndex": 0,
3382
+ "chunkKind": "summary",
3383
+ "content": "Component ID: praxis-dynamic-form-dialog-host\nSelector: praxis-dynamic-form-dialog-host\nFriendly Name: Praxis Dynamic Form Dialog Host\nDescription: Dialog host that renders PraxisDynamicForm for CRUD actions.\nCategory: form\nLib/Package: @praxisui/crud\nTags: dialog, crud, form, host\nInputs:\n - data (CrudDialogData)\n - data.metadata (CrudMetadata)\n - data.action (CrudAction)\n - data.inputs (Record<string, unknown>)\n - data.metadata.resource.path (string)\n - data.metadata.resource.endpointKey (ApiEndpoint)\n - data.metadata.resource.idField (string | number)\n - data.metadata.defaults.modal (DialogConfig)\n - data.metadata.defaults.back (BackConfig)\n - data.action.formId (string)\n - data.action.action (string)\n",
3384
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
3385
+ "contentHash": "74980e00f361d7d3568a90abd53ce716ff901295e02959db3af20a3a8d9a6bf6",
3386
+ "sourceKind": "component_definition",
3387
+ "sourceId": "praxis-dynamic-form-dialog-host",
3388
+ "corpusVersion": "1.0.0"
3389
+ },
3390
+ {
3391
+ "chunkIndex": 1,
3392
+ "chunkKind": "capabilities",
3393
+ "content": "Component Capabilities:\n - Path: inputs.resourcePath\n Category: inputs\n Kind: string\n Description: Caminho do recurso para carregar/salvar dados via CRUD.\n - Path: inputs.resourceId\n Category: inputs\n Kind: string\n Description: ID do registro atual (string ou number).\n - Path: inputs.initialValue\n Category: inputs\n Kind: object\n Description: Valores iniciais locais para campos host-authored ou complementares.\n - Path: inputs.mode\n Category: inputs\n Kind: enum\n Description: Modo do formulario (create/edit/view).\n - Path: inputs.config\n Category: inputs\n Kind: object\n Description: Configuracao completa do formulario (FormConfig).\n - Path: inputs.schemaSource\n Category: inputs\n Kind: enum\n Description: Fonte de schema para construcao automatica (resource/filter).\n - Path: inputs.schemaUrl\n Category: inputs\n Kind: string\n Description: Schema canonico explicito publicado pelo backend para hosts que seguem surfaces/actions/capabilities.\n - Path: inputs.readUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de leitura publicado por surface VIEW/READ_PROJECTION para hidratar a entidade exibida.\n - Path: inputs.apiEndpointKey\n Category: inputs\n Kind: string\n Description: Endpoint canonico usado para resolver schemaUrl, readUrl e submitUrl relativos em hosts destacados.\n - Path: inputs.submitUrl\n Category: inputs\n Kind: string\n Description: Endpoint canonico de submit publicado por surface/action.\n - Path: inputs.submitMethod\n Category: inputs\n Kind: enum\n Description: Metodo HTTP canonico para o submit quando o backend publica operacao explicita.\n - Path: inputs.responseSchemaUrl\n Category: inputs\n Kind: string\n Description: Schema de resposta publicado pelo backend para inspeção diagnostica/read-only do host.\n - Path: inputs.enableCustomization\n Category: inputs\n Kind: boolean\n Description: Habilita a edicao de layout/configuracao no editor.\n - Path: inputs.showAiAssistant\n Category: inputs\n Kind: boolean\n Description: Mostra os gatilhos do copiloto semantico Praxis para a instancia do formulario.\n - Path: inputs.formId\n Category: inputs\n Kind: string\n Description: ID persistente para salvar configuracoes e preferencias.\n - Path: inputs.editorialContext\n Category: inputs\n Kind: object\n Description: Override de contexto editorial fornecido pelo host para os blocos hospedados antes/depois do formulario.\n - Path: inputs.layout\n Category: inputs\n Kind: object\n Description: Layout legado (FormLayout). Preferir inputs.config + sections.\n - Path: inputs.generatedLayoutPreset\n Category: inputs\n Kind: enum\n Description: Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.\n - Path: inputs.backConfig\n Category: inputs\n Kind: object\n Description: Configuracao de navegacao/retorno (BackConfig).\n - Path: inputs.backConfig.strategy\n Category: inputs\n Kind: enum\n Description: Estrategia de retorno (auto/close/navigate).\n - Path: inputs.backConfig.returnTo\n Category: inputs\n Kind: string\n Description: Rota para retornar quando strategy=navigate.\n - Path: inputs.backConfig.confirmOnDirty\n Category: inputs\n Kind: boolean\n Description: Solicita confirmacao ao sair com mudancas nao salvas.\n - Path: inputs.hooks\n Category: inputs\n Kind: object\n Description: Declaracoes de hooks fornecidas diretamente ao componente.\n - Path: inputs.hooks.beforeInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da inicializacao.\n - Path: inputs.hooks.afterInit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a inicializacao.\n - Path: inputs.hooks.beforeValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes da validacao.\n - Path: inputs.hooks.afterValidate[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos a validacao.\n - Path: inputs.hooks.beforeSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados antes do submit.\n - Path: inputs.hooks.afterSubmit[]\n Category: hooks\n Kind: array\n Description: Hooks executados apos o submit.\n - Path: inputs.hooks.onError[]\n Category: hooks\n Kind: array\n Description: Hooks executados em erros de submit/validacao.\n - Path: inputs.removeEmptyContainersOnSave\n Category: inputs\n Kind: boolean\n Description: Remove containers vazios ao salvar configuracao.\n - Path: inputs.reactiveValidation\n Category: inputs\n Kind: boolean\n Description: Ativa validacao reativa (afterValidate em valueChanges).\n - Path: inputs.reactiveValidationDebounceMs\n Category: inputs\n Kind: number\n Description: Debounce em ms para validacao reativa.\n - Path: inputs.notifyIfOutdated\n Category: inputs\n Kind: enum\n Description: Canal de notificacao para schema desatualizado.\n - Path: inputs.snoozeMs\n Category: inputs\n Kind: number\n Description: Duracao do snooze para alertas de schema.\n - Path: inputs.autoOpenSettingsOnOutdated\n Category: inputs\n Kind: boolean\n Description: Abre automaticamente o editor ao detectar schema desatualizado.\n - Path: inputs.readonlyModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo somente leitura global.\n - Path: inputs.disabledModeGlobal\n Category: inputs\n Kind: boolean\n Description: Forca modo desabilitado global.\n - Path: inputs.presentationModeGlobal\n Category: inputs\n Kind: boolean\n Description: Ativa modo de apresentacao global (somente view).\n - Path: inputs.visibleGlobal\n Category: inputs\n Kind: boolean\n Description: Forca visibilidade global dos campos.\n - Path: inputs.customEndpoints\n Category: inputs\n Kind: object\n Description: Override de endpoints CRUD (EndpointConfig).\n - Path: inputs.customEndpoints.getAll\n Category: inputs\n Kind: string\n Description: Endpoint customizado para listar registros.\n - Path: inputs.customEndpoints.getById\n Category: inputs\n Kind: string\n Description: Endpoint customizado para obter registro por ID.\n - Path: inputs.customEndpoints.create\n Category: inputs\n Kind: string\n Description: Endpoint customizado para criar registro.\n - Path: inputs.customEndpoints.update\n Category: inputs\n Kind: string\n Description: Endpoint customizado para atualizar registro.\n - Path: inputs.customEndpoints.delete\n Category: inputs\n Kind: string\n Description: Endpoint customizado para deletar registro.\n - Path: inputs.customEndpoints.filter\n Category: inputs\n Kind: string\n Description: Endpoint customizado para filtro.\n - Path: inputs.customEndpoints.schema\n Category: inputs\n Kind: string\n Description: Endpoint customizado para schemas.\n - Path: inputs.config.presentation\n Category: appearance\n Kind: object\n Description: Preferencias visuais persistidas no config.\n - Path: inputs.config.presentation.labelFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do label (px).\n - Path: inputs.config.presentation.valueFontSize\n Category: appearance\n Kind: number\n Description: Tamanho da fonte do valor (px).\n - Path: inputs.config.presentation.labelPosition\n Category: appearance\n Kind: enum\n Description: Posicionamento do label (above/left).\n - Path: inputs.config.presentation.compact\n Category: appearance\n Kind: boolean\n Description: Modo compacto de apresentacao.\n - Path: inputs.config.presentation.density\n Category: appearance\n Kind: enum\n Description: Densidade visual global.\n - Path: inputs.config.presentation.labelWidth\n Category: appearance\n Kind: number\n Description: Largura do label (px).\n - Path: inputs.config.presentation.labelAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do label.\n - Path: inputs.config.presentation.valueAlign\n Category: appearance\n Kind: enum\n Description: Alinhamento do valor.\n - Path: outputs.formSubmit\n Category: outputs\n Kind: object\n Description: Evento emitido no submit do formulario.\n - Path: outputs.formCancel\n Category: outputs\n Kind: object\n Description: Evento emitido ao cancelar.\n - Path: outputs.formReset\n Category: outputs\n Kind: object\n Description: Evento emitido ao resetar o formulario.\n - Path: outputs.configChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando a configuracao muda.\n - Path: outputs.formReady\n Category: outputs\n Kind: object\n Description: Evento emitido quando o formulario esta pronto.\n - Path: outputs.valueChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o valor do formulario muda.\n - Path: outputs.syncCompleted\n Category: outputs\n Kind: object\n Description: Evento emitido ao completar sincronizacao com schema.\n - Path: outputs.initializationError\n Category: outputs\n Kind: object\n Description: Evento emitido quando ocorre erro na inicializacao.\n - Path: outputs.enableCustomizationChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o modo de customizacao muda.\n - Path: outputs.customAction\n Category: outputs\n Kind: object\n Description: Evento emitido ao disparar acao customizada.\n - Path: outputs.actionConfirmation\n Category: outputs\n Kind: object\n Description: Evento emitido quando acao requer confirmacao.\n - Path: outputs.schemaStatusChange\n Category: outputs\n Kind: object\n Description: Evento emitido quando o status do schema muda.\nCapability Notes:\n - Este catalogo descreve inputs e outputs do componente.\n - O objeto inputs.config segue o schema de FormConfig (veja form-ai-capabilities).\n - inputs.config.presentation e uma extensao de runtime aplicada pelo componente.\n - Preferir FormConfig (sections/fieldMetadata) em vez do layout legado (fieldsets).\n - Use inputs.editorialContext apenas para override de contexto editorial do host; a precedencia final e runtime < config.editorialContext < host.\n - rich content editorial hospedado pelo form pode ser renderizado em tres slots semanticos: before, beforeActions e after.\n",
3394
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/dynamic-form-dialog-host.metadata.ts",
3395
+ "contentHash": "68ccc41943aff85281eb2624c5be954b43d872bd41fa172d5e1867e45929186b",
3396
+ "sourceKind": "component_definition",
3397
+ "sourceId": "praxis-dynamic-form-dialog-host",
3398
+ "corpusVersion": "1.0.0"
3399
+ },
3400
+ {
3401
+ "chunkIndex": 2,
3402
+ "chunkKind": "context_pack",
3403
+ "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {},\n \"actionCatalog\": [\n {\n \"id\": \"inputs.formId.set\",\n \"intentExamples\": [\n \"form id\",\n \"formulario\",\n \"identificador\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"formId\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.resourcePath.set\",\n \"intentExamples\": [\n \"resource path\",\n \"endpoint\",\n \"api\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"resourcePath\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.mode.set\",\n \"intentExamples\": [\n \"modo\",\n \"mode\",\n \"create\",\n \"edit\",\n \"view\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"mode\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.schemaSource.set\",\n \"intentExamples\": [\n \"schema source\",\n \"schema\",\n \"resource\",\n \"filter\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"schemaSource\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.enable\",\n \"intentExamples\": [\n \"enable edit\",\n \"modo edicao\",\n \"edit layout\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": true\n }\n }\n },\n {\n \"id\": \"inputs.enableCustomization.disable\",\n \"intentExamples\": [\n \"disable edit\",\n \"somente leitura\",\n \"no edit\"\n ],\n \"patchTemplate\": {\n \"inputs\": {\n \"enableCustomization\": false\n }\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"Dialog host: patches operate over inputs.*.\",\n \"Use mode=create|edit|view and schemaSource=resource|filter.\"\n ]\n }\n}",
3404
+ "sourcePointer": "praxis-ui-angular/projects/praxis-crud/src/lib/ai/dynamic-form-dialog-host-context-pack.ts",
3405
+ "contentHash": "da0512fe644f8d5826e082bd5818bbd029d0adb85822e4e6bb29c96d0e6e15bf",
3406
+ "sourceKind": "component_definition",
3407
+ "sourceId": "praxis-dynamic-form-dialog-host",
3408
+ "corpusVersion": "1.0.0"
3409
+ }
3410
+ ]
3411
+ }
3412
+ },
3413
+ "note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
3414
+ }