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.
- package/.github/prompts/steer.prompt.md +55 -0
- package/AGENTS.md +9 -7
- package/README.md +192 -154
- package/data/embeddings_asm.json +1 -1
- package/data/embeddings_basic.json +1 -1
- package/data/embeddings_hardware.json +1 -1
- package/data/embeddings_mixed.json +1 -1
- package/data/embeddings_other.json +1 -1
- package/data/graphics/petscii-style-guide.md +4 -4
- package/data/graphics/sprite-charset-best-practices.md +9 -9
- package/data/vice/vice-binary-monitor-spec.md +938 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/c64Client.js +76 -2
- package/dist/device.js +129 -13
- package/dist/mcp-server.js +1 -1
- package/dist/prompts/registry.js +27 -25
- package/dist/rag/indexer.js +18 -8
- package/dist/rag/knowledgeIndex.js +112 -79
- package/dist/rag/resourceUris.js +93 -0
- package/dist/sidwaveCompiler.js +1 -1
- package/dist/{assemblyConverter.js → tools/assember.js} +10 -1
- package/dist/tools/audio.js +11 -11
- package/dist/{basicConverter.js → tools/basicTokenizer.js} +1 -1
- package/dist/tools/debug.js +159 -6
- package/dist/tools/developer.js +13 -13
- package/dist/tools/disassembler.js +478 -0
- package/dist/tools/graphics.js +10 -10
- package/dist/tools/input.js +338 -0
- package/dist/tools/machineControl.js +5 -5
- package/dist/tools/memory.js +336 -12
- package/dist/tools/meta/index.js +1 -1
- package/dist/tools/printer.js +11 -12
- package/dist/tools/programRunners.js +61 -22
- package/dist/tools/rag.js +9 -9
- package/dist/tools/registry/batch.js +167 -0
- package/dist/tools/registry/config.js +1 -1
- package/dist/tools/registry/disk.js +1 -1
- package/dist/tools/registry/drive.js +1 -1
- package/dist/tools/registry/extract.js +1 -1
- package/dist/tools/registry/graphics.js +102 -2
- package/dist/tools/registry/index.js +4 -0
- package/dist/tools/registry/input.js +2 -0
- package/dist/tools/registry/memory.js +62 -2
- package/dist/tools/registry/platform.js +1 -1
- package/dist/tools/registry/printer.js +1 -1
- package/dist/tools/registry/program.js +1 -1
- package/dist/tools/registry/rag.js +1 -1
- package/dist/tools/registry/sound.js +1 -1
- package/dist/tools/registry/stream.js +1 -1
- package/dist/tools/registry/system.js +1 -1
- package/dist/tools/schema.js +4 -5
- package/dist/tools/storage.js +15 -15
- package/dist/tools/streaming.js +3 -3
- package/dist/tools/symbolRegistry.js +49 -0
- package/dist/tools/types.js +56 -4
- package/dist/tools/vice.js +2 -5
- package/dist/vice/process.js +120 -2
- package/dist/vice/readiness.js +35 -0
- package/dist/vice/smokeOptions.js +44 -0
- package/dist/vice/viceClient.js +5 -1
- package/dist/viceRunner.js +2 -0
- package/doc/plans/prompts/README.md +7 -7
- package/mcp/prompts.json +42 -59
- package/mcp/protocol-examples.json +2 -2
- package/mcp/resources.json +179 -166
- package/mcp/schemas/c64_batch.schema.json +53 -0
- package/mcp/schemas/c64_config.schema.json +525 -283
- package/mcp/schemas/c64_debug.schema.json +763 -304
- package/mcp/schemas/c64_disk.schema.json +499 -243
- package/mcp/schemas/c64_drive.schema.json +165 -90
- package/mcp/schemas/c64_extract.schema.json +533 -274
- package/mcp/schemas/c64_graphics.schema.json +607 -295
- package/mcp/schemas/c64_input.schema.json +136 -0
- package/mcp/schemas/c64_memory.schema.json +637 -128
- package/mcp/schemas/c64_printer.schema.json +393 -196
- package/mcp/schemas/c64_program.schema.json +699 -340
- package/mcp/schemas/c64_rag.schema.json +100 -54
- package/mcp/schemas/c64_select_backend.schema.json +49 -23
- package/mcp/schemas/c64_sound.schema.json +1092 -577
- package/mcp/schemas/c64_stream.schema.json +89 -47
- package/mcp/schemas/c64_system.schema.json +351 -185
- package/mcp/schemas/c64_vice.schema.json +85 -47
- package/mcp/server.json +1 -1
- package/mcp/tools.json +7299 -3346
- package/mcp.json +3 -3
- package/package.json +17 -14
- package/scripts/fetch-external-sources.mjs +1 -2
- package/scripts/run-coverage.mjs +33 -1
- package/scripts/run-tests.mjs +2 -2
- package/scripts/run-tests.ts +275 -52
- package/scripts/update-readme.ts +132 -3
- package/server.json +2 -2
package/dist/tools/audio.js
CHANGED
|
@@ -397,9 +397,9 @@ export const audioModule = defineToolModule({
|
|
|
397
397
|
domain: "audio",
|
|
398
398
|
summary: "SID composition, playback, and audio analysis workflows.",
|
|
399
399
|
resources: [
|
|
400
|
-
"c64://
|
|
401
|
-
"c64://
|
|
402
|
-
"c64://
|
|
400
|
+
"c64://sound/sid/spec",
|
|
401
|
+
"c64://sound/sidwave/spec",
|
|
402
|
+
"c64://sound/sid/file-format",
|
|
403
403
|
],
|
|
404
404
|
prompts: ["sid-music"],
|
|
405
405
|
defaultTags: ["sid", "audio"],
|
|
@@ -411,7 +411,7 @@ export const audioModule = defineToolModule({
|
|
|
411
411
|
tools: [
|
|
412
412
|
{
|
|
413
413
|
name: "sid_volume",
|
|
414
|
-
description: "Set the SID master volume register at $D418. See c64://
|
|
414
|
+
description: "Set the SID master volume register at $D418. See c64://sound/sid/spec.",
|
|
415
415
|
summary: "Clamps the requested volume and writes it to the SID master volume register.",
|
|
416
416
|
inputSchema: sidVolumeArgsSchema.jsonSchema,
|
|
417
417
|
tags: ["sid", "control"],
|
|
@@ -496,7 +496,7 @@ export const audioModule = defineToolModule({
|
|
|
496
496
|
},
|
|
497
497
|
{
|
|
498
498
|
name: "sid_note_on",
|
|
499
|
-
description: "Trigger a SID voice with configurable waveform, pulse width, and ADSR envelope. See c64://
|
|
499
|
+
description: "Trigger a SID voice with configurable waveform, pulse width, and ADSR envelope. See c64://sound/sid/spec.",
|
|
500
500
|
summary: "Resolves note or frequency, clamps parameters, and writes the SID voice registers.",
|
|
501
501
|
inputSchema: sidNoteOnArgsSchema.jsonSchema,
|
|
502
502
|
tags: ["sid", "control", "music", "pal-ntsc"],
|
|
@@ -700,7 +700,7 @@ export const audioModule = defineToolModule({
|
|
|
700
700
|
description: "Play a SID file stored on the Ultimate filesystem via the firmware player.",
|
|
701
701
|
summary: "Instructs the SID player to load the given file and optional song number.",
|
|
702
702
|
inputSchema: sidplayFileArgsSchema.jsonSchema,
|
|
703
|
-
relatedResources: ["c64://
|
|
703
|
+
relatedResources: ["c64://sound/sid/spec"],
|
|
704
704
|
tags: ["sid", "playback"],
|
|
705
705
|
prerequisites: ["drives_list"],
|
|
706
706
|
examples: [
|
|
@@ -740,7 +740,7 @@ export const audioModule = defineToolModule({
|
|
|
740
740
|
description: "Play a MOD tracker module stored on the Ultimate filesystem.",
|
|
741
741
|
summary: "Sends the module to the Ultimate SID player and starts playback.",
|
|
742
742
|
inputSchema: modplayFileArgsSchema.jsonSchema,
|
|
743
|
-
relatedResources: ["c64://
|
|
743
|
+
relatedResources: ["c64://sound/sid/spec"],
|
|
744
744
|
tags: ["sid", "playback"],
|
|
745
745
|
prerequisites: ["drives_list"],
|
|
746
746
|
examples: [
|
|
@@ -780,7 +780,7 @@ export const audioModule = defineToolModule({
|
|
|
780
780
|
summary: "Builds a note timeline from semitone offsets and triggers SID playback asynchronously.",
|
|
781
781
|
lifecycle: "fire-and-forget",
|
|
782
782
|
inputSchema: musicGenerateArgsSchema.jsonSchema,
|
|
783
|
-
relatedResources: ["c64://
|
|
783
|
+
relatedResources: ["c64://sound/sid/spec"],
|
|
784
784
|
relatedPrompts: ["sid-music"],
|
|
785
785
|
tags: ["sid", "music", "generator", "pal-ntsc"],
|
|
786
786
|
prerequisites: ["sid_volume"],
|
|
@@ -862,7 +862,7 @@ export const audioModule = defineToolModule({
|
|
|
862
862
|
description: "Compile a SIDWAVE composition to PRG or SID and optionally play it immediately.",
|
|
863
863
|
summary: "Parses SIDWAVE/CPG input, compiles to a PRG, and plays via PRG or SID attachment.",
|
|
864
864
|
inputSchema: musicCompileArgsSchema.jsonSchema,
|
|
865
|
-
relatedResources: ["c64://
|
|
865
|
+
relatedResources: ["c64://sound/sid/spec", "c64://sound/sidwave/spec", "c64://sound/sid/file-format"],
|
|
866
866
|
relatedPrompts: ["sid-music"],
|
|
867
867
|
tags: ["sid", "music", "compiler"],
|
|
868
868
|
prerequisites: [],
|
|
@@ -945,7 +945,7 @@ export const audioModule = defineToolModule({
|
|
|
945
945
|
description: "Record audio from the default input device and analyze SID playback characteristics.",
|
|
946
946
|
summary: "Captures PCM data, extracts notes, tempo, and deviation metrics for SID verification workflows.",
|
|
947
947
|
inputSchema: recordAndAnalyzeArgsSchema.jsonSchema,
|
|
948
|
-
relatedResources: ["c64://
|
|
948
|
+
relatedResources: ["c64://sound/sid/spec", "c64://sound/sid/file-format"],
|
|
949
949
|
relatedPrompts: ["sid-music"],
|
|
950
950
|
tags: ["sid", "analysis"],
|
|
951
951
|
prerequisites: [],
|
|
@@ -985,7 +985,7 @@ export const audioModule = defineToolModule({
|
|
|
985
985
|
description: "Automatically analyze SID playback when the user requests verification feedback.",
|
|
986
986
|
summary: "Detects verification intent in natural language, records a short clip, and returns musical feedback.",
|
|
987
987
|
inputSchema: analyzeAudioArgsSchema.jsonSchema,
|
|
988
|
-
relatedResources: ["c64://
|
|
988
|
+
relatedResources: ["c64://sound/sid/spec", "c64://sound/sid/file-format"],
|
|
989
989
|
relatedPrompts: ["sid-music"],
|
|
990
990
|
tags: ["sid", "analysis"],
|
|
991
991
|
prerequisites: [],
|
|
@@ -6,7 +6,7 @@ Licensed under the GNU General Public License v2.0 or later.
|
|
|
6
6
|
See <https://www.gnu.org/licenses/> for details.
|
|
7
7
|
*/
|
|
8
8
|
import { Buffer } from "node:buffer";
|
|
9
|
-
import { asciiToPetscii, encodeStringWithNames } from "
|
|
9
|
+
import { asciiToPetscii, encodeStringWithNames } from "../petscii.js";
|
|
10
10
|
const DEFAULT_START_ADDRESS = 0x0801;
|
|
11
11
|
const REM_TOKEN = 0x8f;
|
|
12
12
|
const TOKEN_TABLE = buildTokenTable();
|
package/dist/tools/debug.js
CHANGED
|
@@ -57,6 +57,7 @@ const createCheckpointArgsSchema = objectSchema({
|
|
|
57
57
|
stopOnHit: optionalSchema(booleanSchema({ description: "Pause execution when hit (default true).", default: true })),
|
|
58
58
|
enabled: optionalSchema(booleanSchema({ description: "Whether the checkpoint is enabled (default true).", default: true })),
|
|
59
59
|
temporary: optionalSchema(booleanSchema({ description: "Automatically remove after first hit.", default: false })),
|
|
60
|
+
label: optionalSchema(stringSchema({ description: "Optional human-readable label stored in-process.", maxLength: 64 })),
|
|
60
61
|
operations: optionalSchema(objectSchema({
|
|
61
62
|
description: "Checkpoint operation filters.",
|
|
62
63
|
properties: {
|
|
@@ -147,6 +148,42 @@ const stepReturnArgsSchema = objectSchema({
|
|
|
147
148
|
required: ["op"],
|
|
148
149
|
additionalProperties: false,
|
|
149
150
|
});
|
|
151
|
+
const getMonitorStateArgsSchema = objectSchema({
|
|
152
|
+
description: "Read CPU registers and return the current monitor state.",
|
|
153
|
+
properties: {
|
|
154
|
+
op: literalSchema("get_monitor_state"),
|
|
155
|
+
memspace: memspaceSchema,
|
|
156
|
+
},
|
|
157
|
+
required: ["op"],
|
|
158
|
+
additionalProperties: false,
|
|
159
|
+
});
|
|
160
|
+
const waitForStateArgsSchema = objectSchema({
|
|
161
|
+
description: "Poll CPU registers until PC equals expectedPC or timeout elapses.",
|
|
162
|
+
properties: {
|
|
163
|
+
op: literalSchema("wait_for_state"),
|
|
164
|
+
expectedPC: optionalSchema(stringSchema({ description: "Target PC address to wait for (e.g. $0810).", minLength: 1 })),
|
|
165
|
+
timeoutMs: optionalSchema(numberSchema({ description: "Maximum wait time in milliseconds.", integer: true, minimum: 1, maximum: 60000, default: 5000 })),
|
|
166
|
+
pollMs: optionalSchema(numberSchema({ description: "Poll interval in milliseconds.", integer: true, minimum: 10, maximum: 1000, default: 100 })),
|
|
167
|
+
},
|
|
168
|
+
required: ["op"],
|
|
169
|
+
additionalProperties: false,
|
|
170
|
+
});
|
|
171
|
+
const nuclearResetArgsSchema = objectSchema({
|
|
172
|
+
description: "Kill and restart the VICE process (managed instances only).",
|
|
173
|
+
properties: {
|
|
174
|
+
op: literalSchema("nuclear_reset"),
|
|
175
|
+
},
|
|
176
|
+
required: ["op"],
|
|
177
|
+
additionalProperties: false,
|
|
178
|
+
});
|
|
179
|
+
const continueExecutionArgsSchema = objectSchema({
|
|
180
|
+
description: "Exit the Binary Monitor and resume CPU execution (BM 0xAA Exit).",
|
|
181
|
+
properties: {
|
|
182
|
+
op: literalSchema("continue_execution"),
|
|
183
|
+
},
|
|
184
|
+
required: ["op"],
|
|
185
|
+
additionalProperties: false,
|
|
186
|
+
});
|
|
150
187
|
const debugOperationSchemas = [
|
|
151
188
|
listCheckpointsArgsSchema,
|
|
152
189
|
getCheckpointArgsSchema,
|
|
@@ -159,14 +196,19 @@ const debugOperationSchemas = [
|
|
|
159
196
|
setRegistersArgsSchema,
|
|
160
197
|
stepArgsSchema,
|
|
161
198
|
stepReturnArgsSchema,
|
|
199
|
+
getMonitorStateArgsSchema,
|
|
200
|
+
waitForStateArgsSchema,
|
|
201
|
+
nuclearResetArgsSchema,
|
|
202
|
+
continueExecutionArgsSchema,
|
|
162
203
|
];
|
|
204
|
+
const checkpointLabels = new Map();
|
|
163
205
|
const debugOperationHandlers = {
|
|
164
206
|
list_checkpoints: async (_args, ctx) => {
|
|
165
207
|
try {
|
|
166
208
|
listCheckpointsArgsSchema.parse(_args);
|
|
167
209
|
ctx.logger.info("Listing VICE checkpoints");
|
|
168
210
|
const checkpoints = await ctx.client.viceCheckpointList();
|
|
169
|
-
return jsonResult({ checkpoints: checkpoints.map(formatCheckpoint) }, { success: true, count: checkpoints.length });
|
|
211
|
+
return jsonResult({ checkpoints: checkpoints.map((cp) => formatCheckpoint(cp, checkpointLabels.get(cp.id))) }, { success: true, count: checkpoints.length });
|
|
170
212
|
}
|
|
171
213
|
catch (error) {
|
|
172
214
|
return handleToolError(error);
|
|
@@ -176,7 +218,7 @@ const debugOperationHandlers = {
|
|
|
176
218
|
try {
|
|
177
219
|
const parsed = getCheckpointArgsSchema.parse(args);
|
|
178
220
|
const checkpoint = await ctx.client.viceCheckpointGet(parsed.id);
|
|
179
|
-
return jsonResult({ checkpoint: formatCheckpoint(checkpoint) }, { success: true });
|
|
221
|
+
return jsonResult({ checkpoint: formatCheckpoint(checkpoint, checkpointLabels.get(checkpoint.id)) }, { success: true });
|
|
180
222
|
}
|
|
181
223
|
catch (error) {
|
|
182
224
|
return handleToolError(error);
|
|
@@ -201,8 +243,11 @@ const debugOperationHandlers = {
|
|
|
201
243
|
},
|
|
202
244
|
memspace: normaliseMemspace(parsed.memspace),
|
|
203
245
|
});
|
|
204
|
-
|
|
205
|
-
|
|
246
|
+
if (parsed.label) {
|
|
247
|
+
checkpointLabels.set(created.id, parsed.label);
|
|
248
|
+
}
|
|
249
|
+
ctx.logger.info("Created VICE checkpoint", { id: created.id, start: formatAddress(created.start), label: parsed.label });
|
|
250
|
+
return jsonResult({ checkpoint: formatCheckpoint(created, checkpointLabels.get(created.id)) }, { success: true, id: created.id });
|
|
206
251
|
}
|
|
207
252
|
catch (error) {
|
|
208
253
|
return handleToolError(error);
|
|
@@ -212,6 +257,7 @@ const debugOperationHandlers = {
|
|
|
212
257
|
try {
|
|
213
258
|
const parsed = deleteCheckpointArgsSchema.parse(args);
|
|
214
259
|
await ctx.client.viceCheckpointDelete(parsed.id);
|
|
260
|
+
checkpointLabels.delete(parsed.id);
|
|
215
261
|
ctx.logger.info("Deleted VICE checkpoint", { id: parsed.id });
|
|
216
262
|
return textResult(`Deleted checkpoint ${parsed.id}.`, { success: true, id: parsed.id });
|
|
217
263
|
}
|
|
@@ -345,12 +391,93 @@ const debugOperationHandlers = {
|
|
|
345
391
|
return handleToolError(error);
|
|
346
392
|
}
|
|
347
393
|
},
|
|
394
|
+
get_monitor_state: async (args, ctx) => {
|
|
395
|
+
try {
|
|
396
|
+
const parsed = getMonitorStateArgsSchema.parse(args);
|
|
397
|
+
const memspace = normaliseMemspace(parsed.memspace);
|
|
398
|
+
const [metadata, values] = await Promise.all([
|
|
399
|
+
ctx.client.viceRegistersAvailable(memspace),
|
|
400
|
+
ctx.client.viceRegistersGet(memspace),
|
|
401
|
+
]);
|
|
402
|
+
const metadataById = new Map(metadata.map((m) => [m.id, m]));
|
|
403
|
+
const registers = values.map((v) => {
|
|
404
|
+
const meta = metadataById.get(v.id);
|
|
405
|
+
return { id: v.id, name: meta?.name, bits: meta?.bits, size: v.size, value: v.value };
|
|
406
|
+
});
|
|
407
|
+
const pc = registers.find((r) => r.name?.toUpperCase() === "PC");
|
|
408
|
+
ctx.logger.info("Read monitor state", { memspace, pc: pc ? formatAddress(pc.value) : "unknown" });
|
|
409
|
+
return jsonResult({ memspace, registers, pc: pc ? formatAddress(pc.value) : undefined }, { success: true, memspace, count: registers.length });
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
return handleToolError(error);
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
wait_for_state: async (args, ctx) => {
|
|
416
|
+
try {
|
|
417
|
+
const parsed = waitForStateArgsSchema.parse(args);
|
|
418
|
+
const timeoutMs = parsed.timeoutMs ?? 5000;
|
|
419
|
+
const pollMs = parsed.pollMs ?? 100;
|
|
420
|
+
const targetPC = parsed.expectedPC ? parseAddress(parsed.expectedPC, "expectedPC") : undefined;
|
|
421
|
+
const metadata = await ctx.client.viceRegistersAvailable(0);
|
|
422
|
+
const metadataById = new Map(metadata.map((m) => [m.id, m]));
|
|
423
|
+
const pcId = metadata.find((m) => m.name.toUpperCase() === "PC")?.id;
|
|
424
|
+
const deadline = Date.now() + timeoutMs;
|
|
425
|
+
let values = [];
|
|
426
|
+
let currentPC;
|
|
427
|
+
while (Date.now() < deadline) {
|
|
428
|
+
values = await ctx.client.viceRegistersGet(0);
|
|
429
|
+
currentPC = pcId !== undefined ? values.find((v) => v.id === pcId)?.value : undefined;
|
|
430
|
+
if (targetPC === undefined || currentPC === targetPC) {
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
await new Promise((res) => setTimeout(res, pollMs));
|
|
434
|
+
}
|
|
435
|
+
const matched = targetPC === undefined || currentPC === targetPC;
|
|
436
|
+
const regs = values.map((v) => {
|
|
437
|
+
const meta = metadataById.get(v.id);
|
|
438
|
+
return { id: v.id, name: meta?.name, bits: meta?.bits, size: v.size, value: v.value };
|
|
439
|
+
});
|
|
440
|
+
ctx.logger.info("wait_for_state settled", { matched, pc: currentPC !== undefined ? formatAddress(currentPC) : "unknown" });
|
|
441
|
+
return jsonResult({
|
|
442
|
+
matched,
|
|
443
|
+
timedOut: !matched,
|
|
444
|
+
pc: currentPC !== undefined ? formatAddress(currentPC) : undefined,
|
|
445
|
+
registers: regs,
|
|
446
|
+
}, { success: true, matched });
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
return handleToolError(error);
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
nuclear_reset: async (args, ctx) => {
|
|
453
|
+
try {
|
|
454
|
+
nuclearResetArgsSchema.parse(args);
|
|
455
|
+
ctx.logger.info("Performing nuclear reset of VICE process");
|
|
456
|
+
await ctx.client.viceNuclearReset();
|
|
457
|
+
checkpointLabels.clear();
|
|
458
|
+
return textResult("VICE process stopped and restarted.", { success: true });
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
return handleToolError(error);
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
continue_execution: async (args, ctx) => {
|
|
465
|
+
try {
|
|
466
|
+
continueExecutionArgsSchema.parse(args);
|
|
467
|
+
await ctx.client.viceExitMonitor();
|
|
468
|
+
ctx.logger.info("Exited Binary Monitor — CPU resumed");
|
|
469
|
+
return textResult("Execution resumed.", { success: true });
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
return handleToolError(error);
|
|
473
|
+
}
|
|
474
|
+
},
|
|
348
475
|
};
|
|
349
476
|
const debugOperationDispatcher = createOperationDispatcher("c64_debug", debugOperationHandlers);
|
|
350
477
|
export const debugModuleGroup = defineToolModule({
|
|
351
478
|
domain: "debug",
|
|
352
479
|
summary: "VICE Binary Monitor debugger operations (breakpoints, registers, stepping).",
|
|
353
|
-
resources: ["c64://
|
|
480
|
+
resources: ["c64://assembly/6510-spec", "c64://memory/map"],
|
|
354
481
|
prompts: ["assembly-program", "memory-debug"],
|
|
355
482
|
defaultTags: ["debug", "vice"],
|
|
356
483
|
workflowHints: [
|
|
@@ -384,6 +511,31 @@ export const debugModuleGroup = defineToolModule({
|
|
|
384
511
|
description: "Read CPU registers from memspace 0 (default).",
|
|
385
512
|
arguments: { op: "get_registers" },
|
|
386
513
|
},
|
|
514
|
+
{
|
|
515
|
+
name: "Create labelled breakpoint",
|
|
516
|
+
description: "Set a breakpoint at $0810 with a descriptive label.",
|
|
517
|
+
arguments: { op: "create_checkpoint", address: "$0810", label: "entry_point" },
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
name: "Get monitor state",
|
|
521
|
+
description: "Read current CPU state including all registers and PC.",
|
|
522
|
+
arguments: { op: "get_monitor_state" },
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
name: "Wait for PC",
|
|
526
|
+
description: "Poll until PC reaches $0810 or 5 s elapses.",
|
|
527
|
+
arguments: { op: "wait_for_state", expectedPC: "$0810", timeoutMs: 5000 },
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
name: "Nuclear reset",
|
|
531
|
+
description: "Kill and restart the VICE process, clearing all state.",
|
|
532
|
+
arguments: { op: "nuclear_reset" },
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
name: "Continue execution",
|
|
536
|
+
description: "Exit the BM monitor and let the CPU run freely.",
|
|
537
|
+
arguments: { op: "continue_execution" },
|
|
538
|
+
},
|
|
387
539
|
],
|
|
388
540
|
execute: debugOperationDispatcher,
|
|
389
541
|
},
|
|
@@ -395,9 +547,10 @@ function handleToolError(error) {
|
|
|
395
547
|
}
|
|
396
548
|
return unknownErrorResult(error);
|
|
397
549
|
}
|
|
398
|
-
function formatCheckpoint(checkpoint) {
|
|
550
|
+
function formatCheckpoint(checkpoint, label) {
|
|
399
551
|
return {
|
|
400
552
|
id: checkpoint.id,
|
|
553
|
+
...(label ? { label } : {}),
|
|
401
554
|
start: formatAddress(checkpoint.start),
|
|
402
555
|
end: formatAddress(checkpoint.end),
|
|
403
556
|
enabled: checkpoint.enabled,
|
package/dist/tools/developer.js
CHANGED
|
@@ -123,8 +123,8 @@ export const developerModule = defineToolModule({
|
|
|
123
123
|
domain: "developer",
|
|
124
124
|
summary: "Configuration management, diagnostics, and helper utilities for advanced workflows.",
|
|
125
125
|
resources: [
|
|
126
|
-
"c64://
|
|
127
|
-
"c64://
|
|
126
|
+
"c64://guide/bootstrap",
|
|
127
|
+
"c64://guide/index",
|
|
128
128
|
],
|
|
129
129
|
prompts: ["memory-debug"],
|
|
130
130
|
defaultTags: ["developer", "config", "debug"],
|
|
@@ -138,7 +138,7 @@ export const developerModule = defineToolModule({
|
|
|
138
138
|
description: "List configuration categories available on the Ultimate firmware.",
|
|
139
139
|
summary: "Fetches the configuration tree and returns firmware-reported categories.",
|
|
140
140
|
inputSchema: noArgsSchema.jsonSchema,
|
|
141
|
-
relatedResources: ["c64://
|
|
141
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
142
142
|
tags: ["config", "list"],
|
|
143
143
|
examples: [
|
|
144
144
|
{ name: "List configs", description: "Enumerate configuration categories", arguments: {} },
|
|
@@ -173,7 +173,7 @@ export const developerModule = defineToolModule({
|
|
|
173
173
|
description: "Read a configuration category or specific item.",
|
|
174
174
|
summary: "Returns firmware configuration data for the selected category (and item).",
|
|
175
175
|
inputSchema: configGetArgsSchema.jsonSchema,
|
|
176
|
-
relatedResources: ["c64://
|
|
176
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
177
177
|
tags: ["config", "read"],
|
|
178
178
|
examples: [
|
|
179
179
|
{ name: "Get audio config", description: "Read audio category", arguments: { category: "Audio" } },
|
|
@@ -210,7 +210,7 @@ export const developerModule = defineToolModule({
|
|
|
210
210
|
description: "Set a configuration value within a category.",
|
|
211
211
|
summary: "Writes a primitive value to a specific configuration item via firmware APIs.",
|
|
212
212
|
inputSchema: configSetArgsSchema.jsonSchema,
|
|
213
|
-
relatedResources: ["c64://
|
|
213
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
214
214
|
tags: ["config", "write"],
|
|
215
215
|
examples: [
|
|
216
216
|
{ name: "Set volume", description: "Adjust audio volume", arguments: { category: "Audio", item: "Volume", value: 75 } },
|
|
@@ -254,7 +254,7 @@ export const developerModule = defineToolModule({
|
|
|
254
254
|
description: "Apply multiple configuration changes in a single request.",
|
|
255
255
|
summary: "Sends a nested object of category/item values to the firmware batch endpoint.",
|
|
256
256
|
inputSchema: configBatchSchema.jsonSchema,
|
|
257
|
-
relatedResources: ["c64://
|
|
257
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
258
258
|
tags: ["config", "write"],
|
|
259
259
|
examples: [
|
|
260
260
|
{ name: "Batch update", description: "Update multiple settings", arguments: { Audio: { Volume: 80, DACMode: "stereo" } } },
|
|
@@ -298,7 +298,7 @@ export const developerModule = defineToolModule({
|
|
|
298
298
|
description: "Load configuration settings from flash storage.",
|
|
299
299
|
summary: "Restores the firmware configuration by reading the persisted flash snapshot.",
|
|
300
300
|
inputSchema: noArgsSchema.jsonSchema,
|
|
301
|
-
relatedResources: ["c64://
|
|
301
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
302
302
|
tags: ["config", "flash"],
|
|
303
303
|
examples: [
|
|
304
304
|
{ name: "Load from flash", description: "Restore saved configuration", arguments: {} },
|
|
@@ -334,7 +334,7 @@ export const developerModule = defineToolModule({
|
|
|
334
334
|
description: "Persist current configuration settings to flash storage.",
|
|
335
335
|
summary: "Saves the active configuration snapshot so it survives power cycles.",
|
|
336
336
|
inputSchema: noArgsSchema.jsonSchema,
|
|
337
|
-
relatedResources: ["c64://
|
|
337
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
338
338
|
tags: ["config", "flash"],
|
|
339
339
|
examples: [
|
|
340
340
|
{ name: "Save to flash", description: "Persist current config", arguments: {} },
|
|
@@ -370,7 +370,7 @@ export const developerModule = defineToolModule({
|
|
|
370
370
|
description: "Reset configuration categories to their factory defaults.",
|
|
371
371
|
summary: "Instructs the firmware to discard overrides and restore default configuration values.",
|
|
372
372
|
inputSchema: noArgsSchema.jsonSchema,
|
|
373
|
-
relatedResources: ["c64://
|
|
373
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
374
374
|
tags: ["config", "reset"],
|
|
375
375
|
examples: [
|
|
376
376
|
{ name: "Reset config", description: "Restore factory defaults", arguments: {} },
|
|
@@ -407,7 +407,7 @@ export const developerModule = defineToolModule({
|
|
|
407
407
|
summary: "Calls the firmware version endpoint (Ultimate) or returns emulator info (VICE).",
|
|
408
408
|
supportedPlatforms: ["c64u", "vice"],
|
|
409
409
|
inputSchema: noArgsSchema.jsonSchema,
|
|
410
|
-
relatedResources: ["c64://
|
|
410
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
411
411
|
tags: ["diagnostics", "version"],
|
|
412
412
|
examples: [
|
|
413
413
|
{ name: "Get version", description: "Check firmware version", arguments: {} },
|
|
@@ -439,7 +439,7 @@ export const developerModule = defineToolModule({
|
|
|
439
439
|
summary: "Returns the diagnostics payload reported by the firmware (Ultimate) or emulator (VICE).",
|
|
440
440
|
supportedPlatforms: ["c64u", "vice"],
|
|
441
441
|
inputSchema: noArgsSchema.jsonSchema,
|
|
442
|
-
relatedResources: ["c64://
|
|
442
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
443
443
|
tags: ["diagnostics", "info"],
|
|
444
444
|
examples: [
|
|
445
445
|
{ name: "Get hardware info", description: "Query hardware status", arguments: {} },
|
|
@@ -470,7 +470,7 @@ export const developerModule = defineToolModule({
|
|
|
470
470
|
description: "Read the Ultimate debug register ($D7FF).",
|
|
471
471
|
summary: "Returns the current hex value stored in the debug register.",
|
|
472
472
|
inputSchema: noArgsSchema.jsonSchema,
|
|
473
|
-
relatedResources: ["c64://
|
|
473
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
474
474
|
tags: ["debug"],
|
|
475
475
|
examples: [
|
|
476
476
|
{ name: "Read debug register", description: "Check $D7FF value", arguments: {} },
|
|
@@ -509,7 +509,7 @@ export const developerModule = defineToolModule({
|
|
|
509
509
|
description: "Write a value into the Ultimate debug register ($D7FF).",
|
|
510
510
|
summary: "Validates the hex input and forwards it to the firmware.",
|
|
511
511
|
inputSchema: debugWriteArgsSchema.jsonSchema,
|
|
512
|
-
relatedResources: ["c64://
|
|
512
|
+
relatedResources: ["c64://guide/bootstrap"],
|
|
513
513
|
tags: ["debug"],
|
|
514
514
|
examples: [
|
|
515
515
|
{ name: "Write debug register", description: "Set $D7FF to $42", arguments: { value: "42" } },
|