c64bridge 1.0.6 → 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 (136) 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 +70 -15
  16. package/data/assembly/assembly-spec.md +2 -0
  17. package/dist/c64Client.js +238 -60
  18. package/dist/chargen.js +0 -4
  19. package/dist/config.js +53 -28
  20. package/dist/device.js +92 -37
  21. package/dist/diagnostics.js +66 -5
  22. package/dist/hostPaths.js +128 -0
  23. package/dist/logger.js +3 -2
  24. package/dist/loggingHttpClient.js +71 -2
  25. package/dist/mcp-server.js +416 -291
  26. package/dist/numericArg.js +55 -0
  27. package/dist/petscii.js +13 -6
  28. package/dist/platform.js +12 -3
  29. package/dist/prompts/registry.js +6 -1
  30. package/dist/redact.js +166 -0
  31. package/dist/tools/access.js +66 -0
  32. package/dist/tools/debug.js +6 -0
  33. package/dist/tools/developer.js +77 -36
  34. package/dist/tools/errors.js +54 -3
  35. package/dist/tools/input.js +25 -8
  36. package/dist/tools/machineControl.js +113 -21
  37. package/dist/tools/memory.js +135 -30
  38. package/dist/tools/meta/artifacts.js +5 -5
  39. package/dist/tools/meta/background.js +216 -54
  40. package/dist/tools/meta/compilation.js +6 -5
  41. package/dist/tools/meta/config.js +20 -10
  42. package/dist/tools/meta/configInventory.js +25 -2
  43. package/dist/tools/meta/diagnostics.js +2 -1
  44. package/dist/tools/meta/filesystem.js +16 -14
  45. package/dist/tools/meta/graphics.js +48 -20
  46. package/dist/tools/meta/memory.js +45 -19
  47. package/dist/tools/meta/program.js +10 -7
  48. package/dist/tools/meta/screen.js +116 -25
  49. package/dist/tools/pauseGuard.js +23 -0
  50. package/dist/tools/pollValidator.js +53 -8
  51. package/dist/tools/programRunners.js +62 -18
  52. package/dist/tools/registry/batch.js +17 -11
  53. package/dist/tools/registry/config.js +9 -2
  54. package/dist/tools/registry/disk.js +12 -2
  55. package/dist/tools/registry/drive.js +3 -0
  56. package/dist/tools/registry/extract.js +3 -0
  57. package/dist/tools/registry/graphics.js +59 -6
  58. package/dist/tools/registry/index.js +17 -1
  59. package/dist/tools/registry/memory.js +11 -1
  60. package/dist/tools/registry/platform.js +4 -1
  61. package/dist/tools/registry/printer.js +2 -1
  62. package/dist/tools/registry/program.js +5 -1
  63. package/dist/tools/registry/rag.js +1 -0
  64. package/dist/tools/registry/sound.js +12 -1
  65. package/dist/tools/registry/stream.js +2 -1
  66. package/dist/tools/registry/system.js +8 -1
  67. package/dist/tools/schema.js +7 -7
  68. package/dist/tools/streaming.js +34 -4
  69. package/dist/tools/translation/assembler.js +247 -24
  70. package/dist/tools/translation/basicDetokenizer.js +80 -0
  71. package/dist/tools/translation/basicTokenizer.js +8 -3
  72. package/dist/tools/translation/disassembler.js +14 -0
  73. package/dist/tools/types.js +258 -7
  74. package/dist/tools/vice.js +5 -16
  75. package/dist/vicBitmap.js +1 -1
  76. package/dist/vice/mockServer.js +3 -0
  77. package/dist/vice/process.js +19 -0
  78. package/dist/vice/resourcePolicy.js +36 -0
  79. package/dist/vice/viceClient.js +22 -5
  80. package/doc/vice/support-matrix.md +17 -11
  81. package/mcp/schemas/c64_batch.schema.json +2 -1
  82. package/mcp/schemas/c64_config.schema.json +33 -466
  83. package/mcp/schemas/c64_debug.schema.json +3 -602
  84. package/mcp/schemas/c64_disk.schema.json +17 -344
  85. package/mcp/schemas/c64_drive.schema.json +2 -157
  86. package/mcp/schemas/c64_extract.schema.json +10 -364
  87. package/mcp/schemas/c64_graphics.schema.json +19 -426
  88. package/mcp/schemas/c64_input.schema.json +5 -318
  89. package/mcp/schemas/c64_memory.schema.json +23 -491
  90. package/mcp/schemas/c64_printer.schema.json +3 -258
  91. package/mcp/schemas/c64_program.schema.json +16 -491
  92. package/mcp/schemas/c64_rag.schema.json +1 -81
  93. package/mcp/schemas/c64_select_backend.schema.json +2 -36
  94. package/mcp/schemas/c64_sound.schema.json +20 -822
  95. package/mcp/schemas/c64_stream.schema.json +4 -75
  96. package/mcp/schemas/c64_system.schema.json +28 -348
  97. package/mcp/schemas/c64_vice.schema.json +2 -71
  98. package/mcp/server.json +1 -1
  99. package/mcp/tools.json +1990 -6900
  100. package/mcp.json +21 -1
  101. package/package.json +19 -8
  102. package/scripts/mockC64Server.mjs +44 -0
  103. package/scripts/run-coverage.mjs +27 -1
  104. package/scripts/smoke-run.sh +3 -2
  105. package/scripts/start.mjs +23 -1
  106. package/server.json +53 -3
  107. package/dist/.tsbuildinfo +0 -1
  108. package/doc/agent-state-spec.md +0 -243
  109. package/doc/plans/bun/baseline-metrics.md +0 -16
  110. package/doc/plans/bun/migration-checklist.md +0 -55
  111. package/doc/plans/bun/migration.md +0 -83
  112. package/doc/plans/improve-knowledge/notes.md +0 -43
  113. package/doc/plans/improve-knowledge/plan.md +0 -121
  114. package/doc/plans/improve-knowledge/rollout.md +0 -110
  115. package/doc/plans/meta-tools/README.md +0 -110
  116. package/doc/plans/meta-tools/analysis.md +0 -272
  117. package/doc/plans/meta-tools/catalog.md +0 -435
  118. package/doc/plans/meta-tools/notes.md +0 -192
  119. package/doc/plans/meta-tools/rollout.md +0 -368
  120. package/doc/plans/prompts/README.md +0 -96
  121. package/doc/plans/prompts/user-prompt-ideas.md +0 -147
  122. package/doc/plans/tool-consolidation/notes.md +0 -28
  123. package/doc/plans/tool-consolidation/plan.md +0 -169
  124. package/doc/plans/tool-consolidation/rollout.md +0 -104
  125. package/doc/plans/vice-backend-switch/plan.md +0 -486
  126. package/doc/plans/vice-backend-switch-2/plan.md +0 -48
  127. package/doc/plans/vice-support/notes.md +0 -63
  128. package/doc/plans/vice-support/plan.md +0 -88
  129. package/doc/plans/vice-support/rollout.md +0 -99
  130. package/doc/reviews/audit.md +0 -143
  131. package/doc/reviews/hardening/01-fable/prompt-handover.md +0 -125
  132. package/doc/reviews/hardening/01-fable/prompt.md +0 -98
  133. package/doc/reviews/hardening/01-fable/review-prompt.md +0 -468
  134. package/doc/reviews/hardening/01-fable/review.md +0 -1234
  135. package/doc/reviews/vice-support-review.md +0 -185
  136. package/scripts/compare-rest/rest-compare-2025-11-01T00-25-21-830Z.json +0 -2513
@@ -56,10 +56,9 @@
56
56
  },
57
57
  "voice": {
58
58
  "type": "integer",
59
- "description": "SID voice to trigger (1-3).",
59
+ "description": "SID voice to trigger (1-3). Limits depend on op.",
60
60
  "minimum": 1,
61
- "maximum": 3,
62
- "default": 1
61
+ "maximum": 3
63
62
  },
64
63
  "note": {
65
64
  "type": [
@@ -88,14 +87,13 @@
88
87
  },
89
88
  "waveform": {
90
89
  "type": "string",
91
- "description": "SID waveform to enable.",
90
+ "description": "SID waveform to enable. Limits depend on op.",
92
91
  "enum": [
93
92
  "pulse",
94
93
  "saw",
95
94
  "tri",
96
95
  "noise"
97
- ],
98
- "default": "pulse"
96
+ ]
99
97
  },
100
98
  "pulseWidth": {
101
99
  "type": "integer",
@@ -137,8 +135,7 @@
137
135
  "boolean",
138
136
  "null"
139
137
  ],
140
- "description": "When true, record audio after silencing to confirm the SID output is quiet.",
141
- "default": false
138
+ "description": "When true, record audio after silencing to confirm the SID output is quiet. Limits depend on op."
142
139
  },
143
140
  "path": {
144
141
  "type": "string",
@@ -184,28 +181,23 @@
184
181
  "string",
185
182
  "null"
186
183
  ],
187
- "description": "Optional musical preset to influence timing/expression.",
188
- "enum": [
189
- "classic",
190
- "expression"
191
- ],
192
- "default": "classic"
184
+ "description": "Optional musical preset to influence timing/expression. Limits depend on op."
193
185
  },
194
186
  "sidwave": {
195
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
196
187
  "type": [
197
188
  "string",
198
189
  "object",
199
190
  "null"
200
- ]
191
+ ],
192
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object. Limits depend on op."
201
193
  },
202
194
  "cpg": {
203
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
204
195
  "type": [
205
196
  "string",
206
197
  "object",
207
198
  "null"
208
- ]
199
+ ],
200
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object. Limits depend on op."
209
201
  },
210
202
  "format": {
211
203
  "type": [
@@ -259,20 +251,18 @@
259
251
  "number",
260
252
  "null"
261
253
  ],
262
- "description": "Length of the verification recording on analyzable backends.",
254
+ "description": "Length of the verification recording on analyzable backends. Limits depend on op.",
263
255
  "minimum": 0.5,
264
- "maximum": 20,
265
- "default": 4
256
+ "maximum": 20
266
257
  },
267
258
  "waitBeforeCaptureMs": {
268
259
  "type": [
269
260
  "number",
270
261
  "null"
271
262
  ],
272
- "description": "Delay between starting playback and beginning verification capture.",
263
+ "description": "Delay between starting playback and beginning verification capture. Limits depend on op.",
273
264
  "minimum": 0,
274
- "maximum": 5000,
275
- "default": 400
265
+ "maximum": 5000
276
266
  },
277
267
  "restoreActiveBackend": {
278
268
  "type": [
@@ -285,10 +275,10 @@
285
275
  "expectedSidwave": {
286
276
  "type": [
287
277
  "string",
288
- "null"
278
+ "null",
279
+ "object"
289
280
  ],
290
- "description": "Optional expected SIDWAVE used to refine analysis comparisons.",
291
- "minLength": 1
281
+ "description": "Optional expected SIDWAVE used to refine analysis comparisons. Limits depend on op."
292
282
  },
293
283
  "verifySilenceBefore": {
294
284
  "type": [
@@ -356,7 +346,7 @@
356
346
  "number",
357
347
  "null"
358
348
  ],
359
- "description": "Override capture duration in seconds.",
349
+ "description": "Override capture duration in seconds. Limits depend on op.",
360
350
  "minimum": 0.5,
361
351
  "maximum": 30
362
352
  }
@@ -364,798 +354,6 @@
364
354
  "required": [
365
355
  "op"
366
356
  ],
367
- "description": "Sound operations available via the c64_sound tool.\n\nOperations:\n- capture_samples: Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream. Required inputs: none. Optional inputs: count, encoding.\n- set_volume: Set the SID master volume register at $D418 (0-15). Required inputs: volume.\n- reset: Soft or hard reset of SID registers to clear glitches. Required inputs: none. Optional inputs: hard.\n- note_on: Trigger a SID voice with configurable waveform, ADSR, and pitch. Required inputs: none. Optional inputs: voice, note, frequencyHz, system, waveform, pulseWidth, attack, decay, sustain, release.\n- note_off: Release a SID voice by clearing its gate bit. Required inputs: voice.\n- silence_all: Silence all SID voices with optional audio verification. Required inputs: none. Optional inputs: verify.\n- play_sid_file: Play a SID file stored on the Ultimate filesystem. Required inputs: path. Optional inputs: songnr.\n- play_mod_file: Play a MOD tracker module via the Ultimate SID player. Required inputs: path.\n- generate: Generate a lightweight SID arpeggio playback sequence. Required inputs: none. Optional inputs: root, pattern, steps, tempoMs, waveform, preset.\n- compile_play: Compile SIDWAVE or CPG source and optionally play it immediately. Required inputs: none. Optional inputs: sidwave, cpg, format, output, dryRun.\n- play_preset: Compile and play a built-in SID preset such as Für Elise by Beethoven. Required inputs: none. Optional inputs: preset, platforms, verify, analysisDurationSeconds, waitBeforeCaptureMs, restoreActiveBackend.\n- pipeline: Compile a SIDWAVE score, play it, and analyze the recording. Required inputs: none. Optional inputs: sidwave, cpg, output, waitBeforeCaptureMs, analysisDurationSeconds, expectedSidwave, verifySilenceBefore, verifySilenceAfter, silenceDurationSeconds, silenceRmsThreshold, postSilenceWaitMs, silenceWaitMs.\n- analyze: Automatically analyze SID playback when verification is requested. Required inputs: request. Optional inputs: durationSeconds, expectedSidwave.\n- record_analyze: Record audio for a fixed duration and return SID analysis metrics. Uses the Ultimate audio stream on c64u and the host microphone on other backends. Required inputs: durationSeconds. Optional inputs: expectedSidwave.",
368
- "additionalProperties": false,
369
- "x-c64bridge-operations": [
370
- {
371
- "op": "capture_samples",
372
- "description": "Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream.",
373
- "required": [],
374
- "optional": [
375
- "count",
376
- "encoding"
377
- ],
378
- "inputSchema": {
379
- "type": "object",
380
- "description": "Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream.",
381
- "properties": {
382
- "op": {
383
- "const": "capture_samples"
384
- },
385
- "count": {
386
- "type": [
387
- "integer",
388
- "null"
389
- ],
390
- "description": "Number of stereo sample pairs to capture.",
391
- "minimum": 1,
392
- "maximum": 65536,
393
- "default": 256
394
- },
395
- "encoding": {
396
- "type": [
397
- "string",
398
- "null"
399
- ],
400
- "description": "Encoding used for the PCM sample payload.",
401
- "enum": [
402
- "base64",
403
- "hex"
404
- ],
405
- "default": "base64"
406
- }
407
- },
408
- "required": [
409
- "op"
410
- ],
411
- "additionalProperties": false
412
- }
413
- },
414
- {
415
- "op": "set_volume",
416
- "description": "Set the SID master volume register at $D418 (0-15).",
417
- "required": [
418
- "volume"
419
- ],
420
- "optional": [],
421
- "inputSchema": {
422
- "type": "object",
423
- "description": "Set the SID master volume register at $D418 (0-15).",
424
- "properties": {
425
- "volume": {
426
- "type": "number",
427
- "description": "Desired SID master volume. Values outside 0-15 are clamped.",
428
- "minimum": 0,
429
- "maximum": 15
430
- },
431
- "op": {
432
- "const": "set_volume"
433
- }
434
- },
435
- "required": [
436
- "volume",
437
- "op"
438
- ],
439
- "additionalProperties": false
440
- }
441
- },
442
- {
443
- "op": "reset",
444
- "description": "Soft or hard reset of SID registers to clear glitches.",
445
- "required": [],
446
- "optional": [
447
- "hard"
448
- ],
449
- "inputSchema": {
450
- "type": "object",
451
- "description": "Soft or hard reset of SID registers to clear glitches.",
452
- "properties": {
453
- "hard": {
454
- "type": "boolean",
455
- "description": "If true, perform a hard register scrub; otherwise silence voices softly.",
456
- "default": false
457
- },
458
- "op": {
459
- "const": "reset"
460
- }
461
- },
462
- "additionalProperties": false,
463
- "required": [
464
- "op"
465
- ]
466
- }
467
- },
468
- {
469
- "op": "note_on",
470
- "description": "Trigger a SID voice with configurable waveform, ADSR, and pitch.",
471
- "required": [],
472
- "optional": [
473
- "voice",
474
- "note",
475
- "frequencyHz",
476
- "system",
477
- "waveform",
478
- "pulseWidth",
479
- "attack",
480
- "decay",
481
- "sustain",
482
- "release"
483
- ],
484
- "inputSchema": {
485
- "type": "object",
486
- "description": "Trigger a SID voice with configurable waveform, ADSR, and pitch.",
487
- "properties": {
488
- "voice": {
489
- "type": "integer",
490
- "description": "SID voice to trigger (1-3).",
491
- "minimum": 1,
492
- "maximum": 3,
493
- "default": 1
494
- },
495
- "note": {
496
- "type": [
497
- "string",
498
- "null"
499
- ],
500
- "description": "Musical note like A4, C#5, or Bb3. Overrides frequencyHz if provided.",
501
- "pattern": "^([A-Ga-g])([#b]?)(-?\\d+)$"
502
- },
503
- "frequencyHz": {
504
- "type": [
505
- "number",
506
- "null"
507
- ],
508
- "description": "Explicit frequency in Hz. Used when note is omitted.",
509
- "minimum": 1
510
- },
511
- "system": {
512
- "type": "string",
513
- "description": "Video system for frequency calculation.",
514
- "enum": [
515
- "PAL",
516
- "NTSC"
517
- ],
518
- "default": "PAL"
519
- },
520
- "waveform": {
521
- "type": "string",
522
- "description": "SID waveform to enable.",
523
- "enum": [
524
- "pulse",
525
- "saw",
526
- "tri",
527
- "noise"
528
- ],
529
- "default": "pulse"
530
- },
531
- "pulseWidth": {
532
- "type": "integer",
533
- "description": "Pulse width (0-4095). Used for pulse waveform.",
534
- "minimum": 0,
535
- "maximum": 4095,
536
- "default": 2048
537
- },
538
- "attack": {
539
- "type": "integer",
540
- "description": "Attack rate nibble (0-15).",
541
- "minimum": 0,
542
- "maximum": 15,
543
- "default": 1
544
- },
545
- "decay": {
546
- "type": "integer",
547
- "description": "Decay rate nibble (0-15).",
548
- "minimum": 0,
549
- "maximum": 15,
550
- "default": 1
551
- },
552
- "sustain": {
553
- "type": "integer",
554
- "description": "Sustain level nibble (0-15).",
555
- "minimum": 0,
556
- "maximum": 15,
557
- "default": 15
558
- },
559
- "release": {
560
- "type": "integer",
561
- "description": "Release rate nibble (0-15).",
562
- "minimum": 0,
563
- "maximum": 15,
564
- "default": 3
565
- },
566
- "op": {
567
- "const": "note_on"
568
- }
569
- },
570
- "additionalProperties": false,
571
- "required": [
572
- "op"
573
- ]
574
- }
575
- },
576
- {
577
- "op": "note_off",
578
- "description": "Release a SID voice by clearing its gate bit.",
579
- "required": [
580
- "voice"
581
- ],
582
- "optional": [],
583
- "inputSchema": {
584
- "type": "object",
585
- "description": "Release a SID voice by clearing its gate bit.",
586
- "properties": {
587
- "voice": {
588
- "type": "integer",
589
- "description": "SID voice to release (1-3).",
590
- "minimum": 1,
591
- "maximum": 3
592
- },
593
- "op": {
594
- "const": "note_off"
595
- }
596
- },
597
- "required": [
598
- "voice",
599
- "op"
600
- ],
601
- "additionalProperties": false
602
- }
603
- },
604
- {
605
- "op": "silence_all",
606
- "description": "Silence all SID voices with optional audio verification.",
607
- "required": [],
608
- "optional": [
609
- "verify"
610
- ],
611
- "inputSchema": {
612
- "type": "object",
613
- "description": "Silence all SID voices with optional audio verification.",
614
- "properties": {
615
- "verify": {
616
- "type": [
617
- "boolean",
618
- "null"
619
- ],
620
- "description": "When true, record audio after silencing to confirm the SID output is quiet.",
621
- "default": false
622
- },
623
- "op": {
624
- "const": "silence_all"
625
- }
626
- },
627
- "additionalProperties": false,
628
- "required": [
629
- "op"
630
- ]
631
- }
632
- },
633
- {
634
- "op": "play_sid_file",
635
- "description": "Play a SID file stored on the Ultimate filesystem.",
636
- "required": [
637
- "path"
638
- ],
639
- "optional": [
640
- "songnr"
641
- ],
642
- "inputSchema": {
643
- "type": "object",
644
- "description": "Play a SID file stored on the Ultimate filesystem.",
645
- "properties": {
646
- "path": {
647
- "type": "string",
648
- "description": "Absolute or Ultimate filesystem path to the SID, PRG, or audio file.",
649
- "minLength": 1
650
- },
651
- "songnr": {
652
- "type": [
653
- "integer",
654
- "null"
655
- ],
656
- "description": "Song number within the SID file (0-based index).",
657
- "minimum": 0
658
- },
659
- "op": {
660
- "const": "play_sid_file"
661
- }
662
- },
663
- "required": [
664
- "path",
665
- "op"
666
- ],
667
- "additionalProperties": false
668
- }
669
- },
670
- {
671
- "op": "play_mod_file",
672
- "description": "Play a MOD tracker module via the Ultimate SID player.",
673
- "required": [
674
- "path"
675
- ],
676
- "optional": [],
677
- "inputSchema": {
678
- "type": "object",
679
- "description": "Play a MOD tracker module via the Ultimate SID player.",
680
- "properties": {
681
- "path": {
682
- "type": "string",
683
- "description": "Absolute or Ultimate filesystem path to the SID, PRG, or audio file.",
684
- "minLength": 1
685
- },
686
- "op": {
687
- "const": "play_mod_file"
688
- }
689
- },
690
- "required": [
691
- "path",
692
- "op"
693
- ],
694
- "additionalProperties": false
695
- }
696
- },
697
- {
698
- "op": "generate",
699
- "description": "Generate a lightweight SID arpeggio playback sequence.",
700
- "required": [],
701
- "optional": [
702
- "root",
703
- "pattern",
704
- "steps",
705
- "tempoMs",
706
- "waveform",
707
- "preset"
708
- ],
709
- "inputSchema": {
710
- "type": "object",
711
- "description": "Generate a lightweight SID arpeggio playback sequence.",
712
- "properties": {
713
- "root": {
714
- "type": "string",
715
- "description": "Root note for the arpeggio such as C4 or A#3.",
716
- "pattern": "^([A-Ga-g])([#b]?)(-?\\d+)$",
717
- "default": "C4"
718
- },
719
- "pattern": {
720
- "type": "string",
721
- "description": "Comma-separated semitone offsets (e.g. '0,4,7').",
722
- "minLength": 1,
723
- "default": "0,4,7"
724
- },
725
- "steps": {
726
- "type": "integer",
727
- "description": "Number of notes to schedule.",
728
- "minimum": 1,
729
- "maximum": 128,
730
- "default": 16
731
- },
732
- "tempoMs": {
733
- "type": "integer",
734
- "description": "Delay in milliseconds between notes.",
735
- "minimum": 20,
736
- "maximum": 2000,
737
- "default": 120
738
- },
739
- "waveform": {
740
- "type": "string",
741
- "description": "Waveform for playback.",
742
- "enum": [
743
- "pulse",
744
- "saw",
745
- "tri",
746
- "noise"
747
- ],
748
- "default": "tri"
749
- },
750
- "preset": {
751
- "type": [
752
- "string",
753
- "null"
754
- ],
755
- "description": "Optional musical preset to influence timing/expression.",
756
- "enum": [
757
- "classic",
758
- "expression"
759
- ],
760
- "default": "classic"
761
- },
762
- "op": {
763
- "const": "generate"
764
- }
765
- },
766
- "additionalProperties": false,
767
- "required": [
768
- "op"
769
- ]
770
- }
771
- },
772
- {
773
- "op": "compile_play",
774
- "description": "Compile SIDWAVE or CPG source and optionally play it immediately.",
775
- "required": [],
776
- "optional": [
777
- "sidwave",
778
- "cpg",
779
- "format",
780
- "output",
781
- "dryRun"
782
- ],
783
- "inputSchema": {
784
- "type": "object",
785
- "description": "Compile SIDWAVE or CPG source and optionally play it immediately.",
786
- "properties": {
787
- "sidwave": {
788
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
789
- "type": [
790
- "string",
791
- "object",
792
- "null"
793
- ]
794
- },
795
- "cpg": {
796
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
797
- "type": [
798
- "string",
799
- "object",
800
- "null"
801
- ]
802
- },
803
- "format": {
804
- "type": [
805
- "string",
806
- "null"
807
- ],
808
- "description": "Source format hint when providing raw text.",
809
- "enum": [
810
- "yaml",
811
- "json"
812
- ]
813
- },
814
- "output": {
815
- "type": [
816
- "string",
817
- "null"
818
- ],
819
- "description": "Playback target format. PRG works on all backends; SID playback requires C64U/U64 or U2 (SID export with dryRun works everywhere).",
820
- "enum": [
821
- "prg",
822
- "sid"
823
- ],
824
- "default": "prg"
825
- },
826
- "dryRun": {
827
- "type": [
828
- "boolean",
829
- "null"
830
- ],
831
- "description": "When true, skip playback and only return compilation metadata.",
832
- "default": false
833
- },
834
- "op": {
835
- "const": "compile_play"
836
- }
837
- },
838
- "additionalProperties": false,
839
- "required": [
840
- "op"
841
- ]
842
- }
843
- },
844
- {
845
- "op": "play_preset",
846
- "description": "Compile and play a built-in SID preset such as Für Elise by Beethoven.",
847
- "required": [],
848
- "optional": [
849
- "preset",
850
- "platforms",
851
- "verify",
852
- "analysisDurationSeconds",
853
- "waitBeforeCaptureMs",
854
- "restoreActiveBackend"
855
- ],
856
- "inputSchema": {
857
- "type": "object",
858
- "description": "Compile and play a built-in SID preset such as Für Elise by Beethoven.",
859
- "properties": {
860
- "preset": {
861
- "type": [
862
- "string",
863
- "null"
864
- ],
865
- "description": "Named SID preset to compile and play. Canonical public preset: fuer_elise.",
866
- "minLength": 1,
867
- "default": "fuer_elise"
868
- },
869
- "platforms": {
870
- "type": [
871
- "array",
872
- "null"
873
- ],
874
- "items": {
875
- "type": "string",
876
- "description": "Backends to target in sequence.",
877
- "minLength": 1,
878
- "enum": [
879
- "vice",
880
- "c64u",
881
- "u2"
882
- ]
883
- }
884
- },
885
- "verify": {
886
- "type": [
887
- "boolean",
888
- "null"
889
- ],
890
- "description": "Capture and analyze audio after playback starts: native streaming on C64U/U64, host audio input on U2/VICE (PortAudio required).",
891
- "default": true
892
- },
893
- "analysisDurationSeconds": {
894
- "type": [
895
- "number",
896
- "null"
897
- ],
898
- "description": "Length of the verification recording on analyzable backends.",
899
- "minimum": 0.5,
900
- "maximum": 20,
901
- "default": 4
902
- },
903
- "waitBeforeCaptureMs": {
904
- "type": [
905
- "number",
906
- "null"
907
- ],
908
- "description": "Delay between starting playback and beginning verification capture.",
909
- "minimum": 0,
910
- "maximum": 5000,
911
- "default": 400
912
- },
913
- "restoreActiveBackend": {
914
- "type": [
915
- "boolean",
916
- "null"
917
- ],
918
- "description": "Restore the backend that was active before the workflow started.",
919
- "default": true
920
- },
921
- "op": {
922
- "const": "play_preset"
923
- }
924
- },
925
- "additionalProperties": false,
926
- "required": [
927
- "op"
928
- ]
929
- }
930
- },
931
- {
932
- "op": "pipeline",
933
- "description": "Compile a SIDWAVE score, play it, and analyze the recording.",
934
- "required": [],
935
- "optional": [
936
- "sidwave",
937
- "cpg",
938
- "output",
939
- "waitBeforeCaptureMs",
940
- "analysisDurationSeconds",
941
- "expectedSidwave",
942
- "verifySilenceBefore",
943
- "verifySilenceAfter",
944
- "silenceDurationSeconds",
945
- "silenceRmsThreshold",
946
- "postSilenceWaitMs",
947
- "silenceWaitMs"
948
- ],
949
- "inputSchema": {
950
- "type": "object",
951
- "description": "Compile a SIDWAVE score, play it, and analyze the recording.",
952
- "properties": {
953
- "sidwave": {
954
- "type": [
955
- "string",
956
- "null"
957
- ],
958
- "description": "SIDWAVE source in YAML or JSON format.",
959
- "minLength": 1
960
- },
961
- "cpg": {
962
- "type": [
963
- "string",
964
- "null"
965
- ],
966
- "description": "Legacy CPG input format.",
967
- "minLength": 1
968
- },
969
- "output": {
970
- "type": [
971
- "string",
972
- "null"
973
- ],
974
- "description": "Playback artifact format. PRG works on all backends; SID attachment playback requires C64U/U64 or U2.",
975
- "enum": [
976
- "prg",
977
- "sid"
978
- ],
979
- "default": "prg"
980
- },
981
- "waitBeforeCaptureMs": {
982
- "type": [
983
- "number",
984
- "null"
985
- ],
986
- "description": "Delay between starting playback and beginning analysis capture (milliseconds).",
987
- "minimum": 0,
988
- "maximum": 5000,
989
- "default": 500
990
- },
991
- "analysisDurationSeconds": {
992
- "type": [
993
- "number",
994
- "null"
995
- ],
996
- "description": "Audio capture length in seconds.",
997
- "minimum": 0.5,
998
- "maximum": 20,
999
- "default": 3
1000
- },
1001
- "expectedSidwave": {
1002
- "type": [
1003
- "string",
1004
- "null"
1005
- ],
1006
- "description": "Optional expected SIDWAVE used to refine analysis comparisons.",
1007
- "minLength": 1
1008
- },
1009
- "verifySilenceBefore": {
1010
- "type": [
1011
- "boolean",
1012
- "null"
1013
- ],
1014
- "description": "Run silence verification before playback to ensure a quiet baseline.",
1015
- "default": true
1016
- },
1017
- "verifySilenceAfter": {
1018
- "type": [
1019
- "boolean",
1020
- "null"
1021
- ],
1022
- "description": "Run silence verification after playback to ensure voices are released.",
1023
- "default": true
1024
- },
1025
- "silenceDurationSeconds": {
1026
- "type": [
1027
- "number",
1028
- "null"
1029
- ],
1030
- "description": "Audio capture length used for silence verification.",
1031
- "minimum": 0.5,
1032
- "maximum": 10,
1033
- "default": 1.5
1034
- },
1035
- "silenceRmsThreshold": {
1036
- "type": [
1037
- "number",
1038
- "null"
1039
- ],
1040
- "description": "RMS threshold applied to silence verification captures.",
1041
- "minimum": 0,
1042
- "maximum": 1,
1043
- "default": 0.02
1044
- },
1045
- "postSilenceWaitMs": {
1046
- "type": [
1047
- "number",
1048
- "null"
1049
- ],
1050
- "description": "Delay between main analysis capture and the post-playback silence check (milliseconds).",
1051
- "minimum": 0,
1052
- "maximum": 5000,
1053
- "default": 200
1054
- },
1055
- "silenceWaitMs": {
1056
- "type": [
1057
- "number",
1058
- "null"
1059
- ],
1060
- "description": "Delay between silencing the SID and recording during pre/post checks (milliseconds).",
1061
- "minimum": 0,
1062
- "maximum": 5000,
1063
- "default": 150
1064
- },
1065
- "op": {
1066
- "const": "pipeline"
1067
- }
1068
- },
1069
- "additionalProperties": false,
1070
- "required": [
1071
- "op"
1072
- ]
1073
- }
1074
- },
1075
- {
1076
- "op": "analyze",
1077
- "description": "Automatically analyze SID playback when verification is requested.",
1078
- "required": [
1079
- "request"
1080
- ],
1081
- "optional": [
1082
- "durationSeconds",
1083
- "expectedSidwave"
1084
- ],
1085
- "inputSchema": {
1086
- "type": "object",
1087
- "description": "Automatically analyze SID playback when verification is requested.",
1088
- "properties": {
1089
- "request": {
1090
- "type": "string",
1091
- "description": "Natural language user request describing the verification goal.",
1092
- "minLength": 1
1093
- },
1094
- "durationSeconds": {
1095
- "type": [
1096
- "number",
1097
- "null"
1098
- ],
1099
- "description": "Override capture duration in seconds.",
1100
- "minimum": 0.5,
1101
- "maximum": 30
1102
- },
1103
- "expectedSidwave": {
1104
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
1105
- "type": [
1106
- "string",
1107
- "object",
1108
- "null"
1109
- ]
1110
- },
1111
- "op": {
1112
- "const": "analyze"
1113
- }
1114
- },
1115
- "required": [
1116
- "request",
1117
- "op"
1118
- ],
1119
- "additionalProperties": false
1120
- }
1121
- },
1122
- {
1123
- "op": "record_analyze",
1124
- "description": "Record audio for a fixed duration and return SID analysis metrics. Uses the Ultimate audio stream on c64u and the host microphone on other backends.",
1125
- "required": [
1126
- "durationSeconds"
1127
- ],
1128
- "optional": [
1129
- "expectedSidwave"
1130
- ],
1131
- "inputSchema": {
1132
- "type": "object",
1133
- "description": "Record audio for a fixed duration and return SID analysis metrics. Uses the Ultimate audio stream on c64u and the host microphone on other backends.",
1134
- "properties": {
1135
- "durationSeconds": {
1136
- "type": "number",
1137
- "description": "Capture duration in seconds (0.5 - 30).",
1138
- "minimum": 0.5,
1139
- "maximum": 30
1140
- },
1141
- "expectedSidwave": {
1142
- "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
1143
- "type": [
1144
- "string",
1145
- "object",
1146
- "null"
1147
- ]
1148
- },
1149
- "op": {
1150
- "const": "record_analyze"
1151
- }
1152
- },
1153
- "required": [
1154
- "durationSeconds",
1155
- "op"
1156
- ],
1157
- "additionalProperties": false
1158
- }
1159
- }
1160
- ]
357
+ "description": "Sound operations available via the c64_sound tool.\n\nOperations:\n- capture_samples [c64u]: Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream. Required inputs: none. Optional inputs: count, encoding.\n- set_volume [write]: Set the SID master volume register at $D418 (0-15). Required inputs: volume.\n- reset [write]: Soft or hard reset of SID registers to clear glitches. Required inputs: none. Optional inputs: hard.\n- note_on [write]: Trigger a SID voice with configurable waveform, ADSR, and pitch. Required inputs: none. Optional inputs: voice, note, frequencyHz, system, waveform, pulseWidth, attack, decay, sustain, release.\n- note_off [write]: Release a SID voice by clearing its gate bit. Required inputs: voice.\n- silence_all [write]: Silence all SID voices with optional audio verification. Required inputs: none. Optional inputs: verify.\n- play_sid_file [c64u, u2] [write]: Play a SID file stored on the Ultimate filesystem. Required inputs: path. Optional inputs: songnr.\n- play_mod_file [c64u, u2] [write]: Play a MOD tracker module via the Ultimate SID player. Required inputs: path.\n- generate [write]: Generate a lightweight SID arpeggio playback sequence. Required inputs: none. Optional inputs: root, pattern, steps, tempoMs, waveform, preset.\n- compile_play [write]: Compile SIDWAVE or CPG source and optionally play it immediately. Required inputs: none. Optional inputs: sidwave, cpg, format, output, dryRun.\n- play_preset [write]: Compile and play a built-in SID preset such as Für Elise by Beethoven. Required inputs: none. Optional inputs: preset, platforms, verify, analysisDurationSeconds, waitBeforeCaptureMs, restoreActiveBackend.\n- pipeline [write]: Compile a SIDWAVE score, play it, and analyze the recording. Required inputs: none. Optional inputs: sidwave, cpg, output, waitBeforeCaptureMs, analysisDurationSeconds, expectedSidwave, verifySilenceBefore, verifySilenceAfter, silenceDurationSeconds, silenceRmsThreshold, postSilenceWaitMs, silenceWaitMs.\n- analyze: Automatically analyze SID playback when verification is requested. Required inputs: request. Optional inputs: durationSeconds, expectedSidwave.\n- record_analyze: Record audio for a fixed duration and return SID analysis metrics. Uses the Ultimate audio stream on c64u and the host microphone on other backends. Required inputs: durationSeconds. Optional inputs: expectedSidwave.",
358
+ "additionalProperties": false
1161
359
  }