mcp-server-return-to-dark-tower 1.0.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.
- package/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +729 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +250 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +228 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/audio.d.ts +4 -0
- package/dist/tools/audio.d.ts.map +1 -0
- package/dist/tools/audio.js +59 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/connection.d.ts +4 -0
- package/dist/tools/connection.d.ts.map +1 -0
- package/dist/tools/connection.js +111 -0
- package/dist/tools/connection.js.map +1 -0
- package/dist/tools/drums.d.ts +4 -0
- package/dist/tools/drums.d.ts.map +1 -0
- package/dist/tools/drums.js +70 -0
- package/dist/tools/drums.js.map +1 -0
- package/dist/tools/lights.d.ts +4 -0
- package/dist/tools/lights.d.ts.map +1 -0
- package/dist/tools/lights.js +86 -0
- package/dist/tools/lights.js.map +1 -0
- package/dist/tools/seals.d.ts +4 -0
- package/dist/tools/seals.d.ts.map +1 -0
- package/dist/tools/seals.js +60 -0
- package/dist/tools/seals.js.map +1 -0
- package/dist/tools/state.d.ts +4 -0
- package/dist/tools/state.d.ts.map +1 -0
- package/dist/tools/state.js +64 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tower-controller.d.ts +87 -0
- package/dist/tower-controller.d.ts.map +1 -0
- package/dist/tower-controller.js +355 -0
- package/dist/tower-controller.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +29 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/lookups.d.ts +14 -0
- package/dist/utils/lookups.d.ts.map +1 -0
- package/dist/utils/lookups.js +33 -0
- package/dist/utils/lookups.js.map +1 -0
- package/dist/utils/schemas.d.ts +165 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +70 -0
- package/dist/utils/schemas.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/tools/audio.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAS1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAmFlF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
3
|
+
import { SoundIndexSchema, StatefulVolumeSchema } from "../utils/schemas.js";
|
|
4
|
+
import { soundNameToIndex, soundCategoryIndex, getAudioLibrary, getSoundCategories, } from "../utils/lookups.js";
|
|
5
|
+
export function registerAudioTools(server, tower) {
|
|
6
|
+
server.registerTool("tower_play_sound", {
|
|
7
|
+
title: "Play Sound",
|
|
8
|
+
description: "Play a sound from the tower audio library by index number (1-113). Volume is 0 (loudest) to 3 (soft).",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
soundIndex: SoundIndexSchema,
|
|
11
|
+
loop: z.boolean().optional().describe("Loop the sound continuously"),
|
|
12
|
+
volume: StatefulVolumeSchema.optional().describe("Volume level: 0=Loud, 1=Medium, 2=Quiet, 3=Soft"),
|
|
13
|
+
},
|
|
14
|
+
}, (args) => wrapToolHandler(async () => {
|
|
15
|
+
await tower.playSoundStateful(args.soundIndex, args.loop, args.volume);
|
|
16
|
+
return `Playing sound ${args.soundIndex}`;
|
|
17
|
+
}));
|
|
18
|
+
server.registerTool("tower_play_sound_by_name", {
|
|
19
|
+
title: "Play Sound by Name",
|
|
20
|
+
description: "Play a sound by name (e.g. 'Ashstrider', 'Battle Start'). Case-insensitive lookup.",
|
|
21
|
+
inputSchema: {
|
|
22
|
+
name: z.string().describe("Sound name from the audio library"),
|
|
23
|
+
loop: z.boolean().optional().describe("Loop the sound continuously"),
|
|
24
|
+
volume: StatefulVolumeSchema.optional().describe("Volume level: 0=Loud, 1=Medium, 2=Quiet, 3=Soft"),
|
|
25
|
+
},
|
|
26
|
+
}, (args) => wrapToolHandler(async () => {
|
|
27
|
+
const index = soundNameToIndex.get(args.name.toLowerCase());
|
|
28
|
+
if (index === undefined) {
|
|
29
|
+
const categories = getSoundCategories();
|
|
30
|
+
throw new Error(`Sound "${args.name}" not found. Use tower_list_sounds to see available sounds. Categories: ${categories.join(", ")}`);
|
|
31
|
+
}
|
|
32
|
+
await tower.playSoundStateful(index, args.loop, args.volume);
|
|
33
|
+
return `Playing sound "${args.name}" (index ${index})`;
|
|
34
|
+
}));
|
|
35
|
+
server.registerTool("tower_list_sounds", {
|
|
36
|
+
title: "List Sounds",
|
|
37
|
+
description: "List all available sounds from the tower audio library, optionally filtered by category",
|
|
38
|
+
inputSchema: {
|
|
39
|
+
category: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Filter by category: Adversary, Ally, Battle, Classic, Unlisted, Dungeon, Foe, Spawn, Quest, Glyph, State, Seals"),
|
|
43
|
+
},
|
|
44
|
+
}, (args) => wrapToolHandler(async () => {
|
|
45
|
+
if (args.category) {
|
|
46
|
+
const sounds = soundCategoryIndex.get(args.category);
|
|
47
|
+
if (!sounds) {
|
|
48
|
+
const categories = getSoundCategories();
|
|
49
|
+
throw new Error(`Category "${args.category}" not found. Available: ${categories.join(", ")}`);
|
|
50
|
+
}
|
|
51
|
+
return { category: args.category, sounds };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
categories: getSoundCategories(),
|
|
55
|
+
sounds: getAudioLibrary(),
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/tools/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,KAAsB;IAC1E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,uGAAuG;QACzG,WAAW,EAAE;YACX,UAAU,EAAE,gBAAgB;YAC5B,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC9C,iDAAiD,CAClD;SACF;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,iBAAiB,IAAI,CAAC,UAAU,EAAE,CAAC;IAC5C,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,oFAAoF;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC9D,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC9C,iDAAiD,CAClD;SACF;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,CAAC,IAAI,2EAA2E,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtH,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO,kBAAkB,IAAI,CAAC,IAAI,YAAY,KAAK,GAAG,CAAC;IACzD,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,yFAAyF;QAC3F,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,iHAAiH,CAClH;SACJ;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,CAAC,QAAQ,2BAA2B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO;YACL,UAAU,EAAE,kBAAkB,EAAE;YAChC,MAAM,EAAE,eAAe,EAAE;SAC1B,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { TowerController } from "../tower-controller.js";
|
|
3
|
+
export declare function registerConnectionTools(server: McpServer, tower: TowerController): void;
|
|
4
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAE1E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAkKvF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { BluetoothConnectionError } from "ultimatedarktower";
|
|
3
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
4
|
+
export function registerConnectionTools(server, tower) {
|
|
5
|
+
server.registerTool("tower_connect", {
|
|
6
|
+
title: "Connect to Tower",
|
|
7
|
+
description: "Connect to the Return to Dark Tower via Bluetooth LE",
|
|
8
|
+
}, () => wrapToolHandler(async () => {
|
|
9
|
+
await tower.connect();
|
|
10
|
+
// Verify the tower is actually connected and responsive; if not, surface an error
|
|
11
|
+
const responsive = await tower.isConnectedAndResponsive();
|
|
12
|
+
if (!tower.isConnected || !responsive) {
|
|
13
|
+
throw new Error("Failed to connect: tower is not responding");
|
|
14
|
+
}
|
|
15
|
+
return "Connected to tower successfully";
|
|
16
|
+
}));
|
|
17
|
+
server.registerTool("tower_disconnect", {
|
|
18
|
+
title: "Disconnect from Tower",
|
|
19
|
+
description: "Disconnect from the Return to Dark Tower",
|
|
20
|
+
}, () => wrapToolHandler(async () => {
|
|
21
|
+
// If we were never connected, return a clear informative result rather than
|
|
22
|
+
// claiming success. Otherwise attempt disconnect and verify.
|
|
23
|
+
if (!tower.isConnected) {
|
|
24
|
+
return "Tower was not previously connected";
|
|
25
|
+
}
|
|
26
|
+
await tower.disconnect();
|
|
27
|
+
const responsive = await tower.isConnectedAndResponsive();
|
|
28
|
+
if (tower.isConnected || responsive) {
|
|
29
|
+
throw new Error("Failed to disconnect: tower still appears connected");
|
|
30
|
+
}
|
|
31
|
+
return "Disconnected from tower";
|
|
32
|
+
}));
|
|
33
|
+
server.registerTool("tower_calibrate", {
|
|
34
|
+
title: "Calibrate Tower",
|
|
35
|
+
description: "Calibrate the tower drums. Must be connected first. The tower will rotate all drums to their home positions.",
|
|
36
|
+
}, () => wrapToolHandler(async () => {
|
|
37
|
+
await tower.calibrate();
|
|
38
|
+
return "Tower calibrated successfully";
|
|
39
|
+
}));
|
|
40
|
+
server.registerTool("tower_status", {
|
|
41
|
+
title: "Tower Status",
|
|
42
|
+
description: "Get the current tower connection status, calibration state, and battery info",
|
|
43
|
+
}, () => wrapToolHandler(async () => {
|
|
44
|
+
const status = tower.getConnectionStatus();
|
|
45
|
+
return {
|
|
46
|
+
connected: tower.isConnected,
|
|
47
|
+
calibrated: tower.isCalibrated,
|
|
48
|
+
performingLongCommand: tower.performingLongCommand,
|
|
49
|
+
performingCalibration: tower.performingCalibration,
|
|
50
|
+
connectionStatus: status,
|
|
51
|
+
};
|
|
52
|
+
}));
|
|
53
|
+
server.registerTool("tower_device_info", {
|
|
54
|
+
title: "Tower Device Info",
|
|
55
|
+
description: "Get device information: manufacturer, model, firmware/hardware revision, serial number",
|
|
56
|
+
}, () => wrapToolHandler(async () => {
|
|
57
|
+
if (!tower.isConnected) {
|
|
58
|
+
throw new BluetoothConnectionError("Tower is not connected. Call tower_connect first.");
|
|
59
|
+
}
|
|
60
|
+
const info = tower.getDeviceInformation();
|
|
61
|
+
return info;
|
|
62
|
+
}));
|
|
63
|
+
server.registerTool("tower_is_responsive", {
|
|
64
|
+
title: "Check Tower Responsive",
|
|
65
|
+
description: "Active connectivity check — verifies the tower is connected and responding",
|
|
66
|
+
}, () => wrapToolHandler(async () => {
|
|
67
|
+
const responsive = await tower.isConnectedAndResponsive();
|
|
68
|
+
return { responsive };
|
|
69
|
+
}));
|
|
70
|
+
server.registerTool("tower_reconnect", {
|
|
71
|
+
title: "Reconnect to Tower",
|
|
72
|
+
description: "Clean up, reconnect, and recalibrate the tower in one step. Use this when tower_is_responsive returns false or the tower stops responding after going idle.",
|
|
73
|
+
}, () => wrapToolHandler(async () => {
|
|
74
|
+
await tower.cleanup();
|
|
75
|
+
await tower.connect();
|
|
76
|
+
const responsive = await tower.isConnectedAndResponsive();
|
|
77
|
+
if (!tower.isConnected || !responsive) {
|
|
78
|
+
throw new Error("Failed to reconnect: tower is not responding after reconnect attempt");
|
|
79
|
+
}
|
|
80
|
+
await tower.calibrate();
|
|
81
|
+
return "Tower reconnected and recalibrated successfully";
|
|
82
|
+
}));
|
|
83
|
+
server.registerTool("tower_set_connection_monitoring", {
|
|
84
|
+
title: "Set Connection Monitoring",
|
|
85
|
+
description: "Enable or disable connection monitoring with optional frequency and timeout",
|
|
86
|
+
inputSchema: {
|
|
87
|
+
enabled: z.boolean().describe("Enable or disable connection monitoring"),
|
|
88
|
+
frequency: z.number().int().optional().describe("Monitoring frequency in milliseconds"),
|
|
89
|
+
timeout: z.number().int().optional().describe("Connection timeout in milliseconds"),
|
|
90
|
+
},
|
|
91
|
+
}, (args) => wrapToolHandler(async () => {
|
|
92
|
+
tower.setConnectionMonitoring(args.enabled);
|
|
93
|
+
if (args.frequency !== undefined || args.timeout !== undefined) {
|
|
94
|
+
tower.configureConnectionMonitoring(args.frequency, args.timeout);
|
|
95
|
+
}
|
|
96
|
+
return { enabled: args.enabled, frequency: args.frequency, timeout: args.timeout };
|
|
97
|
+
}));
|
|
98
|
+
server.registerTool("tower_set_battery_monitoring", {
|
|
99
|
+
title: "Set Battery Monitoring",
|
|
100
|
+
description: "Configure battery heartbeat monitoring",
|
|
101
|
+
inputSchema: {
|
|
102
|
+
enabled: z.boolean().optional().describe("Enable or disable battery monitoring"),
|
|
103
|
+
timeout: z.number().int().optional().describe("Heartbeat timeout in milliseconds"),
|
|
104
|
+
verify: z.boolean().optional().describe("Verify connection on heartbeat timeout"),
|
|
105
|
+
},
|
|
106
|
+
}, (args) => wrapToolHandler(async () => {
|
|
107
|
+
tower.configureBatteryHeartbeatMonitoring(args.enabled, args.timeout, args.verify);
|
|
108
|
+
return { enabled: args.enabled, timeout: args.timeout, verify: args.verify };
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/tools/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drums.d.ts","sourceRoot":"","sources":["../../src/tools/drums.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAgB1E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAoFjF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
3
|
+
import { TowerSideSchema, SoundIndexSchema } from "../utils/schemas.js";
|
|
4
|
+
const SIDE_TO_INDEX = {
|
|
5
|
+
north: 0,
|
|
6
|
+
east: 1,
|
|
7
|
+
south: 2,
|
|
8
|
+
west: 3,
|
|
9
|
+
};
|
|
10
|
+
const DRUM_TO_INDEX = {
|
|
11
|
+
top: 0,
|
|
12
|
+
middle: 1,
|
|
13
|
+
bottom: 2,
|
|
14
|
+
};
|
|
15
|
+
export function registerDrumTools(server, tower) {
|
|
16
|
+
server.registerTool("tower_rotate", {
|
|
17
|
+
title: "Rotate All Drums",
|
|
18
|
+
description: "Rotate all three drums to specified positions. Requires calibration. Optionally plays a sound.",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
top: TowerSideSchema.describe("Target position for top drum"),
|
|
21
|
+
middle: TowerSideSchema.describe("Target position for middle drum"),
|
|
22
|
+
bottom: TowerSideSchema.describe("Target position for bottom drum"),
|
|
23
|
+
soundIndex: SoundIndexSchema.optional().describe("Optional sound to play during rotation"),
|
|
24
|
+
},
|
|
25
|
+
}, (args) => wrapToolHandler(async () => {
|
|
26
|
+
await tower.rotateWithState(args.top, args.middle, args.bottom, args.soundIndex);
|
|
27
|
+
return `Drums rotated: top=${args.top}, middle=${args.middle}, bottom=${args.bottom}`;
|
|
28
|
+
}));
|
|
29
|
+
server.registerTool("tower_rotate_drum", {
|
|
30
|
+
title: "Rotate Single Drum",
|
|
31
|
+
description: "Rotate a single drum to a specified position. Requires calibration.",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
drum: z.enum(["top", "middle", "bottom"]).describe("Which drum to rotate"),
|
|
34
|
+
position: TowerSideSchema.describe("Target position for the drum"),
|
|
35
|
+
playSound: z.boolean().optional().describe("Play sound during rotation (default: true)"),
|
|
36
|
+
},
|
|
37
|
+
}, (args) => wrapToolHandler(async () => {
|
|
38
|
+
const drumIndex = DRUM_TO_INDEX[args.drum];
|
|
39
|
+
const posIndex = SIDE_TO_INDEX[args.position];
|
|
40
|
+
await tower.rotateDrumStateful(drumIndex, posIndex, args.playSound);
|
|
41
|
+
return `${args.drum} drum rotated to ${args.position}`;
|
|
42
|
+
}));
|
|
43
|
+
server.registerTool("tower_random_rotate", {
|
|
44
|
+
title: "Random Rotate",
|
|
45
|
+
description: "Randomly rotate drum levels. level: 0=all, 1=top, 2=middle, 3=bottom, 4=top+middle, 5=top+bottom, 6=middle+bottom",
|
|
46
|
+
inputSchema: {
|
|
47
|
+
level: z
|
|
48
|
+
.number()
|
|
49
|
+
.int()
|
|
50
|
+
.min(0)
|
|
51
|
+
.max(6)
|
|
52
|
+
.optional()
|
|
53
|
+
.describe("Which drums to rotate randomly (0=all, default)"),
|
|
54
|
+
},
|
|
55
|
+
}, (args) => wrapToolHandler(async () => {
|
|
56
|
+
await tower.randomRotateLevels(args.level);
|
|
57
|
+
return `Random rotation applied (level=${args.level ?? 0})`;
|
|
58
|
+
}));
|
|
59
|
+
server.registerTool("tower_get_drum_positions", {
|
|
60
|
+
title: "Get Drum Positions",
|
|
61
|
+
description: "Get the current position of all three drums",
|
|
62
|
+
}, () => wrapToolHandler(async () => {
|
|
63
|
+
return {
|
|
64
|
+
top: tower.getCurrentDrumPosition("top"),
|
|
65
|
+
middle: tower.getCurrentDrumPosition("middle"),
|
|
66
|
+
bottom: tower.getCurrentDrumPosition("bottom"),
|
|
67
|
+
};
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=drums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drums.js","sourceRoot":"","sources":["../../src/tools/drums.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lights.d.ts","sourceRoot":"","sources":["../../src/tools/lights.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAK1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAuHlF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
3
|
+
import { LightsSchema, LightSequenceSchema, SoundIndexSchema } from "../utils/schemas.js";
|
|
4
|
+
import { lightSequenceNameToValue } from "../utils/lookups.js";
|
|
5
|
+
import { TOWER_LIGHT_SEQUENCES } from "ultimatedarktower";
|
|
6
|
+
export function registerLightTools(server, tower) {
|
|
7
|
+
server.registerTool("tower_set_lights", {
|
|
8
|
+
title: "Set Lights",
|
|
9
|
+
description: "Control tower lights. Set doorway lights (north/south/east/west at top/middle/bottom), ledge lights (corner positions), and base lights. Effects: off, on, breathe, breatheFast, breathe50percent, flicker.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
lights: LightsSchema,
|
|
12
|
+
},
|
|
13
|
+
}, (args) => wrapToolHandler(async () => {
|
|
14
|
+
await tower.lights(args.lights);
|
|
15
|
+
return "Lights updated";
|
|
16
|
+
}));
|
|
17
|
+
server.registerTool("tower_set_led", {
|
|
18
|
+
title: "Set Individual LED",
|
|
19
|
+
description: "Set a single LED by layer and light index. Layers: 0=top ring, 1=middle ring, 2=bottom ring, 3=ledge, 4=base1, 5=base2. Light index 0-3.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
layer: z.number().int().min(0).max(5).describe("Layer index 0-5"),
|
|
22
|
+
lightIndex: z.number().int().min(0).max(3).describe("Light index 0-3 within the layer"),
|
|
23
|
+
effect: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.min(0)
|
|
27
|
+
.max(5)
|
|
28
|
+
.describe("Effect: 0=off, 1=on, 2=breathe, 3=breatheFast, 4=breathe50%, 5=flicker"),
|
|
29
|
+
loop: z.boolean().optional().describe("Loop the effect"),
|
|
30
|
+
},
|
|
31
|
+
}, (args) => wrapToolHandler(async () => {
|
|
32
|
+
await tower.setLED(args.layer, args.lightIndex, args.effect, args.loop);
|
|
33
|
+
return `LED set: layer=${args.layer}, light=${args.lightIndex}, effect=${args.effect}`;
|
|
34
|
+
}));
|
|
35
|
+
server.registerTool("tower_light_sequence", {
|
|
36
|
+
title: "Play Light Sequence",
|
|
37
|
+
description: "Play a predefined light sequence by ID (1-19). Optionally play a sound simultaneously.",
|
|
38
|
+
inputSchema: {
|
|
39
|
+
sequence: LightSequenceSchema,
|
|
40
|
+
soundIndex: SoundIndexSchema.optional().describe("Optional sound to play with sequence"),
|
|
41
|
+
},
|
|
42
|
+
}, (args) => wrapToolHandler(async () => {
|
|
43
|
+
await tower.lightOverrides(args.sequence, args.soundIndex);
|
|
44
|
+
return `Light sequence ${args.sequence} started`;
|
|
45
|
+
}));
|
|
46
|
+
server.registerTool("tower_light_sequence_by_name", {
|
|
47
|
+
title: "Play Light Sequence by Name",
|
|
48
|
+
description: "Play a predefined light sequence by name (e.g. 'victory', 'defeat', 'dungeonIdle', 'twinkle'). Case-insensitive.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
name: z.string().describe("Sequence name from TOWER_LIGHT_SEQUENCES"),
|
|
51
|
+
soundIndex: SoundIndexSchema.optional().describe("Optional sound to play with sequence"),
|
|
52
|
+
},
|
|
53
|
+
}, (args) => wrapToolHandler(async () => {
|
|
54
|
+
const value = lightSequenceNameToValue.get(args.name.toLowerCase());
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
const names = Object.keys(TOWER_LIGHT_SEQUENCES).join(", ");
|
|
57
|
+
throw new Error(`Light sequence "${args.name}" not found. Available: ${names}`);
|
|
58
|
+
}
|
|
59
|
+
await tower.lightOverrides(value, args.soundIndex);
|
|
60
|
+
return `Light sequence "${args.name}" (0x${value.toString(16).padStart(2, "0")}) started`;
|
|
61
|
+
}));
|
|
62
|
+
server.registerTool("tower_lights_on", {
|
|
63
|
+
title: "All Lights On",
|
|
64
|
+
description: "Turn on all 24 tower LEDs with a single command. Optionally specify an effect (0=off, 1=on, 2=breathe, 3=breatheFast, 4=breathe50%, 5=flicker); defaults to on.",
|
|
65
|
+
inputSchema: {
|
|
66
|
+
effect: z
|
|
67
|
+
.number()
|
|
68
|
+
.int()
|
|
69
|
+
.min(0)
|
|
70
|
+
.max(5)
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("Effect to apply to all LEDs (default: 1=on)"),
|
|
73
|
+
},
|
|
74
|
+
}, (args) => wrapToolHandler(async () => {
|
|
75
|
+
await tower.allLightsOn(args.effect);
|
|
76
|
+
return "All lights turned on";
|
|
77
|
+
}));
|
|
78
|
+
server.registerTool("tower_lights_off", {
|
|
79
|
+
title: "All Lights Off",
|
|
80
|
+
description: "Turn off all 24 tower LEDs with a single command",
|
|
81
|
+
}, () => wrapToolHandler(async () => {
|
|
82
|
+
await tower.allLightsOff();
|
|
83
|
+
return "All lights turned off";
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=lights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lights.js","sourceRoot":"","sources":["../../src/tools/lights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seals.d.ts","sourceRoot":"","sources":["../../src/tools/seals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAG1E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAyFjF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
2
|
+
import { TowerSideSchema, TowerLevelsSchema, VolumeSchema } from "../utils/schemas.js";
|
|
3
|
+
export function registerSealTools(server, tower) {
|
|
4
|
+
server.registerTool("tower_break_seal", {
|
|
5
|
+
title: "Break Seal",
|
|
6
|
+
description: "Break a seal at the specified side and level. Plays the seal-breaking animation and sound.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
side: TowerSideSchema.describe("Side of the tower"),
|
|
9
|
+
level: TowerLevelsSchema.describe("Level of the seal"),
|
|
10
|
+
volume: VolumeSchema.optional().describe("Volume: 0=Loud, 1=Medium, 2=Quiet, 3=Mute"),
|
|
11
|
+
},
|
|
12
|
+
}, (args) => wrapToolHandler(async () => {
|
|
13
|
+
await tower.breakSeal({ side: args.side, level: args.level }, args.volume);
|
|
14
|
+
return `Seal broken at ${args.side} ${args.level}`;
|
|
15
|
+
}));
|
|
16
|
+
server.registerTool("tower_is_seal_broken", {
|
|
17
|
+
title: "Check Seal Status",
|
|
18
|
+
description: "Check if a specific seal has been broken",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
side: TowerSideSchema.describe("Side of the tower"),
|
|
21
|
+
level: TowerLevelsSchema.describe("Level of the seal"),
|
|
22
|
+
},
|
|
23
|
+
}, (args) => wrapToolHandler(async () => {
|
|
24
|
+
const broken = tower.isSealBroken({
|
|
25
|
+
side: args.side,
|
|
26
|
+
level: args.level,
|
|
27
|
+
});
|
|
28
|
+
return { side: args.side, level: args.level, broken };
|
|
29
|
+
}));
|
|
30
|
+
server.registerTool("tower_get_broken_seals", {
|
|
31
|
+
title: "Get Broken Seals",
|
|
32
|
+
description: "Get a list of all broken seals",
|
|
33
|
+
}, () => wrapToolHandler(async () => {
|
|
34
|
+
const seals = tower.getBrokenSeals();
|
|
35
|
+
return {
|
|
36
|
+
brokenSeals: seals,
|
|
37
|
+
brokenCount: seals.length,
|
|
38
|
+
totalSeals: 12,
|
|
39
|
+
unbrokenCount: 12 - seals.length,
|
|
40
|
+
};
|
|
41
|
+
}));
|
|
42
|
+
server.registerTool("tower_reset_seals", {
|
|
43
|
+
title: "Reset Seals",
|
|
44
|
+
description: "Reset all seals to unbroken state (in software tracking only)",
|
|
45
|
+
}, () => wrapToolHandler(async () => {
|
|
46
|
+
tower.resetBrokenSeals();
|
|
47
|
+
return "All seals reset to unbroken state";
|
|
48
|
+
}));
|
|
49
|
+
server.registerTool("tower_random_seal", {
|
|
50
|
+
title: "Random Unbroken Seal",
|
|
51
|
+
description: "Get a random unbroken seal location",
|
|
52
|
+
}, () => wrapToolHandler(async () => {
|
|
53
|
+
const seal = tower.getRandomUnbrokenSeal();
|
|
54
|
+
if (!seal) {
|
|
55
|
+
return "All seals are already broken";
|
|
56
|
+
}
|
|
57
|
+
return { seal };
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=seals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seals.js","sourceRoot":"","sources":["../../src/tools/seals.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEvF,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,KAAsB;IACzE,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,4FAA4F;QAC9F,WAAW,EAAE;YACX,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACnD,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACtD,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;SACtF;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,KAAK,CAAC,SAAS,CACnB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAoB,EAAE,EAClE,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,OAAO,kBAAkB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,0CAA0C;QACvD,WAAW,EAAE;YACX,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACnD,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACvD;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CACP,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,IAAiB;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAoB;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,gCAAgC;KAC9C,EACD,GAAG,EAAE,CACH,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACrC,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM;SACjC,CAAC;IACJ,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+DAA+D;KAC7E,EACD,GAAG,EAAE,CACH,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,OAAO,mCAAmC,CAAC;IAC7C,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,qCAAqC;KACnD,EACD,GAAG,EAAE,CACH,eAAe,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,8BAA8B,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/tools/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAmB,MAAM,wBAAwB,CAAC;AAG1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAsGlF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { wrapToolHandler } from "../tower-controller.js";
|
|
3
|
+
import { TowerSideSchema, GlyphSchema } from "../utils/schemas.js";
|
|
4
|
+
export function registerStateTools(server, tower) {
|
|
5
|
+
server.registerTool("tower_get_state", {
|
|
6
|
+
title: "Get Tower State",
|
|
7
|
+
description: "Get the full current tower state including drums, lights, audio, and beam sensor data",
|
|
8
|
+
}, () => wrapToolHandler(async () => {
|
|
9
|
+
const state = tower.getCurrentTowerState();
|
|
10
|
+
if (!state)
|
|
11
|
+
return "No tower state available. Connect and interact with the tower first.";
|
|
12
|
+
return state;
|
|
13
|
+
}));
|
|
14
|
+
server.registerTool("tower_send_state", {
|
|
15
|
+
title: "Send Tower State",
|
|
16
|
+
description: "Send a complete tower state to the tower. Advanced: directly sets all tower hardware state.",
|
|
17
|
+
inputSchema: {
|
|
18
|
+
state: z.any().describe("Complete TowerState object to send to the tower"),
|
|
19
|
+
},
|
|
20
|
+
}, (args) => wrapToolHandler(async () => {
|
|
21
|
+
await tower.sendTowerState(args.state);
|
|
22
|
+
return "Tower state sent successfully";
|
|
23
|
+
}));
|
|
24
|
+
server.registerTool("tower_get_glyphs", {
|
|
25
|
+
title: "Get All Glyph Positions",
|
|
26
|
+
description: "Get the current facing direction of all 5 glyphs (cleanse, quest, battle, banner, reinforce)",
|
|
27
|
+
}, () => wrapToolHandler(async () => {
|
|
28
|
+
return tower.getAllGlyphPositions();
|
|
29
|
+
}));
|
|
30
|
+
server.registerTool("tower_get_glyph", {
|
|
31
|
+
title: "Get Glyph Position",
|
|
32
|
+
description: "Get the current facing direction of a specific glyph",
|
|
33
|
+
inputSchema: {
|
|
34
|
+
glyph: GlyphSchema.describe("The glyph to look up"),
|
|
35
|
+
},
|
|
36
|
+
}, (args) => wrapToolHandler(async () => {
|
|
37
|
+
const position = tower.getGlyphPosition(args.glyph);
|
|
38
|
+
return { glyph: args.glyph, facing: position };
|
|
39
|
+
}));
|
|
40
|
+
server.registerTool("tower_glyphs_facing", {
|
|
41
|
+
title: "Glyphs Facing Direction",
|
|
42
|
+
description: "Get all glyphs currently facing a given direction",
|
|
43
|
+
inputSchema: {
|
|
44
|
+
direction: TowerSideSchema.describe("The direction to check"),
|
|
45
|
+
},
|
|
46
|
+
}, (args) => wrapToolHandler(async () => {
|
|
47
|
+
const glyphs = tower.getGlyphsFacingDirection(args.direction);
|
|
48
|
+
return { direction: args.direction, glyphs };
|
|
49
|
+
}));
|
|
50
|
+
server.registerTool("tower_skull_count", {
|
|
51
|
+
title: "Skull Drop Count",
|
|
52
|
+
description: "Get the cumulative number of skulls that have dropped into the tower",
|
|
53
|
+
}, () => wrapToolHandler(async () => {
|
|
54
|
+
return { skullCount: tower.towerSkullDropCount };
|
|
55
|
+
}));
|
|
56
|
+
server.registerTool("tower_reset_skull_count", {
|
|
57
|
+
title: "Reset Skull Count",
|
|
58
|
+
description: "Reset the skull drop counter to zero",
|
|
59
|
+
}, () => wrapToolHandler(async () => {
|
|
60
|
+
await tower.resetTowerSkullCount();
|
|
61
|
+
return "Skull count reset to 0";
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tools/state.ts"],"names":[],"mappings":"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"}
|