@beryl-so/cli 0.1.0 → 0.2.0

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,1118 @@
1
+ // GENERATED by `poetry run python scripts/gen_plan_schema.py` in api/ — do not edit by hand.
2
+ export const ACTION_PLAN_SCHEMA = {
3
+ "$defs": {
4
+ "ActionType": {
5
+ "enum": [
6
+ "goto",
7
+ "fill",
8
+ "click",
9
+ "press",
10
+ "check",
11
+ "uncheck",
12
+ "select",
13
+ "hover",
14
+ "scroll",
15
+ "wait_for",
16
+ "expect",
17
+ "capture_count",
18
+ "await_email"
19
+ ],
20
+ "title": "ActionType",
21
+ "type": "string"
22
+ },
23
+ "EmailExtract": {
24
+ "enum": [
25
+ "code",
26
+ "link",
27
+ "pattern"
28
+ ],
29
+ "title": "EmailExtract",
30
+ "type": "string"
31
+ },
32
+ "ExpectKind": {
33
+ "enum": [
34
+ "visible",
35
+ "attached",
36
+ "hidden",
37
+ "checked",
38
+ "enabled",
39
+ "disabled",
40
+ "have_text",
41
+ "have_value",
42
+ "have_url",
43
+ "have_title",
44
+ "have_count",
45
+ "persisted",
46
+ "gone",
47
+ "count_delta"
48
+ ],
49
+ "title": "ExpectKind",
50
+ "type": "string"
51
+ },
52
+ "PlanStep": {
53
+ "allOf": [
54
+ {
55
+ "if": {
56
+ "properties": {
57
+ "action": {
58
+ "const": "goto"
59
+ }
60
+ },
61
+ "required": [
62
+ "action"
63
+ ]
64
+ },
65
+ "then": {
66
+ "properties": {
67
+ "url": {
68
+ "minLength": 1,
69
+ "type": "string"
70
+ }
71
+ },
72
+ "required": [
73
+ "url"
74
+ ]
75
+ }
76
+ },
77
+ {
78
+ "if": {
79
+ "properties": {
80
+ "action": {
81
+ "const": "fill"
82
+ }
83
+ },
84
+ "required": [
85
+ "action"
86
+ ]
87
+ },
88
+ "then": {
89
+ "properties": {
90
+ "selector": {
91
+ "minLength": 1,
92
+ "type": "string"
93
+ },
94
+ "value": {
95
+ "not": {
96
+ "type": "null"
97
+ }
98
+ }
99
+ },
100
+ "required": [
101
+ "selector",
102
+ "value"
103
+ ]
104
+ }
105
+ },
106
+ {
107
+ "if": {
108
+ "properties": {
109
+ "action": {
110
+ "const": "click"
111
+ }
112
+ },
113
+ "required": [
114
+ "action"
115
+ ]
116
+ },
117
+ "then": {
118
+ "properties": {
119
+ "selector": {
120
+ "minLength": 1,
121
+ "type": "string"
122
+ }
123
+ },
124
+ "required": [
125
+ "selector"
126
+ ]
127
+ }
128
+ },
129
+ {
130
+ "if": {
131
+ "properties": {
132
+ "action": {
133
+ "const": "press"
134
+ }
135
+ },
136
+ "required": [
137
+ "action"
138
+ ]
139
+ },
140
+ "then": {
141
+ "properties": {
142
+ "key": {
143
+ "minLength": 1,
144
+ "type": "string"
145
+ },
146
+ "selector": {
147
+ "minLength": 1,
148
+ "type": "string"
149
+ }
150
+ },
151
+ "required": [
152
+ "key",
153
+ "selector"
154
+ ]
155
+ }
156
+ },
157
+ {
158
+ "if": {
159
+ "properties": {
160
+ "action": {
161
+ "const": "check"
162
+ }
163
+ },
164
+ "required": [
165
+ "action"
166
+ ]
167
+ },
168
+ "then": {
169
+ "properties": {
170
+ "selector": {
171
+ "minLength": 1,
172
+ "type": "string"
173
+ }
174
+ },
175
+ "required": [
176
+ "selector"
177
+ ]
178
+ }
179
+ },
180
+ {
181
+ "if": {
182
+ "properties": {
183
+ "action": {
184
+ "const": "uncheck"
185
+ }
186
+ },
187
+ "required": [
188
+ "action"
189
+ ]
190
+ },
191
+ "then": {
192
+ "properties": {
193
+ "selector": {
194
+ "minLength": 1,
195
+ "type": "string"
196
+ }
197
+ },
198
+ "required": [
199
+ "selector"
200
+ ]
201
+ }
202
+ },
203
+ {
204
+ "if": {
205
+ "properties": {
206
+ "action": {
207
+ "const": "select"
208
+ }
209
+ },
210
+ "required": [
211
+ "action"
212
+ ]
213
+ },
214
+ "then": {
215
+ "properties": {
216
+ "option": {
217
+ "not": {
218
+ "type": "null"
219
+ }
220
+ },
221
+ "selector": {
222
+ "minLength": 1,
223
+ "type": "string"
224
+ }
225
+ },
226
+ "required": [
227
+ "option",
228
+ "selector"
229
+ ]
230
+ }
231
+ },
232
+ {
233
+ "if": {
234
+ "properties": {
235
+ "action": {
236
+ "const": "hover"
237
+ }
238
+ },
239
+ "required": [
240
+ "action"
241
+ ]
242
+ },
243
+ "then": {
244
+ "properties": {
245
+ "selector": {
246
+ "minLength": 1,
247
+ "type": "string"
248
+ }
249
+ },
250
+ "required": [
251
+ "selector"
252
+ ]
253
+ }
254
+ },
255
+ {
256
+ "if": {
257
+ "properties": {
258
+ "action": {
259
+ "const": "wait_for"
260
+ }
261
+ },
262
+ "required": [
263
+ "action"
264
+ ]
265
+ },
266
+ "then": {
267
+ "properties": {
268
+ "selector": {
269
+ "minLength": 1,
270
+ "type": "string"
271
+ }
272
+ },
273
+ "required": [
274
+ "selector"
275
+ ]
276
+ }
277
+ },
278
+ {
279
+ "if": {
280
+ "properties": {
281
+ "action": {
282
+ "const": "capture_count"
283
+ }
284
+ },
285
+ "required": [
286
+ "action"
287
+ ]
288
+ },
289
+ "then": {
290
+ "properties": {
291
+ "capture_as": {
292
+ "minLength": 1,
293
+ "type": "string"
294
+ },
295
+ "selector": {
296
+ "minLength": 1,
297
+ "type": "string"
298
+ }
299
+ },
300
+ "required": [
301
+ "capture_as",
302
+ "selector"
303
+ ]
304
+ }
305
+ },
306
+ {
307
+ "if": {
308
+ "properties": {
309
+ "action": {
310
+ "const": "expect"
311
+ }
312
+ },
313
+ "required": [
314
+ "action"
315
+ ]
316
+ },
317
+ "then": {
318
+ "properties": {
319
+ "expect_kind": {
320
+ "not": {
321
+ "type": "null"
322
+ }
323
+ }
324
+ },
325
+ "required": [
326
+ "expect_kind"
327
+ ]
328
+ }
329
+ },
330
+ {
331
+ "if": {
332
+ "properties": {
333
+ "action": {
334
+ "const": "await_email"
335
+ }
336
+ },
337
+ "required": [
338
+ "action"
339
+ ]
340
+ },
341
+ "then": {
342
+ "properties": {
343
+ "capture_as": {
344
+ "minLength": 1,
345
+ "type": "string"
346
+ },
347
+ "extract": {
348
+ "not": {
349
+ "type": "null"
350
+ }
351
+ }
352
+ },
353
+ "required": [
354
+ "capture_as",
355
+ "extract"
356
+ ]
357
+ }
358
+ },
359
+ {
360
+ "if": {
361
+ "properties": {
362
+ "expect_kind": {
363
+ "const": "have_text"
364
+ }
365
+ },
366
+ "required": [
367
+ "expect_kind"
368
+ ]
369
+ },
370
+ "then": {
371
+ "properties": {
372
+ "expect_text": {
373
+ "not": {
374
+ "type": "null"
375
+ }
376
+ },
377
+ "selector": {
378
+ "minLength": 1,
379
+ "type": "string"
380
+ }
381
+ },
382
+ "required": [
383
+ "expect_text",
384
+ "selector"
385
+ ]
386
+ }
387
+ },
388
+ {
389
+ "if": {
390
+ "properties": {
391
+ "expect_kind": {
392
+ "const": "have_value"
393
+ }
394
+ },
395
+ "required": [
396
+ "expect_kind"
397
+ ]
398
+ },
399
+ "then": {
400
+ "properties": {
401
+ "expect_text": {
402
+ "not": {
403
+ "type": "null"
404
+ }
405
+ },
406
+ "selector": {
407
+ "minLength": 1,
408
+ "type": "string"
409
+ }
410
+ },
411
+ "required": [
412
+ "expect_text",
413
+ "selector"
414
+ ]
415
+ }
416
+ },
417
+ {
418
+ "if": {
419
+ "properties": {
420
+ "expect_kind": {
421
+ "const": "have_url"
422
+ }
423
+ },
424
+ "required": [
425
+ "expect_kind"
426
+ ]
427
+ },
428
+ "then": {
429
+ "properties": {
430
+ "expect_text": {
431
+ "not": {
432
+ "type": "null"
433
+ }
434
+ }
435
+ },
436
+ "required": [
437
+ "expect_text"
438
+ ]
439
+ }
440
+ },
441
+ {
442
+ "if": {
443
+ "properties": {
444
+ "expect_kind": {
445
+ "const": "have_title"
446
+ }
447
+ },
448
+ "required": [
449
+ "expect_kind"
450
+ ]
451
+ },
452
+ "then": {
453
+ "properties": {
454
+ "expect_text": {
455
+ "not": {
456
+ "type": "null"
457
+ }
458
+ }
459
+ },
460
+ "required": [
461
+ "expect_text"
462
+ ]
463
+ }
464
+ },
465
+ {
466
+ "if": {
467
+ "properties": {
468
+ "expect_kind": {
469
+ "const": "have_count"
470
+ }
471
+ },
472
+ "required": [
473
+ "expect_kind"
474
+ ]
475
+ },
476
+ "then": {
477
+ "properties": {
478
+ "expect_count": {
479
+ "not": {
480
+ "type": "null"
481
+ }
482
+ },
483
+ "selector": {
484
+ "minLength": 1,
485
+ "type": "string"
486
+ }
487
+ },
488
+ "required": [
489
+ "expect_count",
490
+ "selector"
491
+ ]
492
+ }
493
+ },
494
+ {
495
+ "if": {
496
+ "properties": {
497
+ "expect_kind": {
498
+ "const": "count_delta"
499
+ }
500
+ },
501
+ "required": [
502
+ "expect_kind"
503
+ ]
504
+ },
505
+ "then": {
506
+ "properties": {
507
+ "capture_ref": {
508
+ "minLength": 1,
509
+ "type": "string"
510
+ },
511
+ "expect_delta": {
512
+ "not": {
513
+ "type": "null"
514
+ }
515
+ },
516
+ "selector": {
517
+ "minLength": 1,
518
+ "type": "string"
519
+ }
520
+ },
521
+ "required": [
522
+ "capture_ref",
523
+ "expect_delta",
524
+ "selector"
525
+ ]
526
+ }
527
+ },
528
+ {
529
+ "if": {
530
+ "properties": {
531
+ "expect_kind": {
532
+ "const": "visible"
533
+ }
534
+ },
535
+ "required": [
536
+ "expect_kind"
537
+ ]
538
+ },
539
+ "then": {
540
+ "properties": {
541
+ "selector": {
542
+ "minLength": 1,
543
+ "type": "string"
544
+ }
545
+ },
546
+ "required": [
547
+ "selector"
548
+ ]
549
+ }
550
+ },
551
+ {
552
+ "if": {
553
+ "properties": {
554
+ "expect_kind": {
555
+ "const": "attached"
556
+ }
557
+ },
558
+ "required": [
559
+ "expect_kind"
560
+ ]
561
+ },
562
+ "then": {
563
+ "properties": {
564
+ "selector": {
565
+ "minLength": 1,
566
+ "type": "string"
567
+ }
568
+ },
569
+ "required": [
570
+ "selector"
571
+ ]
572
+ }
573
+ },
574
+ {
575
+ "if": {
576
+ "properties": {
577
+ "expect_kind": {
578
+ "const": "hidden"
579
+ }
580
+ },
581
+ "required": [
582
+ "expect_kind"
583
+ ]
584
+ },
585
+ "then": {
586
+ "properties": {
587
+ "selector": {
588
+ "minLength": 1,
589
+ "type": "string"
590
+ }
591
+ },
592
+ "required": [
593
+ "selector"
594
+ ]
595
+ }
596
+ },
597
+ {
598
+ "if": {
599
+ "properties": {
600
+ "expect_kind": {
601
+ "const": "checked"
602
+ }
603
+ },
604
+ "required": [
605
+ "expect_kind"
606
+ ]
607
+ },
608
+ "then": {
609
+ "properties": {
610
+ "selector": {
611
+ "minLength": 1,
612
+ "type": "string"
613
+ }
614
+ },
615
+ "required": [
616
+ "selector"
617
+ ]
618
+ }
619
+ },
620
+ {
621
+ "if": {
622
+ "properties": {
623
+ "expect_kind": {
624
+ "const": "enabled"
625
+ }
626
+ },
627
+ "required": [
628
+ "expect_kind"
629
+ ]
630
+ },
631
+ "then": {
632
+ "properties": {
633
+ "selector": {
634
+ "minLength": 1,
635
+ "type": "string"
636
+ }
637
+ },
638
+ "required": [
639
+ "selector"
640
+ ]
641
+ }
642
+ },
643
+ {
644
+ "if": {
645
+ "properties": {
646
+ "expect_kind": {
647
+ "const": "disabled"
648
+ }
649
+ },
650
+ "required": [
651
+ "expect_kind"
652
+ ]
653
+ },
654
+ "then": {
655
+ "properties": {
656
+ "selector": {
657
+ "minLength": 1,
658
+ "type": "string"
659
+ }
660
+ },
661
+ "required": [
662
+ "selector"
663
+ ]
664
+ }
665
+ },
666
+ {
667
+ "if": {
668
+ "properties": {
669
+ "expect_kind": {
670
+ "const": "persisted"
671
+ }
672
+ },
673
+ "required": [
674
+ "expect_kind"
675
+ ]
676
+ },
677
+ "then": {
678
+ "properties": {
679
+ "selector": {
680
+ "minLength": 1,
681
+ "type": "string"
682
+ }
683
+ },
684
+ "required": [
685
+ "selector"
686
+ ]
687
+ }
688
+ },
689
+ {
690
+ "if": {
691
+ "properties": {
692
+ "expect_kind": {
693
+ "const": "gone"
694
+ }
695
+ },
696
+ "required": [
697
+ "expect_kind"
698
+ ]
699
+ },
700
+ "then": {
701
+ "properties": {
702
+ "selector": {
703
+ "minLength": 1,
704
+ "type": "string"
705
+ }
706
+ },
707
+ "required": [
708
+ "selector"
709
+ ]
710
+ }
711
+ },
712
+ {
713
+ "if": {
714
+ "properties": {
715
+ "action": {
716
+ "const": "await_email"
717
+ },
718
+ "extract": {
719
+ "const": "pattern"
720
+ }
721
+ },
722
+ "required": [
723
+ "action",
724
+ "extract"
725
+ ]
726
+ },
727
+ "then": {
728
+ "properties": {
729
+ "extract_pattern": {
730
+ "minLength": 1,
731
+ "type": "string"
732
+ }
733
+ },
734
+ "required": [
735
+ "extract_pattern"
736
+ ]
737
+ }
738
+ }
739
+ ],
740
+ "properties": {
741
+ "action": {
742
+ "$ref": "#/$defs/ActionType"
743
+ },
744
+ "capture_as": {
745
+ "anyOf": [
746
+ {
747
+ "not": {
748
+ "enum": [
749
+ "inbox_address",
750
+ "timestamp",
751
+ "unique",
752
+ "uuid"
753
+ ]
754
+ },
755
+ "pattern": "^[A-Za-z0-9_]+(?![\\s\\S])",
756
+ "type": "string"
757
+ },
758
+ {
759
+ "type": "null"
760
+ }
761
+ ],
762
+ "default": null,
763
+ "title": "Capture As"
764
+ },
765
+ "capture_ref": {
766
+ "anyOf": [
767
+ {
768
+ "type": "string"
769
+ },
770
+ {
771
+ "type": "null"
772
+ }
773
+ ],
774
+ "default": null,
775
+ "title": "Capture Ref"
776
+ },
777
+ "expect_count": {
778
+ "anyOf": [
779
+ {
780
+ "minimum": 0,
781
+ "type": "integer"
782
+ },
783
+ {
784
+ "type": "null"
785
+ }
786
+ ],
787
+ "default": null,
788
+ "title": "Expect Count"
789
+ },
790
+ "expect_delta": {
791
+ "anyOf": [
792
+ {
793
+ "type": "integer"
794
+ },
795
+ {
796
+ "type": "null"
797
+ }
798
+ ],
799
+ "default": null,
800
+ "title": "Expect Delta"
801
+ },
802
+ "expect_kind": {
803
+ "anyOf": [
804
+ {
805
+ "$ref": "#/$defs/ExpectKind"
806
+ },
807
+ {
808
+ "type": "null"
809
+ }
810
+ ],
811
+ "default": null
812
+ },
813
+ "expect_text": {
814
+ "anyOf": [
815
+ {
816
+ "not": {
817
+ "pattern": "\\{\\{\\s*(?!(?:timestamp|unique|uuid)\\s*\\}\\})[A-Za-z0-9_]+\\s*\\}\\}"
818
+ },
819
+ "type": "string"
820
+ },
821
+ {
822
+ "type": "null"
823
+ }
824
+ ],
825
+ "default": null,
826
+ "title": "Expect Text"
827
+ },
828
+ "extract": {
829
+ "anyOf": [
830
+ {
831
+ "$ref": "#/$defs/EmailExtract"
832
+ },
833
+ {
834
+ "type": "null"
835
+ }
836
+ ],
837
+ "default": null
838
+ },
839
+ "extract_pattern": {
840
+ "anyOf": [
841
+ {
842
+ "type": "string"
843
+ },
844
+ {
845
+ "type": "null"
846
+ }
847
+ ],
848
+ "default": null,
849
+ "title": "Extract Pattern"
850
+ },
851
+ "from_contains": {
852
+ "anyOf": [
853
+ {
854
+ "type": "string"
855
+ },
856
+ {
857
+ "type": "null"
858
+ }
859
+ ],
860
+ "default": null,
861
+ "title": "From Contains"
862
+ },
863
+ "key": {
864
+ "anyOf": [
865
+ {
866
+ "type": "string"
867
+ },
868
+ {
869
+ "type": "null"
870
+ }
871
+ ],
872
+ "default": null,
873
+ "title": "Key"
874
+ },
875
+ "option": {
876
+ "anyOf": [
877
+ {
878
+ "not": {
879
+ "pattern": "\\{\\{\\s*(?!(?:timestamp|unique|uuid)\\s*\\}\\})[A-Za-z0-9_]+\\s*\\}\\}"
880
+ },
881
+ "type": "string"
882
+ },
883
+ {
884
+ "type": "null"
885
+ }
886
+ ],
887
+ "default": null,
888
+ "title": "Option"
889
+ },
890
+ "selector": {
891
+ "anyOf": [
892
+ {
893
+ "not": {
894
+ "pattern": "\\{\\{\\s*(?!(?:timestamp|unique|uuid)\\s*\\}\\})[A-Za-z0-9_]+\\s*\\}\\}"
895
+ },
896
+ "type": "string"
897
+ },
898
+ {
899
+ "type": "null"
900
+ }
901
+ ],
902
+ "default": null,
903
+ "title": "Selector"
904
+ },
905
+ "subject_contains": {
906
+ "anyOf": [
907
+ {
908
+ "type": "string"
909
+ },
910
+ {
911
+ "type": "null"
912
+ }
913
+ ],
914
+ "default": null,
915
+ "title": "Subject Contains"
916
+ },
917
+ "timeout_ms": {
918
+ "anyOf": [
919
+ {
920
+ "maximum": 30000,
921
+ "minimum": 100,
922
+ "type": "integer"
923
+ },
924
+ {
925
+ "type": "null"
926
+ }
927
+ ],
928
+ "default": null,
929
+ "title": "Timeout Ms"
930
+ },
931
+ "url": {
932
+ "anyOf": [
933
+ {
934
+ "type": "string"
935
+ },
936
+ {
937
+ "type": "null"
938
+ }
939
+ ],
940
+ "default": null,
941
+ "title": "Url"
942
+ },
943
+ "value": {
944
+ "anyOf": [
945
+ {
946
+ "type": "string"
947
+ },
948
+ {
949
+ "type": "null"
950
+ }
951
+ ],
952
+ "default": null,
953
+ "title": "Value"
954
+ },
955
+ "wait_s": {
956
+ "anyOf": [
957
+ {
958
+ "maximum": 50,
959
+ "minimum": 1,
960
+ "type": "integer"
961
+ },
962
+ {
963
+ "type": "null"
964
+ }
965
+ ],
966
+ "default": null,
967
+ "title": "Wait S"
968
+ }
969
+ },
970
+ "required": [
971
+ "action"
972
+ ],
973
+ "title": "PlanStep",
974
+ "type": "object"
975
+ }
976
+ },
977
+ "$id": "https://api.beryl.so/api/v1/schemas/action-plan.schema.json",
978
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
979
+ "allOf": [
980
+ {
981
+ "$comment": "The first executed step must be a goto, so the test loads a page before acting (that is before[0] when there is a setup section, else steps[0]).",
982
+ "else": {
983
+ "properties": {
984
+ "steps": {
985
+ "prefixItems": [
986
+ {
987
+ "properties": {
988
+ "action": {
989
+ "const": "goto"
990
+ }
991
+ }
992
+ }
993
+ ]
994
+ }
995
+ }
996
+ },
997
+ "if": {
998
+ "properties": {
999
+ "before": {
1000
+ "minItems": 1,
1001
+ "type": "array"
1002
+ }
1003
+ },
1004
+ "required": [
1005
+ "before"
1006
+ ]
1007
+ },
1008
+ "then": {
1009
+ "properties": {
1010
+ "before": {
1011
+ "prefixItems": [
1012
+ {
1013
+ "properties": {
1014
+ "action": {
1015
+ "const": "goto"
1016
+ }
1017
+ }
1018
+ }
1019
+ ]
1020
+ }
1021
+ }
1022
+ }
1023
+ },
1024
+ {
1025
+ "$comment": "At least one step across before + steps must be an expect, or the test asserts nothing (an expect in `after` only checks the cleanup).",
1026
+ "if": {
1027
+ "required": [
1028
+ "steps"
1029
+ ]
1030
+ },
1031
+ "then": {
1032
+ "anyOf": [
1033
+ {
1034
+ "properties": {
1035
+ "steps": {
1036
+ "contains": {
1037
+ "properties": {
1038
+ "action": {
1039
+ "const": "expect"
1040
+ }
1041
+ },
1042
+ "required": [
1043
+ "action"
1044
+ ]
1045
+ }
1046
+ }
1047
+ }
1048
+ },
1049
+ {
1050
+ "properties": {
1051
+ "before": {
1052
+ "contains": {
1053
+ "properties": {
1054
+ "action": {
1055
+ "const": "expect"
1056
+ }
1057
+ },
1058
+ "required": [
1059
+ "action"
1060
+ ]
1061
+ }
1062
+ }
1063
+ },
1064
+ "required": [
1065
+ "before"
1066
+ ]
1067
+ }
1068
+ ]
1069
+ }
1070
+ }
1071
+ ],
1072
+ "properties": {
1073
+ "after": {
1074
+ "items": {
1075
+ "$ref": "#/$defs/PlanStep"
1076
+ },
1077
+ "title": "After",
1078
+ "type": "array"
1079
+ },
1080
+ "auth_label": {
1081
+ "anyOf": [
1082
+ {
1083
+ "type": "string"
1084
+ },
1085
+ {
1086
+ "type": "null"
1087
+ }
1088
+ ],
1089
+ "default": null,
1090
+ "title": "Auth Label"
1091
+ },
1092
+ "before": {
1093
+ "items": {
1094
+ "$ref": "#/$defs/PlanStep"
1095
+ },
1096
+ "title": "Before",
1097
+ "type": "array"
1098
+ },
1099
+ "requires_auth": {
1100
+ "default": false,
1101
+ "title": "Requires Auth",
1102
+ "type": "boolean"
1103
+ },
1104
+ "steps": {
1105
+ "items": {
1106
+ "$ref": "#/$defs/PlanStep"
1107
+ },
1108
+ "minItems": 1,
1109
+ "title": "Steps",
1110
+ "type": "array"
1111
+ }
1112
+ },
1113
+ "required": [
1114
+ "steps"
1115
+ ],
1116
+ "title": "Beryl ActionPlan",
1117
+ "type": "object"
1118
+ };