@praxisui/charts 9.0.0-beta.8 → 9.0.0-beta.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -4
- package/ai/component-registry.json +2490 -0
- package/fesm2022/praxisui-charts.mjs +4746 -1490
- package/package.json +8 -4
- package/types/praxisui-charts.d.ts +604 -89
|
@@ -0,0 +1,2490 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0.0",
|
|
3
|
+
"generatedAt": "2026-07-19T22:17:32.055Z",
|
|
4
|
+
"packageName": "@praxisui/charts",
|
|
5
|
+
"packageVersion": "9.0.0-beta.80",
|
|
6
|
+
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
|
+
"sourceRegistryVersion": "1.0.0",
|
|
8
|
+
"componentCount": 2,
|
|
9
|
+
"components": {
|
|
10
|
+
"praxis-chart": {
|
|
11
|
+
"id": "praxis-chart",
|
|
12
|
+
"description": "Chart component for analytics and metadata-driven visualizations in Praxis UI.",
|
|
13
|
+
"inputs": [
|
|
14
|
+
{
|
|
15
|
+
"name": "config",
|
|
16
|
+
"type": "PraxisChartConfig",
|
|
17
|
+
"required": false,
|
|
18
|
+
"description": "Declarative chart configuration with metadata-oriented semantics.",
|
|
19
|
+
"default": {
|
|
20
|
+
"id": "palette-chart",
|
|
21
|
+
"type": "bar",
|
|
22
|
+
"title": "Analytics preview",
|
|
23
|
+
"subtitle": "Sample chart inserted from the Praxis component palette.",
|
|
24
|
+
"axes": {
|
|
25
|
+
"x": {
|
|
26
|
+
"field": "category",
|
|
27
|
+
"label": "Category",
|
|
28
|
+
"type": "category"
|
|
29
|
+
},
|
|
30
|
+
"y": {
|
|
31
|
+
"field": "value",
|
|
32
|
+
"label": "Value",
|
|
33
|
+
"type": "value"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"series": [
|
|
37
|
+
{
|
|
38
|
+
"id": "value",
|
|
39
|
+
"name": "Value",
|
|
40
|
+
"metric": {
|
|
41
|
+
"field": "value",
|
|
42
|
+
"aggregation": "sum"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"emptyState": {
|
|
47
|
+
"title": "No chart data",
|
|
48
|
+
"description": "Connect a governed data source or configure the chart fields."
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "data",
|
|
54
|
+
"type": "PraxisChartDataRow[]",
|
|
55
|
+
"required": false,
|
|
56
|
+
"description": "Optional local dataset that takes precedence over local datasource items.",
|
|
57
|
+
"default": [
|
|
58
|
+
{
|
|
59
|
+
"category": "A",
|
|
60
|
+
"value": 18
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"category": "B",
|
|
64
|
+
"value": 32
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"category": "C",
|
|
68
|
+
"value": 24
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "chartDocument",
|
|
74
|
+
"type": "PraxisXUiChartContract | null",
|
|
75
|
+
"required": false,
|
|
76
|
+
"description": "Optional canonical x-ui.chart document used as the authoring source of truth for settings-panel integration.",
|
|
77
|
+
"default": {
|
|
78
|
+
"version": "0.1.0",
|
|
79
|
+
"kind": "bar",
|
|
80
|
+
"chartId": "palette-chart",
|
|
81
|
+
"title": "Analytics preview",
|
|
82
|
+
"subtitle": "Sample chart inserted from the Praxis component palette.",
|
|
83
|
+
"source": {
|
|
84
|
+
"kind": "derived"
|
|
85
|
+
},
|
|
86
|
+
"dimensions": [
|
|
87
|
+
{
|
|
88
|
+
"field": "category",
|
|
89
|
+
"role": "category"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"metrics": [
|
|
93
|
+
{
|
|
94
|
+
"field": "value",
|
|
95
|
+
"aggregation": "sum",
|
|
96
|
+
"label": "Value"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"legend": {
|
|
100
|
+
"enabled": true
|
|
101
|
+
},
|
|
102
|
+
"labels": {
|
|
103
|
+
"enabled": false
|
|
104
|
+
},
|
|
105
|
+
"tooltip": {
|
|
106
|
+
"enabled": true
|
|
107
|
+
},
|
|
108
|
+
"motion": {
|
|
109
|
+
"enabled": true,
|
|
110
|
+
"preset": "standard"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "queryContext",
|
|
116
|
+
"type": "PraxisDataQueryContext | null",
|
|
117
|
+
"required": false,
|
|
118
|
+
"description": "Primary semantic query contract for dynamic-page orchestration. Charts consume filters, sort and limit from queryContext while preserving filterCriteria as a compatibility bridge."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "remoteDataResolver",
|
|
122
|
+
"type": "PraxisChartRemoteDataResolver | null",
|
|
123
|
+
"required": false,
|
|
124
|
+
"description": "Optional host resolver for remote chart rows. When provided, the runtime emits queryRequest and delegates row resolution to the resolver instead of the default praxis.stats client."
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "filterCriteria",
|
|
128
|
+
"type": "Record<string, unknown> | null",
|
|
129
|
+
"required": false,
|
|
130
|
+
"description": "Legacy compatibility bridge for declarative filters. Prefer queryContext for new authoring and widget connections."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "enableCustomization",
|
|
134
|
+
"type": "boolean",
|
|
135
|
+
"required": false,
|
|
136
|
+
"description": "When true and a settings-panel bridge is available, exposes the chart config editor from the runtime.",
|
|
137
|
+
"default": false
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "availableResources",
|
|
141
|
+
"type": "ReadonlyArray<ChartEditorResourceOption>",
|
|
142
|
+
"required": false,
|
|
143
|
+
"description": "Transient governed resource catalog. id is the stable discovery identity and path is the root-relative operational value persisted to chartDocument.source.resource; the catalog itself is not persisted.",
|
|
144
|
+
"default": []
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "availableFields",
|
|
148
|
+
"type": "ReadonlyArray<ChartEditorFieldOption>",
|
|
149
|
+
"required": false,
|
|
150
|
+
"description": "Transient capability-backed field catalog with exact operation, aggregation and distribution terms/histogram eligibility; not intended for widget persistence.",
|
|
151
|
+
"default": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"name": "availableTargets",
|
|
155
|
+
"type": "ReadonlyArray<ChartEditorTargetOption>",
|
|
156
|
+
"required": false,
|
|
157
|
+
"description": "Transient event-scoped targets from existing top-level links that are compatible with public, non-deprecated widget ports or explicitly writable declared page state. events[] identifies the exact authorized structured Chart events; raw pointClick never authorizes events.pointClick, which uses pointAction. Local transform.output semantic-kind inspection is provisional and does not replace a Core-validated transform-output projection (P2). The catalog is not persisted.",
|
|
158
|
+
"default": []
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"outputs": [
|
|
162
|
+
{
|
|
163
|
+
"name": "pointClick",
|
|
164
|
+
"type": "PraxisChartPointEvent",
|
|
165
|
+
"required": false,
|
|
166
|
+
"description": "Raw renderer-neutral point evidence emitted when the host wants to observe a point/series click."
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "pointAction",
|
|
170
|
+
"type": "PraxisChartPointActionEvent",
|
|
171
|
+
"required": false,
|
|
172
|
+
"description": "Emitted when a configured pointClick action resolves semantic filters and target evidence from a point/series click."
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"name": "selectionChange",
|
|
176
|
+
"type": "PraxisChartSelectionEvent",
|
|
177
|
+
"required": false,
|
|
178
|
+
"description": "Emitted when declarative single-point chart selection resolves selected point evidence and canonical filters."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "drillDown",
|
|
182
|
+
"type": "PraxisChartDrillDownEvent",
|
|
183
|
+
"required": false,
|
|
184
|
+
"description": "Emitted when declarative drill-down resolves action, target and canonical filters from a selected chart point."
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "crossFilter",
|
|
188
|
+
"type": "PraxisChartCrossFilterEvent",
|
|
189
|
+
"required": false,
|
|
190
|
+
"description": "Emitted when declarative cross-filtering resolves filters from a selected chart point."
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"name": "queryRequest",
|
|
194
|
+
"type": "PraxisChartQueryRequestEvent",
|
|
195
|
+
"required": false,
|
|
196
|
+
"description": "Emitted before a remote praxis.stats datasource is resolved, allowing host-side observability of the outgoing request."
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"name": "loadStateChange",
|
|
200
|
+
"type": "PraxisChartLoadState",
|
|
201
|
+
"required": false,
|
|
202
|
+
"description": "Emitted when the chart state changes."
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "chartDocumentApplied",
|
|
206
|
+
"type": "PraxisXUiChartContract",
|
|
207
|
+
"required": false,
|
|
208
|
+
"description": "Emitted when the runtime chart editor applies a canonical x-ui.chart document through the settings panel bridge."
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"name": "chartDocumentSaved",
|
|
212
|
+
"type": "PraxisXUiChartContract",
|
|
213
|
+
"required": false,
|
|
214
|
+
"description": "Emitted when the runtime chart editor saves a canonical x-ui.chart document through the settings panel bridge."
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
"configSchemaId": null,
|
|
218
|
+
"selector": "praxis-chart",
|
|
219
|
+
"friendlyName": "Praxis Chart",
|
|
220
|
+
"icon": "bar_chart",
|
|
221
|
+
"tags": [
|
|
222
|
+
"chart",
|
|
223
|
+
"analytics",
|
|
224
|
+
"widget",
|
|
225
|
+
"visualization"
|
|
226
|
+
],
|
|
227
|
+
"lib": "@praxisui/charts",
|
|
228
|
+
"actions": [
|
|
229
|
+
{
|
|
230
|
+
"id": "open-chart-editor",
|
|
231
|
+
"label": "Open Chart Editor",
|
|
232
|
+
"icon": "tune",
|
|
233
|
+
"description": "Opens the canonical chart config editor when the host provides a settings panel bridge and chartDocument.",
|
|
234
|
+
"command": "openConfigEditor",
|
|
235
|
+
"scope": "toolbar"
|
|
236
|
+
}
|
|
237
|
+
],
|
|
238
|
+
"ports": [
|
|
239
|
+
{
|
|
240
|
+
"id": "queryContext",
|
|
241
|
+
"label": "Query Context",
|
|
242
|
+
"direction": "input",
|
|
243
|
+
"semanticKind": "query-context",
|
|
244
|
+
"description": "Primary semantic query contract for declarative orchestration and connected filters.",
|
|
245
|
+
"schema": {
|
|
246
|
+
"id": "PraxisDataQueryContext",
|
|
247
|
+
"kind": "ts-type",
|
|
248
|
+
"ref": "PraxisDataQueryContext"
|
|
249
|
+
},
|
|
250
|
+
"compatibility": {
|
|
251
|
+
"acceptsSemanticKinds": [
|
|
252
|
+
"query-context"
|
|
253
|
+
],
|
|
254
|
+
"schemaMode": "structural"
|
|
255
|
+
},
|
|
256
|
+
"exposure": {
|
|
257
|
+
"public": true,
|
|
258
|
+
"group": "data"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "chartDocument",
|
|
263
|
+
"label": "Chart Document",
|
|
264
|
+
"direction": "input",
|
|
265
|
+
"semanticKind": "config-fragment",
|
|
266
|
+
"description": "Canonical x-ui.chart document used as the authoring source of truth.",
|
|
267
|
+
"schema": {
|
|
268
|
+
"id": "PraxisXUiChartContract",
|
|
269
|
+
"kind": "ts-type",
|
|
270
|
+
"ref": "PraxisXUiChartContract"
|
|
271
|
+
},
|
|
272
|
+
"exposure": {
|
|
273
|
+
"public": true,
|
|
274
|
+
"group": "config"
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
"id": "remoteDataResolver",
|
|
279
|
+
"label": "Remote Data Resolver",
|
|
280
|
+
"direction": "input",
|
|
281
|
+
"semanticKind": "collection",
|
|
282
|
+
"description": "Optional host resolver that owns remote chart data execution for governed integrations outside the default praxis.stats client.",
|
|
283
|
+
"schema": {
|
|
284
|
+
"id": "PraxisChartRemoteDataResolver",
|
|
285
|
+
"kind": "ts-type",
|
|
286
|
+
"ref": "PraxisChartRemoteDataResolver"
|
|
287
|
+
},
|
|
288
|
+
"exposure": {
|
|
289
|
+
"public": true,
|
|
290
|
+
"group": "data"
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"id": "config",
|
|
295
|
+
"label": "Chart Config",
|
|
296
|
+
"direction": "input",
|
|
297
|
+
"semanticKind": "config-fragment",
|
|
298
|
+
"description": "Declarative chart configuration consumed directly by the runtime.",
|
|
299
|
+
"schema": {
|
|
300
|
+
"id": "PraxisChartConfig",
|
|
301
|
+
"kind": "ts-type",
|
|
302
|
+
"ref": "PraxisChartConfig"
|
|
303
|
+
},
|
|
304
|
+
"exposure": {
|
|
305
|
+
"public": true,
|
|
306
|
+
"group": "config"
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"id": "pointClick",
|
|
311
|
+
"label": "Point Click",
|
|
312
|
+
"direction": "output",
|
|
313
|
+
"semanticKind": "event",
|
|
314
|
+
"description": "Raw renderer-neutral point evidence emitted when a point or series is clicked.",
|
|
315
|
+
"cardinality": "stream",
|
|
316
|
+
"schema": {
|
|
317
|
+
"id": "PraxisChartPointEvent",
|
|
318
|
+
"kind": "ts-type",
|
|
319
|
+
"ref": "PraxisChartPointEvent"
|
|
320
|
+
},
|
|
321
|
+
"exposure": {
|
|
322
|
+
"public": true,
|
|
323
|
+
"group": "interaction"
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"id": "pointAction",
|
|
328
|
+
"label": "Point Action",
|
|
329
|
+
"direction": "output",
|
|
330
|
+
"semanticKind": "event",
|
|
331
|
+
"description": "Structured configured pointClick action derived from raw point evidence.",
|
|
332
|
+
"cardinality": "stream",
|
|
333
|
+
"schema": {
|
|
334
|
+
"id": "PraxisChartPointActionEvent",
|
|
335
|
+
"kind": "ts-type",
|
|
336
|
+
"ref": "PraxisChartPointActionEvent"
|
|
337
|
+
},
|
|
338
|
+
"exposure": {
|
|
339
|
+
"public": true,
|
|
340
|
+
"group": "interaction"
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"id": "selectionChange",
|
|
345
|
+
"label": "Selection Change",
|
|
346
|
+
"direction": "output",
|
|
347
|
+
"semanticKind": "event",
|
|
348
|
+
"description": "Canonical selected point payload emitted when declarative chart selection is enabled.",
|
|
349
|
+
"cardinality": "stream",
|
|
350
|
+
"schema": {
|
|
351
|
+
"id": "PraxisChartSelectionEvent",
|
|
352
|
+
"kind": "ts-type",
|
|
353
|
+
"ref": "PraxisChartSelectionEvent"
|
|
354
|
+
},
|
|
355
|
+
"exposure": {
|
|
356
|
+
"public": true,
|
|
357
|
+
"group": "interaction"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"id": "drillDown",
|
|
362
|
+
"label": "Drill Down",
|
|
363
|
+
"direction": "output",
|
|
364
|
+
"semanticKind": "event",
|
|
365
|
+
"description": "Structured drill-down action payload derived from selected chart point evidence.",
|
|
366
|
+
"cardinality": "stream",
|
|
367
|
+
"schema": {
|
|
368
|
+
"id": "PraxisChartDrillDownEvent",
|
|
369
|
+
"kind": "ts-type",
|
|
370
|
+
"ref": "PraxisChartDrillDownEvent"
|
|
371
|
+
},
|
|
372
|
+
"exposure": {
|
|
373
|
+
"public": true,
|
|
374
|
+
"group": "interaction"
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"id": "crossFilter",
|
|
379
|
+
"label": "Cross Filter",
|
|
380
|
+
"direction": "output",
|
|
381
|
+
"semanticKind": "query-context",
|
|
382
|
+
"description": "Canonical filter payload derived from selected chart points for connected hosts.",
|
|
383
|
+
"cardinality": "stream",
|
|
384
|
+
"schema": {
|
|
385
|
+
"id": "PraxisChartCrossFilterEvent",
|
|
386
|
+
"kind": "ts-type",
|
|
387
|
+
"ref": "PraxisChartCrossFilterEvent"
|
|
388
|
+
},
|
|
389
|
+
"exposure": {
|
|
390
|
+
"public": true,
|
|
391
|
+
"group": "interaction"
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"id": "queryRequest",
|
|
396
|
+
"label": "Query Request",
|
|
397
|
+
"direction": "output",
|
|
398
|
+
"semanticKind": "diagnostic",
|
|
399
|
+
"description": "Outgoing remote query request emitted before datasource resolution.",
|
|
400
|
+
"cardinality": "stream",
|
|
401
|
+
"schema": {
|
|
402
|
+
"id": "PraxisChartQueryRequestEvent",
|
|
403
|
+
"kind": "ts-type",
|
|
404
|
+
"ref": "PraxisChartQueryRequestEvent"
|
|
405
|
+
},
|
|
406
|
+
"exposure": {
|
|
407
|
+
"public": true,
|
|
408
|
+
"group": "diagnostics"
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"id": "loadStateChange",
|
|
413
|
+
"label": "Load State",
|
|
414
|
+
"direction": "output",
|
|
415
|
+
"semanticKind": "status",
|
|
416
|
+
"description": "Operational state signal for loading, ready and error transitions.",
|
|
417
|
+
"cardinality": "stream",
|
|
418
|
+
"schema": {
|
|
419
|
+
"id": "PraxisChartLoadState",
|
|
420
|
+
"kind": "ts-type",
|
|
421
|
+
"ref": "PraxisChartLoadState"
|
|
422
|
+
},
|
|
423
|
+
"exposure": {
|
|
424
|
+
"public": true,
|
|
425
|
+
"group": "status"
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
],
|
|
429
|
+
"configEditor": {
|
|
430
|
+
"component": "[ref:PraxisChartWidgetConfigEditor]",
|
|
431
|
+
"title": "Configure chart"
|
|
432
|
+
},
|
|
433
|
+
"authoringManifestRef": {
|
|
434
|
+
"componentId": "praxis-chart",
|
|
435
|
+
"source": "PRAXIS_CHARTS_AUTHORING_MANIFEST"
|
|
436
|
+
},
|
|
437
|
+
"insertionPresets": [
|
|
438
|
+
{
|
|
439
|
+
"id": "canonical-chart",
|
|
440
|
+
"label": "Canonical chart",
|
|
441
|
+
"description": "Creates a chart widget from the canonical x-ui.chart authoring document.",
|
|
442
|
+
"icon": "bar_chart",
|
|
443
|
+
"inputs": {
|
|
444
|
+
"chartDocument": {
|
|
445
|
+
"version": "0.1.0",
|
|
446
|
+
"kind": "bar",
|
|
447
|
+
"chartId": "palette-chart",
|
|
448
|
+
"title": "Analytics preview",
|
|
449
|
+
"subtitle": "Sample chart inserted from the Praxis component palette.",
|
|
450
|
+
"source": {
|
|
451
|
+
"kind": "derived"
|
|
452
|
+
},
|
|
453
|
+
"dimensions": [
|
|
454
|
+
{
|
|
455
|
+
"field": "category",
|
|
456
|
+
"role": "category"
|
|
457
|
+
}
|
|
458
|
+
],
|
|
459
|
+
"metrics": [
|
|
460
|
+
{
|
|
461
|
+
"field": "value",
|
|
462
|
+
"aggregation": "sum",
|
|
463
|
+
"label": "Value"
|
|
464
|
+
}
|
|
465
|
+
],
|
|
466
|
+
"legend": {
|
|
467
|
+
"enabled": true
|
|
468
|
+
},
|
|
469
|
+
"labels": {
|
|
470
|
+
"enabled": false
|
|
471
|
+
},
|
|
472
|
+
"tooltip": {
|
|
473
|
+
"enabled": true
|
|
474
|
+
},
|
|
475
|
+
"motion": {
|
|
476
|
+
"enabled": true,
|
|
477
|
+
"preset": "standard"
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
"data": [
|
|
481
|
+
{
|
|
482
|
+
"category": "A",
|
|
483
|
+
"value": 18
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
"category": "B",
|
|
487
|
+
"value": 32
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"category": "C",
|
|
491
|
+
"value": 24
|
|
492
|
+
}
|
|
493
|
+
],
|
|
494
|
+
"enableCustomization": true
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
],
|
|
498
|
+
"source": "projects/praxis-charts/src/lib/praxis-chart.metadata.ts",
|
|
499
|
+
"exportName": "PRAXIS_CHART_COMPONENT_METADATA",
|
|
500
|
+
"authoringManifest": {
|
|
501
|
+
"schemaVersion": "1.0.0",
|
|
502
|
+
"componentId": "praxis-chart",
|
|
503
|
+
"ownerPackage": "@praxisui/charts",
|
|
504
|
+
"configSchemaId": "PraxisXUiChartContract",
|
|
505
|
+
"manifestVersion": "1.1.0",
|
|
506
|
+
"runtimeInputs": [
|
|
507
|
+
{
|
|
508
|
+
"name": "chartDocument",
|
|
509
|
+
"type": "PraxisXUiChartContract | null",
|
|
510
|
+
"description": "Canonical x-ui.chart document used as the authoring source of truth."
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
"name": "config",
|
|
514
|
+
"type": "PraxisChartConfig",
|
|
515
|
+
"description": "Runtime chart configuration mapped from or supplied beside the canonical chart document."
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"name": "queryContext",
|
|
519
|
+
"type": "PraxisChartQueryContext | null",
|
|
520
|
+
"description": "Canonical @praxisui/core query context observed by remote datasource requests; flat filters execute in praxis.stats and governed filterExpression is preserved but rejected until stats expression support is proven."
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
"name": "remoteDataResolver",
|
|
524
|
+
"type": "PraxisChartRemoteDataResolver | null",
|
|
525
|
+
"description": "Host-governed remote row resolver for integrations outside the default praxis.stats client."
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
"name": "availableResources",
|
|
529
|
+
"type": "ChartEditorResourceOption[]",
|
|
530
|
+
"description": "Transient authoring catalog: id is the stable /schemas/catalog discovery identity, while path is the governed root-relative operational value persisted to chartDocument.source.resource."
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"name": "availableFields",
|
|
534
|
+
"type": "ChartEditorFieldOption[]",
|
|
535
|
+
"description": "Transient capability-backed field catalog. operations, aggregations and distributionModes declare exact group-by, timeseries, distribution/terms and distribution/histogram eligibility."
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
"name": "availableTargets",
|
|
539
|
+
"type": "ChartEditorTargetOption[]",
|
|
540
|
+
"description": "Transient visual-authoring targets derived from existing top-level composition links to public, non-deprecated widget ports or explicitly writable declared page state; id is the unique authoring identity and events[] declares the exact structured Chart events authorized by compatible links. Raw pointClick evidence never authorizes events.pointClick, which is emitted through pointAction. Local transform.output semantic-kind inspection does not replace a Core-validated transform-output projection (P2), and the visual catalog does not yet publish the target input-schema/port projection required for end-to-end mapping validation."
|
|
541
|
+
}
|
|
542
|
+
],
|
|
543
|
+
"editableTargets": [
|
|
544
|
+
{
|
|
545
|
+
"kind": "chartType",
|
|
546
|
+
"resolver": "x-ui-chart-kind",
|
|
547
|
+
"description": "Canonical `kind` field in PraxisXUiChartContract."
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
"kind": "series",
|
|
551
|
+
"resolver": "x-ui-chart-metric-by-field",
|
|
552
|
+
"description": "Metric-backed series definition in `metrics[]`, keyed by field."
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"kind": "axis",
|
|
556
|
+
"resolver": "x-ui-chart-dimension-or-metric-axis",
|
|
557
|
+
"description": "Dimension role, metric axis and chart orientation semantics."
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"kind": "dataBinding",
|
|
561
|
+
"resolver": "x-ui-chart-source-and-field-catalog",
|
|
562
|
+
"description": "Source, dimensions, metrics and resource/field bindings."
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
"kind": "queryContext",
|
|
566
|
+
"resolver": "praxis-chart-query-context",
|
|
567
|
+
"description": "Runtime @praxisui/core queryContext contract for filters, filterExpression, sort, limit, page and governance metadata."
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"kind": "pointClick",
|
|
571
|
+
"resolver": "x-ui-chart-events-point-click",
|
|
572
|
+
"description": "Raw pointClick evidence plus a separate pointAction output for configured pointClick actions."
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"kind": "crossFilter",
|
|
576
|
+
"resolver": "x-ui-chart-events-cross-filter",
|
|
577
|
+
"description": "Cross-filter event mapping emitted as structured query-context filters."
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"kind": "drilldown",
|
|
581
|
+
"resolver": "x-ui-chart-events-drill-down",
|
|
582
|
+
"description": "Drilldown event mapping and governed target."
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"kind": "selection",
|
|
586
|
+
"resolver": "x-ui-chart-events-selection-change",
|
|
587
|
+
"description": "Single-point selection event enablement and mapping semantics; toggle and multi-select are intentionally not advertised."
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"kind": "legend",
|
|
591
|
+
"resolver": "x-ui-chart-legend-feature",
|
|
592
|
+
"description": "Legend visibility through boolean or toggleable feature object."
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"kind": "tooltip",
|
|
596
|
+
"resolver": "x-ui-chart-tooltip-feature",
|
|
597
|
+
"description": "Tooltip visibility through boolean or toggleable feature object."
|
|
598
|
+
}
|
|
599
|
+
],
|
|
600
|
+
"operations": [
|
|
601
|
+
{
|
|
602
|
+
"operationId": "chart.document.set",
|
|
603
|
+
"title": "Set chart document",
|
|
604
|
+
"scope": "global",
|
|
605
|
+
"targetKind": "dataBinding",
|
|
606
|
+
"target": {
|
|
607
|
+
"kind": "dataBinding",
|
|
608
|
+
"resolver": "x-ui-chart-document-root",
|
|
609
|
+
"ambiguityPolicy": "fail",
|
|
610
|
+
"required": false
|
|
611
|
+
},
|
|
612
|
+
"inputSchema": {
|
|
613
|
+
"type": "object",
|
|
614
|
+
"required": [
|
|
615
|
+
"version",
|
|
616
|
+
"kind",
|
|
617
|
+
"source"
|
|
618
|
+
],
|
|
619
|
+
"properties": {
|
|
620
|
+
"version": {
|
|
621
|
+
"const": "0.1.0"
|
|
622
|
+
},
|
|
623
|
+
"kind": {
|
|
624
|
+
"enum": [
|
|
625
|
+
"bar",
|
|
626
|
+
"combo",
|
|
627
|
+
"horizontal-bar",
|
|
628
|
+
"line",
|
|
629
|
+
"pie",
|
|
630
|
+
"donut",
|
|
631
|
+
"area",
|
|
632
|
+
"stacked-bar",
|
|
633
|
+
"stacked-area",
|
|
634
|
+
"scatter"
|
|
635
|
+
]
|
|
636
|
+
},
|
|
637
|
+
"chartId": {
|
|
638
|
+
"type": "string"
|
|
639
|
+
},
|
|
640
|
+
"title": {
|
|
641
|
+
"oneOf": [
|
|
642
|
+
{
|
|
643
|
+
"type": "string"
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
"type": "object"
|
|
647
|
+
}
|
|
648
|
+
]
|
|
649
|
+
},
|
|
650
|
+
"subtitle": {
|
|
651
|
+
"oneOf": [
|
|
652
|
+
{
|
|
653
|
+
"type": "string"
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
"type": "object"
|
|
657
|
+
}
|
|
658
|
+
]
|
|
659
|
+
},
|
|
660
|
+
"source": {
|
|
661
|
+
"type": "object",
|
|
662
|
+
"required": [
|
|
663
|
+
"kind"
|
|
664
|
+
],
|
|
665
|
+
"properties": {
|
|
666
|
+
"kind": {
|
|
667
|
+
"enum": [
|
|
668
|
+
"praxis.stats",
|
|
669
|
+
"derived"
|
|
670
|
+
]
|
|
671
|
+
},
|
|
672
|
+
"resource": {
|
|
673
|
+
"type": "string"
|
|
674
|
+
},
|
|
675
|
+
"operation": {
|
|
676
|
+
"enum": [
|
|
677
|
+
"group-by",
|
|
678
|
+
"timeseries",
|
|
679
|
+
"distribution",
|
|
680
|
+
"comparison"
|
|
681
|
+
]
|
|
682
|
+
},
|
|
683
|
+
"options": {
|
|
684
|
+
"type": "object",
|
|
685
|
+
"properties": {
|
|
686
|
+
"comparisonPeriod": {
|
|
687
|
+
"type": "object",
|
|
688
|
+
"required": [
|
|
689
|
+
"field",
|
|
690
|
+
"timezone",
|
|
691
|
+
"preset",
|
|
692
|
+
"mode"
|
|
693
|
+
],
|
|
694
|
+
"properties": {
|
|
695
|
+
"field": {
|
|
696
|
+
"type": "string"
|
|
697
|
+
},
|
|
698
|
+
"timezone": {
|
|
699
|
+
"type": "string"
|
|
700
|
+
},
|
|
701
|
+
"preset": {
|
|
702
|
+
"enum": [
|
|
703
|
+
"TODAY",
|
|
704
|
+
"YESTERDAY",
|
|
705
|
+
"LAST_7_DAYS",
|
|
706
|
+
"LAST_30_DAYS",
|
|
707
|
+
"THIS_MONTH",
|
|
708
|
+
"LAST_MONTH",
|
|
709
|
+
"THIS_QUARTER",
|
|
710
|
+
"THIS_YEAR"
|
|
711
|
+
]
|
|
712
|
+
},
|
|
713
|
+
"mode": {
|
|
714
|
+
"enum": [
|
|
715
|
+
"PREVIOUS_ALIGNED",
|
|
716
|
+
"PREVIOUS_CALENDAR_PERIOD"
|
|
717
|
+
]
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
},
|
|
725
|
+
"dimensions": {
|
|
726
|
+
"type": "array",
|
|
727
|
+
"items": {
|
|
728
|
+
"type": "object"
|
|
729
|
+
}
|
|
730
|
+
},
|
|
731
|
+
"metrics": {
|
|
732
|
+
"type": "array",
|
|
733
|
+
"items": {
|
|
734
|
+
"type": "object"
|
|
735
|
+
}
|
|
736
|
+
},
|
|
737
|
+
"events": {
|
|
738
|
+
"type": "object"
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
},
|
|
742
|
+
"effects": [
|
|
743
|
+
{
|
|
744
|
+
"kind": "set-value",
|
|
745
|
+
"path": "chartDocument"
|
|
746
|
+
}
|
|
747
|
+
],
|
|
748
|
+
"destructive": false,
|
|
749
|
+
"requiresConfirmation": false,
|
|
750
|
+
"validators": [
|
|
751
|
+
"chart-document-shape",
|
|
752
|
+
"chart-version-supported",
|
|
753
|
+
"chart-type-series-axis-compatible",
|
|
754
|
+
"editor-runtime-round-trip"
|
|
755
|
+
],
|
|
756
|
+
"affectedPaths": [
|
|
757
|
+
"chartDocument"
|
|
758
|
+
],
|
|
759
|
+
"submissionImpact": "config-only",
|
|
760
|
+
"preconditions": [
|
|
761
|
+
"config-initialized"
|
|
762
|
+
]
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"operationId": "chart.type.set",
|
|
766
|
+
"title": "Set chart type",
|
|
767
|
+
"scope": "global",
|
|
768
|
+
"targetKind": "chartType",
|
|
769
|
+
"target": {
|
|
770
|
+
"kind": "chartType",
|
|
771
|
+
"resolver": "x-ui-chart-kind",
|
|
772
|
+
"ambiguityPolicy": "fail",
|
|
773
|
+
"required": false
|
|
774
|
+
},
|
|
775
|
+
"inputSchema": {
|
|
776
|
+
"type": "object",
|
|
777
|
+
"required": [
|
|
778
|
+
"kind"
|
|
779
|
+
],
|
|
780
|
+
"properties": {
|
|
781
|
+
"kind": {
|
|
782
|
+
"enum": [
|
|
783
|
+
"bar",
|
|
784
|
+
"combo",
|
|
785
|
+
"horizontal-bar",
|
|
786
|
+
"line",
|
|
787
|
+
"pie",
|
|
788
|
+
"donut",
|
|
789
|
+
"area",
|
|
790
|
+
"stacked-bar",
|
|
791
|
+
"stacked-area",
|
|
792
|
+
"scatter"
|
|
793
|
+
]
|
|
794
|
+
},
|
|
795
|
+
"orientation": {
|
|
796
|
+
"enum": [
|
|
797
|
+
"vertical",
|
|
798
|
+
"horizontal"
|
|
799
|
+
]
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
},
|
|
803
|
+
"effects": [
|
|
804
|
+
{
|
|
805
|
+
"kind": "merge-object",
|
|
806
|
+
"path": "chartDocument"
|
|
807
|
+
}
|
|
808
|
+
],
|
|
809
|
+
"destructive": false,
|
|
810
|
+
"requiresConfirmation": false,
|
|
811
|
+
"validators": [
|
|
812
|
+
"chart-type-supported",
|
|
813
|
+
"chart-type-series-axis-compatible",
|
|
814
|
+
"pie-single-metric",
|
|
815
|
+
"combo-minimum-series",
|
|
816
|
+
"editor-runtime-round-trip"
|
|
817
|
+
],
|
|
818
|
+
"affectedPaths": [
|
|
819
|
+
"chartDocument.kind",
|
|
820
|
+
"chartDocument.orientation",
|
|
821
|
+
"chartDocument.metrics[]",
|
|
822
|
+
"chartDocument.dimensions[]"
|
|
823
|
+
],
|
|
824
|
+
"submissionImpact": "config-only",
|
|
825
|
+
"preconditions": [
|
|
826
|
+
"config-initialized"
|
|
827
|
+
]
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"operationId": "series.add",
|
|
831
|
+
"title": "Add chart series",
|
|
832
|
+
"scope": "dataBinding",
|
|
833
|
+
"targetKind": "series",
|
|
834
|
+
"target": {
|
|
835
|
+
"kind": "series",
|
|
836
|
+
"resolver": "x-ui-chart-metric-by-field",
|
|
837
|
+
"ambiguityPolicy": "fail",
|
|
838
|
+
"required": false
|
|
839
|
+
},
|
|
840
|
+
"inputSchema": {
|
|
841
|
+
"type": "object",
|
|
842
|
+
"required": [
|
|
843
|
+
"field"
|
|
844
|
+
],
|
|
845
|
+
"properties": {
|
|
846
|
+
"field": {
|
|
847
|
+
"type": "string"
|
|
848
|
+
},
|
|
849
|
+
"label": {
|
|
850
|
+
"oneOf": [
|
|
851
|
+
{
|
|
852
|
+
"type": "string"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"type": "object"
|
|
856
|
+
}
|
|
857
|
+
]
|
|
858
|
+
},
|
|
859
|
+
"aggregation": {
|
|
860
|
+
"enum": [
|
|
861
|
+
"sum",
|
|
862
|
+
"avg",
|
|
863
|
+
"min",
|
|
864
|
+
"max",
|
|
865
|
+
"count",
|
|
866
|
+
"distinct-count"
|
|
867
|
+
]
|
|
868
|
+
},
|
|
869
|
+
"seriesKind": {
|
|
870
|
+
"enum": [
|
|
871
|
+
"bar",
|
|
872
|
+
"line",
|
|
873
|
+
"area"
|
|
874
|
+
]
|
|
875
|
+
},
|
|
876
|
+
"axis": {
|
|
877
|
+
"enum": [
|
|
878
|
+
"primary",
|
|
879
|
+
"secondary"
|
|
880
|
+
]
|
|
881
|
+
},
|
|
882
|
+
"color": {
|
|
883
|
+
"type": "string"
|
|
884
|
+
},
|
|
885
|
+
"format": {
|
|
886
|
+
"type": "string"
|
|
887
|
+
},
|
|
888
|
+
"afterField": {
|
|
889
|
+
"type": "string"
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
},
|
|
893
|
+
"effects": [
|
|
894
|
+
{
|
|
895
|
+
"kind": "compile-domain-patch",
|
|
896
|
+
"handler": "chart-series-add",
|
|
897
|
+
"handlerContract": {
|
|
898
|
+
"reads": [
|
|
899
|
+
"chartDocument.kind",
|
|
900
|
+
"chartDocument.metrics[]",
|
|
901
|
+
"availableFields[]"
|
|
902
|
+
],
|
|
903
|
+
"writes": [
|
|
904
|
+
"chartDocument.metrics[]"
|
|
905
|
+
],
|
|
906
|
+
"identityKeys": [
|
|
907
|
+
"chartDocument.metrics[].field"
|
|
908
|
+
],
|
|
909
|
+
"inputSchema": {
|
|
910
|
+
"type": "object",
|
|
911
|
+
"required": [
|
|
912
|
+
"field"
|
|
913
|
+
],
|
|
914
|
+
"properties": {
|
|
915
|
+
"field": {
|
|
916
|
+
"type": "string"
|
|
917
|
+
},
|
|
918
|
+
"label": {
|
|
919
|
+
"oneOf": [
|
|
920
|
+
{
|
|
921
|
+
"type": "string"
|
|
922
|
+
},
|
|
923
|
+
{
|
|
924
|
+
"type": "object"
|
|
925
|
+
}
|
|
926
|
+
]
|
|
927
|
+
},
|
|
928
|
+
"aggregation": {
|
|
929
|
+
"enum": [
|
|
930
|
+
"sum",
|
|
931
|
+
"avg",
|
|
932
|
+
"min",
|
|
933
|
+
"max",
|
|
934
|
+
"count",
|
|
935
|
+
"distinct-count"
|
|
936
|
+
]
|
|
937
|
+
},
|
|
938
|
+
"seriesKind": {
|
|
939
|
+
"enum": [
|
|
940
|
+
"bar",
|
|
941
|
+
"line",
|
|
942
|
+
"area"
|
|
943
|
+
]
|
|
944
|
+
},
|
|
945
|
+
"axis": {
|
|
946
|
+
"enum": [
|
|
947
|
+
"primary",
|
|
948
|
+
"secondary"
|
|
949
|
+
]
|
|
950
|
+
},
|
|
951
|
+
"color": {
|
|
952
|
+
"type": "string"
|
|
953
|
+
},
|
|
954
|
+
"format": {
|
|
955
|
+
"type": "string"
|
|
956
|
+
},
|
|
957
|
+
"afterField": {
|
|
958
|
+
"type": "string"
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
},
|
|
962
|
+
"failureModes": [
|
|
963
|
+
"field-not-in-catalog",
|
|
964
|
+
"duplicate-series-field",
|
|
965
|
+
"aggregation-not-supported",
|
|
966
|
+
"chart-type-series-incompatible"
|
|
967
|
+
],
|
|
968
|
+
"description": "Adds a metric-backed series by semantic field, validating it against availableFields and chart kind compatibility before patching metrics[]."
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
],
|
|
972
|
+
"destructive": false,
|
|
973
|
+
"requiresConfirmation": false,
|
|
974
|
+
"validators": [
|
|
975
|
+
"series-field-exists",
|
|
976
|
+
"series-field-aggregable",
|
|
977
|
+
"series-id-unique",
|
|
978
|
+
"chart-type-series-axis-compatible",
|
|
979
|
+
"editor-runtime-round-trip"
|
|
980
|
+
],
|
|
981
|
+
"affectedPaths": [
|
|
982
|
+
"chartDocument.metrics[]"
|
|
983
|
+
],
|
|
984
|
+
"submissionImpact": "config-only",
|
|
985
|
+
"preconditions": [
|
|
986
|
+
"config-initialized"
|
|
987
|
+
]
|
|
988
|
+
},
|
|
989
|
+
{
|
|
990
|
+
"operationId": "series.remove",
|
|
991
|
+
"title": "Remove chart series",
|
|
992
|
+
"scope": "dataBinding",
|
|
993
|
+
"targetKind": "series",
|
|
994
|
+
"target": {
|
|
995
|
+
"kind": "series",
|
|
996
|
+
"resolver": "x-ui-chart-metric-by-field",
|
|
997
|
+
"ambiguityPolicy": "fail",
|
|
998
|
+
"required": true
|
|
999
|
+
},
|
|
1000
|
+
"inputSchema": {
|
|
1001
|
+
"type": "object",
|
|
1002
|
+
"required": [
|
|
1003
|
+
"field"
|
|
1004
|
+
],
|
|
1005
|
+
"properties": {
|
|
1006
|
+
"field": {
|
|
1007
|
+
"type": "string"
|
|
1008
|
+
},
|
|
1009
|
+
"replacementField": {
|
|
1010
|
+
"type": "string"
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
},
|
|
1014
|
+
"effects": [
|
|
1015
|
+
{
|
|
1016
|
+
"kind": "remove-by-key",
|
|
1017
|
+
"path": "chartDocument.metrics[]",
|
|
1018
|
+
"key": "field"
|
|
1019
|
+
}
|
|
1020
|
+
],
|
|
1021
|
+
"destructive": true,
|
|
1022
|
+
"requiresConfirmation": true,
|
|
1023
|
+
"validators": [
|
|
1024
|
+
"series-exists",
|
|
1025
|
+
"destructive-series-removal-confirmed",
|
|
1026
|
+
"chart-keeps-required-metric",
|
|
1027
|
+
"editor-runtime-round-trip"
|
|
1028
|
+
],
|
|
1029
|
+
"affectedPaths": [
|
|
1030
|
+
"chartDocument.metrics[]"
|
|
1031
|
+
],
|
|
1032
|
+
"submissionImpact": "config-only",
|
|
1033
|
+
"preconditions": [
|
|
1034
|
+
"config-initialized",
|
|
1035
|
+
"target-series-exists",
|
|
1036
|
+
"confirmation-collected"
|
|
1037
|
+
]
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
"operationId": "axis.configure",
|
|
1041
|
+
"title": "Configure chart axis",
|
|
1042
|
+
"scope": "dataBinding",
|
|
1043
|
+
"targetKind": "axis",
|
|
1044
|
+
"target": {
|
|
1045
|
+
"kind": "axis",
|
|
1046
|
+
"resolver": "x-ui-chart-dimension-or-metric-axis",
|
|
1047
|
+
"ambiguityPolicy": "fail",
|
|
1048
|
+
"required": true
|
|
1049
|
+
},
|
|
1050
|
+
"inputSchema": {
|
|
1051
|
+
"type": "object",
|
|
1052
|
+
"properties": {
|
|
1053
|
+
"dimensionField": {
|
|
1054
|
+
"type": "string"
|
|
1055
|
+
},
|
|
1056
|
+
"dimensionRole": {
|
|
1057
|
+
"enum": [
|
|
1058
|
+
"category",
|
|
1059
|
+
"series",
|
|
1060
|
+
"segment",
|
|
1061
|
+
"time",
|
|
1062
|
+
"value"
|
|
1063
|
+
]
|
|
1064
|
+
},
|
|
1065
|
+
"metricField": {
|
|
1066
|
+
"type": "string"
|
|
1067
|
+
},
|
|
1068
|
+
"metricAxis": {
|
|
1069
|
+
"enum": [
|
|
1070
|
+
"primary",
|
|
1071
|
+
"secondary"
|
|
1072
|
+
]
|
|
1073
|
+
},
|
|
1074
|
+
"orientation": {
|
|
1075
|
+
"enum": [
|
|
1076
|
+
"vertical",
|
|
1077
|
+
"horizontal"
|
|
1078
|
+
]
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
"effects": [
|
|
1083
|
+
{
|
|
1084
|
+
"kind": "compile-domain-patch",
|
|
1085
|
+
"handler": "chart-axis-configure",
|
|
1086
|
+
"handlerContract": {
|
|
1087
|
+
"reads": [
|
|
1088
|
+
"chartDocument.kind",
|
|
1089
|
+
"chartDocument.dimensions[]",
|
|
1090
|
+
"chartDocument.metrics[]",
|
|
1091
|
+
"availableFields[]"
|
|
1092
|
+
],
|
|
1093
|
+
"writes": [
|
|
1094
|
+
"chartDocument.dimensions[]",
|
|
1095
|
+
"chartDocument.metrics[]",
|
|
1096
|
+
"chartDocument.orientation"
|
|
1097
|
+
],
|
|
1098
|
+
"identityKeys": [
|
|
1099
|
+
"chartDocument.dimensions[].field",
|
|
1100
|
+
"chartDocument.metrics[].field"
|
|
1101
|
+
],
|
|
1102
|
+
"inputSchema": {
|
|
1103
|
+
"type": "object",
|
|
1104
|
+
"properties": {
|
|
1105
|
+
"dimensionField": {
|
|
1106
|
+
"type": "string"
|
|
1107
|
+
},
|
|
1108
|
+
"dimensionRole": {
|
|
1109
|
+
"enum": [
|
|
1110
|
+
"category",
|
|
1111
|
+
"series",
|
|
1112
|
+
"segment",
|
|
1113
|
+
"time",
|
|
1114
|
+
"value"
|
|
1115
|
+
]
|
|
1116
|
+
},
|
|
1117
|
+
"metricField": {
|
|
1118
|
+
"type": "string"
|
|
1119
|
+
},
|
|
1120
|
+
"metricAxis": {
|
|
1121
|
+
"enum": [
|
|
1122
|
+
"primary",
|
|
1123
|
+
"secondary"
|
|
1124
|
+
]
|
|
1125
|
+
},
|
|
1126
|
+
"orientation": {
|
|
1127
|
+
"enum": [
|
|
1128
|
+
"vertical",
|
|
1129
|
+
"horizontal"
|
|
1130
|
+
]
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
"failureModes": [
|
|
1135
|
+
"field-not-in-catalog",
|
|
1136
|
+
"secondary-axis-non-combo",
|
|
1137
|
+
"missing-required-dimension",
|
|
1138
|
+
"axis-role-incompatible"
|
|
1139
|
+
],
|
|
1140
|
+
"description": "Configures dimensions and metric axes using semantic fields, preserving combo-only secondary axis constraints."
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
],
|
|
1144
|
+
"destructive": false,
|
|
1145
|
+
"requiresConfirmation": false,
|
|
1146
|
+
"validators": [
|
|
1147
|
+
"axis-field-exists",
|
|
1148
|
+
"secondary-axis-combo-only",
|
|
1149
|
+
"cartesian-dimension-required",
|
|
1150
|
+
"editor-runtime-round-trip"
|
|
1151
|
+
],
|
|
1152
|
+
"affectedPaths": [
|
|
1153
|
+
"chartDocument.dimensions[]",
|
|
1154
|
+
"chartDocument.metrics[].axis",
|
|
1155
|
+
"chartDocument.orientation"
|
|
1156
|
+
],
|
|
1157
|
+
"submissionImpact": "config-only",
|
|
1158
|
+
"preconditions": [
|
|
1159
|
+
"config-initialized"
|
|
1160
|
+
]
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
"operationId": "data.resource.bind",
|
|
1164
|
+
"title": "Bind chart data resource",
|
|
1165
|
+
"scope": "dataBinding",
|
|
1166
|
+
"targetKind": "dataBinding",
|
|
1167
|
+
"target": {
|
|
1168
|
+
"kind": "dataBinding",
|
|
1169
|
+
"resolver": "x-ui-chart-source-and-field-catalog",
|
|
1170
|
+
"ambiguityPolicy": "fail",
|
|
1171
|
+
"required": false
|
|
1172
|
+
},
|
|
1173
|
+
"inputSchema": {
|
|
1174
|
+
"type": "object",
|
|
1175
|
+
"required": [
|
|
1176
|
+
"sourceKind"
|
|
1177
|
+
],
|
|
1178
|
+
"properties": {
|
|
1179
|
+
"sourceKind": {
|
|
1180
|
+
"enum": [
|
|
1181
|
+
"praxis.stats",
|
|
1182
|
+
"derived"
|
|
1183
|
+
]
|
|
1184
|
+
},
|
|
1185
|
+
"resource": {
|
|
1186
|
+
"type": "string",
|
|
1187
|
+
"pattern": "^/(?!/)"
|
|
1188
|
+
},
|
|
1189
|
+
"operation": {},
|
|
1190
|
+
"dimensions": {
|
|
1191
|
+
"type": "array",
|
|
1192
|
+
"items": {
|
|
1193
|
+
"type": "object",
|
|
1194
|
+
"required": [
|
|
1195
|
+
"field"
|
|
1196
|
+
],
|
|
1197
|
+
"properties": {
|
|
1198
|
+
"field": {
|
|
1199
|
+
"type": "string"
|
|
1200
|
+
},
|
|
1201
|
+
"role": {
|
|
1202
|
+
"type": "string"
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
},
|
|
1207
|
+
"metrics": {
|
|
1208
|
+
"type": "array",
|
|
1209
|
+
"items": {
|
|
1210
|
+
"type": "object",
|
|
1211
|
+
"required": [
|
|
1212
|
+
"field"
|
|
1213
|
+
],
|
|
1214
|
+
"properties": {
|
|
1215
|
+
"field": {
|
|
1216
|
+
"type": "string"
|
|
1217
|
+
},
|
|
1218
|
+
"label": {
|
|
1219
|
+
"oneOf": [
|
|
1220
|
+
{
|
|
1221
|
+
"type": "string"
|
|
1222
|
+
},
|
|
1223
|
+
{
|
|
1224
|
+
"type": "object"
|
|
1225
|
+
}
|
|
1226
|
+
]
|
|
1227
|
+
},
|
|
1228
|
+
"aggregation": {
|
|
1229
|
+
"enum": [
|
|
1230
|
+
"sum",
|
|
1231
|
+
"avg",
|
|
1232
|
+
"min",
|
|
1233
|
+
"max",
|
|
1234
|
+
"count",
|
|
1235
|
+
"distinct-count"
|
|
1236
|
+
]
|
|
1237
|
+
},
|
|
1238
|
+
"seriesKind": {
|
|
1239
|
+
"enum": [
|
|
1240
|
+
"bar",
|
|
1241
|
+
"line",
|
|
1242
|
+
"area"
|
|
1243
|
+
]
|
|
1244
|
+
},
|
|
1245
|
+
"axis": {
|
|
1246
|
+
"enum": [
|
|
1247
|
+
"primary",
|
|
1248
|
+
"secondary"
|
|
1249
|
+
]
|
|
1250
|
+
},
|
|
1251
|
+
"color": {
|
|
1252
|
+
"type": "string"
|
|
1253
|
+
},
|
|
1254
|
+
"format": {
|
|
1255
|
+
"type": "string"
|
|
1256
|
+
},
|
|
1257
|
+
"afterField": {
|
|
1258
|
+
"type": "string"
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
},
|
|
1265
|
+
"effects": [
|
|
1266
|
+
{
|
|
1267
|
+
"kind": "compile-domain-patch",
|
|
1268
|
+
"handler": "chart-data-resource-bind",
|
|
1269
|
+
"handlerContract": {
|
|
1270
|
+
"reads": [
|
|
1271
|
+
"availableResources[]",
|
|
1272
|
+
"availableFields[]",
|
|
1273
|
+
"chartDocument.source",
|
|
1274
|
+
"chartDocument.dimensions[]",
|
|
1275
|
+
"chartDocument.metrics[]"
|
|
1276
|
+
],
|
|
1277
|
+
"writes": [
|
|
1278
|
+
"chartDocument.source",
|
|
1279
|
+
"chartDocument.source.options.comparisonPeriod",
|
|
1280
|
+
"chartDocument.dimensions[]",
|
|
1281
|
+
"chartDocument.metrics[]"
|
|
1282
|
+
],
|
|
1283
|
+
"identityKeys": [
|
|
1284
|
+
"availableResources[].path",
|
|
1285
|
+
"availableFields[].field"
|
|
1286
|
+
],
|
|
1287
|
+
"inputSchema": {
|
|
1288
|
+
"type": "object",
|
|
1289
|
+
"required": [
|
|
1290
|
+
"sourceKind"
|
|
1291
|
+
],
|
|
1292
|
+
"properties": {
|
|
1293
|
+
"sourceKind": {
|
|
1294
|
+
"enum": [
|
|
1295
|
+
"praxis.stats",
|
|
1296
|
+
"derived"
|
|
1297
|
+
]
|
|
1298
|
+
},
|
|
1299
|
+
"resource": {
|
|
1300
|
+
"type": "string",
|
|
1301
|
+
"pattern": "^/(?!/)"
|
|
1302
|
+
},
|
|
1303
|
+
"operation": {},
|
|
1304
|
+
"dimensions": {
|
|
1305
|
+
"type": "array"
|
|
1306
|
+
},
|
|
1307
|
+
"metrics": {
|
|
1308
|
+
"type": "array"
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
},
|
|
1312
|
+
"failureModes": [
|
|
1313
|
+
"resource-not-in-api-metadata",
|
|
1314
|
+
"field-not-in-schema",
|
|
1315
|
+
"stats-operation-not-supported",
|
|
1316
|
+
"comparison-period-incomplete",
|
|
1317
|
+
"comparison-metric-unsupported",
|
|
1318
|
+
"remote-binding-incomplete"
|
|
1319
|
+
],
|
|
1320
|
+
"description": "Binds a derived or praxis.stats source using governed resource, capability and field catalogs. For praxis.stats, availableResources[].id is discovery-only: validation requires the matching availableResources[].path and compilation persists that path. Comparison requires one canonical operation, metrics[] and an eligible period field."
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
],
|
|
1324
|
+
"destructive": false,
|
|
1325
|
+
"requiresConfirmation": false,
|
|
1326
|
+
"validators": [
|
|
1327
|
+
"remote-resource-in-api-metadata",
|
|
1328
|
+
"bound-fields-exist",
|
|
1329
|
+
"stats-operation-supported",
|
|
1330
|
+
"comparison-period-complete",
|
|
1331
|
+
"comparison-metrics-supported",
|
|
1332
|
+
"editor-runtime-round-trip"
|
|
1333
|
+
],
|
|
1334
|
+
"affectedPaths": [
|
|
1335
|
+
"chartDocument.source",
|
|
1336
|
+
"chartDocument.source.options.comparisonPeriod",
|
|
1337
|
+
"chartDocument.dimensions[]",
|
|
1338
|
+
"chartDocument.metrics[]"
|
|
1339
|
+
],
|
|
1340
|
+
"submissionImpact": "affects-remote-binding",
|
|
1341
|
+
"preconditions": [
|
|
1342
|
+
"config-initialized"
|
|
1343
|
+
]
|
|
1344
|
+
},
|
|
1345
|
+
{
|
|
1346
|
+
"operationId": "queryContext.set",
|
|
1347
|
+
"title": "Set chart query context",
|
|
1348
|
+
"scope": "dataBinding",
|
|
1349
|
+
"targetKind": "queryContext",
|
|
1350
|
+
"target": {
|
|
1351
|
+
"kind": "queryContext",
|
|
1352
|
+
"resolver": "praxis-chart-query-context",
|
|
1353
|
+
"ambiguityPolicy": "fail",
|
|
1354
|
+
"required": false
|
|
1355
|
+
},
|
|
1356
|
+
"inputSchema": {
|
|
1357
|
+
"type": "object",
|
|
1358
|
+
"properties": {
|
|
1359
|
+
"filters": {
|
|
1360
|
+
"type": "object"
|
|
1361
|
+
},
|
|
1362
|
+
"filterExpression": {
|
|
1363
|
+
"type": "object"
|
|
1364
|
+
},
|
|
1365
|
+
"sort": {
|
|
1366
|
+
"type": "array",
|
|
1367
|
+
"items": {
|
|
1368
|
+
"type": "string"
|
|
1369
|
+
}
|
|
1370
|
+
},
|
|
1371
|
+
"limit": {
|
|
1372
|
+
"type": "number"
|
|
1373
|
+
},
|
|
1374
|
+
"page": {
|
|
1375
|
+
"type": "object"
|
|
1376
|
+
},
|
|
1377
|
+
"meta": {
|
|
1378
|
+
"type": "object"
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
},
|
|
1382
|
+
"effects": [
|
|
1383
|
+
{
|
|
1384
|
+
"kind": "set-value",
|
|
1385
|
+
"path": "queryContext"
|
|
1386
|
+
}
|
|
1387
|
+
],
|
|
1388
|
+
"destructive": false,
|
|
1389
|
+
"requiresConfirmation": false,
|
|
1390
|
+
"validators": [
|
|
1391
|
+
"query-context-structured",
|
|
1392
|
+
"query-context-filter-expression-stats-unsupported",
|
|
1393
|
+
"query-context-fields-exist",
|
|
1394
|
+
"query-context-safe-values",
|
|
1395
|
+
"editor-runtime-round-trip"
|
|
1396
|
+
],
|
|
1397
|
+
"affectedPaths": [
|
|
1398
|
+
"queryContext"
|
|
1399
|
+
],
|
|
1400
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1401
|
+
"preconditions": [
|
|
1402
|
+
"config-initialized"
|
|
1403
|
+
]
|
|
1404
|
+
},
|
|
1405
|
+
{
|
|
1406
|
+
"operationId": "pointClick.configure",
|
|
1407
|
+
"title": "Configure chart point click",
|
|
1408
|
+
"scope": "eventMapping",
|
|
1409
|
+
"targetKind": "pointClick",
|
|
1410
|
+
"target": {
|
|
1411
|
+
"kind": "pointClick",
|
|
1412
|
+
"resolver": "x-ui-chart-events-point-click",
|
|
1413
|
+
"ambiguityPolicy": "fail",
|
|
1414
|
+
"required": false
|
|
1415
|
+
},
|
|
1416
|
+
"inputSchema": {
|
|
1417
|
+
"type": "object",
|
|
1418
|
+
"required": [
|
|
1419
|
+
"action"
|
|
1420
|
+
],
|
|
1421
|
+
"properties": {
|
|
1422
|
+
"action": {
|
|
1423
|
+
"enum": [
|
|
1424
|
+
"filter-widget",
|
|
1425
|
+
"open-detail",
|
|
1426
|
+
"navigate",
|
|
1427
|
+
"update-context",
|
|
1428
|
+
"emit"
|
|
1429
|
+
]
|
|
1430
|
+
},
|
|
1431
|
+
"target": {
|
|
1432
|
+
"type": "string"
|
|
1433
|
+
},
|
|
1434
|
+
"mapping": {
|
|
1435
|
+
"type": "object",
|
|
1436
|
+
"additionalProperties": {
|
|
1437
|
+
"type": "string"
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
},
|
|
1442
|
+
"effects": [
|
|
1443
|
+
{
|
|
1444
|
+
"kind": "compile-domain-patch",
|
|
1445
|
+
"handler": "chart-event-point-click-configure",
|
|
1446
|
+
"handlerContract": {
|
|
1447
|
+
"reads": [
|
|
1448
|
+
"chartDocument.events.pointClick",
|
|
1449
|
+
"chartDocument.dimensions[]",
|
|
1450
|
+
"availableTargets[]"
|
|
1451
|
+
],
|
|
1452
|
+
"writes": [
|
|
1453
|
+
"chartDocument.events.pointClick"
|
|
1454
|
+
],
|
|
1455
|
+
"identityKeys": [
|
|
1456
|
+
"availableTargets[].id"
|
|
1457
|
+
],
|
|
1458
|
+
"inputSchema": {
|
|
1459
|
+
"type": "object",
|
|
1460
|
+
"required": [
|
|
1461
|
+
"action"
|
|
1462
|
+
],
|
|
1463
|
+
"properties": {
|
|
1464
|
+
"action": {
|
|
1465
|
+
"enum": [
|
|
1466
|
+
"filter-widget",
|
|
1467
|
+
"open-detail",
|
|
1468
|
+
"navigate",
|
|
1469
|
+
"update-context",
|
|
1470
|
+
"emit"
|
|
1471
|
+
]
|
|
1472
|
+
},
|
|
1473
|
+
"target": {
|
|
1474
|
+
"type": "string"
|
|
1475
|
+
},
|
|
1476
|
+
"mapping": {
|
|
1477
|
+
"type": "object",
|
|
1478
|
+
"additionalProperties": {
|
|
1479
|
+
"type": "string"
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
},
|
|
1484
|
+
"failureModes": [
|
|
1485
|
+
"target-not-in-catalog",
|
|
1486
|
+
"mapping-source-field-missing",
|
|
1487
|
+
"mapping-target-invalid",
|
|
1488
|
+
"unsafe-event-action"
|
|
1489
|
+
],
|
|
1490
|
+
"description": "Configures pointClick through the pointAction output while keeping pointClick as raw point evidence."
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
],
|
|
1494
|
+
"destructive": false,
|
|
1495
|
+
"requiresConfirmation": false,
|
|
1496
|
+
"validators": [
|
|
1497
|
+
"point-click-action-structured",
|
|
1498
|
+
"event-target-governed",
|
|
1499
|
+
"event-mapping-fields-exist",
|
|
1500
|
+
"event-action-supported",
|
|
1501
|
+
"editor-runtime-round-trip"
|
|
1502
|
+
],
|
|
1503
|
+
"affectedPaths": [
|
|
1504
|
+
"chartDocument.events.pointClick"
|
|
1505
|
+
],
|
|
1506
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1507
|
+
"preconditions": [
|
|
1508
|
+
"config-initialized"
|
|
1509
|
+
]
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
"operationId": "crossFilter.configure",
|
|
1513
|
+
"title": "Configure chart cross-filter",
|
|
1514
|
+
"scope": "eventMapping",
|
|
1515
|
+
"targetKind": "crossFilter",
|
|
1516
|
+
"target": {
|
|
1517
|
+
"kind": "crossFilter",
|
|
1518
|
+
"resolver": "x-ui-chart-events-cross-filter",
|
|
1519
|
+
"ambiguityPolicy": "fail",
|
|
1520
|
+
"required": false
|
|
1521
|
+
},
|
|
1522
|
+
"inputSchema": {
|
|
1523
|
+
"type": "object",
|
|
1524
|
+
"required": [
|
|
1525
|
+
"action"
|
|
1526
|
+
],
|
|
1527
|
+
"properties": {
|
|
1528
|
+
"action": {
|
|
1529
|
+
"enum": [
|
|
1530
|
+
"filter-widget",
|
|
1531
|
+
"open-detail",
|
|
1532
|
+
"navigate",
|
|
1533
|
+
"update-context",
|
|
1534
|
+
"emit"
|
|
1535
|
+
]
|
|
1536
|
+
},
|
|
1537
|
+
"target": {
|
|
1538
|
+
"type": "string"
|
|
1539
|
+
},
|
|
1540
|
+
"mapping": {
|
|
1541
|
+
"type": "object",
|
|
1542
|
+
"additionalProperties": {
|
|
1543
|
+
"type": "string"
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
},
|
|
1548
|
+
"effects": [
|
|
1549
|
+
{
|
|
1550
|
+
"kind": "compile-domain-patch",
|
|
1551
|
+
"handler": "chart-event-cross-filter-configure",
|
|
1552
|
+
"handlerContract": {
|
|
1553
|
+
"reads": [
|
|
1554
|
+
"chartDocument.events.crossFilter",
|
|
1555
|
+
"chartDocument.dimensions[]",
|
|
1556
|
+
"availableTargets[]"
|
|
1557
|
+
],
|
|
1558
|
+
"writes": [
|
|
1559
|
+
"chartDocument.events.crossFilter"
|
|
1560
|
+
],
|
|
1561
|
+
"identityKeys": [
|
|
1562
|
+
"availableTargets[].id"
|
|
1563
|
+
],
|
|
1564
|
+
"inputSchema": {
|
|
1565
|
+
"type": "object",
|
|
1566
|
+
"required": [
|
|
1567
|
+
"action"
|
|
1568
|
+
],
|
|
1569
|
+
"properties": {
|
|
1570
|
+
"action": {
|
|
1571
|
+
"enum": [
|
|
1572
|
+
"filter-widget",
|
|
1573
|
+
"open-detail",
|
|
1574
|
+
"navigate",
|
|
1575
|
+
"update-context",
|
|
1576
|
+
"emit"
|
|
1577
|
+
]
|
|
1578
|
+
},
|
|
1579
|
+
"target": {
|
|
1580
|
+
"type": "string"
|
|
1581
|
+
},
|
|
1582
|
+
"mapping": {
|
|
1583
|
+
"type": "object",
|
|
1584
|
+
"additionalProperties": {
|
|
1585
|
+
"type": "string"
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
},
|
|
1590
|
+
"failureModes": [
|
|
1591
|
+
"target-not-in-catalog",
|
|
1592
|
+
"mapping-source-field-missing",
|
|
1593
|
+
"mapping-target-invalid",
|
|
1594
|
+
"unsafe-event-action"
|
|
1595
|
+
],
|
|
1596
|
+
"description": "Configures crossFilter as a structured event action emitted through the crossFilter output with safe query-context filters to a governed target. For praxis.stats rows, key is governed bucket identity and label is presentation evidence; mappings may use key when the target schema accepts that identity."
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
],
|
|
1600
|
+
"destructive": false,
|
|
1601
|
+
"requiresConfirmation": false,
|
|
1602
|
+
"validators": [
|
|
1603
|
+
"cross-filter-output-structured",
|
|
1604
|
+
"event-target-governed",
|
|
1605
|
+
"event-mapping-fields-exist",
|
|
1606
|
+
"editor-runtime-round-trip"
|
|
1607
|
+
],
|
|
1608
|
+
"affectedPaths": [
|
|
1609
|
+
"chartDocument.events.crossFilter"
|
|
1610
|
+
],
|
|
1611
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1612
|
+
"preconditions": [
|
|
1613
|
+
"config-initialized"
|
|
1614
|
+
]
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
"operationId": "drilldown.configure",
|
|
1618
|
+
"title": "Configure chart drilldown",
|
|
1619
|
+
"scope": "eventMapping",
|
|
1620
|
+
"targetKind": "drilldown",
|
|
1621
|
+
"target": {
|
|
1622
|
+
"kind": "drilldown",
|
|
1623
|
+
"resolver": "x-ui-chart-events-drill-down",
|
|
1624
|
+
"ambiguityPolicy": "fail",
|
|
1625
|
+
"required": false
|
|
1626
|
+
},
|
|
1627
|
+
"inputSchema": {
|
|
1628
|
+
"type": "object",
|
|
1629
|
+
"required": [
|
|
1630
|
+
"action"
|
|
1631
|
+
],
|
|
1632
|
+
"properties": {
|
|
1633
|
+
"action": {
|
|
1634
|
+
"enum": [
|
|
1635
|
+
"filter-widget",
|
|
1636
|
+
"open-detail",
|
|
1637
|
+
"navigate",
|
|
1638
|
+
"update-context",
|
|
1639
|
+
"emit"
|
|
1640
|
+
]
|
|
1641
|
+
},
|
|
1642
|
+
"target": {
|
|
1643
|
+
"type": "string"
|
|
1644
|
+
},
|
|
1645
|
+
"mapping": {
|
|
1646
|
+
"type": "object",
|
|
1647
|
+
"additionalProperties": {
|
|
1648
|
+
"type": "string"
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
},
|
|
1653
|
+
"effects": [
|
|
1654
|
+
{
|
|
1655
|
+
"kind": "compile-domain-patch",
|
|
1656
|
+
"handler": "chart-event-drilldown-configure",
|
|
1657
|
+
"handlerContract": {
|
|
1658
|
+
"reads": [
|
|
1659
|
+
"chartDocument.events.drillDown",
|
|
1660
|
+
"chartDocument.dimensions[]",
|
|
1661
|
+
"availableTargets[]"
|
|
1662
|
+
],
|
|
1663
|
+
"writes": [
|
|
1664
|
+
"chartDocument.events.drillDown"
|
|
1665
|
+
],
|
|
1666
|
+
"identityKeys": [
|
|
1667
|
+
"availableTargets[].id"
|
|
1668
|
+
],
|
|
1669
|
+
"inputSchema": {
|
|
1670
|
+
"type": "object",
|
|
1671
|
+
"required": [
|
|
1672
|
+
"action"
|
|
1673
|
+
],
|
|
1674
|
+
"properties": {
|
|
1675
|
+
"action": {
|
|
1676
|
+
"enum": [
|
|
1677
|
+
"filter-widget",
|
|
1678
|
+
"open-detail",
|
|
1679
|
+
"navigate",
|
|
1680
|
+
"update-context",
|
|
1681
|
+
"emit"
|
|
1682
|
+
]
|
|
1683
|
+
},
|
|
1684
|
+
"target": {
|
|
1685
|
+
"type": "string"
|
|
1686
|
+
},
|
|
1687
|
+
"mapping": {
|
|
1688
|
+
"type": "object",
|
|
1689
|
+
"additionalProperties": {
|
|
1690
|
+
"type": "string"
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
},
|
|
1695
|
+
"failureModes": [
|
|
1696
|
+
"target-not-in-catalog",
|
|
1697
|
+
"mapping-source-field-missing",
|
|
1698
|
+
"drilldown-target-invalid",
|
|
1699
|
+
"unsafe-event-action"
|
|
1700
|
+
],
|
|
1701
|
+
"description": "Configures drillDown through the dedicated drillDown output with governed route/widget targets and structured field mappings."
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
],
|
|
1705
|
+
"destructive": false,
|
|
1706
|
+
"requiresConfirmation": false,
|
|
1707
|
+
"validators": [
|
|
1708
|
+
"drilldown-target-governed",
|
|
1709
|
+
"event-mapping-fields-exist",
|
|
1710
|
+
"event-action-supported",
|
|
1711
|
+
"editor-runtime-round-trip"
|
|
1712
|
+
],
|
|
1713
|
+
"affectedPaths": [
|
|
1714
|
+
"chartDocument.events.drillDown"
|
|
1715
|
+
],
|
|
1716
|
+
"submissionImpact": "config-only",
|
|
1717
|
+
"preconditions": [
|
|
1718
|
+
"config-initialized"
|
|
1719
|
+
]
|
|
1720
|
+
},
|
|
1721
|
+
{
|
|
1722
|
+
"operationId": "selection.configure",
|
|
1723
|
+
"title": "Configure chart selection",
|
|
1724
|
+
"scope": "selection",
|
|
1725
|
+
"targetKind": "selection",
|
|
1726
|
+
"target": {
|
|
1727
|
+
"kind": "selection",
|
|
1728
|
+
"resolver": "x-ui-chart-events-selection-change",
|
|
1729
|
+
"ambiguityPolicy": "fail",
|
|
1730
|
+
"required": false
|
|
1731
|
+
},
|
|
1732
|
+
"inputSchema": {
|
|
1733
|
+
"type": "object",
|
|
1734
|
+
"required": [
|
|
1735
|
+
"action"
|
|
1736
|
+
],
|
|
1737
|
+
"properties": {
|
|
1738
|
+
"action": {
|
|
1739
|
+
"enum": [
|
|
1740
|
+
"filter-widget",
|
|
1741
|
+
"open-detail",
|
|
1742
|
+
"navigate",
|
|
1743
|
+
"update-context",
|
|
1744
|
+
"emit"
|
|
1745
|
+
]
|
|
1746
|
+
},
|
|
1747
|
+
"target": {
|
|
1748
|
+
"type": "string"
|
|
1749
|
+
},
|
|
1750
|
+
"mapping": {
|
|
1751
|
+
"type": "object",
|
|
1752
|
+
"additionalProperties": {
|
|
1753
|
+
"type": "string"
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
},
|
|
1758
|
+
"effects": [
|
|
1759
|
+
{
|
|
1760
|
+
"kind": "compile-domain-patch",
|
|
1761
|
+
"handler": "chart-event-selection-configure",
|
|
1762
|
+
"handlerContract": {
|
|
1763
|
+
"reads": [
|
|
1764
|
+
"chartDocument.events.selectionChange",
|
|
1765
|
+
"chartDocument.dimensions[]",
|
|
1766
|
+
"availableTargets[]"
|
|
1767
|
+
],
|
|
1768
|
+
"writes": [
|
|
1769
|
+
"chartDocument.events.selectionChange"
|
|
1770
|
+
],
|
|
1771
|
+
"identityKeys": [
|
|
1772
|
+
"availableTargets[].id"
|
|
1773
|
+
],
|
|
1774
|
+
"inputSchema": {
|
|
1775
|
+
"type": "object",
|
|
1776
|
+
"required": [
|
|
1777
|
+
"action"
|
|
1778
|
+
],
|
|
1779
|
+
"properties": {
|
|
1780
|
+
"action": {
|
|
1781
|
+
"enum": [
|
|
1782
|
+
"filter-widget",
|
|
1783
|
+
"open-detail",
|
|
1784
|
+
"navigate",
|
|
1785
|
+
"update-context",
|
|
1786
|
+
"emit"
|
|
1787
|
+
]
|
|
1788
|
+
},
|
|
1789
|
+
"target": {
|
|
1790
|
+
"type": "string"
|
|
1791
|
+
},
|
|
1792
|
+
"mapping": {
|
|
1793
|
+
"type": "object",
|
|
1794
|
+
"additionalProperties": {
|
|
1795
|
+
"type": "string"
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
},
|
|
1800
|
+
"failureModes": [
|
|
1801
|
+
"target-not-in-catalog",
|
|
1802
|
+
"mapping-source-field-missing",
|
|
1803
|
+
"mapping-target-invalid",
|
|
1804
|
+
"unsafe-event-action"
|
|
1805
|
+
],
|
|
1806
|
+
"description": "Configures selectionChange as single-point selection evidence whose event key is governed by the operation."
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
],
|
|
1810
|
+
"destructive": false,
|
|
1811
|
+
"requiresConfirmation": false,
|
|
1812
|
+
"validators": [
|
|
1813
|
+
"selection-output-structured",
|
|
1814
|
+
"event-target-governed",
|
|
1815
|
+
"event-mapping-fields-exist",
|
|
1816
|
+
"event-action-supported",
|
|
1817
|
+
"editor-runtime-round-trip"
|
|
1818
|
+
],
|
|
1819
|
+
"affectedPaths": [
|
|
1820
|
+
"chartDocument.events.selectionChange"
|
|
1821
|
+
],
|
|
1822
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1823
|
+
"preconditions": [
|
|
1824
|
+
"config-initialized"
|
|
1825
|
+
]
|
|
1826
|
+
},
|
|
1827
|
+
{
|
|
1828
|
+
"operationId": "legend.configure",
|
|
1829
|
+
"title": "Configure chart legend",
|
|
1830
|
+
"scope": "skin",
|
|
1831
|
+
"targetKind": "legend",
|
|
1832
|
+
"target": {
|
|
1833
|
+
"kind": "legend",
|
|
1834
|
+
"resolver": "x-ui-chart-legend-feature",
|
|
1835
|
+
"ambiguityPolicy": "fail",
|
|
1836
|
+
"required": false
|
|
1837
|
+
},
|
|
1838
|
+
"inputSchema": {
|
|
1839
|
+
"type": "object",
|
|
1840
|
+
"required": [
|
|
1841
|
+
"enabled"
|
|
1842
|
+
],
|
|
1843
|
+
"properties": {
|
|
1844
|
+
"enabled": {
|
|
1845
|
+
"type": "boolean"
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
},
|
|
1849
|
+
"effects": [
|
|
1850
|
+
{
|
|
1851
|
+
"kind": "set-value",
|
|
1852
|
+
"path": "chartDocument.legend"
|
|
1853
|
+
}
|
|
1854
|
+
],
|
|
1855
|
+
"destructive": false,
|
|
1856
|
+
"requiresConfirmation": false,
|
|
1857
|
+
"validators": [
|
|
1858
|
+
"feature-toggle-valid",
|
|
1859
|
+
"editor-runtime-round-trip"
|
|
1860
|
+
],
|
|
1861
|
+
"affectedPaths": [
|
|
1862
|
+
"chartDocument.legend"
|
|
1863
|
+
],
|
|
1864
|
+
"submissionImpact": "visual-only",
|
|
1865
|
+
"preconditions": [
|
|
1866
|
+
"config-initialized"
|
|
1867
|
+
]
|
|
1868
|
+
},
|
|
1869
|
+
{
|
|
1870
|
+
"operationId": "tooltip.configure",
|
|
1871
|
+
"title": "Configure chart tooltip",
|
|
1872
|
+
"scope": "skin",
|
|
1873
|
+
"targetKind": "tooltip",
|
|
1874
|
+
"target": {
|
|
1875
|
+
"kind": "tooltip",
|
|
1876
|
+
"resolver": "x-ui-chart-tooltip-feature",
|
|
1877
|
+
"ambiguityPolicy": "fail",
|
|
1878
|
+
"required": false
|
|
1879
|
+
},
|
|
1880
|
+
"inputSchema": {
|
|
1881
|
+
"type": "object",
|
|
1882
|
+
"required": [
|
|
1883
|
+
"enabled"
|
|
1884
|
+
],
|
|
1885
|
+
"properties": {
|
|
1886
|
+
"enabled": {
|
|
1887
|
+
"type": "boolean"
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
},
|
|
1891
|
+
"effects": [
|
|
1892
|
+
{
|
|
1893
|
+
"kind": "set-value",
|
|
1894
|
+
"path": "chartDocument.tooltip"
|
|
1895
|
+
}
|
|
1896
|
+
],
|
|
1897
|
+
"destructive": false,
|
|
1898
|
+
"requiresConfirmation": false,
|
|
1899
|
+
"validators": [
|
|
1900
|
+
"feature-toggle-valid",
|
|
1901
|
+
"editor-runtime-round-trip"
|
|
1902
|
+
],
|
|
1903
|
+
"affectedPaths": [
|
|
1904
|
+
"chartDocument.tooltip"
|
|
1905
|
+
],
|
|
1906
|
+
"submissionImpact": "visual-only",
|
|
1907
|
+
"preconditions": [
|
|
1908
|
+
"config-initialized"
|
|
1909
|
+
]
|
|
1910
|
+
}
|
|
1911
|
+
],
|
|
1912
|
+
"validators": [
|
|
1913
|
+
{
|
|
1914
|
+
"validatorId": "chart-document-shape",
|
|
1915
|
+
"level": "error",
|
|
1916
|
+
"code": "CHART_DOCUMENT_SHAPE",
|
|
1917
|
+
"description": "Document must conform to PraxisXUiChartContract."
|
|
1918
|
+
},
|
|
1919
|
+
{
|
|
1920
|
+
"validatorId": "chart-version-supported",
|
|
1921
|
+
"level": "error",
|
|
1922
|
+
"code": "CHART_VERSION_SUPPORTED"
|
|
1923
|
+
},
|
|
1924
|
+
{
|
|
1925
|
+
"validatorId": "chart-type-supported",
|
|
1926
|
+
"level": "error",
|
|
1927
|
+
"code": "CHART_TYPE_SUPPORTED",
|
|
1928
|
+
"description": "Chart kind must be supported by @praxisui/charts."
|
|
1929
|
+
},
|
|
1930
|
+
{
|
|
1931
|
+
"validatorId": "chart-type-series-axis-compatible",
|
|
1932
|
+
"level": "error",
|
|
1933
|
+
"code": "CHART_TYPE_SERIES_AXIS_COMPATIBLE",
|
|
1934
|
+
"description": "Chart kind, dimensions, metrics and axes must be compatible."
|
|
1935
|
+
},
|
|
1936
|
+
{
|
|
1937
|
+
"validatorId": "pie-single-metric",
|
|
1938
|
+
"level": "error",
|
|
1939
|
+
"code": "PIE_SINGLE_METRIC",
|
|
1940
|
+
"description": "Pie and donut charts support a single metric."
|
|
1941
|
+
},
|
|
1942
|
+
{
|
|
1943
|
+
"validatorId": "combo-minimum-series",
|
|
1944
|
+
"level": "error",
|
|
1945
|
+
"code": "COMBO_MINIMUM_SERIES",
|
|
1946
|
+
"description": "Combo charts require at least two metrics."
|
|
1947
|
+
},
|
|
1948
|
+
{
|
|
1949
|
+
"validatorId": "series-field-exists",
|
|
1950
|
+
"level": "error",
|
|
1951
|
+
"code": "SERIES_FIELD_EXISTS",
|
|
1952
|
+
"description": "Series field must exist in availableFields or schema context."
|
|
1953
|
+
},
|
|
1954
|
+
{
|
|
1955
|
+
"validatorId": "series-field-aggregable",
|
|
1956
|
+
"level": "error",
|
|
1957
|
+
"code": "SERIES_FIELD_AGGREGABLE",
|
|
1958
|
+
"description": "Metric fields must support the requested aggregation."
|
|
1959
|
+
},
|
|
1960
|
+
{
|
|
1961
|
+
"validatorId": "series-id-unique",
|
|
1962
|
+
"level": "error",
|
|
1963
|
+
"code": "SERIES_ID_UNIQUE",
|
|
1964
|
+
"description": "Metric/series identity must be stable and unique by field."
|
|
1965
|
+
},
|
|
1966
|
+
{
|
|
1967
|
+
"validatorId": "series-exists",
|
|
1968
|
+
"level": "error",
|
|
1969
|
+
"code": "SERIES_EXISTS",
|
|
1970
|
+
"description": "Series removal target must exist."
|
|
1971
|
+
},
|
|
1972
|
+
{
|
|
1973
|
+
"validatorId": "destructive-series-removal-confirmed",
|
|
1974
|
+
"level": "error",
|
|
1975
|
+
"code": "DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED",
|
|
1976
|
+
"description": "Removing a series requires explicit confirmation."
|
|
1977
|
+
},
|
|
1978
|
+
{
|
|
1979
|
+
"validatorId": "chart-keeps-required-metric",
|
|
1980
|
+
"level": "error",
|
|
1981
|
+
"code": "CHART_KEEPS_REQUIRED_METRIC",
|
|
1982
|
+
"description": "A chart cannot be left without required metrics."
|
|
1983
|
+
},
|
|
1984
|
+
{
|
|
1985
|
+
"validatorId": "axis-field-exists",
|
|
1986
|
+
"level": "error",
|
|
1987
|
+
"code": "AXIS_FIELD_EXISTS",
|
|
1988
|
+
"description": "Axis/dimension fields must exist in availableFields or schema context."
|
|
1989
|
+
},
|
|
1990
|
+
{
|
|
1991
|
+
"validatorId": "secondary-axis-combo-only",
|
|
1992
|
+
"level": "error",
|
|
1993
|
+
"code": "SECONDARY_AXIS_COMBO_ONLY",
|
|
1994
|
+
"description": "Secondary axis is supported only for combo charts."
|
|
1995
|
+
},
|
|
1996
|
+
{
|
|
1997
|
+
"validatorId": "cartesian-dimension-required",
|
|
1998
|
+
"level": "error",
|
|
1999
|
+
"code": "CARTESIAN_DIMENSION_REQUIRED",
|
|
2000
|
+
"description": "Cartesian charts require at least one dimension."
|
|
2001
|
+
},
|
|
2002
|
+
{
|
|
2003
|
+
"validatorId": "remote-resource-in-api-metadata",
|
|
2004
|
+
"level": "error",
|
|
2005
|
+
"code": "REMOTE_RESOURCE_IN_API_METADATA",
|
|
2006
|
+
"description": "Remote praxis.stats resource must equal a governed root-relative availableResources[].path beginning with exactly one slash; a discovery id is not an executable resource path."
|
|
2007
|
+
},
|
|
2008
|
+
{
|
|
2009
|
+
"validatorId": "bound-fields-exist",
|
|
2010
|
+
"level": "error",
|
|
2011
|
+
"code": "BOUND_FIELDS_EXIST",
|
|
2012
|
+
"description": "Bound dimensions and metrics must exist in the capability-backed field context and satisfy its operation, aggregation and distribution-mode eligibility."
|
|
2013
|
+
},
|
|
2014
|
+
{
|
|
2015
|
+
"validatorId": "stats-operation-supported",
|
|
2016
|
+
"level": "error",
|
|
2017
|
+
"code": "STATS_OPERATION_SUPPORTED",
|
|
2018
|
+
"description": "Remote datasource operation must be supported by the stats backend."
|
|
2019
|
+
},
|
|
2020
|
+
{
|
|
2021
|
+
"validatorId": "comparison-period-complete",
|
|
2022
|
+
"level": "error",
|
|
2023
|
+
"code": "COMPARISON_PERIOD_COMPLETE",
|
|
2024
|
+
"description": "Comparison requires a time-series eligible period field, timezone, preset and mode grounded in the governed resource capabilities."
|
|
2025
|
+
},
|
|
2026
|
+
{
|
|
2027
|
+
"validatorId": "comparison-metrics-supported",
|
|
2028
|
+
"level": "error",
|
|
2029
|
+
"code": "COMPARISON_METRICS_SUPPORTED",
|
|
2030
|
+
"description": "Comparison requires unique metrics[] aliases using only COUNT, DISTINCT_COUNT or SUM capabilities; singular metric payloads are not authorable."
|
|
2031
|
+
},
|
|
2032
|
+
{
|
|
2033
|
+
"validatorId": "query-context-structured",
|
|
2034
|
+
"level": "error",
|
|
2035
|
+
"code": "QUERY_CONTEXT_STRUCTURED",
|
|
2036
|
+
"description": "queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta."
|
|
2037
|
+
},
|
|
2038
|
+
{
|
|
2039
|
+
"validatorId": "query-context-filter-expression-stats-unsupported",
|
|
2040
|
+
"level": "error",
|
|
2041
|
+
"code": "QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED",
|
|
2042
|
+
"description": "praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared."
|
|
2043
|
+
},
|
|
2044
|
+
{
|
|
2045
|
+
"validatorId": "query-context-fields-exist",
|
|
2046
|
+
"level": "warning",
|
|
2047
|
+
"code": "QUERY_CONTEXT_FIELDS_EXIST",
|
|
2048
|
+
"description": "queryContext filter fields should exist in the schema/data context."
|
|
2049
|
+
},
|
|
2050
|
+
{
|
|
2051
|
+
"validatorId": "query-context-safe-values",
|
|
2052
|
+
"level": "error",
|
|
2053
|
+
"code": "QUERY_CONTEXT_SAFE_VALUES",
|
|
2054
|
+
"description": "queryContext values must be serializable safe data."
|
|
2055
|
+
},
|
|
2056
|
+
{
|
|
2057
|
+
"validatorId": "point-click-action-structured",
|
|
2058
|
+
"level": "error",
|
|
2059
|
+
"code": "POINT_CLICK_ACTION_STRUCTURED",
|
|
2060
|
+
"description": "Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence."
|
|
2061
|
+
},
|
|
2062
|
+
{
|
|
2063
|
+
"validatorId": "cross-filter-output-structured",
|
|
2064
|
+
"level": "error",
|
|
2065
|
+
"code": "CROSS_FILTER_OUTPUT_STRUCTURED",
|
|
2066
|
+
"description": "Cross-filter output must be structured as query-context filters."
|
|
2067
|
+
},
|
|
2068
|
+
{
|
|
2069
|
+
"validatorId": "event-target-governed",
|
|
2070
|
+
"level": "error",
|
|
2071
|
+
"code": "EVENT_TARGET_GOVERNED",
|
|
2072
|
+
"description": "Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed."
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
"validatorId": "event-mapping-fields-exist",
|
|
2076
|
+
"level": "error",
|
|
2077
|
+
"code": "EVENT_MAPPING_FIELDS_EXIST",
|
|
2078
|
+
"description": "Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation."
|
|
2079
|
+
},
|
|
2080
|
+
{
|
|
2081
|
+
"validatorId": "event-action-supported",
|
|
2082
|
+
"level": "error",
|
|
2083
|
+
"code": "EVENT_ACTION_SUPPORTED",
|
|
2084
|
+
"description": "Event action must be one of the supported structured action kinds."
|
|
2085
|
+
},
|
|
2086
|
+
{
|
|
2087
|
+
"validatorId": "drilldown-target-governed",
|
|
2088
|
+
"level": "error",
|
|
2089
|
+
"code": "DRILLDOWN_TARGET_GOVERNED",
|
|
2090
|
+
"description": "Drilldown target must be a governed route or widget target."
|
|
2091
|
+
},
|
|
2092
|
+
{
|
|
2093
|
+
"validatorId": "selection-output-structured",
|
|
2094
|
+
"level": "error",
|
|
2095
|
+
"code": "SELECTION_OUTPUT_STRUCTURED",
|
|
2096
|
+
"description": "Selection output must resolve selected point filters deterministically."
|
|
2097
|
+
},
|
|
2098
|
+
{
|
|
2099
|
+
"validatorId": "feature-toggle-valid",
|
|
2100
|
+
"level": "error",
|
|
2101
|
+
"code": "FEATURE_TOGGLE_VALID",
|
|
2102
|
+
"description": "Legend and tooltip feature values must be boolean or toggleable feature objects."
|
|
2103
|
+
},
|
|
2104
|
+
{
|
|
2105
|
+
"validatorId": "editor-runtime-round-trip",
|
|
2106
|
+
"level": "error",
|
|
2107
|
+
"code": "EDITOR_RUNTIME_ROUND_TRIP",
|
|
2108
|
+
"description": "PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes."
|
|
2109
|
+
}
|
|
2110
|
+
],
|
|
2111
|
+
"roundTripRequirements": [
|
|
2112
|
+
"The canonical saved shape is PraxisXUiChartContract, not raw ECharts options.",
|
|
2113
|
+
"PraxisChartConfigEditor must preserve chart kind, source, dimensions, metrics, events, legend and tooltip across apply/save/reset/reopen.",
|
|
2114
|
+
"Remote bindings persist availableResources[].path; availableResources[].id remains discovery identity, and transient resource/field/target catalogs and diagnostics are never persisted in widget inputs.",
|
|
2115
|
+
"Comparison must preserve one canonical /stats/comparison request with metrics[] and a complete comparisonPeriod; it must not downgrade into independent group-by calls.",
|
|
2116
|
+
"Cross-filter, drilldown and selection authoring must persist structured event actions, not prompt examples or command strings.",
|
|
2117
|
+
"[P1] Backend handler, resolver and validators now execute directly; end-to-end Page Builder parity remains open until assistant requests project the transient availableTargets[].events catalog through validationContext and expose its fail-closed diagnostics.",
|
|
2118
|
+
"[P2] Transform-output semantics and target input-schema/port fields must be materialized and validated by Core; local transform.output inspection and backend-enriched inputFields are not substitutes for those canonical projections.",
|
|
2119
|
+
"Enrichment of capability-backed availableFields with /schemas/filtered property metadata remains a later schema-flow gate."
|
|
2120
|
+
],
|
|
2121
|
+
"examples": [
|
|
2122
|
+
{
|
|
2123
|
+
"id": "set-bar-chart",
|
|
2124
|
+
"request": "Use a bar chart for employees by department.",
|
|
2125
|
+
"operationId": "chart.type.set",
|
|
2126
|
+
"params": {
|
|
2127
|
+
"kind": "bar"
|
|
2128
|
+
},
|
|
2129
|
+
"isPositive": true
|
|
2130
|
+
},
|
|
2131
|
+
{
|
|
2132
|
+
"id": "add-salary-series",
|
|
2133
|
+
"request": "Add salary as a summed metric.",
|
|
2134
|
+
"operationId": "series.add",
|
|
2135
|
+
"params": {
|
|
2136
|
+
"field": "salary",
|
|
2137
|
+
"aggregation": "sum",
|
|
2138
|
+
"label": "Salary"
|
|
2139
|
+
},
|
|
2140
|
+
"isPositive": true
|
|
2141
|
+
},
|
|
2142
|
+
{
|
|
2143
|
+
"id": "remove-old-series",
|
|
2144
|
+
"request": "Remove the old cost series.",
|
|
2145
|
+
"operationId": "series.remove",
|
|
2146
|
+
"target": "cost",
|
|
2147
|
+
"params": {
|
|
2148
|
+
"field": "cost"
|
|
2149
|
+
},
|
|
2150
|
+
"isPositive": true
|
|
2151
|
+
},
|
|
2152
|
+
{
|
|
2153
|
+
"id": "configure-secondary-axis",
|
|
2154
|
+
"request": "Put margin on a secondary axis for the combo chart.",
|
|
2155
|
+
"operationId": "axis.configure",
|
|
2156
|
+
"params": {
|
|
2157
|
+
"metricField": "margin",
|
|
2158
|
+
"metricAxis": "secondary"
|
|
2159
|
+
},
|
|
2160
|
+
"isPositive": true
|
|
2161
|
+
},
|
|
2162
|
+
{
|
|
2163
|
+
"id": "bind-stats-resource",
|
|
2164
|
+
"request": "Bind this chart to payroll stats grouped by department.",
|
|
2165
|
+
"operationId": "data.resource.bind",
|
|
2166
|
+
"params": {
|
|
2167
|
+
"sourceKind": "praxis.stats",
|
|
2168
|
+
"resource": "/api/stats/payroll",
|
|
2169
|
+
"operation": "group-by"
|
|
2170
|
+
},
|
|
2171
|
+
"isPositive": true
|
|
2172
|
+
},
|
|
2173
|
+
{
|
|
2174
|
+
"id": "bind-comparison-resource",
|
|
2175
|
+
"request": "Compare active employees by department with the previous aligned 30-day period.",
|
|
2176
|
+
"operationId": "data.resource.bind",
|
|
2177
|
+
"params": {
|
|
2178
|
+
"sourceKind": "praxis.stats",
|
|
2179
|
+
"resource": "/api/human-resources/employees",
|
|
2180
|
+
"operation": "comparison",
|
|
2181
|
+
"comparisonPeriod": {
|
|
2182
|
+
"field": "admissionDate",
|
|
2183
|
+
"timezone": "America/Sao_Paulo",
|
|
2184
|
+
"preset": "LAST_30_DAYS",
|
|
2185
|
+
"mode": "PREVIOUS_ALIGNED"
|
|
2186
|
+
},
|
|
2187
|
+
"dimensions": [
|
|
2188
|
+
{
|
|
2189
|
+
"field": "department"
|
|
2190
|
+
}
|
|
2191
|
+
],
|
|
2192
|
+
"metrics": [
|
|
2193
|
+
{
|
|
2194
|
+
"field": "employeeId",
|
|
2195
|
+
"aggregation": "distinct-count"
|
|
2196
|
+
}
|
|
2197
|
+
]
|
|
2198
|
+
},
|
|
2199
|
+
"isPositive": true
|
|
2200
|
+
},
|
|
2201
|
+
{
|
|
2202
|
+
"id": "set-query-context",
|
|
2203
|
+
"request": "Limit the chart to active employees and sort by total descending.",
|
|
2204
|
+
"operationId": "queryContext.set",
|
|
2205
|
+
"params": {
|
|
2206
|
+
"filters": {
|
|
2207
|
+
"status": "ACTIVE"
|
|
2208
|
+
},
|
|
2209
|
+
"sort": [
|
|
2210
|
+
"total,desc"
|
|
2211
|
+
],
|
|
2212
|
+
"limit": 10
|
|
2213
|
+
},
|
|
2214
|
+
"isPositive": true
|
|
2215
|
+
},
|
|
2216
|
+
{
|
|
2217
|
+
"id": "configure-cross-filter",
|
|
2218
|
+
"request": "Use selected department to filter the employee table.",
|
|
2219
|
+
"operationId": "crossFilter.configure",
|
|
2220
|
+
"params": {
|
|
2221
|
+
"action": "filter-widget",
|
|
2222
|
+
"target": "employeesTable",
|
|
2223
|
+
"mapping": {
|
|
2224
|
+
"department": "department"
|
|
2225
|
+
}
|
|
2226
|
+
},
|
|
2227
|
+
"isPositive": true
|
|
2228
|
+
},
|
|
2229
|
+
{
|
|
2230
|
+
"id": "configure-stats-key-cross-filter",
|
|
2231
|
+
"request": "Use the governed department bucket identity to filter the employee table.",
|
|
2232
|
+
"operationId": "crossFilter.configure",
|
|
2233
|
+
"params": {
|
|
2234
|
+
"action": "filter-widget",
|
|
2235
|
+
"target": "employeesTable",
|
|
2236
|
+
"mapping": {
|
|
2237
|
+
"key": "departmentIdsIn"
|
|
2238
|
+
}
|
|
2239
|
+
},
|
|
2240
|
+
"isPositive": true
|
|
2241
|
+
},
|
|
2242
|
+
{
|
|
2243
|
+
"id": "configure-drilldown",
|
|
2244
|
+
"request": "Open the department detail when a point is clicked.",
|
|
2245
|
+
"operationId": "drilldown.configure",
|
|
2246
|
+
"params": {
|
|
2247
|
+
"action": "navigate",
|
|
2248
|
+
"target": "/departments/detail",
|
|
2249
|
+
"mapping": {
|
|
2250
|
+
"department": "departmentId"
|
|
2251
|
+
}
|
|
2252
|
+
},
|
|
2253
|
+
"isPositive": true
|
|
2254
|
+
},
|
|
2255
|
+
{
|
|
2256
|
+
"id": "configure-selection",
|
|
2257
|
+
"request": "Emit selected department as a structured selection event.",
|
|
2258
|
+
"operationId": "selection.configure",
|
|
2259
|
+
"params": {
|
|
2260
|
+
"action": "emit",
|
|
2261
|
+
"mapping": {
|
|
2262
|
+
"department": "department"
|
|
2263
|
+
}
|
|
2264
|
+
},
|
|
2265
|
+
"isPositive": true
|
|
2266
|
+
},
|
|
2267
|
+
{
|
|
2268
|
+
"id": "toggle-legend",
|
|
2269
|
+
"request": "Show the legend.",
|
|
2270
|
+
"operationId": "legend.configure",
|
|
2271
|
+
"params": {
|
|
2272
|
+
"enabled": true
|
|
2273
|
+
},
|
|
2274
|
+
"isPositive": true
|
|
2275
|
+
},
|
|
2276
|
+
{
|
|
2277
|
+
"id": "toggle-tooltip",
|
|
2278
|
+
"request": "Disable tooltips.",
|
|
2279
|
+
"operationId": "tooltip.configure",
|
|
2280
|
+
"params": {
|
|
2281
|
+
"enabled": false
|
|
2282
|
+
},
|
|
2283
|
+
"isPositive": true
|
|
2284
|
+
},
|
|
2285
|
+
{
|
|
2286
|
+
"id": "round-trip-editor-runtime",
|
|
2287
|
+
"request": "Save this chart in the editor and reopen it without changing the runtime chart document.",
|
|
2288
|
+
"operationId": "chart.document.set",
|
|
2289
|
+
"params": {
|
|
2290
|
+
"kind": "bar",
|
|
2291
|
+
"source": {
|
|
2292
|
+
"kind": "derived"
|
|
2293
|
+
},
|
|
2294
|
+
"dimensions": [
|
|
2295
|
+
{
|
|
2296
|
+
"field": "department"
|
|
2297
|
+
}
|
|
2298
|
+
],
|
|
2299
|
+
"metrics": [
|
|
2300
|
+
{
|
|
2301
|
+
"field": "total",
|
|
2302
|
+
"aggregation": "count"
|
|
2303
|
+
}
|
|
2304
|
+
]
|
|
2305
|
+
},
|
|
2306
|
+
"isPositive": true
|
|
2307
|
+
},
|
|
2308
|
+
{
|
|
2309
|
+
"id": "reject-ambiguous-series-target",
|
|
2310
|
+
"request": "Remove total when more than one chart series resolves to total.",
|
|
2311
|
+
"operationId": "series.remove",
|
|
2312
|
+
"target": "total",
|
|
2313
|
+
"params": {
|
|
2314
|
+
"field": "total"
|
|
2315
|
+
},
|
|
2316
|
+
"isPositive": false
|
|
2317
|
+
},
|
|
2318
|
+
{
|
|
2319
|
+
"id": "reject-prompt-routing",
|
|
2320
|
+
"request": "Use the prompt example text to decide which backend endpoint to call.",
|
|
2321
|
+
"operationId": "data.resource.bind",
|
|
2322
|
+
"params": {
|
|
2323
|
+
"sourceKind": "praxis.stats",
|
|
2324
|
+
"resource": "from prompt example"
|
|
2325
|
+
},
|
|
2326
|
+
"isPositive": false
|
|
2327
|
+
},
|
|
2328
|
+
{
|
|
2329
|
+
"id": "reject-unsafe-target",
|
|
2330
|
+
"request": "Navigate to javascript:alert(1) on drilldown.",
|
|
2331
|
+
"operationId": "drilldown.configure",
|
|
2332
|
+
"params": {
|
|
2333
|
+
"event": "drillDown",
|
|
2334
|
+
"action": "navigate",
|
|
2335
|
+
"target": "javascript:alert(1)"
|
|
2336
|
+
},
|
|
2337
|
+
"isPositive": false
|
|
2338
|
+
}
|
|
2339
|
+
]
|
|
2340
|
+
},
|
|
2341
|
+
"chunks": [
|
|
2342
|
+
{
|
|
2343
|
+
"chunkIndex": 0,
|
|
2344
|
+
"chunkKind": "summary",
|
|
2345
|
+
"content": "Component ID: praxis-chart\nSelector: praxis-chart\nFriendly Name: Praxis Chart\nDescription: Chart component for analytics and metadata-driven visualizations in Praxis UI.\nLib/Package: @praxisui/charts\nTags: chart, analytics, widget, visualization\nInputs:\n - config (PraxisChartConfig)\n - data (PraxisChartDataRow[])\n - chartDocument (PraxisXUiChartContract | null)\n - queryContext (PraxisDataQueryContext | null)\n - remoteDataResolver (PraxisChartRemoteDataResolver | null)\n - filterCriteria (Record<string, unknown> | null)\n - enableCustomization (boolean)\n - availableResources (ReadonlyArray<ChartEditorResourceOption>)\n - availableFields (ReadonlyArray<ChartEditorFieldOption>)\n - availableTargets (ReadonlyArray<ChartEditorTargetOption>)\nOutputs:\n - pointClick (PraxisChartPointEvent)\n - pointAction (PraxisChartPointActionEvent)\n - selectionChange (PraxisChartSelectionEvent)\n - drillDown (PraxisChartDrillDownEvent)\n - crossFilter (PraxisChartCrossFilterEvent)\n - queryRequest (PraxisChartQueryRequestEvent)\n - loadStateChange (PraxisChartLoadState)\n - chartDocumentApplied (PraxisXUiChartContract)\n - chartDocumentSaved (PraxisXUiChartContract)\nInsertion Presets:\n - canonical-chart: Canonical chart - Creates a chart widget from the canonical x-ui.chart authoring document.\n",
|
|
2346
|
+
"sourcePointer": "projects/praxis-charts/src/lib/praxis-chart.metadata.ts",
|
|
2347
|
+
"contentHash": "5d9a01947277da58d7d6fe751dd45eb420c4607728eb61e1df417322506f917d",
|
|
2348
|
+
"sourceKind": "component_definition",
|
|
2349
|
+
"sourceId": "praxis-chart",
|
|
2350
|
+
"corpusVersion": "1.0.0"
|
|
2351
|
+
},
|
|
2352
|
+
{
|
|
2353
|
+
"chunkIndex": 1,
|
|
2354
|
+
"chunkKind": "authoring_manifest",
|
|
2355
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"identity\"}",
|
|
2356
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2357
|
+
"contentHash": "d481e91e447ae5f92b0d3ffb171cf993e3b16409be95ce237464248c9e5c953b",
|
|
2358
|
+
"sourceKind": "component_definition",
|
|
2359
|
+
"sourceId": "praxis-chart",
|
|
2360
|
+
"corpusVersion": "1.0.0"
|
|
2361
|
+
},
|
|
2362
|
+
{
|
|
2363
|
+
"chunkIndex": 2,
|
|
2364
|
+
"chunkKind": "authoring_manifest",
|
|
2365
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"chartDocument\",\"type\":\"PraxisXUiChartContract | null\",\"description\":\"Canonical x-ui.chart document used as the authoring source of truth.\"},{\"name\":\"config\",\"type\":\"PraxisChartConfig\",\"description\":\"Runtime chart configuration mapped from or supplied beside the canonical chart document.\"},{\"name\":\"queryContext\",\"type\":\"PraxisChartQueryContext | null\",\"description\":\"Canonical @praxisui/core query context observed by remote datasource requests; flat filters execute in praxis.stats and governed filterExpression is preserved but rejected until stats expression support is proven.\"},{\"name\":\"remoteDataResolver\",\"type\":\"PraxisChartRemoteDataResolver | null\",\"description\":\"Host-governed remote row resolver for integrations outside the default praxis.stats client.\"},{\"name\":\"availableResources\",\"type\":\"ChartEditorResourceOption[]\",\"description\":\"Transient authoring catalog: id is the stable /schemas/catalog discovery identity, while path is the governed root-relative operational value persisted to chartDocument.source.resource.\"},{\"name\":\"availableFields\",\"type\":\"ChartEditorFieldOption[]\",\"description\":\"Transient capability-backed field catalog. operations, aggregations and distributionModes declare exact group-by, timeseries, distribution/terms and distribution/histogram eligibility.\"},{\"name\":\"availableTargets\",\"type\":\"ChartEditorTargetOption[]\",\"description\":\"Transient visual-authoring targets derived from existing top-level composition links to public, non-deprecated widget ports or explicitly writable declared page state; id is the unique authoring identity and events[] declares the exact structured Chart events authorized by compatible links. Raw pointClick evidence never authorizes events.pointClick, which is emitted through pointAction. Local transform.output semantic-kind inspection does not replace a Core-validated transform-output projection (P2), and the visual catalog does not yet publish the target input-schema/port projection required for end-to-end mapping validation.\"}]}",
|
|
2366
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2367
|
+
"contentHash": "3d13300daa87e565205df31a140235364b51576f9d829d93c6f794df7089b059",
|
|
2368
|
+
"sourceKind": "component_definition",
|
|
2369
|
+
"sourceId": "praxis-chart",
|
|
2370
|
+
"corpusVersion": "1.0.0"
|
|
2371
|
+
},
|
|
2372
|
+
{
|
|
2373
|
+
"chunkIndex": 3,
|
|
2374
|
+
"chunkKind": "authoring_manifest",
|
|
2375
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"description\":\"Canonical `kind` field in PraxisXUiChartContract.\"},{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"description\":\"Metric-backed series definition in `metrics[]`, keyed by field.\"},{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"description\":\"Dimension role, metric axis and chart orientation semantics.\"},{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"description\":\"Source, dimensions, metrics and resource/field bindings.\"},{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"description\":\"Runtime @praxisui/core queryContext contract for filters, filterExpression, sort, limit, page and governance metadata.\"},{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"description\":\"Raw pointClick evidence plus a separate pointAction output for configured pointClick actions.\"},{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"description\":\"Cross-filter event mapping emitted as structured query-context filters.\"},{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"description\":\"Drilldown event mapping and governed target.\"},{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"description\":\"Single-point selection event enablement and mapping semantics; toggle and multi-select are intentionally not advertised.\"},{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"description\":\"Legend visibility through boolean or toggleable feature object.\"},{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"description\":\"Tooltip visibility through boolean or toggleable feature object.\"}]}",
|
|
2376
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2377
|
+
"contentHash": "a2cb7eff9493cbcb20abc67ed96e1f2326cec3196cda8f656b21843ff607d219",
|
|
2378
|
+
"sourceKind": "component_definition",
|
|
2379
|
+
"sourceId": "praxis-chart",
|
|
2380
|
+
"corpusVersion": "1.0.0"
|
|
2381
|
+
},
|
|
2382
|
+
{
|
|
2383
|
+
"chunkIndex": 4,
|
|
2384
|
+
"chunkKind": "authoring_manifest",
|
|
2385
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"chart.document.set\",\"title\":\"Set chart document\",\"scope\":\"global\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-document-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"version\",\"kind\",\"source\"],\"properties\":{\"version\":{\"const\":\"0.1.0\"},\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\"]},\"chartId\":{\"type\":\"string\"},\"title\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"subtitle\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"source\":{\"type\":\"object\",\"required\":[\"kind\"],\"properties\":{\"kind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"options\":{\"type\":\"object\",\"properties\":{\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}}}}}},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"events\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-document-shape\",\"chart-version-supported\",\"chart-type-series-axis-compatible\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"chart.type.set\",\"title\":\"Set chart type\",\"scope\":\"global\",\"targetKind\":\"chartType\",\"target\":{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"kind\"],\"properties\":{\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-type-supported\",\"chart-type-series-axis-compatible\",\"pie-single-metric\",\"combo-minimum-series\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.add\",\"title\":\"Add chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-series-add\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.metrics[]\"],\"identityKeys\":[\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"failureModes\":[\"field-not-in-catalog\",\"duplicate-series-field\",\"aggregation-not-supported\",\"chart-type-series-incompatible\"],\"description\":\"Adds a metric-backed series by semantic field, validating it against availableFields and chart kind compatibility before patching metrics[].\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"series-field-exists\",\"series-field-aggregable\",\"series-id-unique\",\"chart-type-series-axis-compatible\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.remove\",\"title\":\"Remove chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"replacementField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"chartDocument.metrics[]\",\"key\":\"field\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"series-exists\",\"destructive-series-removal-confirmed\",\"chart-keeps-required-metric\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-series-exists\",\"confirmation-collected\"]},{\"operationId\":\"axis.configure\",\"title\":\"Configure chart axis\",\"scope\":\"dataBinding\",\"targetKind\":\"axis\",\"target\":{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-axis-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"chartDocument.orientation\"],\"identityKeys\":[\"chartDocument.dimensions[].field\",\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"failureModes\":[\"field-not-in-catalog\",\"secondary-axis-non-combo\",\"missing-required-dimension\",\"axis-role-incompatible\"],\"description\":\"Configures dimensions and metric axes using semantic fields, preserving combo-only secondary axis constraints.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"axis-field-exists\",\"secondary-axis-combo-only\",\"cartesian-dimension-required\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[].axis\",\"chartDocument.orientation\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
|
|
2386
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2387
|
+
"contentHash": "2a01115cb91a19ed923ddd556903b33ef3844bc51211d486f03142a439277aca",
|
|
2388
|
+
"sourceKind": "component_definition",
|
|
2389
|
+
"sourceId": "praxis-chart",
|
|
2390
|
+
"corpusVersion": "1.0.0"
|
|
2391
|
+
},
|
|
2392
|
+
{
|
|
2393
|
+
"chunkIndex": 5,
|
|
2394
|
+
"chunkKind": "authoring_manifest",
|
|
2395
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"data.resource.bind\",\"title\":\"Bind chart data resource\",\"scope\":\"dataBinding\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"}}}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-data-resource-bind\",\"handlerContract\":{\"reads\":[\"availableResources[]\",\"availableFields[]\",\"chartDocument.source\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"writes\":[\"chartDocument.source\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"identityKeys\":[\"availableResources[].path\",\"availableFields[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{},\"dimensions\":{\"type\":\"array\"},\"metrics\":{\"type\":\"array\"}}},\"failureModes\":[\"resource-not-in-api-metadata\",\"field-not-in-schema\",\"stats-operation-not-supported\",\"comparison-period-incomplete\",\"comparison-metric-unsupported\",\"remote-binding-incomplete\"],\"description\":\"Binds a derived or praxis.stats source using governed resource, capability and field catalogs. For praxis.stats, availableResources[].id is discovery-only: validation requires the matching availableResources[].path and compilation persists that path. Comparison requires one canonical operation, metrics[] and an eligible period field.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"remote-resource-in-api-metadata\",\"bound-fields-exist\",\"stats-operation-supported\",\"comparison-period-complete\",\"comparison-metrics-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.source\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"queryContext.set\",\"title\":\"Set chart query context\",\"scope\":\"dataBinding\",\"targetKind\":\"queryContext\",\"target\":{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"filters\":{\"type\":\"object\"},\"filterExpression\":{\"type\":\"object\"},\"sort\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"limit\":{\"type\":\"number\"},\"page\":{\"type\":\"object\"},\"meta\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"queryContext\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"query-context-structured\",\"query-context-filter-expression-stats-unsupported\",\"query-context-fields-exist\",\"query-context-safe-values\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"queryContext\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"pointClick.configure\",\"title\":\"Configure chart point click\",\"scope\":\"eventMapping\",\"targetKind\":\"pointClick\",\"target\":{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-point-click-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.pointClick\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.pointClick\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures pointClick through the pointAction output while keeping pointClick as raw point evidence.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"point-click-action-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.pointClick\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"crossFilter.configure\",\"title\":\"Configure chart cross-filter\",\"scope\":\"eventMapping\",\"targetKind\":\"crossFilter\",\"target\":{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-cross-filter-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.crossFilter\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.crossFilter\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures crossFilter as a structured event action emitted through the crossFilter output with safe query-context filters to a governed target. For praxis.stats rows, key is governed bucket identity and label is presentation evidence; mappings may use key when the target schema accepts that identity.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"cross-filter-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.crossFilter\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]}]}",
|
|
2396
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2397
|
+
"contentHash": "61f1fbdc39a28023908b52b9fcc7e0f586fce9a3c7e09b16c0419395fe088752",
|
|
2398
|
+
"sourceKind": "component_definition",
|
|
2399
|
+
"sourceId": "praxis-chart",
|
|
2400
|
+
"corpusVersion": "1.0.0"
|
|
2401
|
+
},
|
|
2402
|
+
{
|
|
2403
|
+
"chunkIndex": 6,
|
|
2404
|
+
"chunkKind": "authoring_manifest",
|
|
2405
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"drilldown.configure\",\"title\":\"Configure chart drilldown\",\"scope\":\"eventMapping\",\"targetKind\":\"drilldown\",\"target\":{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-drilldown-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.drillDown\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.drillDown\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"drilldown-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures drillDown through the dedicated drillDown output with governed route/widget targets and structured field mappings.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"drilldown-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.drillDown\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"selection.configure\",\"title\":\"Configure chart selection\",\"scope\":\"selection\",\"targetKind\":\"selection\",\"target\":{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-selection-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.selectionChange\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.selectionChange\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures selectionChange as single-point selection evidence whose event key is governed by the operation.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"selection-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.selectionChange\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"legend.configure\",\"title\":\"Configure chart legend\",\"scope\":\"skin\",\"targetKind\":\"legend\",\"target\":{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.legend\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.legend\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"tooltip.configure\",\"title\":\"Configure chart tooltip\",\"scope\":\"skin\",\"targetKind\":\"tooltip\",\"target\":{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.tooltip\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.tooltip\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]}]}",
|
|
2406
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2407
|
+
"contentHash": "4712dff8e82caa90ee25b043770f0bfc4b4040652a887fcc05588c361268c94b",
|
|
2408
|
+
"sourceKind": "component_definition",
|
|
2409
|
+
"sourceId": "praxis-chart",
|
|
2410
|
+
"corpusVersion": "1.0.0"
|
|
2411
|
+
},
|
|
2412
|
+
{
|
|
2413
|
+
"chunkIndex": 7,
|
|
2414
|
+
"chunkKind": "authoring_manifest",
|
|
2415
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"chart-document-shape\",\"level\":\"error\",\"code\":\"CHART_DOCUMENT_SHAPE\",\"description\":\"Document must conform to PraxisXUiChartContract.\"},{\"validatorId\":\"chart-version-supported\",\"level\":\"error\",\"code\":\"CHART_VERSION_SUPPORTED\"},{\"validatorId\":\"chart-type-supported\",\"level\":\"error\",\"code\":\"CHART_TYPE_SUPPORTED\",\"description\":\"Chart kind must be supported by @praxisui/charts.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"pie-single-metric\",\"level\":\"error\",\"code\":\"PIE_SINGLE_METRIC\",\"description\":\"Pie and donut charts support a single metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"validatorId\":\"series-field-exists\",\"level\":\"error\",\"code\":\"SERIES_FIELD_EXISTS\",\"description\":\"Series field must exist in availableFields or schema context.\"},{\"validatorId\":\"series-field-aggregable\",\"level\":\"error\",\"code\":\"SERIES_FIELD_AGGREGABLE\",\"description\":\"Metric fields must support the requested aggregation.\"},{\"validatorId\":\"series-id-unique\",\"level\":\"error\",\"code\":\"SERIES_ID_UNIQUE\",\"description\":\"Metric/series identity must be stable and unique by field.\"},{\"validatorId\":\"series-exists\",\"level\":\"error\",\"code\":\"SERIES_EXISTS\",\"description\":\"Series removal target must exist.\"},{\"validatorId\":\"destructive-series-removal-confirmed\",\"level\":\"error\",\"code\":\"DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED\",\"description\":\"Removing a series requires explicit confirmation.\"},{\"validatorId\":\"chart-keeps-required-metric\",\"level\":\"error\",\"code\":\"CHART_KEEPS_REQUIRED_METRIC\",\"description\":\"A chart cannot be left without required metrics.\"},{\"validatorId\":\"axis-field-exists\",\"level\":\"error\",\"code\":\"AXIS_FIELD_EXISTS\",\"description\":\"Axis/dimension fields must exist in availableFields or schema context.\"},{\"validatorId\":\"secondary-axis-combo-only\",\"level\":\"error\",\"code\":\"SECONDARY_AXIS_COMBO_ONLY\",\"description\":\"Secondary axis is supported only for combo charts.\"},{\"validatorId\":\"cartesian-dimension-required\",\"level\":\"error\",\"code\":\"CARTESIAN_DIMENSION_REQUIRED\",\"description\":\"Cartesian charts require at least one dimension.\"},{\"validatorId\":\"remote-resource-in-api-metadata\",\"level\":\"error\",\"code\":\"REMOTE_RESOURCE_IN_API_METADATA\",\"description\":\"Remote praxis.stats resource must equal a governed root-relative availableResources[].path beginning with exactly one slash; a discovery id is not an executable resource path.\"},{\"validatorId\":\"bound-fields-exist\",\"level\":\"error\",\"code\":\"BOUND_FIELDS_EXIST\",\"description\":\"Bound dimensions and metrics must exist in the capability-backed field context and satisfy its operation, aggregation and distribution-mode eligibility.\"},{\"validatorId\":\"stats-operation-supported\",\"level\":\"error\",\"code\":\"STATS_OPERATION_SUPPORTED\",\"description\":\"Remote datasource operation must be supported by the stats backend.\"},{\"validatorId\":\"comparison-period-complete\",\"level\":\"error\",\"code\":\"COMPARISON_PERIOD_COMPLETE\",\"description\":\"Comparison requires a time-series eligible period field, timezone, preset and mode grounded in the governed resource capabilities.\"},{\"validatorId\":\"comparison-metrics-supported\",\"level\":\"error\",\"code\":\"COMPARISON_METRICS_SUPPORTED\",\"description\":\"Comparison requires unique metrics[] aliases using only COUNT, DISTINCT_COUNT or SUM capabilities; singular metric payloads are not authorable.\"},{\"validatorId\":\"query-context-structured\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_STRUCTURED\",\"description\":\"queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta.\"},{\"validatorId\":\"query-context-filter-expression-stats-unsupported\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED\",\"description\":\"praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared.\"},{\"validatorId\":\"query-context-fields-exist\",\"level\":\"warning\",\"code\":\"QUERY_CONTEXT_FIELDS_EXIST\",\"description\":\"queryContext filter fields should exist in the schema/data context.\"},{\"validatorId\":\"query-context-safe-values\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_SAFE_VALUES\",\"description\":\"queryContext values must be serializable safe data.\"},{\"validatorId\":\"point-click-action-structured\",\"level\":\"error\",\"code\":\"POINT_CLICK_ACTION_STRUCTURED\",\"description\":\"Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence.\"},{\"validatorId\":\"cross-filter-output-structured\",\"level\":\"error\",\"code\":\"CROSS_FILTER_OUTPUT_STRUCTURED\",\"description\":\"Cross-filter output must be structured as query-context filters.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"validatorId\":\"drilldown-target-governed\",\"level\":\"error\",\"code\":\"DRILLDOWN_TARGET_GOVERNED\",\"description\":\"Drilldown target must be a governed route or widget target.\"},{\"validatorId\":\"selection-output-structured\",\"level\":\"error\",\"code\":\"SELECTION_OUTPUT_STRUCTURED\",\"description\":\"Selection output must resolve selected point filters deterministically.\"},{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}]}",
|
|
2416
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2417
|
+
"contentHash": "7bc4f81c9e14852418976e82c51e3f433b4982b67bdeb592db5dcf10575e9b6b",
|
|
2418
|
+
"sourceKind": "component_definition",
|
|
2419
|
+
"sourceId": "praxis-chart",
|
|
2420
|
+
"corpusVersion": "1.0.0"
|
|
2421
|
+
},
|
|
2422
|
+
{
|
|
2423
|
+
"chunkIndex": 8,
|
|
2424
|
+
"chunkKind": "authoring_manifest",
|
|
2425
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"The canonical saved shape is PraxisXUiChartContract, not raw ECharts options.\",\"PraxisChartConfigEditor must preserve chart kind, source, dimensions, metrics, events, legend and tooltip across apply/save/reset/reopen.\",\"Remote bindings persist availableResources[].path; availableResources[].id remains discovery identity, and transient resource/field/target catalogs and diagnostics are never persisted in widget inputs.\",\"Comparison must preserve one canonical /stats/comparison request with metrics[] and a complete comparisonPeriod; it must not downgrade into independent group-by calls.\",\"Cross-filter, drilldown and selection authoring must persist structured event actions, not prompt examples or command strings.\",\"[P1] Backend handler, resolver and validators now execute directly; end-to-end Page Builder parity remains open until assistant requests project the transient availableTargets[].events catalog through validationContext and expose its fail-closed diagnostics.\",\"[P2] Transform-output semantics and target input-schema/port fields must be materialized and validated by Core; local transform.output inspection and backend-enriched inputFields are not substitutes for those canonical projections.\",\"Enrichment of capability-backed availableFields with /schemas/filtered property metadata remains a later schema-flow gate.\"]}",
|
|
2426
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2427
|
+
"contentHash": "da88b13f0e19ae4a4a2a23166477f39f4b4815b41683f6e9315d4f84f0dd836c",
|
|
2428
|
+
"sourceKind": "component_definition",
|
|
2429
|
+
"sourceId": "praxis-chart",
|
|
2430
|
+
"corpusVersion": "1.0.0"
|
|
2431
|
+
},
|
|
2432
|
+
{
|
|
2433
|
+
"chunkIndex": 9,
|
|
2434
|
+
"chunkKind": "authoring_manifest",
|
|
2435
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"set-bar-chart\",\"request\":\"Use a bar chart for employees by department.\",\"operationId\":\"chart.type.set\",\"params\":{\"kind\":\"bar\"},\"isPositive\":true},{\"id\":\"add-salary-series\",\"request\":\"Add salary as a summed metric.\",\"operationId\":\"series.add\",\"params\":{\"field\":\"salary\",\"aggregation\":\"sum\",\"label\":\"Salary\"},\"isPositive\":true},{\"id\":\"remove-old-series\",\"request\":\"Remove the old cost series.\",\"operationId\":\"series.remove\",\"target\":\"cost\",\"params\":{\"field\":\"cost\"},\"isPositive\":true},{\"id\":\"configure-secondary-axis\",\"request\":\"Put margin on a secondary axis for the combo chart.\",\"operationId\":\"axis.configure\",\"params\":{\"metricField\":\"margin\",\"metricAxis\":\"secondary\"},\"isPositive\":true},{\"id\":\"bind-stats-resource\",\"request\":\"Bind this chart to payroll stats grouped by department.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/stats/payroll\",\"operation\":\"group-by\"},\"isPositive\":true},{\"id\":\"bind-comparison-resource\",\"request\":\"Compare active employees by department with the previous aligned 30-day period.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/human-resources/employees\",\"operation\":\"comparison\",\"comparisonPeriod\":{\"field\":\"admissionDate\",\"timezone\":\"America/Sao_Paulo\",\"preset\":\"LAST_30_DAYS\",\"mode\":\"PREVIOUS_ALIGNED\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"employeeId\",\"aggregation\":\"distinct-count\"}]},\"isPositive\":true},{\"id\":\"set-query-context\",\"request\":\"Limit the chart to active employees and sort by total descending.\",\"operationId\":\"queryContext.set\",\"params\":{\"filters\":{\"status\":\"ACTIVE\"},\"sort\":[\"total,desc\"],\"limit\":10},\"isPositive\":true},{\"id\":\"configure-cross-filter\",\"request\":\"Use selected department to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"configure-stats-key-cross-filter\",\"request\":\"Use the governed department bucket identity to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"key\":\"departmentIdsIn\"}},\"isPositive\":true},{\"id\":\"configure-drilldown\",\"request\":\"Open the department detail when a point is clicked.\",\"operationId\":\"drilldown.configure\",\"params\":{\"action\":\"navigate\",\"target\":\"/departments/detail\",\"mapping\":{\"department\":\"departmentId\"}},\"isPositive\":true},{\"id\":\"configure-selection\",\"request\":\"Emit selected department as a structured selection event.\",\"operationId\":\"selection.configure\",\"params\":{\"action\":\"emit\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"toggle-legend\",\"request\":\"Show the legend.\",\"operationId\":\"legend.configure\",\"params\":{\"enabled\":true},\"isPositive\":true},{\"id\":\"toggle-tooltip\",\"request\":\"Disable tooltips.\",\"operationId\":\"tooltip.configure\",\"params\":{\"enabled\":false},\"isPositive\":true},{\"id\":\"round-trip-editor-runtime\",\"request\":\"Save this chart in the editor and reopen it without changing the runtime chart document.\",\"operationId\":\"chart.document.set\",\"params\":{\"kind\":\"bar\",\"source\":{\"kind\":\"derived\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"total\",\"aggregation\":\"count\"}]},\"isPositive\":true},{\"id\":\"reject-ambiguous-series-target\",\"request\":\"Remove total when more than one chart series resolves to total.\",\"operationId\":\"series.remove\",\"target\":\"total\",\"params\":{\"field\":\"total\"},\"isPositive\":false},{\"id\":\"reject-prompt-routing\",\"request\":\"Use the prompt example text to decide which backend endpoint to call.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"from prompt example\"},\"isPositive\":false},{\"id\":\"reject-unsafe-target\",\"request\":\"Navigate to javascript:alert(1) on drilldown.\",\"operationId\":\"drilldown.configure\",\"params\":{\"event\":\"drillDown\",\"action\":\"navigate\",\"target\":\"javascript:alert(1)\"},\"isPositive\":false}]}",
|
|
2436
|
+
"sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
|
|
2437
|
+
"contentHash": "1ba0e36fb1494064c4a79dc11890dfe9e2cc5c0bb03335f022081c0928ba6364",
|
|
2438
|
+
"sourceKind": "component_definition",
|
|
2439
|
+
"sourceId": "praxis-chart",
|
|
2440
|
+
"corpusVersion": "1.0.0"
|
|
2441
|
+
}
|
|
2442
|
+
]
|
|
2443
|
+
},
|
|
2444
|
+
"praxis-chart-state-probe": {
|
|
2445
|
+
"id": "praxis-chart-state-probe",
|
|
2446
|
+
"description": "Diagnostic widget used to inspect chart events and runtime payloads during local validation.",
|
|
2447
|
+
"inputs": [
|
|
2448
|
+
{
|
|
2449
|
+
"name": "title",
|
|
2450
|
+
"type": "string",
|
|
2451
|
+
"required": false,
|
|
2452
|
+
"description": "Probe panel title."
|
|
2453
|
+
},
|
|
2454
|
+
{
|
|
2455
|
+
"name": "value",
|
|
2456
|
+
"type": "unknown",
|
|
2457
|
+
"required": false,
|
|
2458
|
+
"description": "Payload rendered as formatted JSON."
|
|
2459
|
+
}
|
|
2460
|
+
],
|
|
2461
|
+
"outputs": [],
|
|
2462
|
+
"configSchemaId": null,
|
|
2463
|
+
"selector": "praxis-chart-state-probe",
|
|
2464
|
+
"friendlyName": "Praxis Chart State Probe",
|
|
2465
|
+
"icon": "monitoring",
|
|
2466
|
+
"tags": [
|
|
2467
|
+
"chart",
|
|
2468
|
+
"probe",
|
|
2469
|
+
"debug",
|
|
2470
|
+
"widget"
|
|
2471
|
+
],
|
|
2472
|
+
"lib": "@praxisui/charts",
|
|
2473
|
+
"source": "projects/praxis-charts/src/lib/praxis-chart-state-probe.metadata.ts",
|
|
2474
|
+
"exportName": "PRAXIS_CHART_STATE_PROBE_COMPONENT_METADATA",
|
|
2475
|
+
"chunks": [
|
|
2476
|
+
{
|
|
2477
|
+
"chunkIndex": 0,
|
|
2478
|
+
"chunkKind": "summary",
|
|
2479
|
+
"content": "Component ID: praxis-chart-state-probe\nSelector: praxis-chart-state-probe\nFriendly Name: Praxis Chart State Probe\nDescription: Diagnostic widget used to inspect chart events and runtime payloads during local validation.\nLib/Package: @praxisui/charts\nTags: chart, probe, debug, widget\nInputs:\n - title (string)\n - value (unknown)\n",
|
|
2480
|
+
"sourcePointer": "projects/praxis-charts/src/lib/praxis-chart-state-probe.metadata.ts",
|
|
2481
|
+
"contentHash": "4edab038ea98b121790987835fecd7930a0b5a182398f8ae30e93f1412ed0d7e",
|
|
2482
|
+
"sourceKind": "component_definition",
|
|
2483
|
+
"sourceId": "praxis-chart-state-probe",
|
|
2484
|
+
"corpusVersion": "1.0.0"
|
|
2485
|
+
}
|
|
2486
|
+
]
|
|
2487
|
+
}
|
|
2488
|
+
},
|
|
2489
|
+
"note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
|
|
2490
|
+
}
|