@praxisui/settings-panel 9.0.0-beta.11 → 9.0.0-beta.14

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,1145 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "generatedAt": "2026-06-24T01:01:47.814Z",
4
+ "packageName": "@praxisui/settings-panel",
5
+ "packageVersion": "9.0.0-beta.14",
6
+ "sourceRegistry": "praxis-component-registry-ingestion",
7
+ "sourceRegistryVersion": "1.0.0",
8
+ "componentCount": 1,
9
+ "components": {
10
+ "praxis-settings-panel": {
11
+ "id": "praxis-settings-panel",
12
+ "description": "Panel for editing component settings and layout properties.",
13
+ "inputs": [],
14
+ "outputs": [],
15
+ "configSchemaId": null,
16
+ "selector": "praxis-settings-panel",
17
+ "friendlyName": "Praxis Settings Panel",
18
+ "icon": "settings",
19
+ "tags": [
20
+ "widget",
21
+ "settings",
22
+ "configurable"
23
+ ],
24
+ "lib": "@praxisui/settings-panel",
25
+ "source": "projects/praxis-settings-panel/src/lib/praxis-settings-panel.metadata.ts",
26
+ "exportName": "PRAXIS_SETTINGS_PANEL_COMPONENT_METADATA",
27
+ "componentCapabilities": [
28
+ {
29
+ "path": "id",
30
+ "category": "identity",
31
+ "valueKind": "string",
32
+ "description": "ID do painel."
33
+ },
34
+ {
35
+ "path": "title",
36
+ "category": "identity",
37
+ "valueKind": "string",
38
+ "description": "Titulo do painel."
39
+ },
40
+ {
41
+ "path": "titleIcon",
42
+ "category": "identity",
43
+ "valueKind": "string",
44
+ "description": "Icone do titulo (Material icon name)."
45
+ },
46
+ {
47
+ "path": "expanded",
48
+ "category": "behavior",
49
+ "valueKind": "boolean",
50
+ "description": "Estado inicial expandido."
51
+ },
52
+ {
53
+ "path": "resizable",
54
+ "category": "behavior",
55
+ "valueKind": "boolean",
56
+ "description": "Habilita resize horizontal do painel autoral."
57
+ },
58
+ {
59
+ "path": "persistSizeKey",
60
+ "category": "behavior",
61
+ "valueKind": "string",
62
+ "description": "Chave estavel para persistencia de largura."
63
+ },
64
+ {
65
+ "path": "minWidth",
66
+ "category": "layout",
67
+ "valueKind": "string",
68
+ "description": "Largura minima do painel."
69
+ },
70
+ {
71
+ "path": "maxWidth",
72
+ "category": "layout",
73
+ "valueKind": "string",
74
+ "description": "Largura maxima do painel."
75
+ },
76
+ {
77
+ "path": "diagnostics",
78
+ "category": "behavior",
79
+ "valueKind": "object",
80
+ "description": "Configuracao opcional de visibilidade dos diagnosticos do shell."
81
+ },
82
+ {
83
+ "path": "diagnostics.showStatusMessage",
84
+ "category": "behavior",
85
+ "valueKind": "boolean",
86
+ "description": "Controla a faixa de status do painel."
87
+ },
88
+ {
89
+ "path": "diagnostics.showDisabledReason",
90
+ "category": "behavior",
91
+ "valueKind": "boolean",
92
+ "description": "Controla tooltips com motivo de acoes desabilitadas."
93
+ },
94
+ {
95
+ "path": "diagnostics.showBusyState",
96
+ "category": "behavior",
97
+ "valueKind": "boolean",
98
+ "description": "Controla indicadores visuais de busy no shell."
99
+ },
100
+ {
101
+ "path": "diagnostics.exposeValidationState",
102
+ "category": "behavior",
103
+ "valueKind": "boolean",
104
+ "description": "Controla a exposicao visual de invalidade do provider."
105
+ },
106
+ {
107
+ "path": "content",
108
+ "category": "content",
109
+ "valueKind": "object",
110
+ "description": "Conteudo do painel."
111
+ },
112
+ {
113
+ "path": "content.component",
114
+ "category": "content",
115
+ "valueKind": "object",
116
+ "description": "Referencia do componente Angular a ser renderizado.",
117
+ "critical": true,
118
+ "safetyNotes": "Nao gerar dinamicamente; o host deve fornecer a referencia."
119
+ },
120
+ {
121
+ "path": "content.inputs",
122
+ "category": "content",
123
+ "valueKind": "object",
124
+ "description": "Inputs passados para o componente de conteudo."
125
+ }
126
+ ],
127
+ "componentCapabilityNotes": [
128
+ "SettingsPanelConfig descreve o painel e o componente embutido (content.component).",
129
+ "content.component deve ser uma referencia de classe Angular fornecida pelo host."
130
+ ],
131
+ "componentContext": {
132
+ "version": "v1",
133
+ "optionsByPath": {},
134
+ "actionCatalog": [
135
+ {
136
+ "id": "title.set",
137
+ "intentExamples": [
138
+ "title",
139
+ "titulo",
140
+ "rename panel"
141
+ ],
142
+ "patchTemplate": {
143
+ "title": "{{value}}"
144
+ }
145
+ },
146
+ {
147
+ "id": "titleIcon.set",
148
+ "intentExamples": [
149
+ "icon",
150
+ "titulo icon",
151
+ "panel icon"
152
+ ],
153
+ "patchTemplate": {
154
+ "titleIcon": "{{value}}"
155
+ }
156
+ },
157
+ {
158
+ "id": "expanded.enable",
159
+ "intentExamples": [
160
+ "expand panel",
161
+ "open panel"
162
+ ],
163
+ "patchTemplate": {
164
+ "expanded": true
165
+ }
166
+ },
167
+ {
168
+ "id": "expanded.disable",
169
+ "intentExamples": [
170
+ "collapse panel",
171
+ "close panel"
172
+ ],
173
+ "patchTemplate": {
174
+ "expanded": false
175
+ }
176
+ }
177
+ ],
178
+ "fieldResolvers": {},
179
+ "hints": [
180
+ "content.component is provided by the host; avoid patching it dynamically.",
181
+ "Use expanded to control default open state."
182
+ ]
183
+ },
184
+ "authoringManifest": {
185
+ "schemaVersion": "1.0.0",
186
+ "componentId": "praxis-settings-panel",
187
+ "ownerPackage": "@praxisui/settings-panel",
188
+ "configSchemaId": "SettingsPanelConfig",
189
+ "manifestVersion": "1.0.0",
190
+ "runtimeInputs": [
191
+ {
192
+ "name": "config",
193
+ "type": "SettingsPanelConfig",
194
+ "description": "Canonical settings panel shell config passed to SettingsPanelService.open."
195
+ },
196
+ {
197
+ "name": "config.diagnostics",
198
+ "type": "SettingsPanelDiagnosticsConfig",
199
+ "description": "Optional shell diagnostics visibility config for status, disabled reason, busy state and validation state."
200
+ },
201
+ {
202
+ "name": "content.component",
203
+ "type": "Type<SettingsValueProvider>",
204
+ "description": "Standalone editor component hosted inside the authoring shell."
205
+ },
206
+ {
207
+ "name": "content.inputs",
208
+ "type": "Record<string, unknown>",
209
+ "description": "Initial editor inputs owned by the consumer component manifest."
210
+ },
211
+ {
212
+ "name": "ref",
213
+ "type": "SettingsPanelRef",
214
+ "description": "Panel ref that emits applied, saved, reset, closed and sizeChanged events."
215
+ },
216
+ {
217
+ "name": "provider",
218
+ "type": "SettingsValueProvider",
219
+ "description": "Editor protocol for dirty, valid, busy, getSettingsValue, onSave, reset and close hooks."
220
+ }
221
+ ],
222
+ "editableTargets": [
223
+ {
224
+ "kind": "panelShell",
225
+ "resolver": "settings-panel-config-root",
226
+ "description": "Top-level shell identity and title fields owned by SettingsPanelConfig."
227
+ },
228
+ {
229
+ "kind": "openMode",
230
+ "resolver": "settings-panel-open-mode",
231
+ "description": "Initial expanded state, replacement mediation and close behavior for an authoring panel."
232
+ },
233
+ {
234
+ "kind": "panelSize",
235
+ "resolver": "settings-panel-size-and-resize",
236
+ "description": "Width, min/max width, resize enablement and persisted size key."
237
+ },
238
+ {
239
+ "kind": "applyBehavior",
240
+ "resolver": "settings-value-provider-apply-contract",
241
+ "description": "Apply availability and payload emission through getSettingsValue()."
242
+ },
243
+ {
244
+ "kind": "saveBehavior",
245
+ "resolver": "settings-value-provider-save-contract",
246
+ "description": "Save availability, onSave fallback and close-after-save behavior."
247
+ },
248
+ {
249
+ "kind": "resetBehavior",
250
+ "resolver": "settings-value-provider-reset-contract",
251
+ "description": "Reset confirmation, provider reset hook and reset event emission."
252
+ },
253
+ {
254
+ "kind": "editorHost",
255
+ "resolver": "settings-panel-editor-host",
256
+ "description": "Hosted editor component and serializable input envelope."
257
+ },
258
+ {
259
+ "kind": "diagnostics",
260
+ "resolver": "settings-panel-state-diagnostics",
261
+ "description": "Dirty, valid, busy, disabled reason and status message visibility."
262
+ }
263
+ ],
264
+ "operations": [
265
+ {
266
+ "operationId": "panel.shell.configure",
267
+ "title": "Configure panel shell identity",
268
+ "scope": "global",
269
+ "targetKind": "panelShell",
270
+ "target": {
271
+ "kind": "panelShell",
272
+ "resolver": "settings-panel-config-root",
273
+ "ambiguityPolicy": "fail",
274
+ "required": true
275
+ },
276
+ "inputSchema": {
277
+ "type": "object",
278
+ "minProperties": 1,
279
+ "properties": {
280
+ "id": {
281
+ "type": "string"
282
+ },
283
+ "title": {
284
+ "type": "string"
285
+ },
286
+ "titleIcon": {
287
+ "type": "string"
288
+ }
289
+ }
290
+ },
291
+ "effects": [
292
+ {
293
+ "kind": "merge-object",
294
+ "path": "config"
295
+ }
296
+ ],
297
+ "validators": [
298
+ "panel-id-stable",
299
+ "title-i18n-compatible",
300
+ "settings-panel-round-trip"
301
+ ],
302
+ "affectedPaths": [
303
+ "config.id",
304
+ "config.title",
305
+ "config.titleIcon"
306
+ ],
307
+ "submissionImpact": "config-only",
308
+ "destructive": false,
309
+ "requiresConfirmation": false,
310
+ "preconditions": [
311
+ "config-initialized"
312
+ ]
313
+ },
314
+ {
315
+ "operationId": "panel.openMode.set",
316
+ "title": "Set panel open mode",
317
+ "scope": "global",
318
+ "targetKind": "openMode",
319
+ "target": {
320
+ "kind": "openMode",
321
+ "resolver": "settings-panel-open-mode",
322
+ "ambiguityPolicy": "fail",
323
+ "required": false
324
+ },
325
+ "inputSchema": {
326
+ "type": "object",
327
+ "minProperties": 1,
328
+ "properties": {
329
+ "expanded": {
330
+ "type": "boolean"
331
+ },
332
+ "replacementPolicy": {
333
+ "enum": [
334
+ "consult-current-editor",
335
+ "reject-when-dirty",
336
+ "force-close-disallowed"
337
+ ]
338
+ }
339
+ }
340
+ },
341
+ "effects": [
342
+ {
343
+ "kind": "merge-object",
344
+ "path": "config"
345
+ }
346
+ ],
347
+ "validators": [
348
+ "replacement-mediates-before-close",
349
+ "settings-panel-round-trip"
350
+ ],
351
+ "affectedPaths": [
352
+ "config.expanded"
353
+ ],
354
+ "submissionImpact": "config-only",
355
+ "destructive": false,
356
+ "requiresConfirmation": false,
357
+ "preconditions": [
358
+ "config-initialized"
359
+ ]
360
+ },
361
+ {
362
+ "operationId": "panel.size.set",
363
+ "title": "Set panel size and resize policy",
364
+ "scope": "layout",
365
+ "targetKind": "panelSize",
366
+ "target": {
367
+ "kind": "panelSize",
368
+ "resolver": "settings-panel-size-and-resize",
369
+ "ambiguityPolicy": "fail",
370
+ "required": false
371
+ },
372
+ "inputSchema": {
373
+ "type": "object",
374
+ "minProperties": 1,
375
+ "properties": {
376
+ "width": {
377
+ "oneOf": [
378
+ {
379
+ "type": "string"
380
+ },
381
+ {
382
+ "type": "number"
383
+ }
384
+ ]
385
+ },
386
+ "minWidth": {
387
+ "type": "string"
388
+ },
389
+ "maxWidth": {
390
+ "type": "string"
391
+ },
392
+ "resizable": {
393
+ "type": "boolean"
394
+ },
395
+ "persistSizeKey": {
396
+ "type": "string"
397
+ },
398
+ "expanded": {
399
+ "type": "boolean"
400
+ }
401
+ }
402
+ },
403
+ "effects": [
404
+ {
405
+ "kind": "compile-domain-patch",
406
+ "handler": "settings-panel-size-set",
407
+ "handlerContract": {
408
+ "reads": [
409
+ "SettingsPanelConfig",
410
+ "SettingsPanelRef.sizeChanged$",
411
+ "persistSizeKey"
412
+ ],
413
+ "writes": [
414
+ "config.minWidth",
415
+ "config.maxWidth",
416
+ "config.resizable",
417
+ "config.persistSizeKey",
418
+ "runtime.size"
419
+ ],
420
+ "identityKeys": [
421
+ "config.id",
422
+ "persistSizeKey"
423
+ ],
424
+ "failureModes": [
425
+ "invalid-css-size",
426
+ "min-width-greater-than-max-width",
427
+ "persist-size-key-missing-for-persistence"
428
+ ],
429
+ "description": "Applies shell size configuration and open-panel width changes through SettingsPanelRef.updateSize without changing hosted editor config semantics."
430
+ }
431
+ }
432
+ ],
433
+ "validators": [
434
+ "panel-size-safe",
435
+ "panel-min-max-consistent",
436
+ "resize-persistence-explicit",
437
+ "settings-panel-round-trip"
438
+ ],
439
+ "affectedPaths": [
440
+ "config.minWidth",
441
+ "config.maxWidth",
442
+ "config.resizable",
443
+ "config.persistSizeKey",
444
+ "runtime.width"
445
+ ],
446
+ "submissionImpact": "visual-only",
447
+ "destructive": false,
448
+ "requiresConfirmation": false,
449
+ "preconditions": [
450
+ "config-initialized"
451
+ ]
452
+ },
453
+ {
454
+ "operationId": "panel.applyBehavior.set",
455
+ "title": "Set apply behavior",
456
+ "scope": "interaction",
457
+ "targetKind": "applyBehavior",
458
+ "target": {
459
+ "kind": "applyBehavior",
460
+ "resolver": "settings-value-provider-apply-contract",
461
+ "ambiguityPolicy": "fail",
462
+ "required": false
463
+ },
464
+ "inputSchema": {
465
+ "type": "object",
466
+ "minProperties": 1,
467
+ "properties": {
468
+ "requireDirty": {
469
+ "type": "boolean"
470
+ },
471
+ "requireValid": {
472
+ "type": "boolean"
473
+ },
474
+ "blockWhileBusy": {
475
+ "type": "boolean"
476
+ },
477
+ "useProviderHook": {
478
+ "type": "boolean"
479
+ },
480
+ "closeAfterSave": {
481
+ "type": "boolean"
482
+ }
483
+ }
484
+ },
485
+ "effects": [
486
+ {
487
+ "kind": "compile-domain-patch",
488
+ "handler": "settings-panel-apply-behavior-set",
489
+ "handlerContract": {
490
+ "reads": [
491
+ "SettingsValueProvider.isDirty$",
492
+ "SettingsValueProvider.isValid$",
493
+ "SettingsValueProvider.isBusy$",
494
+ "SettingsValueProvider.getSettingsValue"
495
+ ],
496
+ "writes": [
497
+ "SettingsPanelRef.applied$"
498
+ ],
499
+ "identityKeys": [
500
+ "config.id",
501
+ "provider.getSettingsValue"
502
+ ],
503
+ "failureModes": [
504
+ "provider-missing-get-settings-value",
505
+ "apply-while-invalid",
506
+ "apply-while-busy",
507
+ "apply-without-dirty-state"
508
+ ],
509
+ "description": "Keeps Apply gated by dirty, valid and busy state and emits the provider value through SettingsPanelRef.applied$."
510
+ }
511
+ }
512
+ ],
513
+ "validators": [
514
+ "apply-requires-provider-value",
515
+ "dirty-valid-busy-gates-preserved",
516
+ "apply-does-not-close-panel",
517
+ "settings-panel-round-trip"
518
+ ],
519
+ "affectedPaths": [
520
+ "provider.isDirty$",
521
+ "provider.isValid$",
522
+ "provider.isBusy$",
523
+ "ref.applied$"
524
+ ],
525
+ "submissionImpact": "none",
526
+ "destructive": false,
527
+ "requiresConfirmation": false,
528
+ "preconditions": [
529
+ "settings-value-provider-attached"
530
+ ]
531
+ },
532
+ {
533
+ "operationId": "panel.saveBehavior.set",
534
+ "title": "Set save behavior",
535
+ "scope": "interaction",
536
+ "targetKind": "saveBehavior",
537
+ "target": {
538
+ "kind": "saveBehavior",
539
+ "resolver": "settings-value-provider-save-contract",
540
+ "ambiguityPolicy": "fail",
541
+ "required": false
542
+ },
543
+ "effects": [
544
+ {
545
+ "kind": "compile-domain-patch",
546
+ "handler": "settings-panel-save-behavior-set",
547
+ "handlerContract": {
548
+ "reads": [
549
+ "SettingsValueProvider.onSave",
550
+ "SettingsValueProvider.getSettingsValue",
551
+ "SettingsValueProvider.isDirty$",
552
+ "SettingsValueProvider.isValid$",
553
+ "SettingsValueProvider.isBusy$"
554
+ ],
555
+ "writes": [
556
+ "SettingsPanelRef.saved$",
557
+ "SettingsPanelRef.closed$"
558
+ ],
559
+ "identityKeys": [
560
+ "config.id",
561
+ "provider.onSave"
562
+ ],
563
+ "failureModes": [
564
+ "save-while-invalid",
565
+ "save-while-busy",
566
+ "save-result-undefined",
567
+ "provider-save-rejected"
568
+ ],
569
+ "description": "Keeps Save gated by dirty, valid and busy state, prefers onSave when present, falls back to getSettingsValue and closes with reason save."
570
+ }
571
+ }
572
+ ],
573
+ "validators": [
574
+ "save-prefers-provider-hook",
575
+ "save-fallback-value-preserved",
576
+ "save-closes-with-save-reason",
577
+ "dirty-valid-busy-gates-preserved"
578
+ ],
579
+ "affectedPaths": [
580
+ "provider.onSave",
581
+ "provider.getSettingsValue",
582
+ "ref.saved$",
583
+ "ref.closed$"
584
+ ],
585
+ "submissionImpact": "config-only",
586
+ "destructive": false,
587
+ "requiresConfirmation": false,
588
+ "preconditions": [
589
+ "settings-value-provider-attached"
590
+ ]
591
+ },
592
+ {
593
+ "operationId": "panel.resetBehavior.set",
594
+ "title": "Set reset behavior",
595
+ "scope": "interaction",
596
+ "targetKind": "resetBehavior",
597
+ "target": {
598
+ "kind": "resetBehavior",
599
+ "resolver": "settings-value-provider-reset-contract",
600
+ "ambiguityPolicy": "fail",
601
+ "required": false
602
+ },
603
+ "inputSchema": {
604
+ "type": "object",
605
+ "minProperties": 1,
606
+ "properties": {
607
+ "requireConfirmation": {
608
+ "type": "boolean"
609
+ },
610
+ "callProviderReset": {
611
+ "type": "boolean"
612
+ },
613
+ "emitResetEvent": {
614
+ "type": "boolean"
615
+ },
616
+ "clearSavedStatus": {
617
+ "type": "boolean"
618
+ }
619
+ }
620
+ },
621
+ "effects": [
622
+ {
623
+ "kind": "compile-domain-patch",
624
+ "handler": "settings-panel-reset-behavior-set",
625
+ "handlerContract": {
626
+ "reads": [
627
+ "SettingsValueProvider.reset",
628
+ "SettingsPanelRef.reset$",
629
+ "ConfirmDialogComponent"
630
+ ],
631
+ "writes": [
632
+ "provider.reset()",
633
+ "SettingsPanelRef.reset$",
634
+ "panel.lastSavedAt"
635
+ ],
636
+ "identityKeys": [
637
+ "config.id",
638
+ "provider.reset"
639
+ ],
640
+ "inputSchema": {
641
+ "type": "object",
642
+ "properties": {
643
+ "requireConfirmation": {
644
+ "type": "boolean"
645
+ },
646
+ "callProviderReset": {
647
+ "type": "boolean"
648
+ },
649
+ "emitResetEvent": {
650
+ "type": "boolean"
651
+ }
652
+ }
653
+ },
654
+ "failureModes": [
655
+ "reset-confirmation-missing",
656
+ "provider-reset-failed",
657
+ "reset-event-not-emitted"
658
+ ],
659
+ "description": "Preserves Reset as a confirmed shell action that calls the provider reset hook and emits SettingsPanelRef.reset$."
660
+ }
661
+ }
662
+ ],
663
+ "destructive": true,
664
+ "requiresConfirmation": true,
665
+ "validators": [
666
+ "reset-requires-confirmation",
667
+ "reset-calls-provider-reset",
668
+ "reset-event-emitted",
669
+ "settings-panel-round-trip"
670
+ ],
671
+ "affectedPaths": [
672
+ "provider.reset",
673
+ "ref.reset$",
674
+ "panel.lastSavedAt"
675
+ ],
676
+ "submissionImpact": "config-only",
677
+ "preconditions": [
678
+ "settings-value-provider-attached",
679
+ "confirmation-collected"
680
+ ]
681
+ },
682
+ {
683
+ "operationId": "editor.host.configure",
684
+ "title": "Configure hosted editor",
685
+ "scope": "templating",
686
+ "targetKind": "editorHost",
687
+ "target": {
688
+ "kind": "editorHost",
689
+ "resolver": "settings-panel-editor-host",
690
+ "ambiguityPolicy": "fail",
691
+ "required": true
692
+ },
693
+ "inputSchema": {
694
+ "type": "object",
695
+ "required": [
696
+ "componentId"
697
+ ],
698
+ "properties": {
699
+ "componentId": {
700
+ "type": "string"
701
+ },
702
+ "inputs": {
703
+ "type": "object"
704
+ },
705
+ "configManifestComponentId": {
706
+ "type": "string"
707
+ },
708
+ "editorContract": {
709
+ "enum": [
710
+ "SettingsValueProvider"
711
+ ]
712
+ }
713
+ }
714
+ },
715
+ "effects": [
716
+ {
717
+ "kind": "compile-domain-patch",
718
+ "handler": "settings-panel-editor-host-configure",
719
+ "handlerContract": {
720
+ "reads": [
721
+ "ComponentMetadataRegistry",
722
+ "SettingsPanelConfig.content",
723
+ "SettingsValueProvider",
724
+ "component.authoringManifest"
725
+ ],
726
+ "writes": [
727
+ "config.content.component",
728
+ "config.content.inputs",
729
+ "delegatedConsumerPatch"
730
+ ],
731
+ "identityKeys": [
732
+ "componentId",
733
+ "configManifestComponentId"
734
+ ],
735
+ "failureModes": [
736
+ "editor-component-not-registered",
737
+ "settings-value-provider-missing",
738
+ "consumer-manifest-required",
739
+ "consumer-config-boundary-violation"
740
+ ],
741
+ "description": "Configures the hosted editor component and input envelope while delegating consumer-specific config edits to the owning component manifest."
742
+ }
743
+ }
744
+ ],
745
+ "validators": [
746
+ "editor-component-registered",
747
+ "settings-value-provider-contract-present",
748
+ "consumer-config-delegated",
749
+ "editor-inputs-serializable"
750
+ ],
751
+ "affectedPaths": [
752
+ "config.content.component",
753
+ "config.content.inputs",
754
+ "delegatedConsumerPatch"
755
+ ],
756
+ "submissionImpact": "config-only",
757
+ "destructive": false,
758
+ "requiresConfirmation": false,
759
+ "preconditions": [
760
+ "component-metadata-resolved"
761
+ ]
762
+ },
763
+ {
764
+ "operationId": "diagnostics.visibility.set",
765
+ "title": "Set panel diagnostics visibility",
766
+ "scope": "interaction",
767
+ "targetKind": "diagnostics",
768
+ "target": {
769
+ "kind": "diagnostics",
770
+ "resolver": "settings-panel-state-diagnostics",
771
+ "ambiguityPolicy": "fail",
772
+ "required": false
773
+ },
774
+ "inputSchema": {
775
+ "type": "object",
776
+ "minProperties": 1,
777
+ "properties": {
778
+ "showStatusMessage": {
779
+ "type": "boolean"
780
+ },
781
+ "showDisabledReason": {
782
+ "type": "boolean"
783
+ },
784
+ "showBusyState": {
785
+ "type": "boolean"
786
+ },
787
+ "exposeValidationState": {
788
+ "type": "boolean"
789
+ }
790
+ }
791
+ },
792
+ "effects": [
793
+ {
794
+ "kind": "merge-object",
795
+ "path": "config.diagnostics"
796
+ }
797
+ ],
798
+ "validators": [
799
+ "diagnostics-follow-provider-state",
800
+ "diagnostics-i18n-compatible",
801
+ "busy-valid-dirty-visible-when-needed",
802
+ "settings-panel-round-trip"
803
+ ],
804
+ "affectedPaths": [
805
+ "config.diagnostics.showStatusMessage",
806
+ "config.diagnostics.showDisabledReason",
807
+ "config.diagnostics.showBusyState",
808
+ "config.diagnostics.exposeValidationState",
809
+ "panel.statusMessage",
810
+ "panel.disabledReason",
811
+ "panel.isDirty",
812
+ "panel.isValid",
813
+ "panel.isBusy"
814
+ ],
815
+ "submissionImpact": "visual-only",
816
+ "destructive": false,
817
+ "requiresConfirmation": false,
818
+ "preconditions": [
819
+ "settings-value-provider-attached"
820
+ ]
821
+ }
822
+ ],
823
+ "validators": [
824
+ {
825
+ "validatorId": "panel-id-stable",
826
+ "level": "error",
827
+ "code": "SETTINGS_PANEL_ID_STABLE",
828
+ "description": "Panel id must remain stable for replacement, persistence and diagnostics."
829
+ },
830
+ {
831
+ "validatorId": "replacement-mediates-before-close",
832
+ "level": "error",
833
+ "code": "SETTINGS_PANEL_REPLACEMENT_MEDIATES_CLOSE",
834
+ "description": "Opening a replacement panel must consult the current editor onBeforeClose before closing."
835
+ },
836
+ {
837
+ "validatorId": "title-i18n-compatible",
838
+ "level": "warning",
839
+ "code": "SETTINGS_PANEL_TITLE_I18N_COMPATIBLE",
840
+ "description": "Authoring chrome text must remain compatible with the settings panel i18n namespace."
841
+ },
842
+ {
843
+ "validatorId": "panel-size-safe",
844
+ "level": "error",
845
+ "code": "SETTINGS_PANEL_SIZE_SAFE",
846
+ "description": "Panel sizes must be finite numbers or safe CSS size strings."
847
+ },
848
+ {
849
+ "validatorId": "panel-min-max-consistent",
850
+ "level": "error",
851
+ "code": "SETTINGS_PANEL_MIN_MAX_CONSISTENT",
852
+ "description": "Minimum width must not exceed maximum width."
853
+ },
854
+ {
855
+ "validatorId": "resize-persistence-explicit",
856
+ "level": "error",
857
+ "code": "SETTINGS_PANEL_RESIZE_PERSISTENCE_EXPLICIT",
858
+ "description": "Persisted resize must use a stable persistSizeKey or be explicitly transient."
859
+ },
860
+ {
861
+ "validatorId": "apply-requires-provider-value",
862
+ "level": "error",
863
+ "code": "SETTINGS_PANEL_APPLY_REQUIRES_PROVIDER_VALUE",
864
+ "description": "Apply must obtain payloads from SettingsValueProvider.getSettingsValue()."
865
+ },
866
+ {
867
+ "validatorId": "apply-does-not-close-panel",
868
+ "level": "error",
869
+ "code": "SETTINGS_PANEL_APPLY_DOES_NOT_CLOSE",
870
+ "description": "Apply emits preview payloads without closing the panel."
871
+ },
872
+ {
873
+ "validatorId": "dirty-valid-busy-gates-preserved",
874
+ "level": "error",
875
+ "code": "SETTINGS_PANEL_STATE_GATES_PRESERVED",
876
+ "description": "Apply and Save remain gated by dirty, valid and busy state."
877
+ },
878
+ {
879
+ "validatorId": "save-prefers-provider-hook",
880
+ "level": "error",
881
+ "code": "SETTINGS_PANEL_SAVE_PREFERS_PROVIDER_HOOK",
882
+ "description": "Save must call onSave when provided before falling back to getSettingsValue()."
883
+ },
884
+ {
885
+ "validatorId": "save-fallback-value-preserved",
886
+ "level": "error",
887
+ "code": "SETTINGS_PANEL_SAVE_FALLBACK_PRESERVED",
888
+ "description": "Save fallback must preserve getSettingsValue payload semantics."
889
+ },
890
+ {
891
+ "validatorId": "save-closes-with-save-reason",
892
+ "level": "error",
893
+ "code": "SETTINGS_PANEL_SAVE_CLOSE_REASON",
894
+ "description": "Successful save must emit saved$ and close with reason save."
895
+ },
896
+ {
897
+ "validatorId": "reset-requires-confirmation",
898
+ "level": "error",
899
+ "code": "SETTINGS_PANEL_RESET_REQUIRES_CONFIRMATION",
900
+ "description": "Reset is destructive and must remain confirmed before provider reset is called."
901
+ },
902
+ {
903
+ "validatorId": "reset-calls-provider-reset",
904
+ "level": "error",
905
+ "code": "SETTINGS_PANEL_RESET_CALLS_PROVIDER",
906
+ "description": "Reset must call the hosted provider reset hook when present."
907
+ },
908
+ {
909
+ "validatorId": "reset-event-emitted",
910
+ "level": "error",
911
+ "code": "SETTINGS_PANEL_RESET_EVENT_EMITTED",
912
+ "description": "Reset must emit SettingsPanelRef.reset$ so hosts can coordinate state."
913
+ },
914
+ {
915
+ "validatorId": "editor-component-registered",
916
+ "level": "error",
917
+ "code": "SETTINGS_PANEL_EDITOR_REGISTERED",
918
+ "description": "Hosted editor component must resolve from governed component metadata or host registration."
919
+ },
920
+ {
921
+ "validatorId": "settings-value-provider-contract-present",
922
+ "level": "error",
923
+ "code": "SETTINGS_PANEL_PROVIDER_CONTRACT_PRESENT",
924
+ "description": "Hosted authoring editors must implement SettingsValueProvider state and value contract."
925
+ },
926
+ {
927
+ "validatorId": "consumer-config-delegated",
928
+ "level": "error",
929
+ "code": "SETTINGS_PANEL_CONSUMER_CONFIG_DELEGATED",
930
+ "description": "Consumer-specific config operations must delegate to the owning component manifest."
931
+ },
932
+ {
933
+ "validatorId": "editor-inputs-serializable",
934
+ "level": "error",
935
+ "code": "SETTINGS_PANEL_EDITOR_INPUTS_SERIALIZABLE",
936
+ "description": "Persisted editor host inputs must be serializable safe values."
937
+ },
938
+ {
939
+ "validatorId": "diagnostics-follow-provider-state",
940
+ "level": "error",
941
+ "code": "SETTINGS_PANEL_DIAGNOSTICS_PROVIDER_STATE",
942
+ "description": "Diagnostics must reflect provider dirty, valid and busy state."
943
+ },
944
+ {
945
+ "validatorId": "diagnostics-i18n-compatible",
946
+ "level": "warning",
947
+ "code": "SETTINGS_PANEL_DIAGNOSTICS_I18N_COMPATIBLE",
948
+ "description": "Diagnostics copy must use the settings panel i18n namespace."
949
+ },
950
+ {
951
+ "validatorId": "busy-valid-dirty-visible-when-needed",
952
+ "level": "error",
953
+ "code": "SETTINGS_PANEL_STATE_VISIBLE",
954
+ "description": "Busy, invalid and dirty states must remain visible or explain disabled actions."
955
+ },
956
+ {
957
+ "validatorId": "settings-panel-round-trip",
958
+ "level": "error",
959
+ "code": "SETTINGS_PANEL_ROUND_TRIP",
960
+ "description": "Open, edit, apply, save, reset and reopen must preserve the shell protocol without mutating consumer config semantics."
961
+ }
962
+ ],
963
+ "roundTripRequirements": [
964
+ "SettingsPanelConfig owns only shell fields: identity, title, size, resize persistence and hosted editor envelope.",
965
+ "SettingsValueProvider owns apply/save/reset payload extraction, while consumer config semantics stay delegated to the owning component manifest.",
966
+ "Apply must emit applied$ without closing; Save must emit saved$ and close with reason save; Reset must be confirmed and emit reset$.",
967
+ "Busy, dirty and valid state must gate Apply and Save consistently and remain visible through diagnostics.",
968
+ "Opening a replacement panel must pass through the current editor onBeforeClose and dirty-discard mediation."
969
+ ],
970
+ "examples": [
971
+ {
972
+ "id": "open-component-editor",
973
+ "request": "Open the table settings editor in the settings panel.",
974
+ "operationId": "editor.host.configure",
975
+ "params": {
976
+ "componentId": "praxis-table",
977
+ "inputs": {
978
+ "tableId": "orders"
979
+ },
980
+ "configManifestComponentId": "praxis-table",
981
+ "editorContract": "SettingsValueProvider"
982
+ },
983
+ "isPositive": true
984
+ },
985
+ {
986
+ "id": "start-expanded",
987
+ "request": "Open this settings panel expanded.",
988
+ "operationId": "panel.openMode.set",
989
+ "params": {
990
+ "expanded": true
991
+ },
992
+ "isPositive": true
993
+ },
994
+ {
995
+ "id": "set-resizable-width",
996
+ "request": "Make the settings drawer resizable between 420px and 960px.",
997
+ "operationId": "panel.size.set",
998
+ "params": {
999
+ "resizable": true,
1000
+ "minWidth": "420px",
1001
+ "maxWidth": "960px",
1002
+ "persistSizeKey": "settings-panel:orders"
1003
+ },
1004
+ "isPositive": true
1005
+ },
1006
+ {
1007
+ "id": "apply-preview",
1008
+ "request": "Apply the editor change without saving or closing.",
1009
+ "operationId": "panel.applyBehavior.set",
1010
+ "params": {
1011
+ "requireDirty": true,
1012
+ "requireValid": true,
1013
+ "blockWhileBusy": true
1014
+ },
1015
+ "isPositive": true
1016
+ },
1017
+ {
1018
+ "id": "save-and-close",
1019
+ "request": "Save this editor value and close the panel.",
1020
+ "operationId": "panel.saveBehavior.set",
1021
+ "params": {
1022
+ "requireDirty": true,
1023
+ "requireValid": true,
1024
+ "blockWhileBusy": true,
1025
+ "useProviderHook": true,
1026
+ "closeAfterSave": true
1027
+ },
1028
+ "isPositive": true
1029
+ },
1030
+ {
1031
+ "id": "reset-to-original",
1032
+ "request": "Reset this editor to its original value.",
1033
+ "operationId": "panel.resetBehavior.set",
1034
+ "params": {
1035
+ "requireConfirmation": true,
1036
+ "callProviderReset": true,
1037
+ "emitResetEvent": true
1038
+ },
1039
+ "isPositive": true
1040
+ },
1041
+ {
1042
+ "id": "show-busy-diagnostics",
1043
+ "request": "Show why Apply and Save are disabled while the editor is busy.",
1044
+ "operationId": "diagnostics.visibility.set",
1045
+ "params": {
1046
+ "showStatusMessage": true,
1047
+ "showDisabledReason": true,
1048
+ "showBusyState": true
1049
+ },
1050
+ "isPositive": true
1051
+ },
1052
+ {
1053
+ "id": "reject-table-column-direct-edit",
1054
+ "request": "Use settings-panel to rename a table column directly.",
1055
+ "operationId": "editor.host.configure",
1056
+ "params": {
1057
+ "componentId": "praxis-settings-panel",
1058
+ "inputs": {
1059
+ "columns": [
1060
+ {
1061
+ "field": "name",
1062
+ "label": "Name"
1063
+ }
1064
+ ]
1065
+ }
1066
+ },
1067
+ "isPositive": false
1068
+ },
1069
+ {
1070
+ "id": "reject-missing-provider",
1071
+ "request": "Host a component that has no dirty, valid, busy or getSettingsValue contract.",
1072
+ "operationId": "editor.host.configure",
1073
+ "params": {
1074
+ "componentId": "plain-info-card"
1075
+ },
1076
+ "isPositive": false
1077
+ },
1078
+ {
1079
+ "id": "reject-reset-without-confirmation",
1080
+ "request": "Reset the editor immediately without confirmation.",
1081
+ "operationId": "panel.resetBehavior.set",
1082
+ "params": {
1083
+ "requireConfirmation": false,
1084
+ "callProviderReset": true
1085
+ },
1086
+ "isPositive": false
1087
+ }
1088
+ ]
1089
+ },
1090
+ "chunks": [
1091
+ {
1092
+ "chunkIndex": 0,
1093
+ "chunkKind": "summary",
1094
+ "content": "Component ID: praxis-settings-panel\nSelector: praxis-settings-panel\nFriendly Name: Praxis Settings Panel\nDescription: Panel for editing component settings and layout properties.\nLib/Package: @praxisui/settings-panel\nTags: widget, settings, configurable\n",
1095
+ "sourcePointer": "praxis-ui-angular/projects/praxis-settings-panel/src/lib/praxis-settings-panel.metadata.ts",
1096
+ "contentHash": "9033f73fcf8e782c6cc41ba9378a4dc21407730906c04296492bd798f720a12a",
1097
+ "sourceKind": "component_definition",
1098
+ "sourceId": "praxis-settings-panel",
1099
+ "corpusVersion": "1.0.0"
1100
+ },
1101
+ {
1102
+ "chunkIndex": 1,
1103
+ "chunkKind": "capabilities",
1104
+ "content": "Component Capabilities:\n - Path: id\n Category: identity\n Kind: string\n Description: ID do painel.\n - Path: title\n Category: identity\n Kind: string\n Description: Titulo do painel.\n - Path: titleIcon\n Category: identity\n Kind: string\n Description: Icone do titulo (Material icon name).\n - Path: expanded\n Category: behavior\n Kind: boolean\n Description: Estado inicial expandido.\n - Path: resizable\n Category: behavior\n Kind: boolean\n Description: Habilita resize horizontal do painel autoral.\n - Path: persistSizeKey\n Category: behavior\n Kind: string\n Description: Chave estavel para persistencia de largura.\n - Path: minWidth\n Category: layout\n Kind: string\n Description: Largura minima do painel.\n - Path: maxWidth\n Category: layout\n Kind: string\n Description: Largura maxima do painel.\n - Path: diagnostics\n Category: behavior\n Kind: object\n Description: Configuracao opcional de visibilidade dos diagnosticos do shell.\n - Path: diagnostics.showStatusMessage\n Category: behavior\n Kind: boolean\n Description: Controla a faixa de status do painel.\n - Path: diagnostics.showDisabledReason\n Category: behavior\n Kind: boolean\n Description: Controla tooltips com motivo de acoes desabilitadas.\n - Path: diagnostics.showBusyState\n Category: behavior\n Kind: boolean\n Description: Controla indicadores visuais de busy no shell.\n - Path: diagnostics.exposeValidationState\n Category: behavior\n Kind: boolean\n Description: Controla a exposicao visual de invalidade do provider.\n - Path: content\n Category: content\n Kind: object\n Description: Conteudo do painel.\n - Path: content.component\n Category: content\n Kind: object\n Description: Referencia do componente Angular a ser renderizado.\n - Path: content.inputs\n Category: content\n Kind: object\n Description: Inputs passados para o componente de conteudo.\nCapability Notes:\n - SettingsPanelConfig descreve o painel e o componente embutido (content.component).\n - content.component deve ser uma referencia de classe Angular fornecida pelo host.\n",
1105
+ "sourcePointer": "praxis-ui-angular/projects/praxis-settings-panel/src/lib/ai/settings-panel-ai-capabilities.ts",
1106
+ "contentHash": "288b0428b63bc301a77be188f94f89df9e14852181f463b1048694c6563d8290",
1107
+ "sourceKind": "component_definition",
1108
+ "sourceId": "praxis-settings-panel",
1109
+ "corpusVersion": "1.0.0"
1110
+ },
1111
+ {
1112
+ "chunkIndex": 2,
1113
+ "chunkKind": "authoring_manifest",
1114
+ "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-settings-panel\",\n \"ownerPackage\": \"@praxisui/settings-panel\",\n \"configSchemaId\": \"SettingsPanelConfig\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"config\",\n \"type\": \"SettingsPanelConfig\",\n \"description\": \"Canonical settings panel shell config passed to SettingsPanelService.open.\"\n },\n {\n \"name\": \"config.diagnostics\",\n \"type\": \"SettingsPanelDiagnosticsConfig\",\n \"description\": \"Optional shell diagnostics visibility config for status, disabled reason, busy state and validation state.\"\n },\n {\n \"name\": \"content.component\",\n \"type\": \"Type<SettingsValueProvider>\",\n \"description\": \"Standalone editor component hosted inside the authoring shell.\"\n },\n {\n \"name\": \"content.inputs\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Initial editor inputs owned by the consumer component manifest.\"\n },\n {\n \"name\": \"ref\",\n \"type\": \"SettingsPanelRef\",\n \"description\": \"Panel ref that emits applied, saved, reset, closed and sizeChanged events.\"\n },\n {\n \"name\": \"provider\",\n \"type\": \"SettingsValueProvider\",\n \"description\": \"Editor protocol for dirty, valid, busy, getSettingsValue, onSave, reset and close hooks.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"panelShell\",\n \"resolver\": \"settings-panel-config-root\",\n \"description\": \"Top-level shell identity and title fields owned by SettingsPanelConfig.\"\n },\n {\n \"kind\": \"openMode\",\n \"resolver\": \"settings-panel-open-mode\",\n \"description\": \"Initial expanded state, replacement mediation and close behavior for an authoring panel.\"\n },\n {\n \"kind\": \"panelSize\",\n \"resolver\": \"settings-panel-size-and-resize\",\n \"description\": \"Width, min/max width, resize enablement and persisted size key.\"\n },\n {\n \"kind\": \"applyBehavior\",\n \"resolver\": \"settings-value-provider-apply-contract\",\n \"description\": \"Apply availability and payload emission through getSettingsValue().\"\n },\n {\n \"kind\": \"saveBehavior\",\n \"resolver\": \"settings-value-provider-save-contract\",\n \"description\": \"Save availability, onSave fallback and close-after-save behavior.\"\n },\n {\n \"kind\": \"resetBehavior\",\n \"resolver\": \"settings-value-provider-reset-contract\",\n \"description\": \"Reset confirmation, provider reset hook and reset event emission.\"\n },\n {\n \"kind\": \"editorHost\",\n \"resolver\": \"settings-panel-editor-host\",\n \"description\": \"Hosted editor component and serializable input envelope.\"\n },\n {\n \"kind\": \"diagnostics\",\n \"resolver\": \"settings-panel-state-diagnostics\",\n \"description\": \"Dirty, valid, busy, disabled reason and status message visibility.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"panel.shell.configure\",\n \"title\": \"Configure panel shell identity\",\n \"scope\": \"global\",\n \"targetKind\": \"panelShell\",\n \"target\": {\n \"kind\": \"panelShell\",\n \"resolver\": \"settings-panel-config-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"titleIcon\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"validators\": [\n \"panel-id-stable\",\n \"title-i18n-compatible\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.id\",\n \"config.title\",\n \"config.titleIcon\"\n ],\n \"submissionImpact\": \"config-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"panel.openMode.set\",\n \"title\": \"Set panel open mode\",\n \"scope\": \"global\",\n \"targetKind\": \"openMode\",\n \"target\": {\n \"kind\": \"openMode\",\n \"resolver\": \"settings-panel-open-mode\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"expanded\": {\n \"type\": \"boolean\"\n },\n \"replacementPolicy\": {\n \"enum\": [\n \"consult-current-editor\",\n \"reject-when-dirty\",\n \"force-close-disallowed\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"validators\": [\n \"replacement-mediates-before-close\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.expanded\"\n ],\n \"submissionImpact\": \"config-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"panel.size.set\",\n \"title\": \"Set panel size and resize policy\",\n \"scope\": \"layout\",\n \"targetKind\": \"panelSize\",\n \"target\": {\n \"kind\": \"panelSize\",\n \"resolver\": \"settings-panel-size-and-resize\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"width\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"minWidth\": {\n \"type\": \"string\"\n },\n \"maxWidth\": {\n \"type\": \"string\"\n },\n \"resizable\": {\n \"type\": \"boolean\"\n },\n \"persistSizeKey\": {\n \"type\": \"string\"\n },\n \"expanded\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"settings-panel-size-set\",\n \"handlerContract\": {\n \"reads\": [\n \"SettingsPanelConfig\",\n \"SettingsPanelRef.sizeChanged$\",\n \"persistSizeKey\"\n ],\n \"writes\": [\n \"config.minWidth\",\n \"config.maxWidth\",\n \"config.resizable\",\n \"config.persistSizeKey\",\n \"runtime.size\"\n ],\n \"identityKeys\": [\n \"config.id\",\n \"persistSizeKey\"\n ],\n \"failureModes\": [\n \"invalid-css-size\",\n \"min-width-greater-than-max-width\",\n \"persist-size-key-missing-for-persistence\"\n ],\n \"description\": \"Applies shell size configuration and open-panel width changes through SettingsPanelRef.updateSize without changing hosted editor config semantics.\"\n }\n }\n ],\n \"validators\": [\n \"panel-size-safe\",\n \"panel-min-max-consistent\",\n \"resize-persistence-explicit\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.minWidth\",\n \"config.maxWidth\",\n \"config.resizable\",\n \"config.persistSizeKey\",\n \"runtime.width\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"panel.applyBehavior.set\",\n \"title\": \"Set apply behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"applyBehavior\",\n \"target\": {\n \"kind\": \"applyBehavior\",\n \"resolver\": \"settings-value-provider-apply-contract\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"requireDirty\": {\n \"type\": \"boolean\"\n },\n \"requireValid\": {\n \"type\": \"boolean\"\n },\n \"blockWhileBusy\": {\n \"type\": \"boolean\"\n },\n \"useProviderHook\": {\n \"type\": \"boolean\"\n },\n \"closeAfterSave\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"settings-panel-apply-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"SettingsValueProvider.isDirty$\",\n \"SettingsValueProvider.isValid$\",\n \"SettingsValueProvider.isBusy$\",\n \"SettingsValueProvider.getSettingsValue\"\n ],\n \"writes\": [\n \"SettingsPanelRef.applied$\"\n ],\n \"identityKeys\": [\n \"config.id\",\n \"provider.getSettingsValue\"\n ],\n \"failureModes\": [\n \"provider-missing-get-settings-value\",\n \"apply-while-invalid\",\n \"apply-while-busy\",\n \"apply-without-dirty-state\"\n ],\n \"description\": \"Keeps Apply gated by dirty, valid and busy state and emits the provider value through SettingsPanelRef.applied$.\"\n }\n }\n ],\n \"validators\": [\n \"apply-requires-provider-value\",\n \"dirty-valid-busy-gates-preserved\",\n \"apply-does-not-close-panel\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"provider.isDirty$\",\n \"provider.isValid$\",\n \"provider.isBusy$\",\n \"ref.applied$\"\n ],\n \"submissionImpact\": \"none\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"settings-value-provider-attached\"\n ]\n },\n {\n \"operationId\": \"panel.saveBehavior.set\",\n \"title\": \"Set save behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"saveBehavior\",\n \"target\": {\n \"kind\": \"saveBehavior\",\n \"resolver\": \"settings-value-provider-save-contract\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"settings-panel-save-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"SettingsValueProvider.onSave\",\n \"SettingsValueProvider.getSettingsValue\",\n \"SettingsValueProvider.isDirty$\",\n \"SettingsValueProvider.isValid$\",\n \"SettingsValueProvider.isBusy$\"\n ],\n \"writes\": [\n \"SettingsPanelRef.saved$\",\n \"SettingsPanelRef.closed$\"\n ],\n \"identityKeys\": [\n \"config.id\",\n \"provider.onSave\"\n ],\n \"failureModes\": [\n \"save-while-invalid\",\n \"save-while-busy\",\n \"save-result-undefined\",\n \"provider-save-rejected\"\n ],\n \"description\": \"Keeps Save gated by dirty, valid and busy state, prefers onSave when present, falls back to getSettingsValue and closes with reason save.\"\n }\n }\n ],\n \"validators\": [\n \"save-prefers-provider-hook\",\n \"save-fallback-value-preserved\",\n \"save-closes-with-save-reason\",\n \"dirty-valid-busy-gates-preserved\"\n ],\n \"affectedPaths\": [\n \"provider.onSave\",\n \"provider.getSettingsValue\",\n \"ref.saved$\",\n \"ref.closed$\"\n ],\n \"submissionImpact\": \"config-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"settings-value-provider-attached\"\n ]\n },\n {\n \"operationId\": \"panel.resetBehavior.set\",\n \"title\": \"Set reset behavior\",\n \"scope\": \"interaction\",\n \"targetKind\": \"resetBehavior\",\n \"target\": {\n \"kind\": \"resetBehavior\",\n \"resolver\": \"settings-value-provider-reset-contract\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"requireConfirmation\": {\n \"type\": \"boolean\"\n },\n \"callProviderReset\": {\n \"type\": \"boolean\"\n },\n \"emitResetEvent\": {\n \"type\": \"boolean\"\n },\n \"clearSavedStatus\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"settings-panel-reset-behavior-set\",\n \"handlerContract\": {\n \"reads\": [\n \"SettingsValueProvider.reset\",\n \"SettingsPanelRef.reset$\",\n \"ConfirmDialogComponent\"\n ],\n \"writes\": [\n \"provider.reset()\",\n \"SettingsPanelRef.reset$\",\n \"panel.lastSavedAt\"\n ],\n \"identityKeys\": [\n \"config.id\",\n \"provider.reset\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"requireConfirmation\": {\n \"type\": \"boolean\"\n },\n \"callProviderReset\": {\n \"type\": \"boolean\"\n },\n \"emitResetEvent\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"reset-confirmation-missing\",\n \"provider-reset-failed\",\n \"reset-event-not-emitted\"\n ],\n \"description\": \"Preserves Reset as a confirmed shell action that calls the provider reset hook and emits SettingsPanelRef.reset$.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"reset-requires-confirmation\",\n \"reset-calls-provider-reset\",\n \"reset-event-emitted\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"provider.reset\",\n \"ref.reset$\",\n \"panel.lastSavedAt\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"settings-value-provider-attached\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"editor.host.configure\",\n \"title\": \"Configure hosted editor\",\n \"scope\": \"templating\",\n \"targetKind\": \"editorHost\",\n \"target\": {\n \"kind\": \"editorHost\",\n \"resolver\": \"settings-panel-editor-host\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"componentId\"\n ],\n \"properties\": {\n \"componentId\": {\n \"type\": \"string\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"configManifestComponentId\": {\n \"type\": \"string\"\n },\n \"editorContract\": {\n \"enum\": [\n \"SettingsValueProvider\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"settings-panel-editor-host-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"ComponentMetadataRegistry\",\n \"SettingsPanelConfig.content\",\n \"SettingsValueProvider\",\n \"component.authoringManifest\"\n ],\n \"writes\": [\n \"config.content.component\",\n \"config.content.inputs\",\n \"delegatedConsumerPatch\"\n ],\n \"identityKeys\": [\n \"componentId\",\n \"configManifestComponentId\"\n ],\n \"failureModes\": [\n \"editor-component-not-registered\",\n \"settings-value-provider-missing\",\n \"consumer-manifest-required\",\n \"consumer-config-boundary-violation\"\n ],\n \"description\": \"Configures the hosted editor component and input envelope while delegating consumer-specific config edits to the owning component manifest.\"\n }\n }\n ],\n \"validators\": [\n \"editor-component-registered\",\n \"settings-value-provider-contract-present\",\n \"consumer-config-delegated\",\n \"editor-inputs-serializable\"\n ],\n \"affectedPaths\": [\n \"config.content.component\",\n \"config.content.inputs\",\n \"delegatedConsumerPatch\"\n ],\n \"submissionImpact\": \"config-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"component-metadata-resolved\"\n ]\n },\n {\n \"operationId\": \"diagnostics.visibility.set\",\n \"title\": \"Set panel diagnostics visibility\",\n \"scope\": \"interaction\",\n \"targetKind\": \"diagnostics\",\n \"target\": {\n \"kind\": \"diagnostics\",\n \"resolver\": \"settings-panel-state-diagnostics\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"showStatusMessage\": {\n \"type\": \"boolean\"\n },\n \"showDisabledReason\": {\n \"type\": \"boolean\"\n },\n \"showBusyState\": {\n \"type\": \"boolean\"\n },\n \"exposeValidationState\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config.diagnostics\"\n }\n ],\n \"validators\": [\n \"diagnostics-follow-provider-state\",\n \"diagnostics-i18n-compatible\",\n \"busy-valid-dirty-visible-when-needed\",\n \"settings-panel-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.diagnostics.showStatusMessage\",\n \"config.diagnostics.showDisabledReason\",\n \"config.diagnostics.showBusyState\",\n \"config.diagnostics.exposeValidationState\",\n \"panel.statusMessage\",\n \"panel.disabledReason\",\n \"panel.isDirty\",\n \"panel.isValid\",\n \"panel.isBusy\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"preconditions\": [\n \"settings-value-provider-attached\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"panel-id-stable\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_ID_STABLE\",\n \"description\": \"Panel id must remain stable for replacement, persistence and diagnostics.\"\n },\n {\n \"validatorId\": \"replacement-mediates-before-close\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_REPLACEMENT_MEDIATES_CLOSE\",\n \"description\": \"Opening a replacement panel must consult the current editor onBeforeClose before closing.\"\n },\n {\n \"validatorId\": \"title-i18n-compatible\",\n \"level\": \"warning\",\n \"code\": \"SETTINGS_PANEL_TITLE_I18N_COMPATIBLE\",\n \"description\": \"Authoring chrome text must remain compatible with the settings panel i18n namespace.\"\n },\n {\n \"validatorId\": \"panel-size-safe\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_SIZE_SAFE\",\n \"description\": \"Panel sizes must be finite numbers or safe CSS size strings.\"\n },\n {\n \"validatorId\": \"panel-min-max-consistent\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_MIN_MAX_CONSISTENT\",\n \"description\": \"Minimum width must not exceed maximum width.\"\n },\n {\n \"validatorId\": \"resize-persistence-explicit\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_RESIZE_PERSISTENCE_EXPLICIT\",\n \"description\": \"Persisted resize must use a stable persistSizeKey or be explicitly transient.\"\n },\n {\n \"validatorId\": \"apply-requires-provider-value\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_APPLY_REQUIRES_PROVIDER_VALUE\",\n \"description\": \"Apply must obtain payloads from SettingsValueProvider.getSettingsValue().\"\n },\n {\n \"validatorId\": \"apply-does-not-close-panel\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_APPLY_DOES_NOT_CLOSE\",\n \"description\": \"Apply emits preview payloads without closing the panel.\"\n },\n {\n \"validatorId\": \"dirty-valid-busy-gates-preserved\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_STATE_GATES_PRESERVED\",\n \"description\": \"Apply and Save remain gated by dirty, valid and busy state.\"\n },\n {\n \"validatorId\": \"save-prefers-provider-hook\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_SAVE_PREFERS_PROVIDER_HOOK\",\n \"description\": \"Save must call onSave when provided before falling back to getSettingsValue().\"\n },\n {\n \"validatorId\": \"save-fallback-value-preserved\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_SAVE_FALLBACK_PRESERVED\",\n \"description\": \"Save fallback must preserve getSettingsValue payload semantics.\"\n },\n {\n \"validatorId\": \"save-closes-with-save-reason\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_SAVE_CLOSE_REASON\",\n \"description\": \"Successful save must emit saved$ and close with reason save.\"\n },\n {\n \"validatorId\": \"reset-requires-confirmation\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_RESET_REQUIRES_CONFIRMATION\",\n \"description\": \"Reset is destructive and must remain confirmed before provider reset is called.\"\n },\n {\n \"validatorId\": \"reset-calls-provider-reset\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_RESET_CALLS_PROVIDER\",\n \"description\": \"Reset must call the hosted provider reset hook when present.\"\n },\n {\n \"validatorId\": \"reset-event-emitted\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_RESET_EVENT_EMITTED\",\n \"description\": \"Reset must emit SettingsPanelRef.reset$ so hosts can coordinate state.\"\n },\n {\n \"validatorId\": \"editor-component-registered\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_EDITOR_REGISTERED\",\n \"description\": \"Hosted editor component must resolve from governed component metadata or host registration.\"\n },\n {\n \"validatorId\": \"settings-value-provider-contract-present\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_PROVIDER_CONTRACT_PRESENT\",\n \"description\": \"Hosted authoring editors must implement SettingsValueProvider state and value contract.\"\n },\n {\n \"validatorId\": \"consumer-config-delegated\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_CONSUMER_CONFIG_DELEGATED\",\n \"description\": \"Consumer-specific config operations must delegate to the owning component manifest.\"\n },\n {\n \"validatorId\": \"editor-inputs-serializable\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_EDITOR_INPUTS_SERIALIZABLE\",\n \"description\": \"Persisted editor host inputs must be serializable safe values.\"\n },\n {\n \"validatorId\": \"diagnostics-follow-provider-state\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_DIAGNOSTICS_PROVIDER_STATE\",\n \"description\": \"Diagnostics must reflect provider dirty, valid and busy state.\"\n },\n {\n \"validatorId\": \"diagnostics-i18n-compatible\",\n \"level\": \"warning\",\n \"code\": \"SETTINGS_PANEL_DIAGNOSTICS_I18N_COMPATIBLE\",\n \"description\": \"Diagnostics copy must use the settings panel i18n namespace.\"\n },\n {\n \"validatorId\": \"busy-valid-dirty-visible-when-needed\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_STATE_VISIBLE\",\n \"description\": \"Busy, invalid and dirty states must remain visible or explain disabled actions.\"\n },\n {\n \"validatorId\": \"settings-panel-round-trip\",\n \"level\": \"error\",\n \"code\": \"SETTINGS_PANEL_ROUND_TRIP\",\n \"description\": \"Open, edit, apply, save, reset and reopen must preserve the shell protocol without mutating consumer config semantics.\"\n }\n ],\n \"roundTripRequirements\": [\n \"SettingsPanelConfig owns only shell fields: identity, title, size, resize persistence and hosted editor envelope.\",\n \"SettingsValueProvider owns apply/save/reset payload extraction, while consumer config semantics stay delegated to the owning component manifest.\",\n \"Apply must emit applied$ without closing; Save must emit saved$ and close with reason save; Reset must be confirmed and emit reset$.\",\n \"Busy, dirty and valid state must gate Apply and Save consistently and remain visible through diagnostics.\",\n \"Opening a replacement panel must pass through the current editor onBeforeClose and dirty-discard mediation.\"\n ],\n \"examples\": [\n {\n \"id\": \"open-component-editor\",\n \"request\": \"Open the table settings editor in the settings panel.\",\n \"operationId\": \"editor.host.configure\",\n \"params\": {\n \"componentId\": \"praxis-table\",\n \"inputs\": {\n \"tableId\": \"orders\"\n },\n \"configManifestComponentId\": \"praxis-table\",\n \"editorContract\": \"SettingsValueProvider\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"start-expanded\",\n \"request\": \"Open this settings panel expanded.\",\n \"operationId\": \"panel.openMode.set\",\n \"params\": {\n \"expanded\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-resizable-width\",\n \"request\": \"Make the settings drawer resizable between 420px and 960px.\",\n \"operationId\": \"panel.size.set\",\n \"params\": {\n \"resizable\": true,\n \"minWidth\": \"420px\",\n \"maxWidth\": \"960px\",\n \"persistSizeKey\": \"settings-panel:orders\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-preview\",\n \"request\": \"Apply the editor change without saving or closing.\",\n \"operationId\": \"panel.applyBehavior.set\",\n \"params\": {\n \"requireDirty\": true,\n \"requireValid\": true,\n \"blockWhileBusy\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"save-and-close\",\n \"request\": \"Save this editor value and close the panel.\",\n \"operationId\": \"panel.saveBehavior.set\",\n \"params\": {\n \"requireDirty\": true,\n \"requireValid\": true,\n \"blockWhileBusy\": true,\n \"useProviderHook\": true,\n \"closeAfterSave\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reset-to-original\",\n \"request\": \"Reset this editor to its original value.\",\n \"operationId\": \"panel.resetBehavior.set\",\n \"params\": {\n \"requireConfirmation\": true,\n \"callProviderReset\": true,\n \"emitResetEvent\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"show-busy-diagnostics\",\n \"request\": \"Show why Apply and Save are disabled while the editor is busy.\",\n \"operationId\": \"diagnostics.visibility.set\",\n \"params\": {\n \"showStatusMessage\": true,\n \"showDisabledReason\": true,\n \"showBusyState\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-table-column-direct-edit\",\n \"request\": \"Use settings-panel to rename a table column directly.\",\n \"operationId\": \"editor.host.configure\",\n \"params\": {\n \"componentId\": \"praxis-settings-panel\",\n \"inputs\": {\n \"columns\": [\n {\n \"field\": \"name\",\n \"label\": \"Name\"\n }\n ]\n }\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-missing-provider\",\n \"request\": \"Host a component that has no dirty, valid, busy or getSettingsValue contract.\",\n \"operationId\": \"editor.host.configure\",\n \"params\": {\n \"componentId\": \"plain-info-card\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-reset-without-confirmation\",\n \"request\": \"Reset the editor immediately without confirmation.\",\n \"operationId\": \"panel.resetBehavior.set\",\n \"params\": {\n \"requireConfirmation\": false,\n \"callProviderReset\": true\n },\n \"isPositive\": false\n }\n ]\n}",
1115
+ "sourcePointer": "praxis-ui-angular/projects/praxis-settings-panel/src/lib/ai/praxis-settings-panel-authoring-manifest.ts",
1116
+ "contentHash": "a649f5151f217c003827cfef26a809b27bd42f0e7e84db7ef359237c304d1e1f",
1117
+ "sourceKind": "component_definition",
1118
+ "sourceId": "praxis-settings-panel",
1119
+ "corpusVersion": "1.0.0"
1120
+ },
1121
+ {
1122
+ "chunkIndex": 3,
1123
+ "chunkKind": "context_pack",
1124
+ "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {},\n \"actionCatalog\": [\n {\n \"id\": \"title.set\",\n \"intentExamples\": [\n \"title\",\n \"titulo\",\n \"rename panel\"\n ],\n \"patchTemplate\": {\n \"title\": \"{{value}}\"\n }\n },\n {\n \"id\": \"titleIcon.set\",\n \"intentExamples\": [\n \"icon\",\n \"titulo icon\",\n \"panel icon\"\n ],\n \"patchTemplate\": {\n \"titleIcon\": \"{{value}}\"\n }\n },\n {\n \"id\": \"expanded.enable\",\n \"intentExamples\": [\n \"expand panel\",\n \"open panel\"\n ],\n \"patchTemplate\": {\n \"expanded\": true\n }\n },\n {\n \"id\": \"expanded.disable\",\n \"intentExamples\": [\n \"collapse panel\",\n \"close panel\"\n ],\n \"patchTemplate\": {\n \"expanded\": false\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"content.component is provided by the host; avoid patching it dynamically.\",\n \"Use expanded to control default open state.\"\n ]\n }\n}",
1125
+ "sourcePointer": "praxis-ui-angular/projects/praxis-settings-panel/src/lib/ai/settings-panel-context-pack.ts",
1126
+ "contentHash": "35f9cc5873ec46ee479ec036ab46c16a91ecbf7d4504d71218b4188e190df5ab",
1127
+ "sourceKind": "component_definition",
1128
+ "sourceId": "praxis-settings-panel",
1129
+ "corpusVersion": "1.0.0"
1130
+ },
1131
+ {
1132
+ "chunkIndex": 4,
1133
+ "chunkKind": "recipe",
1134
+ "content": "{\n \"_comment\": \"Receita para o Painel de Configurações (Settings Panel).\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-settings-panel\",\n \"variantId\": \"base\",\n \"useWhen\": \"Base settings panel configuration.\",\n \"examplePrompts\": [\n \"configure settings panel sections\",\n \"set settings panel titles and icons\"\n ]\n },\n \"config\": {\n \"saveMode\": \"auto\",\n \"i18n\": {\n \"title\": \"Configurações do Sistema\",\n \"saveSuccess\": \"Salvo com sucesso!\"\n },\n \"validation\": {\n \"mode\": \"blur\"\n },\n \"sections\": [\n {\n \"id\": \"general\",\n \"title\": \"Geral\",\n \"icon\": \"tune\",\n \"permissions\": [\"admin\", \"manager\"],\n \"fields\": [\n { \"key\": \"appName\", \"type\": \"text\", \"label\": \"Nome da Aplicação\", \"required\": true },\n { \"key\": \"theme\", \"type\": \"select\", \"label\": \"Tema\", \"options\": [\"Light\", \"Dark\"] }\n ]\n },\n {\n \"id\": \"notifications\",\n \"title\": \"Notificações\",\n \"icon\": \"notifications\",\n \"fields\": [\n { \"key\": \"emailAlerts\", \"type\": \"toggle\", \"label\": \"Alertas por E-mail\", \"default\": true },\n { \"key\": \"smsAlerts\", \"type\": \"toggle\", \"label\": \"Alertas por SMS\" }\n ]\n }\n ],\n \"overrides\": {\n \"tenant-abc\": {\n \"defaults\": { \"theme\": \"Dark\" }\n }\n }\n }\n}\n",
1135
+ "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-settings-panel.json",
1136
+ "contentHash": "1bdc02a1084d6227bfef7cec4b0ed1941b201449ebc3b8605d8ac49d62908249",
1137
+ "sourceKind": "component_definition",
1138
+ "sourceId": "praxis-settings-panel",
1139
+ "corpusVersion": "1.0.0"
1140
+ }
1141
+ ]
1142
+ }
1143
+ },
1144
+ "note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
1145
+ }