c64bridge 0.5.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 (138) hide show
  1. package/.github/prompts/README.md +6 -0
  2. package/.github/prompts/assembly-routine-session.prompt.md +13 -0
  3. package/.github/prompts/basic-program-session.prompt.md +13 -0
  4. package/.github/prompts/drive-management-session.prompt.md +13 -0
  5. package/.github/prompts/petscii-art-session.prompt.md +13 -0
  6. package/.github/prompts/play-classic-game.prompt.md +13 -0
  7. package/.github/prompts/sid-music-session.prompt.md +13 -0
  8. package/AGENTS.md +173 -0
  9. package/LICENSE +339 -0
  10. package/README.md +582 -0
  11. package/data/README.md +16 -0
  12. package/data/api/basic-api-spec.md +154 -0
  13. package/data/api/kernal-api-spec.md +68 -0
  14. package/data/assembly/assembly-spec.md +196 -0
  15. package/data/assembly/examples/effects/sinewave.asm +5 -0
  16. package/data/assembly/examples/graphics/sprite/mover.asm +15 -0
  17. package/data/assembly/examples/sid-file-structure.md +8 -0
  18. package/data/assembly/examples/sid-overview.md +11 -0
  19. package/data/audio/examples/Biosphere.sid +0 -0
  20. package/data/audio/sid-file-structure.md +91 -0
  21. package/data/audio/sid-programming-best-practices.md +198 -0
  22. package/data/audio/sid-spec.md +166 -0
  23. package/data/audio/sidwave.md +131 -0
  24. package/data/audio/sidwave.schema.json +64 -0
  25. package/data/basic/basic-spec.md +230 -0
  26. package/data/basic/examples/audio/alle-meine-entchen-expressive.bas +41 -0
  27. package/data/basic/examples/audio/c-major-scale-pleasant.bas +29 -0
  28. package/data/basic/examples/io/joystick.bas +5 -0
  29. package/data/basic/examples/video/bounce.bas +8 -0
  30. package/data/basic/examples/video/entchen-petscii.bas +16 -0
  31. package/data/basic/examples/video/hello-world.bas +4 -0
  32. package/data/basic/examples/video/wave.bas +7 -0
  33. package/data/context/bootstrap.md +148 -0
  34. package/data/context/chat.md +36 -0
  35. package/data/drive/drive-spec.md +215 -0
  36. package/data/embeddings_asm.json +1 -0
  37. package/data/embeddings_basic.json +1 -0
  38. package/data/embeddings_hardware.json +1 -0
  39. package/data/embeddings_mixed.json +1 -0
  40. package/data/embeddings_other.json +1 -0
  41. package/data/io/cia-spec.md +115 -0
  42. package/data/io/io-spec.md +124 -0
  43. package/data/memory/kernal-memory-map.md +227 -0
  44. package/data/memory/low-memory-map.md +133 -0
  45. package/data/memory/memory-map.md +186 -0
  46. package/data/printer/printer-commodore-bitmap.md +31 -0
  47. package/data/printer/printer-commodore.md +28 -0
  48. package/data/printer/printer-epson-bitmap.md +29 -0
  49. package/data/printer/printer-epson.md +30 -0
  50. package/data/printer/printer-prompts.md +29 -0
  51. package/data/printer/printer-spec.md +180 -0
  52. package/data/video/character-set.csv +257 -0
  53. package/data/video/vic-spec.md +276 -0
  54. package/dist/assemblyConverter.js +1299 -0
  55. package/dist/audio/record_and_analyze_audio.js +292 -0
  56. package/dist/basicConverter.js +193 -0
  57. package/dist/bootstrap/stdio-logger.js +32 -0
  58. package/dist/c64Client.js +1052 -0
  59. package/dist/chargen.js +197 -0
  60. package/dist/config.js +142 -0
  61. package/dist/context.js +157 -0
  62. package/dist/device.js +413 -0
  63. package/dist/index.js +7 -0
  64. package/dist/knowledge.js +454 -0
  65. package/dist/logger.js +182 -0
  66. package/dist/loggingHttpClient.js +88 -0
  67. package/dist/mcp-server.js +426 -0
  68. package/dist/petscii.js +135 -0
  69. package/dist/petsciiArt.js +356 -0
  70. package/dist/platform.js +82 -0
  71. package/dist/prompts/registry.js +560 -0
  72. package/dist/rag/discover.config.json +41 -0
  73. package/dist/rag/discover.js +401 -0
  74. package/dist/rag/embeddings.js +60 -0
  75. package/dist/rag/externalFetcher.js +934 -0
  76. package/dist/rag/indexer.js +770 -0
  77. package/dist/rag/init.js +139 -0
  78. package/dist/rag/knowledgeIndex.js +361 -0
  79. package/dist/rag/loggingRetriever.js +46 -0
  80. package/dist/rag/rateLimiter.js +127 -0
  81. package/dist/rag/retriever.js +74 -0
  82. package/dist/rag/sources.csv +31 -0
  83. package/dist/rag/types.js +5 -0
  84. package/dist/rag/urlUtils.js +38 -0
  85. package/dist/sidplayRunner.js +240 -0
  86. package/dist/sidwave.js +101 -0
  87. package/dist/sidwaveCompiler.js +329 -0
  88. package/dist/tools/audio.js +944 -0
  89. package/dist/tools/developer.js +515 -0
  90. package/dist/tools/errors.js +59 -0
  91. package/dist/tools/graphics.js +469 -0
  92. package/dist/tools/machineControl.js +267 -0
  93. package/dist/tools/memory.js +224 -0
  94. package/dist/tools/printer.js +482 -0
  95. package/dist/tools/programRunners.js +315 -0
  96. package/dist/tools/rag.js +153 -0
  97. package/dist/tools/registry.js +58 -0
  98. package/dist/tools/responses.js +36 -0
  99. package/dist/tools/schema.js +304 -0
  100. package/dist/tools/storage.js +740 -0
  101. package/dist/tools/streaming.js +132 -0
  102. package/dist/tools/types.js +99 -0
  103. package/dist/viceRunner.js +239 -0
  104. package/doc/MCP_SETUP.md +153 -0
  105. package/doc/README.md +7 -0
  106. package/doc/developer.md +312 -0
  107. package/doc/img/logo.png +0 -0
  108. package/doc/img/prompts/duck_petscii.png +0 -0
  109. package/doc/img/prompts/duck_song.png +0 -0
  110. package/doc/img/vscode/vscode-copilot-c64-chat-mode.png +0 -0
  111. package/doc/img/vscode/vscode-copilot-hello-world.png +0 -0
  112. package/doc/prompts/README.md +96 -0
  113. package/doc/prompts/user-prompt-ideas.md +147 -0
  114. package/doc/rest/c64-openapi.yaml +979 -0
  115. package/doc/rest/c64-rest-api.md +106 -0
  116. package/doc/troubleshooting-mcp.md +177 -0
  117. package/generated/c64/index.js +857 -0
  118. package/mcp.json +106 -0
  119. package/package.json +79 -0
  120. package/scripts/c64-cli.mjs +142 -0
  121. package/scripts/c64-tool.sh +83 -0
  122. package/scripts/check-package.mjs +89 -0
  123. package/scripts/cli.js +61 -0
  124. package/scripts/fetch-external-sources.mjs +67 -0
  125. package/scripts/generate-changelog.mjs +131 -0
  126. package/scripts/postbuild.mjs +101 -0
  127. package/scripts/prepare-release.mjs +58 -0
  128. package/scripts/rag-rebuild.mjs +53 -0
  129. package/scripts/register-ts-node.mjs +6 -0
  130. package/scripts/run-mcp-check.sh +104 -0
  131. package/scripts/run-tests.mjs +195 -0
  132. package/scripts/sid2wav.sh +94 -0
  133. package/scripts/smoke-run.sh +65 -0
  134. package/scripts/start-mock-c64.mjs +51 -0
  135. package/scripts/start-mock.mjs +31 -0
  136. package/scripts/start.mjs +72 -0
  137. package/scripts/update-readme.ts +164 -0
  138. package/scripts/verify-package.mjs +147 -0
@@ -0,0 +1,979 @@
1
+ openapi: 3.1.0
2
+ info:
3
+ title: Ultimate 64 REST API
4
+ version: "1.0.0"
5
+ summary: REST interface exposed by Ultimate 64 / 1541 Ultimate firmware ≥ 3.11.
6
+ description: |
7
+ This OpenAPI document captures the public HTTP interface described in the
8
+ official Ultimate 64 REST API documentation. Responses always include an
9
+ `errors` array unless noted. When a network password is configured, clients
10
+ must supply the `X-Password` header on every request.
11
+ servers:
12
+ - url: http://c64u
13
+ description: Ultimate 64 on the local network
14
+ components:
15
+ securitySchemes:
16
+ NetworkPassword:
17
+ type: apiKey
18
+ in: header
19
+ name: X-Password
20
+ schemas:
21
+ ErrorResponse:
22
+ type: object
23
+ required:
24
+ - errors
25
+ properties:
26
+ errors:
27
+ type: array
28
+ items:
29
+ type: string
30
+ VersionResponse:
31
+ allOf:
32
+ - $ref: '#/components/schemas/ErrorResponse'
33
+ - type: object
34
+ required:
35
+ - version
36
+ properties:
37
+ version:
38
+ type: string
39
+ InfoResponse:
40
+ allOf:
41
+ - $ref: '#/components/schemas/ErrorResponse'
42
+ - type: object
43
+ properties:
44
+ product:
45
+ type: string
46
+ firmware_version:
47
+ type: string
48
+ fpga_version:
49
+ type: string
50
+ core_version:
51
+ type: string
52
+ description: Present on Ultimate 64 devices.
53
+ hostname:
54
+ type: string
55
+ unique_id:
56
+ type: string
57
+ ConfigListResponse:
58
+ allOf:
59
+ - $ref: '#/components/schemas/ErrorResponse'
60
+ - type: object
61
+ properties:
62
+ categories:
63
+ type: array
64
+ items:
65
+ type: string
66
+ ConfigCategoryResponse:
67
+ allOf:
68
+ - $ref: '#/components/schemas/ErrorResponse'
69
+ - type: object
70
+ additionalProperties:
71
+ type: object
72
+ ConfigItemResponse:
73
+ allOf:
74
+ - $ref: '#/components/schemas/ErrorResponse'
75
+ - type: object
76
+ additionalProperties:
77
+ type: object
78
+ MemoryReadJson:
79
+ allOf:
80
+ - $ref: '#/components/schemas/ErrorResponse'
81
+ - type: object
82
+ properties:
83
+ data:
84
+ oneOf:
85
+ - type: string
86
+ description: Base64 encoded bytes.
87
+ - type: array
88
+ items:
89
+ type: integer
90
+ format: int32
91
+ minimum: 0
92
+ maximum: 255
93
+ MemoryDebugResponse:
94
+ allOf:
95
+ - $ref: '#/components/schemas/ErrorResponse'
96
+ - type: object
97
+ required:
98
+ - value
99
+ properties:
100
+ value:
101
+ type: string
102
+ description: Hex string read from $D7FF.
103
+ DriveListResponse:
104
+ allOf:
105
+ - $ref: '#/components/schemas/ErrorResponse'
106
+ - type: object
107
+ properties:
108
+ drives:
109
+ type: array
110
+ items:
111
+ type: object
112
+ additionalProperties:
113
+ type: object
114
+ properties:
115
+ enabled:
116
+ type: boolean
117
+ bus_id:
118
+ type: integer
119
+ type:
120
+ type: string
121
+ rom:
122
+ type: string
123
+ image_file:
124
+ type: string
125
+ image_path:
126
+ type: string
127
+ last_error:
128
+ type: string
129
+ partitions:
130
+ type: array
131
+ items:
132
+ type: object
133
+ properties:
134
+ id:
135
+ type: integer
136
+ path:
137
+ type: string
138
+ FileInfoResponse:
139
+ allOf:
140
+ - $ref: '#/components/schemas/ErrorResponse'
141
+ - type: object
142
+ properties:
143
+ info:
144
+ type: object
145
+ additionalProperties: true
146
+ MachineActionResponse:
147
+ $ref: '#/components/schemas/ErrorResponse'
148
+ RunnerActionResponse:
149
+ $ref: '#/components/schemas/ErrorResponse'
150
+ security:
151
+ - NetworkPassword: []
152
+ paths:
153
+ /v1/version:
154
+ get:
155
+ summary: Get API version
156
+ responses:
157
+ '200':
158
+ description: Successful response
159
+ content:
160
+ application/json:
161
+ schema:
162
+ $ref: '#/components/schemas/VersionResponse'
163
+ /v1/info:
164
+ get:
165
+ summary: Get device information
166
+ responses:
167
+ '200':
168
+ description: Successful response
169
+ content:
170
+ application/json:
171
+ schema:
172
+ $ref: '#/components/schemas/InfoResponse'
173
+ /v1/runners:sidplay:
174
+ put:
175
+ summary: Play SID from filesystem
176
+ parameters:
177
+ - in: query
178
+ name: file
179
+ required: true
180
+ schema:
181
+ type: string
182
+ - in: query
183
+ name: songnr
184
+ schema:
185
+ type: integer
186
+ minimum: 0
187
+ responses:
188
+ '200':
189
+ description: Request accepted
190
+ content:
191
+ application/json:
192
+ schema:
193
+ $ref: '#/components/schemas/RunnerActionResponse'
194
+ post:
195
+ summary: Play uploaded SID
196
+ parameters:
197
+ - in: query
198
+ name: songnr
199
+ schema:
200
+ type: integer
201
+ minimum: 0
202
+ requestBody:
203
+ required: true
204
+ content:
205
+ multipart/form-data:
206
+ schema:
207
+ type: object
208
+ properties:
209
+ sid:
210
+ type: string
211
+ format: binary
212
+ songlengths:
213
+ type: string
214
+ format: binary
215
+ required:
216
+ - sid
217
+ responses:
218
+ '200':
219
+ description: Request accepted
220
+ content:
221
+ application/json:
222
+ schema:
223
+ $ref: '#/components/schemas/RunnerActionResponse'
224
+ /v1/runners:modplay:
225
+ put:
226
+ summary: Play MOD from filesystem
227
+ parameters:
228
+ - in: query
229
+ name: file
230
+ required: true
231
+ schema:
232
+ type: string
233
+ responses:
234
+ '200':
235
+ description: Request accepted
236
+ content:
237
+ application/json:
238
+ schema:
239
+ $ref: '#/components/schemas/RunnerActionResponse'
240
+ post:
241
+ summary: Play uploaded MOD
242
+ requestBody:
243
+ required: true
244
+ content:
245
+ application/octet-stream:
246
+ schema:
247
+ type: string
248
+ format: binary
249
+ responses:
250
+ '200':
251
+ description: Request accepted
252
+ content:
253
+ application/json:
254
+ schema:
255
+ $ref: '#/components/schemas/RunnerActionResponse'
256
+ /v1/runners:load_prg:
257
+ put:
258
+ summary: Load PRG from filesystem
259
+ parameters:
260
+ - in: query
261
+ name: file
262
+ required: true
263
+ schema:
264
+ type: string
265
+ responses:
266
+ '200':
267
+ description: Request accepted
268
+ content:
269
+ application/json:
270
+ schema:
271
+ $ref: '#/components/schemas/RunnerActionResponse'
272
+ post:
273
+ summary: Load uploaded PRG
274
+ requestBody:
275
+ required: true
276
+ content:
277
+ application/octet-stream:
278
+ schema:
279
+ type: string
280
+ format: binary
281
+ responses:
282
+ '200':
283
+ description: Request accepted
284
+ content:
285
+ application/json:
286
+ schema:
287
+ $ref: '#/components/schemas/RunnerActionResponse'
288
+ /v1/runners:run_prg:
289
+ put:
290
+ summary: Run PRG from filesystem
291
+ parameters:
292
+ - in: query
293
+ name: file
294
+ required: true
295
+ schema:
296
+ type: string
297
+ responses:
298
+ '200':
299
+ description: Request accepted
300
+ content:
301
+ application/json:
302
+ schema:
303
+ $ref: '#/components/schemas/RunnerActionResponse'
304
+ post:
305
+ summary: Run uploaded PRG
306
+ requestBody:
307
+ required: true
308
+ content:
309
+ application/octet-stream:
310
+ schema:
311
+ type: string
312
+ format: binary
313
+ responses:
314
+ '200':
315
+ description: Request accepted
316
+ content:
317
+ application/json:
318
+ schema:
319
+ $ref: '#/components/schemas/RunnerActionResponse'
320
+ /v1/runners:run_crt:
321
+ put:
322
+ summary: Run cartridge from filesystem
323
+ parameters:
324
+ - in: query
325
+ name: file
326
+ required: true
327
+ schema:
328
+ type: string
329
+ responses:
330
+ '200':
331
+ description: Request accepted
332
+ content:
333
+ application/json:
334
+ schema:
335
+ $ref: '#/components/schemas/RunnerActionResponse'
336
+ post:
337
+ summary: Run uploaded cartridge
338
+ requestBody:
339
+ required: true
340
+ content:
341
+ application/octet-stream:
342
+ schema:
343
+ type: string
344
+ format: binary
345
+ responses:
346
+ '200':
347
+ description: Request accepted
348
+ content:
349
+ application/json:
350
+ schema:
351
+ $ref: '#/components/schemas/RunnerActionResponse'
352
+ /v1/configs:
353
+ get:
354
+ summary: List configuration categories
355
+ responses:
356
+ '200':
357
+ description: Categories returned
358
+ content:
359
+ application/json:
360
+ schema:
361
+ $ref: '#/components/schemas/ConfigListResponse'
362
+ post:
363
+ summary: Batch update configuration
364
+ requestBody:
365
+ required: true
366
+ content:
367
+ application/json:
368
+ schema:
369
+ type: object
370
+ additionalProperties:
371
+ type: object
372
+ responses:
373
+ '200':
374
+ description: Update applied
375
+ content:
376
+ application/json:
377
+ schema:
378
+ $ref: '#/components/schemas/ErrorResponse'
379
+ /v1/configs/{category}:
380
+ get:
381
+ summary: Inspect category
382
+ parameters:
383
+ - in: path
384
+ name: category
385
+ required: true
386
+ schema:
387
+ type: string
388
+ responses:
389
+ '200':
390
+ description: Category returned
391
+ content:
392
+ application/json:
393
+ schema:
394
+ $ref: '#/components/schemas/ConfigCategoryResponse'
395
+ /v1/configs/{category}/{item}:
396
+ get:
397
+ summary: Inspect configuration item
398
+ parameters:
399
+ - in: path
400
+ name: category
401
+ required: true
402
+ schema:
403
+ type: string
404
+ - in: path
405
+ name: item
406
+ required: true
407
+ schema:
408
+ type: string
409
+ responses:
410
+ '200':
411
+ description: Item returned
412
+ content:
413
+ application/json:
414
+ schema:
415
+ $ref: '#/components/schemas/ConfigItemResponse'
416
+ put:
417
+ summary: Update configuration item
418
+ parameters:
419
+ - in: path
420
+ name: category
421
+ required: true
422
+ schema:
423
+ type: string
424
+ - in: path
425
+ name: item
426
+ required: true
427
+ schema:
428
+ type: string
429
+ - in: query
430
+ name: value
431
+ required: true
432
+ schema:
433
+ type: string
434
+ responses:
435
+ '200':
436
+ description: Update applied
437
+ content:
438
+ application/json:
439
+ schema:
440
+ $ref: '#/components/schemas/ErrorResponse'
441
+ /v1/configs:load_from_flash:
442
+ put:
443
+ summary: Load configuration from flash
444
+ responses:
445
+ '200':
446
+ description: Loaded
447
+ content:
448
+ application/json:
449
+ schema:
450
+ $ref: '#/components/schemas/ErrorResponse'
451
+ /v1/configs:save_to_flash:
452
+ put:
453
+ summary: Save configuration to flash
454
+ responses:
455
+ '200':
456
+ description: Saved
457
+ content:
458
+ application/json:
459
+ schema:
460
+ $ref: '#/components/schemas/ErrorResponse'
461
+ /v1/configs:reset_to_default:
462
+ put:
463
+ summary: Reset configuration to defaults
464
+ responses:
465
+ '200':
466
+ description: Reset complete
467
+ content:
468
+ application/json:
469
+ schema:
470
+ $ref: '#/components/schemas/ErrorResponse'
471
+ /v1/machine:reset:
472
+ put:
473
+ summary: Soft reset machine
474
+ responses:
475
+ '200':
476
+ description: Reset triggered
477
+ content:
478
+ application/json:
479
+ schema:
480
+ $ref: '#/components/schemas/MachineActionResponse'
481
+ /v1/machine:reboot:
482
+ put:
483
+ summary: Reboot machine
484
+ responses:
485
+ '200':
486
+ description: Reboot triggered
487
+ content:
488
+ application/json:
489
+ schema:
490
+ $ref: '#/components/schemas/MachineActionResponse'
491
+ /v1/machine:pause:
492
+ put:
493
+ summary: Pause machine via DMA
494
+ responses:
495
+ '200':
496
+ description: Pause applied
497
+ content:
498
+ application/json:
499
+ schema:
500
+ $ref: '#/components/schemas/MachineActionResponse'
501
+ /v1/machine:resume:
502
+ put:
503
+ summary: Resume machine from pause
504
+ responses:
505
+ '200':
506
+ description: Resume applied
507
+ content:
508
+ application/json:
509
+ schema:
510
+ $ref: '#/components/schemas/MachineActionResponse'
511
+ /v1/machine:poweroff:
512
+ put:
513
+ summary: Power off machine
514
+ responses:
515
+ '200':
516
+ description: Power off requested
517
+ content:
518
+ application/json:
519
+ schema:
520
+ $ref: '#/components/schemas/MachineActionResponse'
521
+ /v1/machine:menu_button:
522
+ put:
523
+ summary: Toggle Ultimate menu button
524
+ responses:
525
+ '200':
526
+ description: Button event queued
527
+ content:
528
+ application/json:
529
+ schema:
530
+ $ref: '#/components/schemas/MachineActionResponse'
531
+ /v1/machine:writemem:
532
+ put:
533
+ summary: Write memory via query data
534
+ parameters:
535
+ - in: query
536
+ name: address
537
+ required: true
538
+ schema:
539
+ type: string
540
+ description: Hexadecimal start address.
541
+ - in: query
542
+ name: data
543
+ required: true
544
+ schema:
545
+ type: string
546
+ description: Hex string representing bytes (≤ 128 bytes).
547
+ responses:
548
+ '200':
549
+ description: Write applied
550
+ content:
551
+ application/json:
552
+ schema:
553
+ $ref: '#/components/schemas/MachineActionResponse'
554
+ post:
555
+ summary: Write memory via binary payload
556
+ parameters:
557
+ - in: query
558
+ name: address
559
+ required: true
560
+ schema:
561
+ type: string
562
+ description: Hexadecimal start address.
563
+ requestBody:
564
+ required: true
565
+ content:
566
+ application/octet-stream:
567
+ schema:
568
+ type: string
569
+ format: binary
570
+ responses:
571
+ '200':
572
+ description: Write applied
573
+ content:
574
+ application/json:
575
+ schema:
576
+ $ref: '#/components/schemas/MachineActionResponse'
577
+ /v1/machine:readmem:
578
+ get:
579
+ summary: Read memory
580
+ parameters:
581
+ - in: query
582
+ name: address
583
+ required: true
584
+ schema:
585
+ type: string
586
+ description: Hexadecimal start address.
587
+ - in: query
588
+ name: length
589
+ schema:
590
+ type: integer
591
+ minimum: 1
592
+ maximum: 4096
593
+ responses:
594
+ '200':
595
+ description: Memory data
596
+ content:
597
+ application/json:
598
+ schema:
599
+ $ref: '#/components/schemas/MemoryReadJson'
600
+ application/octet-stream:
601
+ schema:
602
+ type: string
603
+ format: binary
604
+ /v1/machine:debugreg:
605
+ get:
606
+ summary: Read debug register
607
+ responses:
608
+ '200':
609
+ description: Register value
610
+ content:
611
+ application/json:
612
+ schema:
613
+ $ref: '#/components/schemas/MemoryDebugResponse'
614
+ put:
615
+ summary: Write debug register
616
+ parameters:
617
+ - in: query
618
+ name: value
619
+ required: true
620
+ schema:
621
+ type: string
622
+ description: Hexadecimal value to write.
623
+ responses:
624
+ '200':
625
+ description: Updated register value
626
+ content:
627
+ application/json:
628
+ schema:
629
+ $ref: '#/components/schemas/MemoryDebugResponse'
630
+ /v1/drives:
631
+ get:
632
+ summary: List internal drives
633
+ responses:
634
+ '200':
635
+ description: Drive information
636
+ content:
637
+ application/json:
638
+ schema:
639
+ $ref: '#/components/schemas/DriveListResponse'
640
+ /v1/drives/{drive}:mount:
641
+ put:
642
+ summary: Mount disk image from filesystem
643
+ parameters:
644
+ - in: path
645
+ name: drive
646
+ required: true
647
+ schema:
648
+ type: string
649
+ - in: query
650
+ name: image
651
+ required: true
652
+ schema:
653
+ type: string
654
+ - in: query
655
+ name: type
656
+ schema:
657
+ type: string
658
+ enum: [d64, g64, d71, g71, d81]
659
+ - in: query
660
+ name: mode
661
+ schema:
662
+ type: string
663
+ enum: [readwrite, readonly, unlinked]
664
+ responses:
665
+ '200':
666
+ description: Mount complete
667
+ content:
668
+ application/json:
669
+ schema:
670
+ $ref: '#/components/schemas/ErrorResponse'
671
+ post:
672
+ summary: Mount uploaded disk image
673
+ parameters:
674
+ - in: path
675
+ name: drive
676
+ required: true
677
+ schema:
678
+ type: string
679
+ - in: query
680
+ name: type
681
+ schema:
682
+ type: string
683
+ enum: [d64, g64, d71, g71, d81]
684
+ - in: query
685
+ name: mode
686
+ schema:
687
+ type: string
688
+ enum: [readwrite, readonly, unlinked]
689
+ requestBody:
690
+ required: true
691
+ content:
692
+ application/octet-stream:
693
+ schema:
694
+ type: string
695
+ format: binary
696
+ responses:
697
+ '200':
698
+ description: Mount complete
699
+ content:
700
+ application/json:
701
+ schema:
702
+ $ref: '#/components/schemas/ErrorResponse'
703
+ /v1/drives/{drive}:reset:
704
+ put:
705
+ summary: Reset drive
706
+ parameters:
707
+ - in: path
708
+ name: drive
709
+ required: true
710
+ schema:
711
+ type: string
712
+ responses:
713
+ '200':
714
+ description: Reset complete
715
+ content:
716
+ application/json:
717
+ schema:
718
+ $ref: '#/components/schemas/ErrorResponse'
719
+ /v1/drives/{drive}:remove:
720
+ put:
721
+ summary: Remove mounted image
722
+ parameters:
723
+ - in: path
724
+ name: drive
725
+ required: true
726
+ schema:
727
+ type: string
728
+ responses:
729
+ '200':
730
+ description: Removal complete
731
+ content:
732
+ application/json:
733
+ schema:
734
+ $ref: '#/components/schemas/ErrorResponse'
735
+ /v1/drives/{drive}:on:
736
+ put:
737
+ summary: Power on drive
738
+ parameters:
739
+ - in: path
740
+ name: drive
741
+ required: true
742
+ schema:
743
+ type: string
744
+ responses:
745
+ '200':
746
+ description: Drive powered on
747
+ content:
748
+ application/json:
749
+ schema:
750
+ $ref: '#/components/schemas/ErrorResponse'
751
+ /v1/drives/{drive}:off:
752
+ put:
753
+ summary: Power off drive
754
+ parameters:
755
+ - in: path
756
+ name: drive
757
+ required: true
758
+ schema:
759
+ type: string
760
+ responses:
761
+ '200':
762
+ description: Drive powered off
763
+ content:
764
+ application/json:
765
+ schema:
766
+ $ref: '#/components/schemas/ErrorResponse'
767
+ /v1/drives/{drive}:load_rom:
768
+ put:
769
+ summary: Load ROM from filesystem
770
+ parameters:
771
+ - in: path
772
+ name: drive
773
+ required: true
774
+ schema:
775
+ type: string
776
+ - in: query
777
+ name: file
778
+ required: true
779
+ schema:
780
+ type: string
781
+ responses:
782
+ '200':
783
+ description: ROM loaded
784
+ content:
785
+ application/json:
786
+ schema:
787
+ $ref: '#/components/schemas/ErrorResponse'
788
+ post:
789
+ summary: Load ROM from upload
790
+ parameters:
791
+ - in: path
792
+ name: drive
793
+ required: true
794
+ schema:
795
+ type: string
796
+ requestBody:
797
+ required: true
798
+ content:
799
+ application/octet-stream:
800
+ schema:
801
+ type: string
802
+ format: binary
803
+ responses:
804
+ '200':
805
+ description: ROM loaded
806
+ content:
807
+ application/json:
808
+ schema:
809
+ $ref: '#/components/schemas/ErrorResponse'
810
+ /v1/drives/{drive}:set_mode:
811
+ put:
812
+ summary: Set drive mode
813
+ parameters:
814
+ - in: path
815
+ name: drive
816
+ required: true
817
+ schema:
818
+ type: string
819
+ - in: query
820
+ name: mode
821
+ required: true
822
+ schema:
823
+ type: string
824
+ enum: [1541, 1571, 1581]
825
+ responses:
826
+ '200':
827
+ description: Mode updated
828
+ content:
829
+ application/json:
830
+ schema:
831
+ $ref: '#/components/schemas/ErrorResponse'
832
+ /v1/streams/{stream}:start:
833
+ put:
834
+ summary: Start data stream
835
+ parameters:
836
+ - in: path
837
+ name: stream
838
+ required: true
839
+ schema:
840
+ type: string
841
+ enum: [video, audio, debug]
842
+ - in: query
843
+ name: ip
844
+ required: true
845
+ schema:
846
+ type: string
847
+ description: Target IP address with optional port (ip[:port]).
848
+ responses:
849
+ '200':
850
+ description: Stream started
851
+ content:
852
+ application/json:
853
+ schema:
854
+ $ref: '#/components/schemas/ErrorResponse'
855
+ /v1/streams/{stream}:stop:
856
+ put:
857
+ summary: Stop data stream
858
+ parameters:
859
+ - in: path
860
+ name: stream
861
+ required: true
862
+ schema:
863
+ type: string
864
+ enum: [video, audio, debug]
865
+ responses:
866
+ '200':
867
+ description: Stream stopped
868
+ content:
869
+ application/json:
870
+ schema:
871
+ $ref: '#/components/schemas/ErrorResponse'
872
+ /v1/files/{path}:info:
873
+ get:
874
+ summary: Inspect file metadata
875
+ parameters:
876
+ - in: path
877
+ name: path
878
+ required: true
879
+ schema:
880
+ type: string
881
+ responses:
882
+ '200':
883
+ description: Metadata returned
884
+ content:
885
+ application/json:
886
+ schema:
887
+ $ref: '#/components/schemas/FileInfoResponse'
888
+ /v1/files/{path}:create_d64:
889
+ put:
890
+ summary: Create D64 image
891
+ parameters:
892
+ - in: path
893
+ name: path
894
+ required: true
895
+ schema:
896
+ type: string
897
+ - in: query
898
+ name: tracks
899
+ schema:
900
+ type: integer
901
+ enum: [35, 40]
902
+ - in: query
903
+ name: diskname
904
+ schema:
905
+ type: string
906
+ responses:
907
+ '200':
908
+ description: Image created
909
+ content:
910
+ application/json:
911
+ schema:
912
+ $ref: '#/components/schemas/ErrorResponse'
913
+ /v1/files/{path}:create_d71:
914
+ put:
915
+ summary: Create D71 image
916
+ parameters:
917
+ - in: path
918
+ name: path
919
+ required: true
920
+ schema:
921
+ type: string
922
+ - in: query
923
+ name: diskname
924
+ schema:
925
+ type: string
926
+ responses:
927
+ '200':
928
+ description: Image created
929
+ content:
930
+ application/json:
931
+ schema:
932
+ $ref: '#/components/schemas/ErrorResponse'
933
+ /v1/files/{path}:create_d81:
934
+ put:
935
+ summary: Create D81 image
936
+ parameters:
937
+ - in: path
938
+ name: path
939
+ required: true
940
+ schema:
941
+ type: string
942
+ - in: query
943
+ name: diskname
944
+ schema:
945
+ type: string
946
+ responses:
947
+ '200':
948
+ description: Image created
949
+ content:
950
+ application/json:
951
+ schema:
952
+ $ref: '#/components/schemas/ErrorResponse'
953
+ /v1/files/{path}:create_dnp:
954
+ put:
955
+ summary: Create DNP image
956
+ parameters:
957
+ - in: path
958
+ name: path
959
+ required: true
960
+ schema:
961
+ type: string
962
+ - in: query
963
+ name: tracks
964
+ required: true
965
+ schema:
966
+ type: integer
967
+ minimum: 1
968
+ maximum: 255
969
+ - in: query
970
+ name: diskname
971
+ schema:
972
+ type: string
973
+ responses:
974
+ '200':
975
+ description: Image created
976
+ content:
977
+ application/json:
978
+ schema:
979
+ $ref: '#/components/schemas/ErrorResponse'