@timeax/digital-service-engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1138 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$ref": "#/definitions/EditorSnapshot",
4
+ "definitions": {
5
+ "EditorSnapshot": {
6
+ "type": "object",
7
+ "properties": {
8
+ "props": {
9
+ "$ref": "#/definitions/ServiceProps"
10
+ },
11
+ "layout": {
12
+ "$ref": "#/definitions/LayoutState"
13
+ },
14
+ "comments": {
15
+ "type": "array",
16
+ "items": {
17
+ "$ref": "#/definitions/CommentNode"
18
+ }
19
+ },
20
+ "meta": {
21
+ "type": "object",
22
+ "additionalProperties": {}
23
+ }
24
+ },
25
+ "required": [
26
+ "props"
27
+ ]
28
+ },
29
+ "ServiceProps": {
30
+ "type": "object",
31
+ "properties": {
32
+ "order_for_tags": {
33
+ "type": "object",
34
+ "additionalProperties": {
35
+ "type": "array",
36
+ "items": {
37
+ "type": "string"
38
+ }
39
+ }
40
+ },
41
+ "filters": {
42
+ "type": "array",
43
+ "items": {
44
+ "$ref": "#/definitions/Tag"
45
+ }
46
+ },
47
+ "fields": {
48
+ "type": "array",
49
+ "items": {
50
+ "$ref": "#/definitions/Field"
51
+ }
52
+ },
53
+ "includes_for_buttons": {
54
+ "type": "object",
55
+ "additionalProperties": {
56
+ "type": "array",
57
+ "items": {
58
+ "type": "string"
59
+ }
60
+ }
61
+ },
62
+ "excludes_for_buttons": {
63
+ "type": "object",
64
+ "additionalProperties": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "string"
68
+ }
69
+ }
70
+ },
71
+ "schema_version": {
72
+ "type": "string"
73
+ },
74
+ "fallbacks": {
75
+ "$ref": "#/definitions/ServiceFallback"
76
+ }
77
+ },
78
+ "required": [
79
+ "filters",
80
+ "fields"
81
+ ]
82
+ },
83
+ "Tag": {
84
+ "type": "object",
85
+ "properties": {
86
+ "id": {
87
+ "type": "string"
88
+ },
89
+ "label": {
90
+ "type": "string"
91
+ },
92
+ "bind_id": {
93
+ "type": "string"
94
+ },
95
+ "service_id": {
96
+ "type": "number"
97
+ },
98
+ "includes": {
99
+ "type": "array",
100
+ "items": {
101
+ "type": "string"
102
+ }
103
+ },
104
+ "excludes": {
105
+ "type": "array",
106
+ "items": {
107
+ "type": "string"
108
+ }
109
+ },
110
+ "meta": {
111
+ "type": "object",
112
+ "properties": {
113
+ "quantityDefault": {
114
+ "type": "number"
115
+ }
116
+ }
117
+ },
118
+ "constraints": {
119
+ "type": "object",
120
+ "additionalProperties": {
121
+ "type": "boolean"
122
+ },
123
+ "description": "Which flags are set for this tag. If a flag is not set, it's inherited from the nearest ancestor with a value set."
124
+ },
125
+ "constraints_origin": {
126
+ "type": "object",
127
+ "additionalProperties": {
128
+ "type": "string"
129
+ },
130
+ "description": "Which ancestor defined the *effective* value for each flag (nearest source)."
131
+ },
132
+ "constraints_overrides": {
133
+ "type": "object",
134
+ "additionalProperties": {
135
+ "type": "object",
136
+ "properties": {
137
+ "from": {
138
+ "type": "boolean"
139
+ },
140
+ "to": {
141
+ "type": "boolean"
142
+ },
143
+ "origin": {
144
+ "type": "string"
145
+ }
146
+ },
147
+ "required": [
148
+ "from",
149
+ "to",
150
+ "origin"
151
+ ]
152
+ },
153
+ "description": "Present only when a child explicitly set a different value but was overridden by an ancestor during normalisation."
154
+ }
155
+ },
156
+ "required": [
157
+ "id",
158
+ "label"
159
+ ]
160
+ },
161
+ "Field": {
162
+ "anyOf": [
163
+ {
164
+ "type": "object",
165
+ "properties": {
166
+ "button": {
167
+ "type": "boolean",
168
+ "const": false
169
+ },
170
+ "service_id": {
171
+ "not": {}
172
+ },
173
+ "id": {
174
+ "type": "string"
175
+ },
176
+ "type": {
177
+ "$ref": "#/definitions/FieldType"
178
+ },
179
+ "bind_id": {
180
+ "anyOf": [
181
+ {
182
+ "type": "string"
183
+ },
184
+ {
185
+ "type": "array",
186
+ "items": {
187
+ "type": "string"
188
+ }
189
+ }
190
+ ]
191
+ },
192
+ "name": {
193
+ "type": "string"
194
+ },
195
+ "options": {
196
+ "type": "array",
197
+ "items": {
198
+ "$ref": "#/definitions/FieldOption"
199
+ }
200
+ },
201
+ "description": {
202
+ "type": "string"
203
+ },
204
+ "component": {
205
+ "type": "string"
206
+ },
207
+ "pricing_role": {
208
+ "$ref": "#/definitions/PricingRole"
209
+ },
210
+ "meta": {
211
+ "type": "object",
212
+ "properties": {
213
+ "multi": {
214
+ "type": "boolean"
215
+ },
216
+ "utility": {
217
+ "type": "object",
218
+ "properties": {
219
+ "rate": {
220
+ "type": "number"
221
+ },
222
+ "mode": {
223
+ "type": "string",
224
+ "enum": [
225
+ "flat",
226
+ "per_quantity",
227
+ "per_value",
228
+ "percent"
229
+ ]
230
+ },
231
+ "valueBy": {
232
+ "type": "string",
233
+ "enum": [
234
+ "value",
235
+ "length"
236
+ ]
237
+ },
238
+ "percentBase": {
239
+ "type": "string",
240
+ "enum": [
241
+ "service_total",
242
+ "base_service",
243
+ "all"
244
+ ]
245
+ },
246
+ "label": {
247
+ "type": "string"
248
+ }
249
+ },
250
+ "required": [
251
+ "rate",
252
+ "mode"
253
+ ]
254
+ },
255
+ "quantity": {
256
+ "type": "object",
257
+ "properties": {
258
+ "valueBy": {
259
+ "type": "string",
260
+ "enum": [
261
+ "value",
262
+ "length",
263
+ "eval"
264
+ ]
265
+ },
266
+ "code": {
267
+ "type": "string"
268
+ },
269
+ "multiply": {
270
+ "type": "number"
271
+ },
272
+ "clamp": {
273
+ "type": "object",
274
+ "properties": {
275
+ "min": {
276
+ "type": "number"
277
+ },
278
+ "max": {
279
+ "type": "number"
280
+ }
281
+ }
282
+ },
283
+ "fallback": {
284
+ "type": "number"
285
+ }
286
+ },
287
+ "required": [
288
+ "valueBy"
289
+ ]
290
+ }
291
+ }
292
+ },
293
+ "label": {
294
+ "type": "string"
295
+ },
296
+ "required": {
297
+ "type": "boolean"
298
+ },
299
+ "ui": {
300
+ "type": "object",
301
+ "additionalProperties": {
302
+ "$ref": "#/definitions/Ui"
303
+ },
304
+ "description": "Host-defined prop names → typed UI nodes"
305
+ },
306
+ "defaults": {
307
+ "type": "object",
308
+ "additionalProperties": {},
309
+ "description": "Host-defined prop names → runtime default values (untyped base)"
310
+ }
311
+ },
312
+ "required": [
313
+ "id",
314
+ "label",
315
+ "type"
316
+ ]
317
+ },
318
+ {
319
+ "type": "object",
320
+ "properties": {
321
+ "quantityDefault": {
322
+ "type": "number"
323
+ },
324
+ "button": {
325
+ "type": "boolean",
326
+ "const": true
327
+ },
328
+ "service_id": {
329
+ "type": "number"
330
+ },
331
+ "id": {
332
+ "type": "string"
333
+ },
334
+ "type": {
335
+ "$ref": "#/definitions/FieldType"
336
+ },
337
+ "bind_id": {
338
+ "anyOf": [
339
+ {
340
+ "type": "string"
341
+ },
342
+ {
343
+ "type": "array",
344
+ "items": {
345
+ "type": "string"
346
+ }
347
+ }
348
+ ]
349
+ },
350
+ "name": {
351
+ "type": "string"
352
+ },
353
+ "options": {
354
+ "type": "array",
355
+ "items": {
356
+ "$ref": "#/definitions/FieldOption"
357
+ }
358
+ },
359
+ "description": {
360
+ "type": "string"
361
+ },
362
+ "component": {
363
+ "type": "string"
364
+ },
365
+ "pricing_role": {
366
+ "$ref": "#/definitions/PricingRole"
367
+ },
368
+ "meta": {
369
+ "type": "object",
370
+ "properties": {
371
+ "multi": {
372
+ "type": "boolean"
373
+ },
374
+ "utility": {
375
+ "type": "object",
376
+ "properties": {
377
+ "rate": {
378
+ "type": "number"
379
+ },
380
+ "mode": {
381
+ "type": "string",
382
+ "enum": [
383
+ "flat",
384
+ "per_quantity",
385
+ "per_value",
386
+ "percent"
387
+ ]
388
+ },
389
+ "valueBy": {
390
+ "type": "string",
391
+ "enum": [
392
+ "value",
393
+ "length"
394
+ ]
395
+ },
396
+ "percentBase": {
397
+ "type": "string",
398
+ "enum": [
399
+ "service_total",
400
+ "base_service",
401
+ "all"
402
+ ]
403
+ },
404
+ "label": {
405
+ "type": "string"
406
+ }
407
+ },
408
+ "required": [
409
+ "rate",
410
+ "mode"
411
+ ]
412
+ },
413
+ "quantity": {
414
+ "type": "object",
415
+ "properties": {
416
+ "valueBy": {
417
+ "type": "string",
418
+ "enum": [
419
+ "value",
420
+ "length",
421
+ "eval"
422
+ ]
423
+ },
424
+ "code": {
425
+ "type": "string"
426
+ },
427
+ "multiply": {
428
+ "type": "number"
429
+ },
430
+ "clamp": {
431
+ "type": "object",
432
+ "properties": {
433
+ "min": {
434
+ "type": "number"
435
+ },
436
+ "max": {
437
+ "type": "number"
438
+ }
439
+ }
440
+ },
441
+ "fallback": {
442
+ "type": "number"
443
+ }
444
+ },
445
+ "required": [
446
+ "valueBy"
447
+ ]
448
+ }
449
+ }
450
+ },
451
+ "label": {
452
+ "type": "string"
453
+ },
454
+ "required": {
455
+ "type": "boolean"
456
+ },
457
+ "ui": {
458
+ "type": "object",
459
+ "additionalProperties": {
460
+ "$ref": "#/definitions/Ui"
461
+ },
462
+ "description": "Host-defined prop names → typed UI nodes"
463
+ },
464
+ "defaults": {
465
+ "type": "object",
466
+ "additionalProperties": {},
467
+ "description": "Host-defined prop names → runtime default values (untyped base)"
468
+ }
469
+ },
470
+ "required": [
471
+ "button",
472
+ "id",
473
+ "label",
474
+ "type"
475
+ ]
476
+ }
477
+ ]
478
+ },
479
+ "FieldType": {
480
+ "type": "string"
481
+ },
482
+ "FieldOption": {
483
+ "type": "object",
484
+ "properties": {
485
+ "id": {
486
+ "type": "string"
487
+ },
488
+ "label": {
489
+ "type": "string"
490
+ },
491
+ "value": {
492
+ "type": [
493
+ "string",
494
+ "number"
495
+ ]
496
+ },
497
+ "service_id": {
498
+ "type": "number"
499
+ },
500
+ "pricing_role": {
501
+ "$ref": "#/definitions/PricingRole"
502
+ },
503
+ "meta": {
504
+ "type": "object",
505
+ "properties": {
506
+ "quantityDefault": {
507
+ "type": "number"
508
+ },
509
+ "utility": {
510
+ "type": "object",
511
+ "properties": {
512
+ "rate": {
513
+ "type": "number"
514
+ },
515
+ "mode": {
516
+ "type": "string",
517
+ "enum": [
518
+ "flat",
519
+ "per_quantity",
520
+ "per_value",
521
+ "percent"
522
+ ]
523
+ },
524
+ "valueBy": {
525
+ "type": "string",
526
+ "enum": [
527
+ "value",
528
+ "length"
529
+ ]
530
+ },
531
+ "percentBase": {
532
+ "type": "string",
533
+ "enum": [
534
+ "service_total",
535
+ "base_service",
536
+ "all"
537
+ ]
538
+ },
539
+ "label": {
540
+ "type": "string"
541
+ }
542
+ },
543
+ "required": [
544
+ "rate",
545
+ "mode"
546
+ ]
547
+ }
548
+ }
549
+ }
550
+ },
551
+ "required": [
552
+ "id",
553
+ "label"
554
+ ]
555
+ },
556
+ "PricingRole": {
557
+ "type": "string",
558
+ "enum": [
559
+ "base",
560
+ "utility"
561
+ ]
562
+ },
563
+ "Ui": {
564
+ "anyOf": [
565
+ {
566
+ "$ref": "#/definitions/UiString"
567
+ },
568
+ {
569
+ "$ref": "#/definitions/UiNumber"
570
+ },
571
+ {
572
+ "$ref": "#/definitions/UiBoolean"
573
+ },
574
+ {
575
+ "$ref": "#/definitions/UiAnyOf"
576
+ },
577
+ {
578
+ "$ref": "#/definitions/UiArray"
579
+ },
580
+ {
581
+ "$ref": "#/definitions/UiObject"
582
+ }
583
+ ]
584
+ },
585
+ "UiString": {
586
+ "type": "object",
587
+ "properties": {
588
+ "type": {
589
+ "type": "string",
590
+ "const": "string"
591
+ },
592
+ "enum": {
593
+ "type": "array",
594
+ "items": {
595
+ "type": "string"
596
+ }
597
+ },
598
+ "minLength": {
599
+ "type": "number"
600
+ },
601
+ "maxLength": {
602
+ "type": "number"
603
+ },
604
+ "pattern": {
605
+ "type": "string"
606
+ },
607
+ "format": {
608
+ "type": "string"
609
+ }
610
+ },
611
+ "required": [
612
+ "type"
613
+ ],
614
+ "description": "string"
615
+ },
616
+ "UiNumber": {
617
+ "type": "object",
618
+ "properties": {
619
+ "type": {
620
+ "type": "string",
621
+ "const": "number"
622
+ },
623
+ "minimum": {
624
+ "type": "number"
625
+ },
626
+ "maximum": {
627
+ "type": "number"
628
+ },
629
+ "multipleOf": {
630
+ "type": "number"
631
+ }
632
+ },
633
+ "required": [
634
+ "type"
635
+ ],
636
+ "description": "number"
637
+ },
638
+ "UiBoolean": {
639
+ "type": "object",
640
+ "properties": {
641
+ "type": {
642
+ "type": "string",
643
+ "const": "boolean"
644
+ }
645
+ },
646
+ "required": [
647
+ "type"
648
+ ],
649
+ "description": "boolean"
650
+ },
651
+ "UiAnyOf": {
652
+ "type": "object",
653
+ "properties": {
654
+ "type": {
655
+ "type": "string",
656
+ "const": "anyOf"
657
+ },
658
+ "multiple": {
659
+ "type": "boolean"
660
+ },
661
+ "items": {
662
+ "type": "array",
663
+ "items": {
664
+ "type": "object",
665
+ "properties": {
666
+ "type": {
667
+ "type": "string",
668
+ "enum": [
669
+ "string",
670
+ "number",
671
+ "boolean"
672
+ ]
673
+ },
674
+ "title": {
675
+ "type": "string"
676
+ },
677
+ "description": {
678
+ "type": "string"
679
+ },
680
+ "value": {
681
+ "type": [
682
+ "string",
683
+ "number",
684
+ "boolean"
685
+ ]
686
+ }
687
+ },
688
+ "required": [
689
+ "type",
690
+ "value"
691
+ ]
692
+ }
693
+ }
694
+ },
695
+ "required": [
696
+ "type",
697
+ "items"
698
+ ],
699
+ "description": "enumerated choices"
700
+ },
701
+ "UiArray": {
702
+ "type": "object",
703
+ "properties": {
704
+ "type": {
705
+ "type": "string",
706
+ "const": "array"
707
+ },
708
+ "item": {
709
+ "$ref": "#/definitions/Ui"
710
+ },
711
+ "items": {
712
+ "type": "array",
713
+ "items": {
714
+ "$ref": "#/definitions/Ui"
715
+ }
716
+ },
717
+ "minItems": {
718
+ "type": "number"
719
+ },
720
+ "maxItems": {
721
+ "type": "number"
722
+ },
723
+ "uniqueItems": {
724
+ "type": "boolean"
725
+ }
726
+ },
727
+ "required": [
728
+ "type"
729
+ ],
730
+ "description": "arrays: homogeneous (item) or tuple (items)"
731
+ },
732
+ "UiObject": {
733
+ "type": "object",
734
+ "properties": {
735
+ "type": {
736
+ "type": "string",
737
+ "const": "object"
738
+ },
739
+ "fields": {
740
+ "type": "object",
741
+ "additionalProperties": {
742
+ "$ref": "#/definitions/Ui"
743
+ }
744
+ },
745
+ "required": {
746
+ "type": "array",
747
+ "items": {
748
+ "type": "string"
749
+ }
750
+ },
751
+ "order": {
752
+ "type": "array",
753
+ "items": {
754
+ "type": "string"
755
+ }
756
+ }
757
+ },
758
+ "required": [
759
+ "type",
760
+ "fields"
761
+ ],
762
+ "description": "objects: nested props"
763
+ },
764
+ "ServiceFallback": {
765
+ "type": "object",
766
+ "properties": {
767
+ "nodes": {
768
+ "type": "object",
769
+ "additionalProperties": {
770
+ "type": "array",
771
+ "items": {
772
+ "$ref": "#/definitions/ServiceIdRef"
773
+ }
774
+ },
775
+ "description": "Node-scoped fallbacks: prefer these when that node’s primary service fails"
776
+ },
777
+ "global": {
778
+ "type": "object",
779
+ "additionalProperties": {
780
+ "type": "array",
781
+ "items": {
782
+ "$ref": "#/definitions/ServiceIdRef"
783
+ }
784
+ },
785
+ "description": "Primary→fallback list used when no node-scoped entry is present"
786
+ }
787
+ }
788
+ },
789
+ "ServiceIdRef": {
790
+ "type": [
791
+ "number",
792
+ "string"
793
+ ]
794
+ },
795
+ "LayoutState": {
796
+ "type": "object",
797
+ "properties": {
798
+ "canvas": {
799
+ "$ref": "#/definitions/CanvasState"
800
+ },
801
+ "edges": {
802
+ "type": "array",
803
+ "items": {
804
+ "$ref": "#/definitions/EdgeRoute"
805
+ }
806
+ }
807
+ },
808
+ "required": [
809
+ "canvas"
810
+ ]
811
+ },
812
+ "CanvasState": {
813
+ "type": "object",
814
+ "properties": {
815
+ "graph": {
816
+ "$ref": "#/definitions/GraphSnapshot"
817
+ },
818
+ "positions": {
819
+ "$ref": "#/definitions/NodePositions"
820
+ },
821
+ "selection": {
822
+ "type": "object",
823
+ "properties": {
824
+ "size": {
825
+ "type": "number"
826
+ }
827
+ },
828
+ "required": [
829
+ "size"
830
+ ]
831
+ },
832
+ "highlighted": {
833
+ "type": "object",
834
+ "properties": {
835
+ "size": {
836
+ "type": "number"
837
+ }
838
+ },
839
+ "required": [
840
+ "size"
841
+ ]
842
+ },
843
+ "hoverId": {
844
+ "type": "string"
845
+ },
846
+ "viewport": {
847
+ "$ref": "#/definitions/Viewport"
848
+ },
849
+ "draftWire": {
850
+ "$ref": "#/definitions/DraftWire"
851
+ },
852
+ "version": {
853
+ "type": "number"
854
+ }
855
+ },
856
+ "required": [
857
+ "graph",
858
+ "positions",
859
+ "selection",
860
+ "highlighted",
861
+ "viewport",
862
+ "version"
863
+ ]
864
+ },
865
+ "GraphSnapshot": {
866
+ "type": "object",
867
+ "properties": {
868
+ "nodes": {
869
+ "type": "array",
870
+ "items": {
871
+ "$ref": "#/definitions/GraphNode"
872
+ }
873
+ },
874
+ "edges": {
875
+ "type": "array",
876
+ "items": {
877
+ "$ref": "#/definitions/GraphEdge"
878
+ }
879
+ }
880
+ },
881
+ "required": [
882
+ "nodes",
883
+ "edges"
884
+ ]
885
+ },
886
+ "GraphNode": {
887
+ "type": "object",
888
+ "properties": {
889
+ "id": {
890
+ "type": "string"
891
+ },
892
+ "kind": {
893
+ "$ref": "#/definitions/NodeKind"
894
+ },
895
+ "bind_type": {
896
+ "type": [
897
+ "string",
898
+ "null"
899
+ ],
900
+ "enum": [
901
+ "bound",
902
+ "utility",
903
+ null
904
+ ]
905
+ },
906
+ "errors": {
907
+ "type": "array",
908
+ "items": {
909
+ "type": "string"
910
+ }
911
+ },
912
+ "label": {
913
+ "type": "string"
914
+ }
915
+ },
916
+ "required": [
917
+ "id",
918
+ "kind",
919
+ "label"
920
+ ]
921
+ },
922
+ "NodeKind": {
923
+ "type": "string",
924
+ "enum": [
925
+ "tag",
926
+ "field",
927
+ "comment",
928
+ "option"
929
+ ]
930
+ },
931
+ "GraphEdge": {
932
+ "type": "object",
933
+ "properties": {
934
+ "from": {
935
+ "type": "string"
936
+ },
937
+ "to": {
938
+ "type": "string"
939
+ },
940
+ "kind": {
941
+ "$ref": "#/definitions/EdgeKind"
942
+ },
943
+ "meta": {
944
+ "type": "object",
945
+ "additionalProperties": {}
946
+ }
947
+ },
948
+ "required": [
949
+ "from",
950
+ "to",
951
+ "kind"
952
+ ]
953
+ },
954
+ "EdgeKind": {
955
+ "type": "string",
956
+ "enum": [
957
+ "child",
958
+ "bind",
959
+ "include",
960
+ "exclude",
961
+ "error",
962
+ "anchor"
963
+ ]
964
+ },
965
+ "NodePositions": {
966
+ "type": "object",
967
+ "additionalProperties": {
968
+ "$ref": "#/definitions/NodePos"
969
+ }
970
+ },
971
+ "NodePos": {
972
+ "type": "object",
973
+ "properties": {
974
+ "x": {
975
+ "type": "number"
976
+ },
977
+ "y": {
978
+ "type": "number"
979
+ }
980
+ },
981
+ "required": [
982
+ "x",
983
+ "y"
984
+ ]
985
+ },
986
+ "Viewport": {
987
+ "type": "object",
988
+ "properties": {
989
+ "x": {
990
+ "type": "number"
991
+ },
992
+ "y": {
993
+ "type": "number"
994
+ },
995
+ "zoom": {
996
+ "type": "number"
997
+ }
998
+ },
999
+ "required": [
1000
+ "x",
1001
+ "y",
1002
+ "zoom"
1003
+ ]
1004
+ },
1005
+ "DraftWire": {
1006
+ "type": "object",
1007
+ "properties": {
1008
+ "from": {
1009
+ "type": "string"
1010
+ },
1011
+ "kind": {
1012
+ "$ref": "#/definitions/EdgeKind"
1013
+ }
1014
+ },
1015
+ "required": [
1016
+ "from",
1017
+ "kind"
1018
+ ]
1019
+ },
1020
+ "EdgeRoute": {
1021
+ "type": "object",
1022
+ "properties": {
1023
+ "id": {
1024
+ "type": "string"
1025
+ },
1026
+ "points": {
1027
+ "type": "array",
1028
+ "items": {
1029
+ "type": "object",
1030
+ "properties": {
1031
+ "x": {
1032
+ "type": "number"
1033
+ },
1034
+ "y": {
1035
+ "type": "number"
1036
+ }
1037
+ },
1038
+ "required": [
1039
+ "x",
1040
+ "y"
1041
+ ]
1042
+ }
1043
+ }
1044
+ },
1045
+ "required": [
1046
+ "id",
1047
+ "points"
1048
+ ]
1049
+ },
1050
+ "CommentNode": {
1051
+ "type": "object",
1052
+ "properties": {
1053
+ "id": {
1054
+ "type": "string"
1055
+ },
1056
+ "text": {
1057
+ "type": "string"
1058
+ },
1059
+ "status": {
1060
+ "type": "string",
1061
+ "enum": [
1062
+ "open",
1063
+ "resolved"
1064
+ ]
1065
+ },
1066
+ "anchor": {
1067
+ "type": "object",
1068
+ "properties": {
1069
+ "kind": {
1070
+ "type": "string",
1071
+ "enum": [
1072
+ "tag",
1073
+ "field",
1074
+ "option"
1075
+ ]
1076
+ },
1077
+ "id": {
1078
+ "type": "string"
1079
+ }
1080
+ },
1081
+ "required": [
1082
+ "kind",
1083
+ "id"
1084
+ ]
1085
+ },
1086
+ "replies": {
1087
+ "type": "array",
1088
+ "items": {
1089
+ "type": "object",
1090
+ "properties": {
1091
+ "id": {
1092
+ "type": "string"
1093
+ },
1094
+ "text": {
1095
+ "type": "string"
1096
+ },
1097
+ "created_at": {
1098
+ "type": "string"
1099
+ },
1100
+ "author": {
1101
+ "type": "string"
1102
+ }
1103
+ },
1104
+ "required": [
1105
+ "id",
1106
+ "text",
1107
+ "created_at"
1108
+ ]
1109
+ }
1110
+ },
1111
+ "xy": {
1112
+ "type": "object",
1113
+ "properties": {
1114
+ "x": {
1115
+ "type": "number"
1116
+ },
1117
+ "y": {
1118
+ "type": "number"
1119
+ }
1120
+ },
1121
+ "required": [
1122
+ "x",
1123
+ "y"
1124
+ ]
1125
+ },
1126
+ "meta": {
1127
+ "type": "object",
1128
+ "additionalProperties": {}
1129
+ }
1130
+ },
1131
+ "required": [
1132
+ "id",
1133
+ "text",
1134
+ "status"
1135
+ ]
1136
+ }
1137
+ }
1138
+ }