c64bridge 0.8.1 → 0.9.1

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 (92) hide show
  1. package/.github/prompts/steer.prompt.md +55 -0
  2. package/AGENTS.md +9 -7
  3. package/README.md +192 -154
  4. package/data/embeddings_asm.json +1 -1
  5. package/data/embeddings_basic.json +1 -1
  6. package/data/embeddings_hardware.json +1 -1
  7. package/data/embeddings_mixed.json +1 -1
  8. package/data/embeddings_other.json +1 -1
  9. package/data/graphics/petscii-style-guide.md +4 -4
  10. package/data/graphics/sprite-charset-best-practices.md +9 -9
  11. package/data/vice/vice-binary-monitor-spec.md +938 -0
  12. package/dist/.tsbuildinfo +1 -1
  13. package/dist/c64Client.js +76 -2
  14. package/dist/device.js +129 -13
  15. package/dist/mcp-server.js +1 -1
  16. package/dist/prompts/registry.js +27 -25
  17. package/dist/rag/indexer.js +18 -8
  18. package/dist/rag/knowledgeIndex.js +112 -79
  19. package/dist/rag/resourceUris.js +93 -0
  20. package/dist/sidwaveCompiler.js +1 -1
  21. package/dist/{assemblyConverter.js → tools/assember.js} +10 -1
  22. package/dist/tools/audio.js +11 -11
  23. package/dist/{basicConverter.js → tools/basicTokenizer.js} +1 -1
  24. package/dist/tools/debug.js +159 -6
  25. package/dist/tools/developer.js +13 -13
  26. package/dist/tools/disassembler.js +478 -0
  27. package/dist/tools/graphics.js +10 -10
  28. package/dist/tools/input.js +338 -0
  29. package/dist/tools/machineControl.js +5 -5
  30. package/dist/tools/memory.js +336 -12
  31. package/dist/tools/meta/index.js +1 -1
  32. package/dist/tools/printer.js +11 -12
  33. package/dist/tools/programRunners.js +61 -22
  34. package/dist/tools/rag.js +9 -9
  35. package/dist/tools/registry/batch.js +167 -0
  36. package/dist/tools/registry/config.js +1 -1
  37. package/dist/tools/registry/disk.js +1 -1
  38. package/dist/tools/registry/drive.js +1 -1
  39. package/dist/tools/registry/extract.js +1 -1
  40. package/dist/tools/registry/graphics.js +102 -2
  41. package/dist/tools/registry/index.js +4 -0
  42. package/dist/tools/registry/input.js +2 -0
  43. package/dist/tools/registry/memory.js +62 -2
  44. package/dist/tools/registry/platform.js +1 -1
  45. package/dist/tools/registry/printer.js +1 -1
  46. package/dist/tools/registry/program.js +1 -1
  47. package/dist/tools/registry/rag.js +1 -1
  48. package/dist/tools/registry/sound.js +1 -1
  49. package/dist/tools/registry/stream.js +1 -1
  50. package/dist/tools/registry/system.js +1 -1
  51. package/dist/tools/schema.js +4 -5
  52. package/dist/tools/storage.js +15 -15
  53. package/dist/tools/streaming.js +3 -3
  54. package/dist/tools/symbolRegistry.js +49 -0
  55. package/dist/tools/types.js +56 -4
  56. package/dist/tools/vice.js +2 -5
  57. package/dist/vice/process.js +120 -2
  58. package/dist/vice/readiness.js +35 -0
  59. package/dist/vice/smokeOptions.js +44 -0
  60. package/dist/vice/viceClient.js +5 -1
  61. package/dist/viceRunner.js +2 -0
  62. package/doc/plans/prompts/README.md +7 -7
  63. package/mcp/prompts.json +42 -59
  64. package/mcp/protocol-examples.json +2 -2
  65. package/mcp/resources.json +179 -166
  66. package/mcp/schemas/c64_batch.schema.json +53 -0
  67. package/mcp/schemas/c64_config.schema.json +525 -283
  68. package/mcp/schemas/c64_debug.schema.json +763 -304
  69. package/mcp/schemas/c64_disk.schema.json +499 -243
  70. package/mcp/schemas/c64_drive.schema.json +165 -90
  71. package/mcp/schemas/c64_extract.schema.json +533 -274
  72. package/mcp/schemas/c64_graphics.schema.json +607 -295
  73. package/mcp/schemas/c64_input.schema.json +136 -0
  74. package/mcp/schemas/c64_memory.schema.json +637 -128
  75. package/mcp/schemas/c64_printer.schema.json +393 -196
  76. package/mcp/schemas/c64_program.schema.json +699 -340
  77. package/mcp/schemas/c64_rag.schema.json +100 -54
  78. package/mcp/schemas/c64_select_backend.schema.json +49 -23
  79. package/mcp/schemas/c64_sound.schema.json +1092 -577
  80. package/mcp/schemas/c64_stream.schema.json +89 -47
  81. package/mcp/schemas/c64_system.schema.json +351 -185
  82. package/mcp/schemas/c64_vice.schema.json +85 -47
  83. package/mcp/server.json +1 -1
  84. package/mcp/tools.json +7299 -3346
  85. package/mcp.json +3 -3
  86. package/package.json +17 -14
  87. package/scripts/fetch-external-sources.mjs +1 -2
  88. package/scripts/run-coverage.mjs +33 -1
  89. package/scripts/run-tests.mjs +2 -2
  90. package/scripts/run-tests.ts +275 -52
  91. package/scripts/update-readme.ts +132 -3
  92. package/server.json +2 -2
@@ -1,278 +1,534 @@
1
1
  {
2
2
  "type": "object",
3
- "description": "Disk operations available via the c64_disk tool.",
4
- "oneOf": [
3
+ "properties": {
4
+ "op": {
5
+ "type": "string",
6
+ "enum": [
7
+ "list_drives",
8
+ "mount",
9
+ "unmount",
10
+ "file_info",
11
+ "create_image",
12
+ "find_and_run"
13
+ ],
14
+ "description": "Selects the operation."
15
+ },
16
+ "drive": {
17
+ "type": "string",
18
+ "description": "Drive identifier (for example drive8).",
19
+ "minLength": 1
20
+ },
21
+ "image": {
22
+ "type": "string",
23
+ "description": "Absolute or Ultimate filesystem path to the disk image.",
24
+ "minLength": 1
25
+ },
26
+ "type": {
27
+ "type": [
28
+ "string",
29
+ "null"
30
+ ],
31
+ "description": "Override detected image type when firmware guesses incorrectly.",
32
+ "enum": [
33
+ "d64",
34
+ "g64",
35
+ "d71",
36
+ "g71",
37
+ "d81"
38
+ ]
39
+ },
40
+ "attachmentMode": {
41
+ "type": [
42
+ "string",
43
+ "null"
44
+ ],
45
+ "description": "Attachment mode controlling how the firmware treats the mounted image.",
46
+ "enum": [
47
+ "readwrite",
48
+ "readonly",
49
+ "unlinked"
50
+ ]
51
+ },
52
+ "driveMode": {
53
+ "type": [
54
+ "string",
55
+ "null"
56
+ ],
57
+ "description": "Drive emulation mode to switch to during verification.",
58
+ "enum": [
59
+ "1541",
60
+ "1571",
61
+ "1581"
62
+ ]
63
+ },
64
+ "verify": {
65
+ "type": "boolean",
66
+ "description": "When true, power on/reset/verify using the reliability workflow.",
67
+ "default": false
68
+ },
69
+ "powerOnIfNeeded": {
70
+ "type": "boolean",
71
+ "description": "Power on the drive automatically before mounting when verify=true.",
72
+ "default": true
73
+ },
74
+ "resetAfterMount": {
75
+ "type": "boolean",
76
+ "description": "Issue a drive reset after mounting when verify=true.",
77
+ "default": true
78
+ },
79
+ "maxRetries": {
80
+ "type": "integer",
81
+ "description": "Maximum number of mount retries when verify=true.",
82
+ "minimum": 0,
83
+ "maximum": 5,
84
+ "default": 2
85
+ },
86
+ "retryDelayMs": {
87
+ "type": "integer",
88
+ "description": "Delay between mount retry attempts when verify=true.",
89
+ "minimum": 0,
90
+ "maximum": 5000,
91
+ "default": 500
92
+ },
93
+ "path": {
94
+ "type": "string",
95
+ "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
96
+ "minLength": 1
97
+ },
98
+ "format": {
99
+ "type": "string",
100
+ "description": "Disk image format to create.",
101
+ "enum": [
102
+ "d64",
103
+ "d71",
104
+ "d81",
105
+ "dnp"
106
+ ]
107
+ },
108
+ "diskname": {
109
+ "type": [
110
+ "string",
111
+ "null"
112
+ ],
113
+ "description": "Optional disk label (1-16 characters, converted to PETSCII).",
114
+ "minLength": 1,
115
+ "maxLength": 16
116
+ },
117
+ "tracks": {
118
+ "type": [
119
+ "integer",
120
+ "null"
121
+ ],
122
+ "description": "Track count (D64 supports 35 or 40; DNP requires explicit tracks).",
123
+ "minimum": 1,
124
+ "maximum": 255
125
+ },
126
+ "root": {
127
+ "type": [
128
+ "string",
129
+ "null"
130
+ ],
131
+ "description": "Root path to search",
132
+ "minLength": 1,
133
+ "default": "/"
134
+ },
135
+ "nameContains": {
136
+ "type": "string",
137
+ "description": "Substring to match",
138
+ "minLength": 1
139
+ },
140
+ "extensions": {
141
+ "type": [
142
+ "array",
143
+ "null"
144
+ ],
145
+ "items": {
146
+ "type": "string",
147
+ "description": "File extensions to include (without dot)",
148
+ "minLength": 1
149
+ }
150
+ },
151
+ "caseInsensitive": {
152
+ "type": [
153
+ "boolean",
154
+ "null"
155
+ ],
156
+ "description": "Case-insensitive name match",
157
+ "default": true
158
+ },
159
+ "sort": {
160
+ "type": [
161
+ "string",
162
+ "null"
163
+ ],
164
+ "description": "Sort order for matches",
165
+ "enum": [
166
+ "discovered",
167
+ "alphabetical"
168
+ ],
169
+ "default": "discovered"
170
+ },
171
+ "waitMs": {
172
+ "type": [
173
+ "integer",
174
+ "null"
175
+ ],
176
+ "description": "Delay after firmware run before returning",
177
+ "minimum": 0,
178
+ "default": 0
179
+ },
180
+ "captureCandidates": {
181
+ "type": [
182
+ "integer",
183
+ "null"
184
+ ],
185
+ "description": "Include up to this many candidates in result",
186
+ "minimum": 1,
187
+ "maximum": 100,
188
+ "default": 10
189
+ }
190
+ },
191
+ "required": [
192
+ "op"
193
+ ],
194
+ "description": "Disk operations available via the c64_disk tool.\n\nOperations:\n- list_drives: List Ultimate drive slots and their mounted images. Required inputs: none.\n- mount: Mount a disk image with optional verification and retries. Required inputs: drive, image. Optional inputs: type, attachmentMode, driveMode, verify, powerOnIfNeeded, resetAfterMount, maxRetries, retryDelayMs.\n- unmount: Remove the mounted image from an Ultimate drive slot. Required inputs: drive.\n- file_info: Inspect metadata for a file on the Ultimate filesystem. Required inputs: path.\n- create_image: Create a blank disk image of the specified format. Required inputs: format, path. Optional inputs: diskname, tracks.\n- find_and_run: Search for a PRG/CRT by name substring and run the first match. Required inputs: nameContains. Optional inputs: root, extensions, caseInsensitive, sort, waitMs, captureCandidates.",
195
+ "additionalProperties": false,
196
+ "x-c64bridge-operations": [
5
197
  {
6
- "type": "object",
198
+ "op": "list_drives",
7
199
  "description": "List Ultimate drive slots and their mounted images.",
8
- "properties": {
9
- "op": {
10
- "const": "list_drives"
11
- }
12
- },
13
- "additionalProperties": false,
14
- "required": [
15
- "op"
16
- ]
200
+ "required": [],
201
+ "optional": [],
202
+ "inputSchema": {
203
+ "type": "object",
204
+ "description": "List Ultimate drive slots and their mounted images.",
205
+ "properties": {
206
+ "op": {
207
+ "const": "list_drives"
208
+ }
209
+ },
210
+ "additionalProperties": false,
211
+ "required": [
212
+ "op"
213
+ ]
214
+ }
17
215
  },
18
216
  {
19
- "type": "object",
217
+ "op": "mount",
20
218
  "description": "Mount a disk image with optional verification and retries.",
21
- "properties": {
22
- "drive": {
23
- "type": "string",
24
- "description": "Drive identifier (for example drive8).",
25
- "minLength": 1
26
- },
27
- "image": {
28
- "type": "string",
29
- "description": "Absolute or Ultimate filesystem path to the disk image.",
30
- "minLength": 1
31
- },
32
- "type": {
33
- "type": [
34
- "string",
35
- "null"
36
- ],
37
- "description": "Override detected image type when firmware guesses incorrectly.",
38
- "enum": [
39
- "d64",
40
- "g64",
41
- "d71",
42
- "g71",
43
- "d81"
44
- ]
45
- },
46
- "attachmentMode": {
47
- "type": [
48
- "string",
49
- "null"
50
- ],
51
- "description": "Attachment mode controlling how the firmware treats the mounted image.",
52
- "enum": [
53
- "readwrite",
54
- "readonly",
55
- "unlinked"
56
- ]
57
- },
58
- "driveMode": {
59
- "type": [
60
- "string",
61
- "null"
62
- ],
63
- "description": "Drive emulation mode to switch to during verification.",
64
- "enum": [
65
- "1541",
66
- "1571",
67
- "1581"
68
- ]
69
- },
70
- "verify": {
71
- "type": "boolean",
72
- "description": "When true, power on/reset/verify using the reliability workflow.",
73
- "default": false
74
- },
75
- "powerOnIfNeeded": {
76
- "type": "boolean",
77
- "description": "Power on the drive automatically before mounting when verify=true.",
78
- "default": true
79
- },
80
- "resetAfterMount": {
81
- "type": "boolean",
82
- "description": "Issue a drive reset after mounting when verify=true.",
83
- "default": true
84
- },
85
- "maxRetries": {
86
- "type": "integer",
87
- "description": "Maximum number of mount retries when verify=true.",
88
- "minimum": 0,
89
- "maximum": 5,
90
- "default": 2
91
- },
92
- "retryDelayMs": {
93
- "type": "integer",
94
- "description": "Delay between mount retry attempts when verify=true.",
95
- "minimum": 0,
96
- "maximum": 5000,
97
- "default": 500
98
- },
99
- "op": {
100
- "const": "mount"
101
- }
102
- },
103
219
  "required": [
104
220
  "drive",
105
- "image",
106
- "op"
221
+ "image"
222
+ ],
223
+ "optional": [
224
+ "type",
225
+ "attachmentMode",
226
+ "driveMode",
227
+ "verify",
228
+ "powerOnIfNeeded",
229
+ "resetAfterMount",
230
+ "maxRetries",
231
+ "retryDelayMs"
107
232
  ],
108
- "additionalProperties": false
233
+ "inputSchema": {
234
+ "type": "object",
235
+ "description": "Mount a disk image with optional verification and retries.",
236
+ "properties": {
237
+ "drive": {
238
+ "type": "string",
239
+ "description": "Drive identifier (for example drive8).",
240
+ "minLength": 1
241
+ },
242
+ "image": {
243
+ "type": "string",
244
+ "description": "Absolute or Ultimate filesystem path to the disk image.",
245
+ "minLength": 1
246
+ },
247
+ "type": {
248
+ "type": [
249
+ "string",
250
+ "null"
251
+ ],
252
+ "description": "Override detected image type when firmware guesses incorrectly.",
253
+ "enum": [
254
+ "d64",
255
+ "g64",
256
+ "d71",
257
+ "g71",
258
+ "d81"
259
+ ]
260
+ },
261
+ "attachmentMode": {
262
+ "type": [
263
+ "string",
264
+ "null"
265
+ ],
266
+ "description": "Attachment mode controlling how the firmware treats the mounted image.",
267
+ "enum": [
268
+ "readwrite",
269
+ "readonly",
270
+ "unlinked"
271
+ ]
272
+ },
273
+ "driveMode": {
274
+ "type": [
275
+ "string",
276
+ "null"
277
+ ],
278
+ "description": "Drive emulation mode to switch to during verification.",
279
+ "enum": [
280
+ "1541",
281
+ "1571",
282
+ "1581"
283
+ ]
284
+ },
285
+ "verify": {
286
+ "type": "boolean",
287
+ "description": "When true, power on/reset/verify using the reliability workflow.",
288
+ "default": false
289
+ },
290
+ "powerOnIfNeeded": {
291
+ "type": "boolean",
292
+ "description": "Power on the drive automatically before mounting when verify=true.",
293
+ "default": true
294
+ },
295
+ "resetAfterMount": {
296
+ "type": "boolean",
297
+ "description": "Issue a drive reset after mounting when verify=true.",
298
+ "default": true
299
+ },
300
+ "maxRetries": {
301
+ "type": "integer",
302
+ "description": "Maximum number of mount retries when verify=true.",
303
+ "minimum": 0,
304
+ "maximum": 5,
305
+ "default": 2
306
+ },
307
+ "retryDelayMs": {
308
+ "type": "integer",
309
+ "description": "Delay between mount retry attempts when verify=true.",
310
+ "minimum": 0,
311
+ "maximum": 5000,
312
+ "default": 500
313
+ },
314
+ "op": {
315
+ "const": "mount"
316
+ }
317
+ },
318
+ "required": [
319
+ "drive",
320
+ "image",
321
+ "op"
322
+ ],
323
+ "additionalProperties": false
324
+ }
109
325
  },
110
326
  {
111
- "type": "object",
327
+ "op": "unmount",
112
328
  "description": "Remove the mounted image from an Ultimate drive slot.",
113
- "properties": {
114
- "drive": {
115
- "type": "string",
116
- "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
117
- "minLength": 1
118
- },
119
- "op": {
120
- "const": "unmount"
121
- }
122
- },
123
329
  "required": [
124
- "drive",
125
- "op"
330
+ "drive"
126
331
  ],
127
- "additionalProperties": false
332
+ "optional": [],
333
+ "inputSchema": {
334
+ "type": "object",
335
+ "description": "Remove the mounted image from an Ultimate drive slot.",
336
+ "properties": {
337
+ "drive": {
338
+ "type": "string",
339
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
340
+ "minLength": 1
341
+ },
342
+ "op": {
343
+ "const": "unmount"
344
+ }
345
+ },
346
+ "required": [
347
+ "drive",
348
+ "op"
349
+ ],
350
+ "additionalProperties": false
351
+ }
128
352
  },
129
353
  {
130
- "type": "object",
354
+ "op": "file_info",
131
355
  "description": "Inspect metadata for a file on the Ultimate filesystem.",
132
- "properties": {
133
- "path": {
134
- "type": "string",
135
- "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
136
- "minLength": 1
137
- },
138
- "op": {
139
- "const": "file_info"
140
- }
141
- },
142
356
  "required": [
143
- "path",
144
- "op"
357
+ "path"
145
358
  ],
146
- "additionalProperties": false
359
+ "optional": [],
360
+ "inputSchema": {
361
+ "type": "object",
362
+ "description": "Inspect metadata for a file on the Ultimate filesystem.",
363
+ "properties": {
364
+ "path": {
365
+ "type": "string",
366
+ "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
367
+ "minLength": 1
368
+ },
369
+ "op": {
370
+ "const": "file_info"
371
+ }
372
+ },
373
+ "required": [
374
+ "path",
375
+ "op"
376
+ ],
377
+ "additionalProperties": false
378
+ }
147
379
  },
148
380
  {
149
- "type": "object",
381
+ "op": "create_image",
150
382
  "description": "Create a blank disk image of the specified format.",
151
- "properties": {
152
- "format": {
153
- "type": "string",
154
- "description": "Disk image format to create.",
155
- "enum": [
156
- "d64",
157
- "d71",
158
- "d81",
159
- "dnp"
160
- ]
161
- },
162
- "path": {
163
- "type": "string",
164
- "description": "Destination path on the Ultimate filesystem.",
165
- "minLength": 1
166
- },
167
- "diskname": {
168
- "type": [
169
- "string",
170
- "null"
171
- ],
172
- "description": "Optional disk label (1-16 characters, converted to PETSCII).",
173
- "minLength": 1,
174
- "maxLength": 16
175
- },
176
- "tracks": {
177
- "type": [
178
- "integer",
179
- "null"
180
- ],
181
- "description": "Track count (D64 supports 35 or 40; DNP requires explicit tracks).",
182
- "minimum": 1,
183
- "maximum": 255
184
- },
185
- "op": {
186
- "const": "create_image"
187
- }
188
- },
189
383
  "required": [
190
384
  "format",
191
- "path",
192
- "op"
385
+ "path"
386
+ ],
387
+ "optional": [
388
+ "diskname",
389
+ "tracks"
193
390
  ],
194
- "additionalProperties": false
391
+ "inputSchema": {
392
+ "type": "object",
393
+ "description": "Create a blank disk image of the specified format.",
394
+ "properties": {
395
+ "format": {
396
+ "type": "string",
397
+ "description": "Disk image format to create.",
398
+ "enum": [
399
+ "d64",
400
+ "d71",
401
+ "d81",
402
+ "dnp"
403
+ ]
404
+ },
405
+ "path": {
406
+ "type": "string",
407
+ "description": "Destination path on the Ultimate filesystem.",
408
+ "minLength": 1
409
+ },
410
+ "diskname": {
411
+ "type": [
412
+ "string",
413
+ "null"
414
+ ],
415
+ "description": "Optional disk label (1-16 characters, converted to PETSCII).",
416
+ "minLength": 1,
417
+ "maxLength": 16
418
+ },
419
+ "tracks": {
420
+ "type": [
421
+ "integer",
422
+ "null"
423
+ ],
424
+ "description": "Track count (D64 supports 35 or 40; DNP requires explicit tracks).",
425
+ "minimum": 1,
426
+ "maximum": 255
427
+ },
428
+ "op": {
429
+ "const": "create_image"
430
+ }
431
+ },
432
+ "required": [
433
+ "format",
434
+ "path",
435
+ "op"
436
+ ],
437
+ "additionalProperties": false
438
+ }
195
439
  },
196
440
  {
197
- "type": "object",
441
+ "op": "find_and_run",
198
442
  "description": "Search for a PRG/CRT by name substring and run the first match.",
199
- "properties": {
200
- "root": {
201
- "type": [
202
- "string",
203
- "null"
204
- ],
205
- "description": "Root path to search",
206
- "minLength": 1,
207
- "default": "/"
208
- },
209
- "nameContains": {
210
- "type": "string",
211
- "description": "Substring to match",
212
- "minLength": 1
213
- },
214
- "extensions": {
215
- "type": [
216
- "array",
217
- "null"
218
- ],
219
- "items": {
443
+ "required": [
444
+ "nameContains"
445
+ ],
446
+ "optional": [
447
+ "root",
448
+ "extensions",
449
+ "caseInsensitive",
450
+ "sort",
451
+ "waitMs",
452
+ "captureCandidates"
453
+ ],
454
+ "inputSchema": {
455
+ "type": "object",
456
+ "description": "Search for a PRG/CRT by name substring and run the first match.",
457
+ "properties": {
458
+ "root": {
459
+ "type": [
460
+ "string",
461
+ "null"
462
+ ],
463
+ "description": "Root path to search",
464
+ "minLength": 1,
465
+ "default": "/"
466
+ },
467
+ "nameContains": {
220
468
  "type": "string",
221
- "description": "File extensions to include (without dot)",
469
+ "description": "Substring to match",
222
470
  "minLength": 1
471
+ },
472
+ "extensions": {
473
+ "type": [
474
+ "array",
475
+ "null"
476
+ ],
477
+ "items": {
478
+ "type": "string",
479
+ "description": "File extensions to include (without dot)",
480
+ "minLength": 1
481
+ }
482
+ },
483
+ "caseInsensitive": {
484
+ "type": [
485
+ "boolean",
486
+ "null"
487
+ ],
488
+ "description": "Case-insensitive name match",
489
+ "default": true
490
+ },
491
+ "sort": {
492
+ "type": [
493
+ "string",
494
+ "null"
495
+ ],
496
+ "description": "Sort order for matches",
497
+ "enum": [
498
+ "discovered",
499
+ "alphabetical"
500
+ ],
501
+ "default": "discovered"
502
+ },
503
+ "waitMs": {
504
+ "type": [
505
+ "integer",
506
+ "null"
507
+ ],
508
+ "description": "Delay after firmware run before returning",
509
+ "minimum": 0,
510
+ "default": 0
511
+ },
512
+ "captureCandidates": {
513
+ "type": [
514
+ "integer",
515
+ "null"
516
+ ],
517
+ "description": "Include up to this many candidates in result",
518
+ "minimum": 1,
519
+ "maximum": 100,
520
+ "default": 10
521
+ },
522
+ "op": {
523
+ "const": "find_and_run"
223
524
  }
224
525
  },
225
- "caseInsensitive": {
226
- "type": [
227
- "boolean",
228
- "null"
229
- ],
230
- "description": "Case-insensitive name match",
231
- "default": true
232
- },
233
- "sort": {
234
- "type": [
235
- "string",
236
- "null"
237
- ],
238
- "description": "Sort order for matches",
239
- "enum": [
240
- "discovered",
241
- "alphabetical"
242
- ],
243
- "default": "discovered"
244
- },
245
- "waitMs": {
246
- "type": [
247
- "integer",
248
- "null"
249
- ],
250
- "description": "Delay after firmware run before returning",
251
- "minimum": 0,
252
- "default": 0
253
- },
254
- "captureCandidates": {
255
- "type": [
256
- "integer",
257
- "null"
258
- ],
259
- "description": "Include up to this many candidates in result",
260
- "minimum": 1,
261
- "maximum": 100,
262
- "default": 10
263
- },
264
- "op": {
265
- "const": "find_and_run"
266
- }
267
- },
268
- "required": [
269
- "nameContains",
270
- "op"
271
- ],
272
- "additionalProperties": false
526
+ "required": [
527
+ "nameContains",
528
+ "op"
529
+ ],
530
+ "additionalProperties": false
531
+ }
273
532
  }
274
- ],
275
- "discriminator": {
276
- "propertyName": "op"
277
- }
533
+ ]
278
534
  }