c64bridge 1.0.7 → 1.1.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.
Files changed (132) hide show
  1. package/.github/skills/assembly-program/SKILL.md +37 -0
  2. package/.github/skills/basic-program/SKILL.md +40 -0
  3. package/.github/skills/cross-platform-demo/SKILL.md +32 -0
  4. package/.github/skills/drive-manager/SKILL.md +33 -0
  5. package/.github/skills/graphics-demo/SKILL.md +30 -0
  6. package/.github/skills/hello-world/SKILL.md +36 -0
  7. package/.github/skills/memory-debug/SKILL.md +32 -0
  8. package/.github/skills/pr-converge/SKILL.md +33 -0
  9. package/.github/skills/printer-job/SKILL.md +30 -0
  10. package/.github/skills/sid-music/SKILL.md +35 -0
  11. package/.github/skills/software-launch/SKILL.md +31 -0
  12. package/.github/skills/stream-control/SKILL.md +29 -0
  13. package/.github/skills/system-control/SKILL.md +32 -0
  14. package/AGENTS.md +28 -7
  15. package/README.md +69 -14
  16. package/data/assembly/assembly-spec.md +2 -0
  17. package/dist/c64Client.js +238 -60
  18. package/dist/config.js +48 -26
  19. package/dist/device.js +92 -37
  20. package/dist/diagnostics.js +62 -2
  21. package/dist/hostPaths.js +128 -0
  22. package/dist/loggingHttpClient.js +59 -1
  23. package/dist/mcp-server.js +409 -286
  24. package/dist/numericArg.js +55 -0
  25. package/dist/petscii.js +13 -1
  26. package/dist/platform.js +12 -3
  27. package/dist/prompts/registry.js +6 -1
  28. package/dist/tools/access.js +66 -0
  29. package/dist/tools/debug.js +6 -0
  30. package/dist/tools/developer.js +67 -34
  31. package/dist/tools/errors.js +54 -3
  32. package/dist/tools/input.js +23 -6
  33. package/dist/tools/machineControl.js +112 -20
  34. package/dist/tools/memory.js +135 -30
  35. package/dist/tools/meta/artifacts.js +5 -5
  36. package/dist/tools/meta/background.js +216 -54
  37. package/dist/tools/meta/compilation.js +6 -5
  38. package/dist/tools/meta/config.js +15 -6
  39. package/dist/tools/meta/filesystem.js +16 -14
  40. package/dist/tools/meta/graphics.js +48 -20
  41. package/dist/tools/meta/memory.js +45 -19
  42. package/dist/tools/meta/program.js +10 -7
  43. package/dist/tools/meta/screen.js +116 -25
  44. package/dist/tools/pauseGuard.js +23 -0
  45. package/dist/tools/pollValidator.js +53 -8
  46. package/dist/tools/programRunners.js +62 -18
  47. package/dist/tools/registry/batch.js +16 -4
  48. package/dist/tools/registry/config.js +9 -2
  49. package/dist/tools/registry/disk.js +12 -2
  50. package/dist/tools/registry/drive.js +3 -0
  51. package/dist/tools/registry/extract.js +3 -0
  52. package/dist/tools/registry/graphics.js +59 -6
  53. package/dist/tools/registry/index.js +17 -1
  54. package/dist/tools/registry/memory.js +11 -1
  55. package/dist/tools/registry/platform.js +4 -1
  56. package/dist/tools/registry/printer.js +2 -1
  57. package/dist/tools/registry/program.js +5 -1
  58. package/dist/tools/registry/rag.js +1 -0
  59. package/dist/tools/registry/sound.js +12 -1
  60. package/dist/tools/registry/stream.js +2 -1
  61. package/dist/tools/registry/system.js +8 -1
  62. package/dist/tools/schema.js +7 -7
  63. package/dist/tools/streaming.js +34 -4
  64. package/dist/tools/translation/assembler.js +247 -24
  65. package/dist/tools/translation/basicDetokenizer.js +80 -0
  66. package/dist/tools/translation/basicTokenizer.js +8 -3
  67. package/dist/tools/translation/disassembler.js +14 -0
  68. package/dist/tools/types.js +258 -7
  69. package/dist/tools/vice.js +5 -16
  70. package/dist/vicBitmap.js +1 -1
  71. package/dist/vice/mockServer.js +3 -0
  72. package/dist/vice/process.js +19 -0
  73. package/dist/vice/resourcePolicy.js +36 -0
  74. package/dist/vice/viceClient.js +22 -5
  75. package/doc/vice/support-matrix.md +17 -11
  76. package/mcp/schemas/c64_batch.schema.json +2 -1
  77. package/mcp/schemas/c64_config.schema.json +25 -475
  78. package/mcp/schemas/c64_debug.schema.json +3 -602
  79. package/mcp/schemas/c64_disk.schema.json +17 -344
  80. package/mcp/schemas/c64_drive.schema.json +2 -157
  81. package/mcp/schemas/c64_extract.schema.json +10 -364
  82. package/mcp/schemas/c64_graphics.schema.json +19 -426
  83. package/mcp/schemas/c64_input.schema.json +5 -318
  84. package/mcp/schemas/c64_memory.schema.json +23 -491
  85. package/mcp/schemas/c64_printer.schema.json +3 -258
  86. package/mcp/schemas/c64_program.schema.json +16 -491
  87. package/mcp/schemas/c64_rag.schema.json +1 -81
  88. package/mcp/schemas/c64_select_backend.schema.json +2 -36
  89. package/mcp/schemas/c64_sound.schema.json +20 -822
  90. package/mcp/schemas/c64_stream.schema.json +4 -75
  91. package/mcp/schemas/c64_system.schema.json +28 -348
  92. package/mcp/schemas/c64_vice.schema.json +2 -71
  93. package/mcp/server.json +1 -1
  94. package/mcp/tools.json +1983 -6910
  95. package/mcp.json +21 -1
  96. package/package.json +16 -8
  97. package/scripts/mockC64Server.mjs +44 -0
  98. package/scripts/run-coverage.mjs +27 -1
  99. package/scripts/smoke-run.sh +3 -2
  100. package/scripts/start.mjs +23 -1
  101. package/server.json +35 -2
  102. package/dist/.tsbuildinfo +0 -1
  103. package/doc/agent-state-spec.md +0 -243
  104. package/doc/audit/secret-handling.md +0 -61
  105. package/doc/plans/bun/baseline-metrics.md +0 -16
  106. package/doc/plans/bun/migration-checklist.md +0 -55
  107. package/doc/plans/bun/migration.md +0 -83
  108. package/doc/plans/improve-knowledge/notes.md +0 -43
  109. package/doc/plans/improve-knowledge/plan.md +0 -121
  110. package/doc/plans/improve-knowledge/rollout.md +0 -110
  111. package/doc/plans/meta-tools/README.md +0 -110
  112. package/doc/plans/meta-tools/analysis.md +0 -272
  113. package/doc/plans/meta-tools/catalog.md +0 -435
  114. package/doc/plans/meta-tools/notes.md +0 -192
  115. package/doc/plans/meta-tools/rollout.md +0 -368
  116. package/doc/plans/prompts/README.md +0 -96
  117. package/doc/plans/prompts/user-prompt-ideas.md +0 -147
  118. package/doc/plans/tool-consolidation/notes.md +0 -28
  119. package/doc/plans/tool-consolidation/plan.md +0 -169
  120. package/doc/plans/tool-consolidation/rollout.md +0 -104
  121. package/doc/plans/vice-backend-switch/plan.md +0 -486
  122. package/doc/plans/vice-backend-switch-2/plan.md +0 -48
  123. package/doc/plans/vice-support/notes.md +0 -63
  124. package/doc/plans/vice-support/plan.md +0 -88
  125. package/doc/plans/vice-support/rollout.md +0 -99
  126. package/doc/reviews/audit.md +0 -143
  127. package/doc/reviews/hardening/01-fable/prompt-handover.md +0 -125
  128. package/doc/reviews/hardening/01-fable/prompt.md +0 -98
  129. package/doc/reviews/hardening/01-fable/review-prompt.md +0 -468
  130. package/doc/reviews/hardening/01-fable/review.md +0 -1234
  131. package/doc/reviews/vice-support-review.md +0 -185
  132. package/scripts/compare-rest/rest-compare-2025-11-01T00-25-21-830Z.json +0 -2513
@@ -23,8 +23,11 @@
23
23
  "description": "Selects the operation."
24
24
  },
25
25
  "category": {
26
- "type": "string",
27
- "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio').",
26
+ "type": [
27
+ "string",
28
+ "null"
29
+ ],
30
+ "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio'). Limits depend on op.",
28
31
  "minLength": 1
29
32
  },
30
33
  "item": {
@@ -32,7 +35,7 @@
32
35
  "string",
33
36
  "null"
34
37
  ],
35
- "description": "Specific configuration item inside the selected category (e.g. 'Volume').",
38
+ "description": "Specific configuration item inside the selected category (e.g. 'Volume'). Limits depend on op.",
36
39
  "minLength": 1
37
40
  },
38
41
  "includeSecretValues": {
@@ -44,12 +47,27 @@
44
47
  "default": false
45
48
  },
46
49
  "value": {
47
- "description": "Primitive configuration value (string, number, or boolean).",
48
50
  "type": [
49
51
  "string",
50
52
  "number",
51
53
  "boolean"
52
- ]
54
+ ],
55
+ "description": "Primitive configuration value (string, number, or boolean). Limits depend on op."
56
+ },
57
+ "updates": {
58
+ "type": "object",
59
+ "description": "Categories mapped to item/value pairs (primitive values only), for example {\"Audio\": {\"Volume\": 80}}.",
60
+ "additionalProperties": {
61
+ "type": "object",
62
+ "description": "Item/value pairs of one category (primitive values only).",
63
+ "additionalProperties": {
64
+ "type": [
65
+ "string",
66
+ "number",
67
+ "boolean"
68
+ ]
69
+ }
70
+ }
53
71
  },
54
72
  "path": {
55
73
  "type": "string",
@@ -136,474 +154,6 @@
136
154
  "required": [
137
155
  "op"
138
156
  ],
139
- "description": "Configuration operations available via the c64_config tool.\n\nOperations:\n- list: List configuration categories reported by the firmware. Required inputs: none.\n- get: Read a configuration category or specific item. Required inputs: category. Optional inputs: item, includeSecretValues.\n- set: Write a configuration value in the selected category. Required inputs: category, item, value.\n- batch_update: Apply multiple configuration updates in a single request. Required inputs: none.\n- load_flash: Load configuration from flash storage. Required inputs: none.\n- save_flash: Persist the current configuration to flash storage. Required inputs: none.\n- reset_defaults: Reset firmware configuration to factory defaults. Required inputs: none.\n- read_debugreg: Read the Ultimate debug register ($D7FF). Required inputs: none.\n- write_debugreg: Write a hex value to the Ultimate debug register ($D7FF). Required inputs: value.\n- info: Retrieve Ultimate hardware information and status. Required inputs: none.\n- version: Fetch firmware version details. Required inputs: none.\n- snapshot: Snapshot configuration to disk for later restore or diff. Required inputs: path.\n- restore: Restore configuration from a snapshot file. Required inputs: path. Optional inputs: applyToFlash.\n- diff: Compare the current configuration with a snapshot. Required inputs: path.\n- shuffle: Discover PRG/CRT files and run each with optional screen capture. Required inputs: none. Optional inputs: root, extensions, durationMs, captureScreen, maxPrograms, outputPath, resetDelayMs.",
140
- "additionalProperties": false,
141
- "x-c64bridge-operations": [
142
- {
143
- "op": "list",
144
- "description": "List configuration categories reported by the firmware.",
145
- "required": [],
146
- "optional": [],
147
- "inputSchema": {
148
- "type": "object",
149
- "description": "List configuration categories reported by the firmware.",
150
- "properties": {
151
- "op": {
152
- "const": "list"
153
- }
154
- },
155
- "additionalProperties": false,
156
- "required": [
157
- "op"
158
- ]
159
- }
160
- },
161
- {
162
- "op": "get",
163
- "description": "Read a configuration category or specific item.",
164
- "required": [
165
- "category"
166
- ],
167
- "optional": [
168
- "item",
169
- "includeSecretValues"
170
- ],
171
- "inputSchema": {
172
- "type": "object",
173
- "description": "Read a configuration category or specific item.",
174
- "properties": {
175
- "category": {
176
- "type": "string",
177
- "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio').",
178
- "minLength": 1
179
- },
180
- "item": {
181
- "type": [
182
- "string",
183
- "null"
184
- ],
185
- "description": "Specific configuration item inside the selected category (e.g. 'Volume').",
186
- "minLength": 1
187
- },
188
- "includeSecretValues": {
189
- "type": [
190
- "boolean",
191
- "null"
192
- ],
193
- "description": "Return credential values (network password, FTP/Telnet passwords, Wi-Fi keys) in plain text. Default false: those values are replaced with ***.",
194
- "default": false
195
- },
196
- "op": {
197
- "const": "get"
198
- }
199
- },
200
- "required": [
201
- "category",
202
- "op"
203
- ],
204
- "additionalProperties": false
205
- }
206
- },
207
- {
208
- "op": "set",
209
- "description": "Write a configuration value in the selected category.",
210
- "required": [
211
- "category",
212
- "item",
213
- "value"
214
- ],
215
- "optional": [],
216
- "inputSchema": {
217
- "type": "object",
218
- "description": "Write a configuration value in the selected category.",
219
- "properties": {
220
- "category": {
221
- "type": "string",
222
- "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio').",
223
- "minLength": 1
224
- },
225
- "item": {
226
- "type": "string",
227
- "description": "Configuration item name inside the category.",
228
- "minLength": 1
229
- },
230
- "value": {
231
- "description": "Primitive configuration value (string, number, or boolean).",
232
- "type": [
233
- "string",
234
- "number",
235
- "boolean"
236
- ]
237
- },
238
- "op": {
239
- "const": "set"
240
- }
241
- },
242
- "required": [
243
- "category",
244
- "item",
245
- "value",
246
- "op"
247
- ],
248
- "additionalProperties": false
249
- }
250
- },
251
- {
252
- "op": "batch_update",
253
- "description": "Apply multiple configuration updates in a single request.",
254
- "required": [],
255
- "optional": [],
256
- "inputSchema": {
257
- "description": "Apply multiple configuration updates in a single request.",
258
- "type": "object",
259
- "additionalProperties": {
260
- "type": "object",
261
- "additionalProperties": {
262
- "type": [
263
- "string",
264
- "number",
265
- "boolean"
266
- ]
267
- }
268
- },
269
- "properties": {
270
- "op": {
271
- "const": "batch_update"
272
- }
273
- },
274
- "required": [
275
- "op"
276
- ]
277
- }
278
- },
279
- {
280
- "op": "load_flash",
281
- "description": "Load configuration from flash storage.",
282
- "required": [],
283
- "optional": [],
284
- "inputSchema": {
285
- "type": "object",
286
- "description": "Load configuration from flash storage.",
287
- "properties": {
288
- "op": {
289
- "const": "load_flash"
290
- }
291
- },
292
- "additionalProperties": false,
293
- "required": [
294
- "op"
295
- ]
296
- }
297
- },
298
- {
299
- "op": "save_flash",
300
- "description": "Persist the current configuration to flash storage.",
301
- "required": [],
302
- "optional": [],
303
- "inputSchema": {
304
- "type": "object",
305
- "description": "Persist the current configuration to flash storage.",
306
- "properties": {
307
- "op": {
308
- "const": "save_flash"
309
- }
310
- },
311
- "additionalProperties": false,
312
- "required": [
313
- "op"
314
- ]
315
- }
316
- },
317
- {
318
- "op": "reset_defaults",
319
- "description": "Reset firmware configuration to factory defaults.",
320
- "required": [],
321
- "optional": [],
322
- "inputSchema": {
323
- "type": "object",
324
- "description": "Reset firmware configuration to factory defaults.",
325
- "properties": {
326
- "op": {
327
- "const": "reset_defaults"
328
- }
329
- },
330
- "additionalProperties": false,
331
- "required": [
332
- "op"
333
- ]
334
- }
335
- },
336
- {
337
- "op": "read_debugreg",
338
- "description": "Read the Ultimate debug register ($D7FF).",
339
- "required": [],
340
- "optional": [],
341
- "inputSchema": {
342
- "type": "object",
343
- "description": "Read the Ultimate debug register ($D7FF).",
344
- "properties": {
345
- "op": {
346
- "const": "read_debugreg"
347
- }
348
- },
349
- "additionalProperties": false,
350
- "required": [
351
- "op"
352
- ]
353
- }
354
- },
355
- {
356
- "op": "write_debugreg",
357
- "description": "Write a hex value to the Ultimate debug register ($D7FF).",
358
- "required": [
359
- "value"
360
- ],
361
- "optional": [],
362
- "inputSchema": {
363
- "type": "object",
364
- "description": "Write a hex value to the Ultimate debug register ($D7FF).",
365
- "properties": {
366
- "value": {
367
- "type": "string",
368
- "description": "Hex value (00-FF) to write to the debug register.",
369
- "minLength": 1,
370
- "maxLength": 2,
371
- "pattern": "^[0-9A-Fa-f]{1,2}$"
372
- },
373
- "op": {
374
- "const": "write_debugreg"
375
- }
376
- },
377
- "required": [
378
- "value",
379
- "op"
380
- ],
381
- "additionalProperties": false
382
- }
383
- },
384
- {
385
- "op": "info",
386
- "description": "Retrieve Ultimate hardware information and status.",
387
- "required": [],
388
- "optional": [],
389
- "inputSchema": {
390
- "type": "object",
391
- "description": "Retrieve Ultimate hardware information and status.",
392
- "properties": {
393
- "op": {
394
- "const": "info"
395
- }
396
- },
397
- "additionalProperties": false,
398
- "required": [
399
- "op"
400
- ]
401
- }
402
- },
403
- {
404
- "op": "version",
405
- "description": "Fetch firmware version details.",
406
- "required": [],
407
- "optional": [],
408
- "inputSchema": {
409
- "type": "object",
410
- "description": "Fetch firmware version details.",
411
- "properties": {
412
- "op": {
413
- "const": "version"
414
- }
415
- },
416
- "additionalProperties": false,
417
- "required": [
418
- "op"
419
- ]
420
- }
421
- },
422
- {
423
- "op": "snapshot",
424
- "description": "Snapshot configuration to disk for later restore or diff.",
425
- "required": [
426
- "path"
427
- ],
428
- "optional": [],
429
- "inputSchema": {
430
- "type": "object",
431
- "description": "Snapshot configuration to disk for later restore or diff.",
432
- "properties": {
433
- "path": {
434
- "type": "string",
435
- "description": "Absolute or workspace-relative path where the snapshot file will be written.",
436
- "minLength": 1
437
- },
438
- "op": {
439
- "const": "snapshot"
440
- }
441
- },
442
- "required": [
443
- "path",
444
- "op"
445
- ],
446
- "additionalProperties": false
447
- }
448
- },
449
- {
450
- "op": "restore",
451
- "description": "Restore configuration from a snapshot file.",
452
- "required": [
453
- "path"
454
- ],
455
- "optional": [
456
- "applyToFlash"
457
- ],
458
- "inputSchema": {
459
- "type": "object",
460
- "description": "Restore configuration from a snapshot file.",
461
- "properties": {
462
- "path": {
463
- "type": "string",
464
- "description": "Snapshot file to read (must contain categories payload).",
465
- "minLength": 1
466
- },
467
- "applyToFlash": {
468
- "type": [
469
- "boolean",
470
- "null"
471
- ],
472
- "description": "When true, save the restored configuration to flash immediately (C64U/U64 and U2 only).",
473
- "default": false
474
- },
475
- "op": {
476
- "const": "restore"
477
- }
478
- },
479
- "required": [
480
- "path",
481
- "op"
482
- ],
483
- "additionalProperties": false
484
- }
485
- },
486
- {
487
- "op": "diff",
488
- "description": "Compare the current configuration with a snapshot.",
489
- "required": [
490
- "path"
491
- ],
492
- "optional": [],
493
- "inputSchema": {
494
- "type": "object",
495
- "description": "Compare the current configuration with a snapshot.",
496
- "properties": {
497
- "path": {
498
- "type": "string",
499
- "description": "Snapshot file to compare with.",
500
- "minLength": 1
501
- },
502
- "op": {
503
- "const": "diff"
504
- }
505
- },
506
- "required": [
507
- "path",
508
- "op"
509
- ],
510
- "additionalProperties": false
511
- }
512
- },
513
- {
514
- "op": "shuffle",
515
- "description": "Discover PRG/CRT files and run each with optional screen capture.",
516
- "required": [],
517
- "optional": [
518
- "root",
519
- "extensions",
520
- "durationMs",
521
- "captureScreen",
522
- "maxPrograms",
523
- "outputPath",
524
- "resetDelayMs"
525
- ],
526
- "inputSchema": {
527
- "type": "object",
528
- "description": "Discover PRG/CRT files and run each with optional screen capture.",
529
- "properties": {
530
- "root": {
531
- "type": [
532
- "string",
533
- "null"
534
- ],
535
- "description": "Root path to search for programs",
536
- "minLength": 1,
537
- "default": "/"
538
- },
539
- "extensions": {
540
- "type": [
541
- "array",
542
- "null"
543
- ],
544
- "items": {
545
- "type": "string",
546
- "description": "File extensions to include (without dot)",
547
- "minLength": 1
548
- },
549
- "default": [
550
- "prg",
551
- "crt"
552
- ]
553
- },
554
- "durationMs": {
555
- "type": [
556
- "integer",
557
- "null"
558
- ],
559
- "description": "Duration to run each program in milliseconds",
560
- "minimum": 1,
561
- "default": 5000
562
- },
563
- "captureScreen": {
564
- "type": [
565
- "boolean",
566
- "null"
567
- ],
568
- "description": "Capture screen after each run",
569
- "default": true
570
- },
571
- "maxPrograms": {
572
- "type": [
573
- "integer",
574
- "null"
575
- ],
576
- "description": "Maximum number of programs to run",
577
- "minimum": 1,
578
- "default": 10
579
- },
580
- "outputPath": {
581
- "type": [
582
- "string",
583
- "null"
584
- ],
585
- "description": "Output directory for run logs and captures",
586
- "minLength": 1
587
- },
588
- "resetDelayMs": {
589
- "type": [
590
- "integer",
591
- "null"
592
- ],
593
- "description": "Delay after reset operations to allow the platform to settle.",
594
- "minimum": 0,
595
- "maximum": 1000,
596
- "default": 100
597
- },
598
- "op": {
599
- "const": "shuffle"
600
- }
601
- },
602
- "additionalProperties": false,
603
- "required": [
604
- "op"
605
- ]
606
- }
607
- }
608
- ]
157
+ "description": "Configuration operations available via the c64_config tool.\n\nOperations:\n- list: List configuration categories reported by the firmware. Required inputs: none.\n- get: Read a configuration category or specific item. Required inputs: category. Optional inputs: item, includeSecretValues.\n- set [write]: Write a configuration value in the selected category. Required inputs: category, item, value.\n- batch_update [write]: Apply multiple configuration updates in a single request. Pass `updates` as {category: {item: value}}; categories as top-level keys are still accepted at runtime. Required inputs: none. Optional inputs: updates.\n- load_flash [c64u, u2] [destructive]: Load configuration from flash storage. Required inputs: none. Optional inputs: category.\n- save_flash [c64u, u2] [destructive]: Persist the current configuration to flash storage. Required inputs: none. Optional inputs: category.\n- reset_defaults [c64u, u2] [destructive]: Reset firmware configuration to factory defaults. Required inputs: none. Optional inputs: category.\n- read_debugreg [c64u]: Read the Ultimate debug register ($D7FF). Required inputs: none.\n- write_debugreg [c64u] [destructive]: Write a hex value to the Ultimate debug register ($D7FF). Required inputs: value.\n- info: Retrieve Ultimate hardware information and status. Required inputs: none.\n- version: Fetch firmware version details. Required inputs: none.\n- snapshot [write]: Snapshot configuration to disk for later restore or diff. Required inputs: path.\n- restore [write]: Restore configuration from a snapshot file. Required inputs: path. Optional inputs: applyToFlash.\n- diff: Compare the current configuration with a snapshot. Required inputs: path.\n- shuffle [c64u, u2] [write]: Discover PRG/CRT files and run each with optional screen capture. Required inputs: none. Optional inputs: root, extensions, durationMs, captureScreen, maxPrograms, outputPath, resetDelayMs.",
158
+ "additionalProperties": false
609
159
  }