yaml-flow 8.11.8 → 8.11.10

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.
Files changed (94) hide show
  1. package/browser/asset-integrity.json +5 -5
  2. package/browser/live-cards.schema.json +807 -151
  3. package/browser/server-runtime-controlface.js +5 -5
  4. package/examples/board/cards/card-rebalance-sim.json +7 -5
  5. package/examples/board/cards/cardT-market-prices.json +3 -1
  6. package/examples/board/cards/cardT-portfolio-value.json +3 -1
  7. package/examples/board/cards/cardT-portfolio.json +4 -2
  8. package/examples/board/test/server-http-test-browser.ts +3 -1
  9. package/examples/board/test/server-http-test.js +3 -1
  10. package/examples/portfolio-tracker/portfolio-tracker.js +2 -2
  11. package/examples/portfolio-tracker/test/portfolio-t4.js +2 -2
  12. package/lib/board-live-cards-mcp.cjs +1 -1
  13. package/lib/board-live-cards-mcp.js +1 -1
  14. package/lib/board-live-cards-node.cjs +2 -2
  15. package/lib/board-live-cards-node.js +1 -1
  16. package/lib/board-live-cards-public.cjs +1 -1
  17. package/lib/board-live-cards-public.js +1 -1
  18. package/lib/board-live-cards-server-runtime.cjs +1 -1
  19. package/lib/board-live-cards-server-runtime.js +1 -1
  20. package/lib/board-livegraph-runtime/index.cjs +1 -1
  21. package/lib/board-livegraph-runtime/index.d.cts +1 -1
  22. package/lib/board-livegraph-runtime/index.d.ts +1 -1
  23. package/lib/board-livegraph-runtime/index.js +1 -1
  24. package/lib/card-compute/index.cjs +1 -1
  25. package/lib/card-compute/index.js +1 -1
  26. package/lib/card-store-public.cjs +1 -1
  27. package/lib/card-store-public.js +1 -1
  28. package/lib/card-validation.cjs +1 -1
  29. package/lib/card-validation.js +1 -1
  30. package/lib/chunk-23X3V5FR.cjs +2 -0
  31. package/lib/{chunk-OR6B2H2Y.cjs → chunk-2AIIEBBL.cjs} +3 -3
  32. package/lib/chunk-3EITX4IQ.cjs +3 -0
  33. package/lib/chunk-4P52IVQN.cjs +2 -0
  34. package/lib/chunk-66ZZIF2L.cjs +2 -0
  35. package/lib/{chunk-4NWVZ7AW.js → chunk-72FB4M6P.js} +2 -2
  36. package/lib/{chunk-BRYV6CDD.js → chunk-C7OY3PYL.js} +3 -3
  37. package/lib/{chunk-EGZPROOH.cjs → chunk-C7RR2JCL.cjs} +3 -3
  38. package/lib/{chunk-JOQWJ3VR.cjs → chunk-CAID4CGO.cjs} +2 -2
  39. package/lib/{chunk-REZO2QJD.js → chunk-E7SDEZSI.js} +3 -3
  40. package/lib/chunk-G5UUXBIB.cjs +2 -0
  41. package/lib/chunk-JQALMLNI.js +2 -0
  42. package/lib/{chunk-ROIYEFSE.js → chunk-K2VRX4TC.js} +2 -2
  43. package/lib/chunk-NJCDHKPX.js +3 -0
  44. package/lib/chunk-ONJG6QW6.js +2 -0
  45. package/lib/{chunk-HOS2ZUFZ.cjs → chunk-P4WQJ7LA.cjs} +2 -2
  46. package/lib/{chunk-6SPWFJRG.cjs → chunk-PYYRDOD5.cjs} +2 -2
  47. package/lib/chunk-QE3QXEHI.js +2 -0
  48. package/lib/{chunk-MRESV3MD.js → chunk-QJQ53PLM.js} +2 -2
  49. package/lib/{chunk-BA25VGJP.js → chunk-QOOIN523.js} +3 -3
  50. package/lib/{chunk-MRIFSG7L.cjs → chunk-TIQ775WI.cjs} +3 -3
  51. package/lib/chunk-WFMVZ3LO.js +2 -0
  52. package/lib/cloud-storage.cjs +1 -1
  53. package/lib/cloud-storage.js +1 -1
  54. package/lib/continuous-event-graph/index.cjs +1 -1
  55. package/lib/continuous-event-graph/index.d.cts +2 -2
  56. package/lib/continuous-event-graph/index.d.ts +2 -2
  57. package/lib/continuous-event-graph/index.js +1 -1
  58. package/lib/firestore-storage/index.cjs +1 -1
  59. package/lib/firestore-storage/index.js +1 -1
  60. package/lib/index.cjs +2 -2
  61. package/lib/index.d.cts +1 -1
  62. package/lib/index.d.ts +1 -1
  63. package/lib/index.js +1 -1
  64. package/lib/{live-cards-bridge-Bwi-lbBT.d.cts → live-cards-bridge-D8kP3uog.d.cts} +2 -2
  65. package/lib/{live-cards-bridge-YL6AWawT.d.ts → live-cards-bridge-DMBSDgpk.d.ts} +2 -2
  66. package/lib/localstorage-storage/index.cjs +1 -1
  67. package/lib/localstorage-storage/index.js +1 -1
  68. package/lib/{mcp-tool-registries-CRtea2x4.d.cts → mcp-tool-registries-B6KrbGuh.d.cts} +9 -0
  69. package/lib/{mcp-tool-registries-D3rWSppt.d.ts → mcp-tool-registries-BbxbZCbF.d.ts} +9 -0
  70. package/lib/server-runtime/index.cjs +1 -1
  71. package/lib/server-runtime/index.js +1 -1
  72. package/lib/server-runtime-agentface/index.d.cts +1 -1
  73. package/lib/server-runtime-agentface/index.d.ts +1 -1
  74. package/lib/server-runtime-controlface/index.cjs +1 -1
  75. package/lib/server-runtime-controlface/index.js +1 -1
  76. package/lib/server-runtime-core/index.cjs +1 -1
  77. package/lib/server-runtime-core/index.d.cts +14 -1
  78. package/lib/server-runtime-core/index.d.ts +14 -1
  79. package/lib/server-runtime-core/index.js +1 -1
  80. package/lib/server-runtime-webhooks/index.d.cts +1 -1
  81. package/lib/server-runtime-webhooks/index.d.ts +1 -1
  82. package/package.json +2 -1
  83. package/schema/live-cards.schema.json +807 -151
  84. package/browser/live-cards.js +0 -108
  85. package/lib/chunk-36KKCQVE.cjs +0 -2
  86. package/lib/chunk-3DWVFRQD.cjs +0 -3
  87. package/lib/chunk-3SLSRX6Q.js +0 -3
  88. package/lib/chunk-543ZEGP7.cjs +0 -2
  89. package/lib/chunk-ESTFYRHF.cjs +0 -2
  90. package/lib/chunk-NN52BT3Q.js +0 -2
  91. package/lib/chunk-PIPXFUEA.js +0 -2
  92. package/lib/chunk-UJQ7IML5.js +0 -2
  93. package/lib/chunk-YOY2JM5N.js +0 -2
  94. package/lib/chunk-ZV35WD6K.cjs +0 -2
@@ -7,34 +7,6 @@
7
7
  "type": "string",
8
8
  "pattern": "^(card_data|requires|fetched_sources|computed_values)(\\.|$)"
9
9
  },
10
- "bind_or_literal": {
11
- "description": "A literal value or a bind reference object",
12
- "oneOf": [
13
- {
14
- "type": "string"
15
- },
16
- {
17
- "type": "number"
18
- },
19
- {
20
- "type": "boolean"
21
- },
22
- {
23
- "type": "array"
24
- },
25
- {
26
- "type": "object",
27
- "properties": {
28
- "bind": {
29
- "$ref": "#/definitions/bind_ref"
30
- }
31
- },
32
- "required": [
33
- "bind"
34
- ]
35
- }
36
- ]
37
- },
38
10
  "compute_expr": {
39
11
  "description": "A declarative JSON compute expression",
40
12
  "type": "object",
@@ -278,11 +250,8 @@
278
250
  "required": [
279
251
  "kind"
280
252
  ],
253
+ "additionalProperties": false,
281
254
  "properties": {
282
- "id": {
283
- "type": "string",
284
- "description": "Optional element ID for targeted updates"
285
- },
286
255
  "kind": {
287
256
  "enum": [
288
257
  "metric",
@@ -290,7 +259,6 @@
290
259
  "editable-table",
291
260
  "chart",
292
261
  "form",
293
- "filter",
294
262
  "list",
295
263
  "notes",
296
264
  "todo",
@@ -299,163 +267,457 @@
299
267
  "badge",
300
268
  "text",
301
269
  "markdown",
270
+ "markup",
271
+ "selection",
272
+ "searchbox",
273
+ "query",
302
274
  "ref",
303
275
  "custom",
304
- "actions"
276
+ "actions",
277
+ "multi-file-upload"
305
278
  ]
306
279
  },
280
+ "id": {
281
+ "type": "string",
282
+ "description": "Optional element ID for targeted updates and action routing"
283
+ },
307
284
  "label": {
308
285
  "type": "string",
309
- "description": "Heading above this element"
286
+ "description": "Heading above this element (also the metric/alert title)"
310
287
  },
311
288
  "className": {
312
289
  "type": "string",
313
290
  "description": "Bootstrap grid class, e.g. 'col-12 col-md-6'"
314
291
  },
292
+ "containerStyle": {
293
+ "type": "object",
294
+ "description": "Inline style applied to the element container"
295
+ },
315
296
  "visible": {
316
297
  "type": "string",
317
298
  "description": "card_data/requires/fetched_sources/computed_values path — element shown only if truthy"
318
299
  },
319
300
  "data": {
301
+ "allOf": [
302
+ {
303
+ "$ref": "#/definitions/value_source"
304
+ }
305
+ ],
306
+ "description": "The element value: { bind } (dynamic) or { value } (static literal)"
307
+ },
308
+ "writeTo": {
309
+ "$ref": "#/definitions/write_ref"
310
+ },
311
+ "spec": {
320
312
  "type": "object",
321
- "properties": {
322
- "bind": {
323
- "$ref": "#/definitions/bind_ref",
324
- "description": "card_data/requires/fetched_sources/computed_values path to read data from"
313
+ "description": "Per-kind static configuration (constrained per kind below)"
314
+ }
315
+ },
316
+ "allOf": [
317
+ {
318
+ "if": {
319
+ "properties": {
320
+ "kind": {
321
+ "const": "metric"
322
+ }
325
323
  },
326
- "writeTo": {
327
- "$ref": "#/definitions/bind_ref",
328
- "description": "card_data path for user input (form, filter, todo, notes)"
324
+ "required": [
325
+ "kind"
326
+ ]
327
+ },
328
+ "then": {
329
+ "properties": {
330
+ "spec": {
331
+ "$ref": "#/definitions/spec_empty"
332
+ },
333
+ "writeTo": false
329
334
  },
330
- "columns": {
331
- "type": "array",
332
- "items": {
333
- "type": "string"
335
+ "required": [
336
+ "data"
337
+ ]
338
+ }
339
+ },
340
+ {
341
+ "if": {
342
+ "properties": {
343
+ "kind": {
344
+ "const": "table"
345
+ }
346
+ },
347
+ "required": [
348
+ "kind"
349
+ ]
350
+ },
351
+ "then": {
352
+ "properties": {
353
+ "spec": {
354
+ "$ref": "#/definitions/spec_table"
334
355
  },
335
- "description": "table: visible columns"
356
+ "writeTo": false
336
357
  },
337
- "maxRows": {
338
- "type": "integer",
339
- "description": "table/list: max rows to display"
358
+ "required": [
359
+ "data"
360
+ ]
361
+ }
362
+ },
363
+ {
364
+ "if": {
365
+ "properties": {
366
+ "kind": {
367
+ "const": "list"
368
+ }
340
369
  },
341
- "sortable": {
342
- "type": "boolean",
343
- "default": true,
344
- "description": "table: enable click-to-sort"
370
+ "required": [
371
+ "kind"
372
+ ]
373
+ },
374
+ "then": {
375
+ "properties": {
376
+ "spec": {
377
+ "$ref": "#/definitions/spec_table"
378
+ },
379
+ "writeTo": false
345
380
  },
346
- "placeholder": {
347
- "type": "string",
348
- "description": "Empty-state message"
381
+ "required": [
382
+ "data"
383
+ ]
384
+ }
385
+ },
386
+ {
387
+ "if": {
388
+ "properties": {
389
+ "kind": {
390
+ "const": "chart"
391
+ }
349
392
  },
350
- "chartType": {
351
- "enum": [
352
- "bar",
353
- "line",
354
- "pie",
355
- "doughnut"
356
- ]
393
+ "required": [
394
+ "kind"
395
+ ]
396
+ },
397
+ "then": {
398
+ "properties": {
399
+ "spec": {
400
+ "$ref": "#/definitions/spec_chart"
401
+ },
402
+ "writeTo": false
357
403
  },
358
- "chartOptions": {
359
- "type": "object",
360
- "description": "Chart.js options passthrough"
361
- },
362
- "fields": {
363
- "type": "object",
364
- "description": "JSON Schema for form/filter fields"
365
- },
366
- "thresholds": {
367
- "type": "object",
368
- "properties": {
369
- "green": {
370
- "type": "string"
371
- },
372
- "amber": {
373
- "type": "string"
374
- }
404
+ "required": [
405
+ "data"
406
+ ]
407
+ }
408
+ },
409
+ {
410
+ "if": {
411
+ "properties": {
412
+ "kind": {
413
+ "const": "alert"
375
414
  }
376
415
  },
377
- "colorMap": {
378
- "type": "object",
379
- "description": "badge: value → Bootstrap color"
416
+ "required": [
417
+ "kind"
418
+ ]
419
+ },
420
+ "then": {
421
+ "properties": {
422
+ "spec": {
423
+ "$ref": "#/definitions/spec_alert"
424
+ },
425
+ "writeTo": false
380
426
  },
381
- "style": {
382
- "enum": [
383
- "heading",
384
- "muted",
385
- "default"
386
- ],
387
- "description": "text: display style"
427
+ "required": [
428
+ "data"
429
+ ]
430
+ }
431
+ },
432
+ {
433
+ "if": {
434
+ "properties": {
435
+ "kind": {
436
+ "const": "badge"
437
+ }
388
438
  },
389
- "upload": {
390
- "type": "boolean",
391
- "default": true,
392
- "description": "file-upload: show drop zone (false = read-only file list)"
439
+ "required": [
440
+ "kind"
441
+ ]
442
+ },
443
+ "then": {
444
+ "properties": {
445
+ "spec": {
446
+ "$ref": "#/definitions/spec_badge"
447
+ },
448
+ "writeTo": false
393
449
  },
394
- "accept": {
395
- "type": "array",
396
- "items": {
397
- "type": "string"
450
+ "required": [
451
+ "data"
452
+ ]
453
+ }
454
+ },
455
+ {
456
+ "if": {
457
+ "properties": {
458
+ "kind": {
459
+ "const": "narrative"
460
+ }
461
+ },
462
+ "required": [
463
+ "kind"
464
+ ]
465
+ },
466
+ "then": {
467
+ "properties": {
468
+ "spec": {
469
+ "$ref": "#/definitions/spec_empty"
398
470
  },
399
- "description": "file-upload: allowed extensions"
471
+ "writeTo": false
400
472
  },
401
- "multiple": {
402
- "type": "boolean",
403
- "default": true,
404
- "description": "file-upload: allow multiple files"
473
+ "required": [
474
+ "data"
475
+ ]
476
+ }
477
+ },
478
+ {
479
+ "if": {
480
+ "properties": {
481
+ "kind": {
482
+ "const": "text"
483
+ }
405
484
  },
406
- "fileAttach": {
407
- "type": "boolean",
408
- "default": false,
409
- "description": "chat: enable inline file attachments"
485
+ "required": [
486
+ "kind"
487
+ ]
488
+ },
489
+ "then": {
490
+ "properties": {
491
+ "spec": {
492
+ "$ref": "#/definitions/spec_text"
493
+ },
494
+ "writeTo": false
410
495
  },
411
- "fileAccept": {
412
- "type": "array",
413
- "items": {
414
- "type": "string"
496
+ "required": [
497
+ "data"
498
+ ]
499
+ }
500
+ },
501
+ {
502
+ "if": {
503
+ "properties": {
504
+ "kind": {
505
+ "const": "markdown"
506
+ }
507
+ },
508
+ "required": [
509
+ "kind"
510
+ ]
511
+ },
512
+ "then": {
513
+ "properties": {
514
+ "spec": {
515
+ "$ref": "#/definitions/spec_empty"
415
516
  },
416
- "description": "chat: allowed attachment extensions"
417
- },
418
- "buttons": {
419
- "type": "array",
420
- "description": "actions: button definitions",
421
- "items": {
422
- "type": "object",
423
- "required": [
424
- "id",
425
- "label"
426
- ],
427
- "properties": {
428
- "id": {
429
- "type": "string"
430
- },
431
- "label": {
432
- "type": "string"
433
- },
434
- "style": {
435
- "type": "string",
436
- "description": "Bootstrap button variant, e.g. 'success', 'outline-danger'"
437
- },
438
- "size": {
439
- "type": "string",
440
- "default": "sm"
441
- },
442
- "disabled": {
443
- "oneOf": [
444
- {
445
- "type": "boolean"
446
- },
447
- {
448
- "type": "string",
449
- "description": "card_data/requires/fetched_sources/computed_values path — truthy = disabled"
450
- }
451
- ]
452
- }
453
- }
517
+ "writeTo": false
518
+ },
519
+ "required": [
520
+ "data"
521
+ ]
522
+ }
523
+ },
524
+ {
525
+ "if": {
526
+ "properties": {
527
+ "kind": {
528
+ "const": "markup"
529
+ }
530
+ },
531
+ "required": [
532
+ "kind"
533
+ ]
534
+ },
535
+ "then": {
536
+ "properties": {
537
+ "spec": {
538
+ "$ref": "#/definitions/spec_empty"
539
+ },
540
+ "writeTo": false
541
+ },
542
+ "required": [
543
+ "data"
544
+ ]
545
+ }
546
+ },
547
+ {
548
+ "if": {
549
+ "properties": {
550
+ "kind": {
551
+ "const": "actions"
552
+ }
553
+ },
554
+ "required": [
555
+ "kind"
556
+ ]
557
+ },
558
+ "then": {
559
+ "properties": {
560
+ "spec": {
561
+ "$ref": "#/definitions/spec_actions"
562
+ },
563
+ "data": false,
564
+ "writeTo": false
565
+ }
566
+ }
567
+ },
568
+ {
569
+ "if": {
570
+ "properties": {
571
+ "kind": {
572
+ "const": "selection"
573
+ }
574
+ },
575
+ "required": [
576
+ "kind"
577
+ ]
578
+ },
579
+ "then": {
580
+ "properties": {
581
+ "spec": {
582
+ "$ref": "#/definitions/spec_single_field"
583
+ }
584
+ }
585
+ }
586
+ },
587
+ {
588
+ "if": {
589
+ "properties": {
590
+ "kind": {
591
+ "const": "searchbox"
592
+ }
593
+ },
594
+ "required": [
595
+ "kind"
596
+ ]
597
+ },
598
+ "then": {
599
+ "properties": {
600
+ "spec": {
601
+ "$ref": "#/definitions/spec_searchbox"
602
+ }
603
+ }
604
+ }
605
+ },
606
+ {
607
+ "if": {
608
+ "properties": {
609
+ "kind": {
610
+ "const": "query"
611
+ }
612
+ },
613
+ "required": [
614
+ "kind"
615
+ ]
616
+ },
617
+ "then": {
618
+ "properties": {
619
+ "spec": {
620
+ "$ref": "#/definitions/spec_searchbox"
621
+ }
622
+ }
623
+ }
624
+ },
625
+ {
626
+ "if": {
627
+ "properties": {
628
+ "kind": {
629
+ "const": "form"
630
+ }
631
+ },
632
+ "required": [
633
+ "kind"
634
+ ]
635
+ },
636
+ "then": {
637
+ "properties": {
638
+ "spec": {
639
+ "$ref": "#/definitions/spec_form"
640
+ }
641
+ }
642
+ }
643
+ },
644
+ {
645
+ "if": {
646
+ "properties": {
647
+ "kind": {
648
+ "const": "notes"
649
+ }
650
+ },
651
+ "required": [
652
+ "kind"
653
+ ]
654
+ },
655
+ "then": {
656
+ "properties": {
657
+ "spec": {
658
+ "$ref": "#/definitions/spec_empty"
659
+ }
660
+ }
661
+ }
662
+ },
663
+ {
664
+ "if": {
665
+ "properties": {
666
+ "kind": {
667
+ "const": "todo"
668
+ }
669
+ },
670
+ "required": [
671
+ "kind"
672
+ ]
673
+ },
674
+ "then": {
675
+ "properties": {
676
+ "spec": {
677
+ "$ref": "#/definitions/spec_empty"
678
+ }
679
+ }
680
+ }
681
+ },
682
+ {
683
+ "if": {
684
+ "properties": {
685
+ "kind": {
686
+ "const": "editable-table"
687
+ }
688
+ },
689
+ "required": [
690
+ "kind"
691
+ ]
692
+ },
693
+ "then": {
694
+ "properties": {
695
+ "spec": {
696
+ "$ref": "#/definitions/spec_editable_table"
697
+ }
698
+ }
699
+ }
700
+ },
701
+ {
702
+ "if": {
703
+ "properties": {
704
+ "kind": {
705
+ "const": "ref"
706
+ }
707
+ },
708
+ "required": [
709
+ "kind"
710
+ ]
711
+ },
712
+ "then": {
713
+ "properties": {
714
+ "spec": {
715
+ "$ref": "#/definitions/spec_ref"
454
716
  }
455
717
  }
456
718
  }
457
719
  }
458
- }
720
+ ]
459
721
  },
460
722
  "view": {
461
723
  "type": "object",
@@ -471,6 +733,371 @@
471
733
  }
472
734
  }
473
735
  }
736
+ },
737
+ "value_source": {
738
+ "description": "Element value source. Exactly one of `bind` (dynamic path) or `value` (static inline literal).",
739
+ "type": "object",
740
+ "oneOf": [
741
+ {
742
+ "required": [
743
+ "bind"
744
+ ],
745
+ "additionalProperties": false,
746
+ "properties": {
747
+ "bind": {
748
+ "$ref": "#/definitions/bind_ref",
749
+ "description": "card_data/requires/fetched_sources/computed_values path to read the value from"
750
+ }
751
+ }
752
+ },
753
+ {
754
+ "required": [
755
+ "value"
756
+ ],
757
+ "additionalProperties": false,
758
+ "properties": {
759
+ "value": {
760
+ "description": "Static inline literal value (no binding)."
761
+ }
762
+ }
763
+ }
764
+ ]
765
+ },
766
+ "write_ref": {
767
+ "type": "string",
768
+ "pattern": "^card_data(\\.|$)",
769
+ "description": "card_data path the element writes user input to (input kinds only)"
770
+ },
771
+ "spec_empty": {
772
+ "type": "object",
773
+ "additionalProperties": false,
774
+ "properties": {}
775
+ },
776
+ "spec_table": {
777
+ "type": "object",
778
+ "additionalProperties": false,
779
+ "properties": {
780
+ "columns": {
781
+ "type": "array",
782
+ "items": {
783
+ "type": "string"
784
+ },
785
+ "description": "Visible columns, in order"
786
+ },
787
+ "maxRows": {
788
+ "type": "integer",
789
+ "description": "Max rows to display"
790
+ },
791
+ "sortable": {
792
+ "type": "boolean",
793
+ "default": true,
794
+ "description": "Enable click-to-sort"
795
+ },
796
+ "placeholder": {
797
+ "type": "string",
798
+ "description": "Empty-state message"
799
+ }
800
+ }
801
+ },
802
+ "spec_chart": {
803
+ "type": "object",
804
+ "additionalProperties": false,
805
+ "properties": {
806
+ "chartType": {
807
+ "enum": [
808
+ "bar",
809
+ "line",
810
+ "area",
811
+ "scatter",
812
+ "pie",
813
+ "doughnut"
814
+ ],
815
+ "description": "Explicit chart type (else auto-detected)"
816
+ },
817
+ "columns": {
818
+ "type": "array",
819
+ "items": {
820
+ "type": "string"
821
+ },
822
+ "description": "First column is the label/x axis; rest are series"
823
+ },
824
+ "labelKey": {
825
+ "type": "string",
826
+ "description": "Row key to use as the category/x label"
827
+ },
828
+ "xKey": {
829
+ "type": "string",
830
+ "description": "Row key to use as the x axis (line charts)"
831
+ },
832
+ "series": {
833
+ "type": "array",
834
+ "items": {
835
+ "type": "string"
836
+ },
837
+ "description": "Row keys to plot as series"
838
+ },
839
+ "stacked": {
840
+ "type": "boolean",
841
+ "description": "Stack bar/area series"
842
+ },
843
+ "legend": {
844
+ "type": "boolean",
845
+ "default": true,
846
+ "description": "Show the legend"
847
+ },
848
+ "grid": {
849
+ "type": "boolean",
850
+ "default": true,
851
+ "description": "Show the cartesian grid"
852
+ },
853
+ "height": {
854
+ "type": "integer",
855
+ "default": 220,
856
+ "description": "Chart height in pixels"
857
+ }
858
+ }
859
+ },
860
+ "spec_alert": {
861
+ "type": "object",
862
+ "additionalProperties": false,
863
+ "properties": {
864
+ "thresholds": {
865
+ "type": "object",
866
+ "additionalProperties": false,
867
+ "properties": {
868
+ "green": {
869
+ "type": "string",
870
+ "description": "Comparison expr, e.g. '>=80'"
871
+ },
872
+ "amber": {
873
+ "type": "string",
874
+ "description": "Comparison expr, e.g. '>=50'"
875
+ }
876
+ }
877
+ }
878
+ }
879
+ },
880
+ "spec_badge": {
881
+ "type": "object",
882
+ "additionalProperties": false,
883
+ "properties": {
884
+ "colorMap": {
885
+ "type": "object",
886
+ "additionalProperties": {
887
+ "type": "string"
888
+ },
889
+ "description": "value → tone/Bootstrap color"
890
+ }
891
+ }
892
+ },
893
+ "spec_text": {
894
+ "type": "object",
895
+ "additionalProperties": false,
896
+ "properties": {
897
+ "format": {
898
+ "enum": [
899
+ "default",
900
+ "file-links"
901
+ ],
902
+ "description": "'file-links' renders the bound file array as download links"
903
+ },
904
+ "style": {
905
+ "enum": [
906
+ "default",
907
+ "muted",
908
+ "muted-italic",
909
+ "heading"
910
+ ],
911
+ "description": "Display style"
912
+ },
913
+ "hideIfEmpty": {
914
+ "type": "boolean",
915
+ "description": "Render nothing when the value is empty"
916
+ }
917
+ }
918
+ },
919
+ "spec_actions": {
920
+ "type": "object",
921
+ "additionalProperties": false,
922
+ "required": [
923
+ "buttons"
924
+ ],
925
+ "properties": {
926
+ "buttons": {
927
+ "type": "array",
928
+ "description": "Button definitions; clicks emit an action save keyed by element id + button id",
929
+ "items": {
930
+ "type": "object",
931
+ "required": [
932
+ "id",
933
+ "label"
934
+ ],
935
+ "additionalProperties": false,
936
+ "properties": {
937
+ "id": {
938
+ "type": "string"
939
+ },
940
+ "label": {
941
+ "type": "string"
942
+ },
943
+ "style": {
944
+ "type": "string",
945
+ "description": "Bootstrap button variant, e.g. 'success', 'outline-danger'"
946
+ },
947
+ "size": {
948
+ "type": "string",
949
+ "default": "sm"
950
+ },
951
+ "disabled": {
952
+ "oneOf": [
953
+ {
954
+ "type": "boolean"
955
+ },
956
+ {
957
+ "type": "string",
958
+ "description": "card_data/requires/fetched_sources/computed_values path — truthy = disabled"
959
+ }
960
+ ]
961
+ }
962
+ }
963
+ }
964
+ }
965
+ }
966
+ },
967
+ "spec_form": {
968
+ "type": "object",
969
+ "additionalProperties": false,
970
+ "required": [
971
+ "fields"
972
+ ],
973
+ "properties": {
974
+ "fields": {
975
+ "type": "object",
976
+ "description": "JSON-Schema-ish { properties, required } describing the form fields"
977
+ },
978
+ "discardLabel": {
979
+ "type": "string"
980
+ },
981
+ "saveLabel": {
982
+ "type": "string"
983
+ },
984
+ "validators": {
985
+ "type": "array",
986
+ "description": "Cross-field validation rules. Each item is a [jsonataExpr, errorMessage] pair; the expr is evaluated against { data: <current field values> } and must return true to pass. Required-field emptiness is already handled by fields.required, so validators are for format/relationship rules. Runs on blur and submit.",
987
+ "items": {
988
+ "type": "array",
989
+ "minItems": 2,
990
+ "maxItems": 2,
991
+ "items": {
992
+ "type": "string"
993
+ }
994
+ }
995
+ }
996
+ }
997
+ },
998
+ "spec_single_field": {
999
+ "type": "object",
1000
+ "additionalProperties": false,
1001
+ "required": [
1002
+ "fields"
1003
+ ],
1004
+ "properties": {
1005
+ "fields": {
1006
+ "type": "object",
1007
+ "description": "Single-property JSON-Schema-ish { properties, required } for the control"
1008
+ }
1009
+ }
1010
+ },
1011
+ "spec_searchbox": {
1012
+ "type": "object",
1013
+ "additionalProperties": false,
1014
+ "required": [
1015
+ "fields"
1016
+ ],
1017
+ "properties": {
1018
+ "fields": {
1019
+ "type": "object",
1020
+ "description": "Single-property JSON-Schema-ish { properties, required } for the query field"
1021
+ },
1022
+ "actionLabel": {
1023
+ "type": "string",
1024
+ "description": "Submit button label (default 'Search')"
1025
+ }
1026
+ }
1027
+ },
1028
+ "spec_editable_table": {
1029
+ "type": "object",
1030
+ "additionalProperties": false,
1031
+ "properties": {
1032
+ "schema": {
1033
+ "type": "object",
1034
+ "description": "JSON-Schema-ish { properties } describing per-column cell types"
1035
+ },
1036
+ "columns": {
1037
+ "type": "array",
1038
+ "items": {
1039
+ "type": "string"
1040
+ },
1041
+ "description": "Explicit column order"
1042
+ },
1043
+ "addRow": {
1044
+ "type": "boolean",
1045
+ "default": true
1046
+ },
1047
+ "deleteRow": {
1048
+ "type": "boolean",
1049
+ "default": true
1050
+ },
1051
+ "placeholder": {
1052
+ "type": "string"
1053
+ }
1054
+ }
1055
+ },
1056
+ "spec_ref": {
1057
+ "type": "object",
1058
+ "additionalProperties": true,
1059
+ "required": [
1060
+ "viewBind"
1061
+ ],
1062
+ "properties": {
1063
+ "viewBind": {
1064
+ "$ref": "#/definitions/bind_ref",
1065
+ "description": "Path to a computed view descriptor { kind, data?, spec? } selecting the effective kind at runtime"
1066
+ },
1067
+ "fallbackKind": {
1068
+ "enum": [
1069
+ "metric",
1070
+ "table",
1071
+ "editable-table",
1072
+ "chart",
1073
+ "form",
1074
+ "list",
1075
+ "notes",
1076
+ "todo",
1077
+ "alert",
1078
+ "narrative",
1079
+ "badge",
1080
+ "text",
1081
+ "markdown",
1082
+ "markup",
1083
+ "selection",
1084
+ "searchbox",
1085
+ "query",
1086
+ "ref",
1087
+ "custom",
1088
+ "actions",
1089
+ "multi-file-upload"
1090
+ ],
1091
+ "description": "Kind to use when viewBind is absent/unresolved"
1092
+ },
1093
+ "columns": {
1094
+ "type": "array",
1095
+ "items": {
1096
+ "type": "string"
1097
+ },
1098
+ "description": "Columns to forward to the resolved table/list view"
1099
+ }
1100
+ }
474
1101
  }
475
1102
  },
476
1103
  "title": "LiveCard",
@@ -552,6 +1179,35 @@
552
1179
  },
553
1180
  "additionalProperties": false
554
1181
  }
1182
+ },
1183
+ "filegroups": {
1184
+ "type": "array",
1185
+ "description": "Optional grouped multi-file upload submissions maintained by host handlers. Each entry references files in card_data.files by index and carries an optional message. Identified by array position.",
1186
+ "items": {
1187
+ "type": "object",
1188
+ "required": [
1189
+ "file_idxs"
1190
+ ],
1191
+ "properties": {
1192
+ "message": {
1193
+ "type": "string",
1194
+ "description": "Optional message associated with the upload group; empty string when none."
1195
+ },
1196
+ "file_idxs": {
1197
+ "type": "array",
1198
+ "description": "Indexes into card_data.files identifying the files in this group, in upload order.",
1199
+ "items": {
1200
+ "type": "integer",
1201
+ "minimum": 0
1202
+ }
1203
+ },
1204
+ "created_at": {
1205
+ "type": "string",
1206
+ "format": "date-time"
1207
+ }
1208
+ },
1209
+ "additionalProperties": false
1210
+ }
555
1211
  }
556
1212
  },
557
1213
  "additionalProperties": true