@saluzi/saluzi-edu 0.4.6 → 0.4.8

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 (87) hide show
  1. package/dist/cli.js +54 -63
  2. package/dist/guide/guide-data.json +175 -175
  3. package/dist/vendor/archify/LICENSE +22 -0
  4. package/dist/vendor/archify/SKILL.md +137 -0
  5. package/dist/vendor/archify/THIRD_PARTY_NOTICES.md +69 -0
  6. package/dist/vendor/archify/assets/JetBrainsMono-OFL.txt +93 -0
  7. package/dist/vendor/archify/assets/template.html +14934 -0
  8. package/dist/vendor/archify/bin/archify.mjs +2687 -0
  9. package/dist/vendor/archify/bin/open-artifact.mjs +95 -0
  10. package/dist/vendor/archify/bin/preview.mjs +764 -0
  11. package/dist/vendor/archify/bin/visual-check.mjs +1012 -0
  12. package/dist/vendor/archify/brand-marks/README.md +31 -0
  13. package/dist/vendor/archify/brand-marks/catalog.json +131 -0
  14. package/dist/vendor/archify/delta/architecture-delta.mjs +1221 -0
  15. package/dist/vendor/archify/examples/agent-run.lifecycle.json +60 -0
  16. package/dist/vendor/archify/examples/agent-tool-call.workflow.json +94 -0
  17. package/dist/vendor/archify/examples/async-job-roundtrip.sequence.json +61 -0
  18. package/dist/vendor/archify/examples/brand-aware-delivery.architecture.json +47 -0
  19. package/dist/vendor/archify/examples/cache-miss-request.sequence.json +82 -0
  20. package/dist/vendor/archify/examples/checkout-platform.base.architecture.json +31 -0
  21. package/dist/vendor/archify/examples/checkout-platform.head.architecture.json +31 -0
  22. package/dist/vendor/archify/examples/dataflow-product-analytics.html +15045 -0
  23. package/dist/vendor/archify/examples/deployment-release.lifecycle.json +49 -0
  24. package/dist/vendor/archify/examples/event-stream.dataflow.json +57 -0
  25. package/dist/vendor/archify/examples/incident-response.workflow.json +64 -0
  26. package/dist/vendor/archify/examples/lifecycle-agent-run.html +14980 -0
  27. package/dist/vendor/archify/examples/product-analytics.dataflow.json +76 -0
  28. package/dist/vendor/archify/examples/production-deployment.architecture.json +71 -0
  29. package/dist/vendor/archify/examples/release-delivery.workflow.json +62 -0
  30. package/dist/vendor/archify/examples/sequence-cache-miss-request.html +15060 -0
  31. package/dist/vendor/archify/examples/web-app-rendered.html +15009 -0
  32. package/dist/vendor/archify/examples/web-app.architecture.json +46 -0
  33. package/dist/vendor/archify/examples/workflow-agent-tool-call-rendered.html +15051 -0
  34. package/dist/vendor/archify/migrations/workflow-v2.mjs +279 -0
  35. package/dist/vendor/archify/package.json +17 -0
  36. package/dist/vendor/archify/recipes/scenarios.mjs +391 -0
  37. package/dist/vendor/archify/references/authoring-contract.md +243 -0
  38. package/dist/vendor/archify/references/brand-marks.md +65 -0
  39. package/dist/vendor/archify/references/delivery-contract.md +120 -0
  40. package/dist/vendor/archify/references/viewer-runtime.md +45 -0
  41. package/dist/vendor/archify/renderers/architecture/grid.mjs +62 -0
  42. package/dist/vendor/archify/renderers/architecture/render-architecture.mjs +1078 -0
  43. package/dist/vendor/archify/renderers/dataflow/README.md +104 -0
  44. package/dist/vendor/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  45. package/dist/vendor/archify/renderers/lifecycle/README.md +115 -0
  46. package/dist/vendor/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  47. package/dist/vendor/archify/renderers/sequence/README.md +114 -0
  48. package/dist/vendor/archify/renderers/sequence/render-sequence.mjs +464 -0
  49. package/dist/vendor/archify/renderers/shared/brand-marks.mjs +563 -0
  50. package/dist/vendor/archify/renderers/shared/cli.mjs +218 -0
  51. package/dist/vendor/archify/renderers/shared/desktop-readability.mjs +26 -0
  52. package/dist/vendor/archify/renderers/shared/diagnostics.mjs +127 -0
  53. package/dist/vendor/archify/renderers/shared/engineering-profiles.mjs +157 -0
  54. package/dist/vendor/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  55. package/dist/vendor/archify/renderers/shared/generated-validators.mjs +13 -0
  56. package/dist/vendor/archify/renderers/shared/geometry.mjs +1423 -0
  57. package/dist/vendor/archify/renderers/shared/i18n.mjs +595 -0
  58. package/dist/vendor/archify/renderers/shared/layout-report.mjs +40 -0
  59. package/dist/vendor/archify/renderers/shared/legend.mjs +217 -0
  60. package/dist/vendor/archify/renderers/shared/output-path.mjs +340 -0
  61. package/dist/vendor/archify/renderers/shared/repository-evidence.mjs +238 -0
  62. package/dist/vendor/archify/renderers/shared/repository-location.mjs +58 -0
  63. package/dist/vendor/archify/renderers/shared/text-fit.mjs +49 -0
  64. package/dist/vendor/archify/renderers/shared/utils.mjs +232 -0
  65. package/dist/vendor/archify/renderers/shared/validator.mjs +86 -0
  66. package/dist/vendor/archify/renderers/workflow/README.md +223 -0
  67. package/dist/vendor/archify/renderers/workflow/render-workflow.mjs +35 -0
  68. package/dist/vendor/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  69. package/dist/vendor/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  70. package/dist/vendor/archify/schemas/README.md +211 -0
  71. package/dist/vendor/archify/schemas/architecture.schema.json +178 -0
  72. package/dist/vendor/archify/schemas/common.schema.json +115 -0
  73. package/dist/vendor/archify/schemas/dataflow.schema.json +243 -0
  74. package/dist/vendor/archify/schemas/lifecycle.schema.json +266 -0
  75. package/dist/vendor/archify/schemas/sequence.schema.json +223 -0
  76. package/dist/vendor/archify/schemas/workflow.schema.json +428 -0
  77. package/dist/vendor/archify/scripts/check-render-output.mjs +836 -0
  78. package/dist/vendor/archify/scripts/check-update.mjs +1667 -0
  79. package/dist/vendor/archify/scripts/render-examples.mjs +26 -0
  80. package/dist/vendor/archify/scripts/update-contract.mjs +182 -0
  81. package/dist/vendor/archify/skill-release.json +10 -0
  82. package/package.json +1 -1
  83. package/packages/remote-control-server/src/__tests__/helpers/mock-config.ts +2 -0
  84. package/packages/remote-control-server/src/__tests__/stuck-turn-watchdog.test.ts +453 -0
  85. package/packages/remote-control-server/src/config.ts +9 -0
  86. package/packages/remote-control-server/src/services/disconnect-monitor.ts +5 -0
  87. package/packages/remote-control-server/src/services/stuck-turn-watchdog.ts +144 -0
@@ -0,0 +1,223 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/tt-a1i/archify/schemas/sequence.schema.json",
4
+ "title": "Archify Sequence Diagram",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "diagram_type",
10
+ "meta",
11
+ "participants",
12
+ "messages"
13
+ ],
14
+ "properties": {
15
+ "schema_version": {
16
+ "const": 1
17
+ },
18
+ "diagram_type": {
19
+ "const": "sequence"
20
+ },
21
+ "meta": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": [
25
+ "title"
26
+ ],
27
+ "properties": {
28
+ "title": {
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "locale": {
33
+ "$ref": "common.schema.json#/$defs/locale"
34
+ },
35
+ "subtitle": {
36
+ "type": "string"
37
+ },
38
+ "output": {
39
+ "type": "string"
40
+ },
41
+ "animation": {
42
+ "$ref": "common.schema.json#/$defs/animation"
43
+ },
44
+ "visual_preset": {
45
+ "$ref": "common.schema.json#/$defs/visualPreset"
46
+ },
47
+ "quality_profile": {
48
+ "$ref": "common.schema.json#/$defs/qualityProfile"
49
+ },
50
+ "column_fit": {
51
+ "description": "Horizontal participant layout. Omit this field or use fixed for the stable 86px boxes and 108px gap. Use spread when a wide viewBox would leave unused horizontal space or meaningful participant labels do not fit the fixed boxes; spread derives wider boxes and gaps from the viewBox without changing participant order or message semantics.",
52
+ "enum": ["fixed", "spread"]
53
+ },
54
+ "views": {
55
+ "$ref": "common.schema.json#/$defs/guidedViews"
56
+ },
57
+ "legend": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "properties": {
61
+ "mode": { "$ref": "common.schema.json#/$defs/legendMode" },
62
+ "entries": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "default": { "$ref": "common.schema.json#/$defs/legendEntry" },
67
+ "emphasis": { "$ref": "common.schema.json#/$defs/legendEntry" },
68
+ "security": { "$ref": "common.schema.json#/$defs/legendEntry" },
69
+ "dashed": { "$ref": "common.schema.json#/$defs/legendEntry" },
70
+ "return": { "$ref": "common.schema.json#/$defs/legendEntry" }
71
+ }
72
+ }
73
+ }
74
+ },
75
+ "viewBox": {
76
+ "type": "array",
77
+ "prefixItems": [
78
+ {
79
+ "type": "number",
80
+ "minimum": 480
81
+ },
82
+ {
83
+ "type": "number",
84
+ "minimum": 480
85
+ }
86
+ ],
87
+ "items": false,
88
+ "minItems": 2,
89
+ "maxItems": 2
90
+ }
91
+ }
92
+ },
93
+ "participants": {
94
+ "type": "array",
95
+ "minItems": 2,
96
+ "items": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": [
100
+ "id",
101
+ "type",
102
+ "label"
103
+ ],
104
+ "properties": {
105
+ "id": {
106
+ "$ref": "common.schema.json#/$defs/id"
107
+ },
108
+ "type": {
109
+ "$ref": "common.schema.json#/$defs/componentType"
110
+ },
111
+ "label": {
112
+ "type": "string",
113
+ "minLength": 1
114
+ },
115
+ "sublabel": {
116
+ "type": "string"
117
+ },
118
+ "brand": {
119
+ "$ref": "common.schema.json#/$defs/brandMark"
120
+ }
121
+ }
122
+ }
123
+ },
124
+ "segments": {
125
+ "type": "array",
126
+ "items": {
127
+ "type": "object",
128
+ "additionalProperties": false,
129
+ "required": [
130
+ "from",
131
+ "to",
132
+ "label"
133
+ ],
134
+ "properties": {
135
+ "from": {
136
+ "type": "number"
137
+ },
138
+ "to": {
139
+ "type": "number"
140
+ },
141
+ "label": {
142
+ "type": "string",
143
+ "minLength": 1
144
+ }
145
+ }
146
+ }
147
+ },
148
+ "messages": {
149
+ "type": "array",
150
+ "minItems": 1,
151
+ "items": {
152
+ "type": "object",
153
+ "additionalProperties": false,
154
+ "required": [
155
+ "from",
156
+ "to",
157
+ "y",
158
+ "label"
159
+ ],
160
+ "properties": {
161
+ "id": {
162
+ "$ref": "common.schema.json#/$defs/id"
163
+ },
164
+ "from": {
165
+ "$ref": "common.schema.json#/$defs/id"
166
+ },
167
+ "to": {
168
+ "$ref": "common.schema.json#/$defs/id"
169
+ },
170
+ "y": {
171
+ "type": "number",
172
+ "minimum": 160
173
+ },
174
+ "label": {
175
+ "type": "string",
176
+ "minLength": 1
177
+ },
178
+ "variant": {
179
+ "enum": [
180
+ "default",
181
+ "emphasis",
182
+ "security",
183
+ "dashed",
184
+ "return"
185
+ ]
186
+ },
187
+ "note": {
188
+ "type": "string"
189
+ }
190
+ }
191
+ }
192
+ },
193
+ "activations": {
194
+ "type": "array",
195
+ "items": {
196
+ "type": "object",
197
+ "additionalProperties": false,
198
+ "required": [
199
+ "participant",
200
+ "from",
201
+ "to"
202
+ ],
203
+ "properties": {
204
+ "participant": {
205
+ "$ref": "common.schema.json#/$defs/id"
206
+ },
207
+ "from": {
208
+ "type": "number"
209
+ },
210
+ "to": {
211
+ "type": "number"
212
+ },
213
+ "type": {
214
+ "$ref": "common.schema.json#/$defs/componentType"
215
+ }
216
+ }
217
+ }
218
+ },
219
+ "cards": {
220
+ "$ref": "common.schema.json#/$defs/cards"
221
+ }
222
+ }
223
+ }
@@ -0,0 +1,428 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/tt-a1i/archify/schemas/workflow.schema.json",
4
+ "title": "Archify Workflow Diagram",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "diagram_type",
10
+ "meta",
11
+ "lanes",
12
+ "nodes",
13
+ "edges"
14
+ ],
15
+ "properties": {
16
+ "schema_version": {
17
+ "enum": [
18
+ 1,
19
+ 2
20
+ ]
21
+ },
22
+ "diagram_type": {
23
+ "const": "workflow"
24
+ },
25
+ "meta": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": [
29
+ "title"
30
+ ],
31
+ "properties": {
32
+ "title": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "locale": {
37
+ "$ref": "common.schema.json#/$defs/locale"
38
+ },
39
+ "subtitle": {
40
+ "type": "string"
41
+ },
42
+ "output": {
43
+ "type": "string"
44
+ },
45
+ "animation": {
46
+ "enum": [
47
+ "trace",
48
+ "none"
49
+ ]
50
+ },
51
+ "visual_preset": {
52
+ "enum": [
53
+ "classic",
54
+ "signal-flow",
55
+ "blueprint",
56
+ "editorial"
57
+ ]
58
+ },
59
+ "quality_profile": {
60
+ "enum": [
61
+ "standard",
62
+ "showcase"
63
+ ]
64
+ },
65
+ "views": {
66
+ "$ref": "common.schema.json#/$defs/guidedViews"
67
+ },
68
+ "legend": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "properties": {
72
+ "mode": { "$ref": "common.schema.json#/$defs/legendMode" },
73
+ "entries": {
74
+ "type": "object",
75
+ "additionalProperties": false,
76
+ "properties": {
77
+ "frontend": { "$ref": "common.schema.json#/$defs/legendEntry" },
78
+ "backend": { "$ref": "common.schema.json#/$defs/legendEntry" },
79
+ "database": { "$ref": "common.schema.json#/$defs/legendEntry" },
80
+ "cloud": { "$ref": "common.schema.json#/$defs/legendEntry" },
81
+ "security": { "$ref": "common.schema.json#/$defs/legendEntry" },
82
+ "messagebus": { "$ref": "common.schema.json#/$defs/legendEntry" },
83
+ "external": { "$ref": "common.schema.json#/$defs/legendEntry" }
84
+ }
85
+ }
86
+ }
87
+ },
88
+ "viewBox": {
89
+ "type": "array",
90
+ "prefixItems": [
91
+ {
92
+ "type": "number",
93
+ "minimum": 700
94
+ },
95
+ {
96
+ "type": "number",
97
+ "minimum": 240
98
+ }
99
+ ],
100
+ "items": false,
101
+ "minItems": 2,
102
+ "maxItems": 2
103
+ }
104
+ }
105
+ },
106
+ "lanes": {
107
+ "type": "array",
108
+ "minItems": 1,
109
+ "items": {
110
+ "type": "object",
111
+ "additionalProperties": false,
112
+ "required": [
113
+ "id",
114
+ "label"
115
+ ],
116
+ "properties": {
117
+ "id": {
118
+ "$ref": "common.schema.json#/$defs/id"
119
+ },
120
+ "label": {
121
+ "type": "string",
122
+ "minLength": 1
123
+ },
124
+ "variant": {
125
+ "enum": [
126
+ "normal",
127
+ "exception"
128
+ ]
129
+ }
130
+ }
131
+ }
132
+ },
133
+ "phases": {
134
+ "type": "array",
135
+ "items": {
136
+ "type": "object",
137
+ "additionalProperties": false,
138
+ "required": [
139
+ "id",
140
+ "label",
141
+ "fromCol",
142
+ "toCol"
143
+ ],
144
+ "properties": {
145
+ "id": {
146
+ "$ref": "common.schema.json#/$defs/id"
147
+ },
148
+ "label": {
149
+ "type": "string",
150
+ "minLength": 1
151
+ },
152
+ "fromCol": {
153
+ "type": "integer",
154
+ "minimum": 0,
155
+ "maximum": 5
156
+ },
157
+ "toCol": {
158
+ "type": "integer",
159
+ "minimum": 0,
160
+ "maximum": 5
161
+ },
162
+ "variant": {
163
+ "enum": [
164
+ "default",
165
+ "emphasis",
166
+ "security",
167
+ "dashed"
168
+ ]
169
+ }
170
+ }
171
+ }
172
+ },
173
+ "groups": {
174
+ "type": "array",
175
+ "items": {
176
+ "type": "object",
177
+ "additionalProperties": false,
178
+ "required": [
179
+ "id",
180
+ "label",
181
+ "lane",
182
+ "fromCol",
183
+ "toCol"
184
+ ],
185
+ "properties": {
186
+ "id": {
187
+ "$ref": "common.schema.json#/$defs/id"
188
+ },
189
+ "label": {
190
+ "type": "string",
191
+ "minLength": 1
192
+ },
193
+ "lane": {
194
+ "$ref": "common.schema.json#/$defs/id"
195
+ },
196
+ "fromCol": {
197
+ "type": "integer",
198
+ "minimum": 0,
199
+ "maximum": 5
200
+ },
201
+ "toCol": {
202
+ "type": "integer",
203
+ "minimum": 0,
204
+ "maximum": 5
205
+ },
206
+ "variant": {
207
+ "enum": [
208
+ "default",
209
+ "emphasis",
210
+ "security",
211
+ "dashed"
212
+ ]
213
+ }
214
+ }
215
+ }
216
+ },
217
+ "mainPath": {
218
+ "type": "array",
219
+ "minItems": 2,
220
+ "items": {
221
+ "$ref": "common.schema.json#/$defs/id"
222
+ }
223
+ },
224
+ "semanticChecks": {
225
+ "type": "object",
226
+ "additionalProperties": false,
227
+ "minProperties": 1,
228
+ "properties": {
229
+ "allowedRoots": {
230
+ "type": "array",
231
+ "items": {
232
+ "$ref": "common.schema.json#/$defs/id"
233
+ }
234
+ },
235
+ "allowedTerminals": {
236
+ "type": "array",
237
+ "items": {
238
+ "$ref": "common.schema.json#/$defs/id"
239
+ }
240
+ },
241
+ "requiredEdges": {
242
+ "type": "array",
243
+ "items": {
244
+ "$ref": "#/$defs/semanticRelation"
245
+ }
246
+ },
247
+ "requiredPaths": {
248
+ "type": "array",
249
+ "items": {
250
+ "$ref": "#/$defs/semanticRelation"
251
+ }
252
+ }
253
+ }
254
+ },
255
+ "nodes": {
256
+ "type": "array",
257
+ "minItems": 1,
258
+ "items": {
259
+ "type": "object",
260
+ "additionalProperties": false,
261
+ "required": [
262
+ "id",
263
+ "lane",
264
+ "col",
265
+ "type",
266
+ "label"
267
+ ],
268
+ "properties": {
269
+ "id": {
270
+ "$ref": "common.schema.json#/$defs/id"
271
+ },
272
+ "lane": {
273
+ "$ref": "common.schema.json#/$defs/id"
274
+ },
275
+ "col": {
276
+ "type": "integer",
277
+ "minimum": 0,
278
+ "maximum": 5
279
+ },
280
+ "type": {
281
+ "$ref": "common.schema.json#/$defs/componentType"
282
+ },
283
+ "label": {
284
+ "type": "string",
285
+ "minLength": 1
286
+ },
287
+ "sublabel": {
288
+ "type": "string"
289
+ },
290
+ "tag": {
291
+ "type": "string"
292
+ },
293
+ "brand": {
294
+ "$ref": "common.schema.json#/$defs/brandMark"
295
+ },
296
+ "width": {
297
+ "type": "number",
298
+ "minimum": 32
299
+ },
300
+ "height": {
301
+ "type": "number",
302
+ "minimum": 32
303
+ },
304
+ "yOffset": {
305
+ "type": "number"
306
+ }
307
+ }
308
+ }
309
+ },
310
+ "edges": {
311
+ "type": "array",
312
+ "items": {
313
+ "type": "object",
314
+ "additionalProperties": false,
315
+ "required": [
316
+ "from",
317
+ "to"
318
+ ],
319
+ "properties": {
320
+ "id": {
321
+ "$ref": "common.schema.json#/$defs/id"
322
+ },
323
+ "from": {
324
+ "$ref": "common.schema.json#/$defs/id"
325
+ },
326
+ "to": {
327
+ "$ref": "common.schema.json#/$defs/id"
328
+ },
329
+ "label": {
330
+ "type": "string"
331
+ },
332
+ "variant": {
333
+ "$ref": "common.schema.json#/$defs/variant"
334
+ },
335
+ "role": {
336
+ "enum": [
337
+ "main",
338
+ "branch",
339
+ "async",
340
+ "return",
341
+ "error"
342
+ ]
343
+ },
344
+ "fromSide": {
345
+ "$ref": "#/$defs/side"
346
+ },
347
+ "toSide": {
348
+ "$ref": "#/$defs/side"
349
+ },
350
+ "route": {
351
+ "enum": [
352
+ "auto",
353
+ "straight",
354
+ "drop",
355
+ "outside-right",
356
+ "return-left",
357
+ "bottom-channel",
358
+ "up-channel"
359
+ ]
360
+ },
361
+ "via": {
362
+ "type": "array",
363
+ "items": {
364
+ "$ref": "common.schema.json#/$defs/point"
365
+ }
366
+ },
367
+ "labelAt": {
368
+ "$ref": "common.schema.json#/$defs/point"
369
+ },
370
+ "labelDx": {
371
+ "type": "number"
372
+ },
373
+ "labelDy": {
374
+ "type": "number"
375
+ },
376
+ "labelSegment": {
377
+ "type": "integer",
378
+ "minimum": 0
379
+ },
380
+ "channelX": {
381
+ "type": "number"
382
+ },
383
+ "channelY": {
384
+ "type": "number"
385
+ },
386
+ "bias": {
387
+ "type": "number",
388
+ "minimum": 0,
389
+ "maximum": 1
390
+ },
391
+ "width": {
392
+ "type": "number",
393
+ "minimum": 0.5
394
+ }
395
+ }
396
+ }
397
+ },
398
+ "cards": {
399
+ "$ref": "common.schema.json#/$defs/cards"
400
+ }
401
+ },
402
+ "$defs": {
403
+ "semanticRelation": {
404
+ "type": "object",
405
+ "additionalProperties": false,
406
+ "required": [
407
+ "from",
408
+ "to"
409
+ ],
410
+ "properties": {
411
+ "from": {
412
+ "$ref": "common.schema.json#/$defs/id"
413
+ },
414
+ "to": {
415
+ "$ref": "common.schema.json#/$defs/id"
416
+ }
417
+ }
418
+ },
419
+ "side": {
420
+ "enum": [
421
+ "left",
422
+ "right",
423
+ "top",
424
+ "bottom"
425
+ ]
426
+ }
427
+ }
428
+ }