@mythxengine/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/assemble.test.d.ts +2 -0
  3. package/dist/__tests__/assemble.test.d.ts.map +1 -0
  4. package/dist/__tests__/assemble.test.js +81 -0
  5. package/dist/__tests__/assemble.test.js.map +1 -0
  6. package/dist/index.d.ts +10 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +38 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/resources/index.d.ts +9 -0
  11. package/dist/resources/index.d.ts.map +1 -0
  12. package/dist/resources/index.js +202 -0
  13. package/dist/resources/index.js.map +1 -0
  14. package/dist/server.d.ts +41 -0
  15. package/dist/server.d.ts.map +1 -0
  16. package/dist/server.js +91 -0
  17. package/dist/server.js.map +1 -0
  18. package/dist/state/manager.d.ts +88 -0
  19. package/dist/state/manager.d.ts.map +1 -0
  20. package/dist/state/manager.js +308 -0
  21. package/dist/state/manager.js.map +1 -0
  22. package/dist/state/rules.d.ts +30 -0
  23. package/dist/state/rules.d.ts.map +1 -0
  24. package/dist/state/rules.js +61 -0
  25. package/dist/state/rules.js.map +1 -0
  26. package/dist/state/worldpacks.d.ts +43 -0
  27. package/dist/state/worldpacks.d.ts.map +1 -0
  28. package/dist/state/worldpacks.js +125 -0
  29. package/dist/state/worldpacks.js.map +1 -0
  30. package/dist/tools/augmentation/augment.d.ts +15 -0
  31. package/dist/tools/augmentation/augment.d.ts.map +1 -0
  32. package/dist/tools/augmentation/augment.js +512 -0
  33. package/dist/tools/augmentation/augment.js.map +1 -0
  34. package/dist/tools/augmentation/index.d.ts +6 -0
  35. package/dist/tools/augmentation/index.d.ts.map +1 -0
  36. package/dist/tools/augmentation/index.js +7 -0
  37. package/dist/tools/augmentation/index.js.map +1 -0
  38. package/dist/tools/characters.d.ts +26 -0
  39. package/dist/tools/characters.d.ts.map +1 -0
  40. package/dist/tools/characters.js +362 -0
  41. package/dist/tools/characters.js.map +1 -0
  42. package/dist/tools/clocks.d.ts +33 -0
  43. package/dist/tools/clocks.d.ts.map +1 -0
  44. package/dist/tools/clocks.js +438 -0
  45. package/dist/tools/clocks.js.map +1 -0
  46. package/dist/tools/combat.d.ts +38 -0
  47. package/dist/tools/combat.d.ts.map +1 -0
  48. package/dist/tools/combat.js +574 -0
  49. package/dist/tools/combat.js.map +1 -0
  50. package/dist/tools/dice.d.ts +9 -0
  51. package/dist/tools/dice.d.ts.map +1 -0
  52. package/dist/tools/dice.js +287 -0
  53. package/dist/tools/dice.js.map +1 -0
  54. package/dist/tools/encounters.d.ts +21 -0
  55. package/dist/tools/encounters.d.ts.map +1 -0
  56. package/dist/tools/encounters.js +521 -0
  57. package/dist/tools/encounters.js.map +1 -0
  58. package/dist/tools/engagement.d.ts +25 -0
  59. package/dist/tools/engagement.d.ts.map +1 -0
  60. package/dist/tools/engagement.js +491 -0
  61. package/dist/tools/engagement.js.map +1 -0
  62. package/dist/tools/expansion/archetype.d.ts +12 -0
  63. package/dist/tools/expansion/archetype.d.ts.map +1 -0
  64. package/dist/tools/expansion/archetype.js +157 -0
  65. package/dist/tools/expansion/archetype.js.map +1 -0
  66. package/dist/tools/expansion/index.d.ts +12 -0
  67. package/dist/tools/expansion/index.d.ts.map +1 -0
  68. package/dist/tools/expansion/index.js +21 -0
  69. package/dist/tools/expansion/index.js.map +1 -0
  70. package/dist/tools/expansion/location.d.ts +12 -0
  71. package/dist/tools/expansion/location.d.ts.map +1 -0
  72. package/dist/tools/expansion/location.js +149 -0
  73. package/dist/tools/expansion/location.js.map +1 -0
  74. package/dist/tools/expansion/monster.d.ts +12 -0
  75. package/dist/tools/expansion/monster.d.ts.map +1 -0
  76. package/dist/tools/expansion/monster.js +157 -0
  77. package/dist/tools/expansion/monster.js.map +1 -0
  78. package/dist/tools/expansion/npc.d.ts +12 -0
  79. package/dist/tools/expansion/npc.d.ts.map +1 -0
  80. package/dist/tools/expansion/npc.js +153 -0
  81. package/dist/tools/expansion/npc.js.map +1 -0
  82. package/dist/tools/generation/archetypes.d.ts +12 -0
  83. package/dist/tools/generation/archetypes.d.ts.map +1 -0
  84. package/dist/tools/generation/archetypes.js +129 -0
  85. package/dist/tools/generation/archetypes.js.map +1 -0
  86. package/dist/tools/generation/arcs.d.ts +13 -0
  87. package/dist/tools/generation/arcs.d.ts.map +1 -0
  88. package/dist/tools/generation/arcs.js +186 -0
  89. package/dist/tools/generation/arcs.js.map +1 -0
  90. package/dist/tools/generation/encounters.d.ts +12 -0
  91. package/dist/tools/generation/encounters.d.ts.map +1 -0
  92. package/dist/tools/generation/encounters.js +169 -0
  93. package/dist/tools/generation/encounters.js.map +1 -0
  94. package/dist/tools/generation/index.d.ts +19 -0
  95. package/dist/tools/generation/index.d.ts.map +1 -0
  96. package/dist/tools/generation/index.js +42 -0
  97. package/dist/tools/generation/index.js.map +1 -0
  98. package/dist/tools/generation/items.d.ts +12 -0
  99. package/dist/tools/generation/items.d.ts.map +1 -0
  100. package/dist/tools/generation/items.js +149 -0
  101. package/dist/tools/generation/items.js.map +1 -0
  102. package/dist/tools/generation/locations.d.ts +12 -0
  103. package/dist/tools/generation/locations.d.ts.map +1 -0
  104. package/dist/tools/generation/locations.js +131 -0
  105. package/dist/tools/generation/locations.js.map +1 -0
  106. package/dist/tools/generation/monsters.d.ts +12 -0
  107. package/dist/tools/generation/monsters.d.ts.map +1 -0
  108. package/dist/tools/generation/monsters.js +154 -0
  109. package/dist/tools/generation/monsters.js.map +1 -0
  110. package/dist/tools/generation/narrative.d.ts +12 -0
  111. package/dist/tools/generation/narrative.d.ts.map +1 -0
  112. package/dist/tools/generation/narrative.js +129 -0
  113. package/dist/tools/generation/narrative.js.map +1 -0
  114. package/dist/tools/generation/npcs.d.ts +12 -0
  115. package/dist/tools/generation/npcs.d.ts.map +1 -0
  116. package/dist/tools/generation/npcs.js +136 -0
  117. package/dist/tools/generation/npcs.js.map +1 -0
  118. package/dist/tools/generation/resume.d.ts +12 -0
  119. package/dist/tools/generation/resume.d.ts.map +1 -0
  120. package/dist/tools/generation/resume.js +288 -0
  121. package/dist/tools/generation/resume.js.map +1 -0
  122. package/dist/tools/generation/rules-prompt.d.ts +23 -0
  123. package/dist/tools/generation/rules-prompt.d.ts.map +1 -0
  124. package/dist/tools/generation/rules-prompt.js +209 -0
  125. package/dist/tools/generation/rules-prompt.js.map +1 -0
  126. package/dist/tools/generation/seed.d.ts +12 -0
  127. package/dist/tools/generation/seed.d.ts.map +1 -0
  128. package/dist/tools/generation/seed.js +171 -0
  129. package/dist/tools/generation/seed.js.map +1 -0
  130. package/dist/tools/generation/situations.d.ts +13 -0
  131. package/dist/tools/generation/situations.d.ts.map +1 -0
  132. package/dist/tools/generation/situations.js +247 -0
  133. package/dist/tools/generation/situations.js.map +1 -0
  134. package/dist/tools/gm-guidance.d.ts +13 -0
  135. package/dist/tools/gm-guidance.d.ts.map +1 -0
  136. package/dist/tools/gm-guidance.js +395 -0
  137. package/dist/tools/gm-guidance.js.map +1 -0
  138. package/dist/tools/index.d.ts +33 -0
  139. package/dist/tools/index.d.ts.map +1 -0
  140. package/dist/tools/index.js +80 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/investigation.d.ts +41 -0
  143. package/dist/tools/investigation.d.ts.map +1 -0
  144. package/dist/tools/investigation.js +586 -0
  145. package/dist/tools/investigation.js.map +1 -0
  146. package/dist/tools/leads.d.ts +29 -0
  147. package/dist/tools/leads.d.ts.map +1 -0
  148. package/dist/tools/leads.js +460 -0
  149. package/dist/tools/leads.js.map +1 -0
  150. package/dist/tools/players.d.ts +30 -0
  151. package/dist/tools/players.d.ts.map +1 -0
  152. package/dist/tools/players.js +448 -0
  153. package/dist/tools/players.js.map +1 -0
  154. package/dist/tools/portable-clues.d.ts +29 -0
  155. package/dist/tools/portable-clues.d.ts.map +1 -0
  156. package/dist/tools/portable-clues.js +490 -0
  157. package/dist/tools/portable-clues.js.map +1 -0
  158. package/dist/tools/relationships.d.ts +29 -0
  159. package/dist/tools/relationships.d.ts.map +1 -0
  160. package/dist/tools/relationships.js +471 -0
  161. package/dist/tools/relationships.js.map +1 -0
  162. package/dist/tools/scene-framing.d.ts +21 -0
  163. package/dist/tools/scene-framing.d.ts.map +1 -0
  164. package/dist/tools/scene-framing.js +380 -0
  165. package/dist/tools/scene-framing.js.map +1 -0
  166. package/dist/tools/sessions.d.ts +30 -0
  167. package/dist/tools/sessions.d.ts.map +1 -0
  168. package/dist/tools/sessions.js +253 -0
  169. package/dist/tools/sessions.js.map +1 -0
  170. package/dist/tools/time.d.ts +26 -0
  171. package/dist/tools/time.d.ts.map +1 -0
  172. package/dist/tools/time.js +438 -0
  173. package/dist/tools/time.js.map +1 -0
  174. package/dist/tools/turns.d.ts +38 -0
  175. package/dist/tools/turns.d.ts.map +1 -0
  176. package/dist/tools/turns.js +560 -0
  177. package/dist/tools/turns.js.map +1 -0
  178. package/dist/tools/worldpack/assemble.d.ts +20 -0
  179. package/dist/tools/worldpack/assemble.d.ts.map +1 -0
  180. package/dist/tools/worldpack/assemble.js +237 -0
  181. package/dist/tools/worldpack/assemble.js.map +1 -0
  182. package/dist/tools/worldpack/docs-generator.d.ts +18 -0
  183. package/dist/tools/worldpack/docs-generator.d.ts.map +1 -0
  184. package/dist/tools/worldpack/docs-generator.js +264 -0
  185. package/dist/tools/worldpack/docs-generator.js.map +1 -0
  186. package/dist/tools/worldpack/export.d.ts +12 -0
  187. package/dist/tools/worldpack/export.d.ts.map +1 -0
  188. package/dist/tools/worldpack/export.js +209 -0
  189. package/dist/tools/worldpack/export.js.map +1 -0
  190. package/dist/tools/worldpack/index.d.ts +15 -0
  191. package/dist/tools/worldpack/index.d.ts.map +1 -0
  192. package/dist/tools/worldpack/index.js +30 -0
  193. package/dist/tools/worldpack/index.js.map +1 -0
  194. package/dist/tools/worldpack/lookup.d.ts +19 -0
  195. package/dist/tools/worldpack/lookup.d.ts.map +1 -0
  196. package/dist/tools/worldpack/lookup.js +320 -0
  197. package/dist/tools/worldpack/lookup.js.map +1 -0
  198. package/dist/tools/worldpack/manage.d.ts +20 -0
  199. package/dist/tools/worldpack/manage.d.ts.map +1 -0
  200. package/dist/tools/worldpack/manage.js +101 -0
  201. package/dist/tools/worldpack/manage.js.map +1 -0
  202. package/dist/tools/worldpack/save-result.d.ts +12 -0
  203. package/dist/tools/worldpack/save-result.d.ts.map +1 -0
  204. package/dist/tools/worldpack/save-result.js +222 -0
  205. package/dist/tools/worldpack/save-result.js.map +1 -0
  206. package/dist/tools/worldpack/summary.d.ts +13 -0
  207. package/dist/tools/worldpack/summary.d.ts.map +1 -0
  208. package/dist/tools/worldpack/summary.js +180 -0
  209. package/dist/tools/worldpack/summary.js.map +1 -0
  210. package/dist/tools/worldpack/validate.d.ts +12 -0
  211. package/dist/tools/worldpack/validate.d.ts.map +1 -0
  212. package/dist/tools/worldpack/validate.js +388 -0
  213. package/dist/tools/worldpack/validate.js.map +1 -0
  214. package/package.json +59 -0
@@ -0,0 +1,574 @@
1
+ /**
2
+ * Combat tools - combat tracker and resolution
3
+ */
4
+ import { z } from "zod";
5
+ import { createRNG, rollInitiativeDetailed, resolveAttack } from "@mythxengine/engine";
6
+ import { advanceGameTime, createInitialGameTime } from "@mythxengine/types";
7
+ import { sessionManager } from "../state/manager.js";
8
+ import { getRulesForSession } from "../state/rules.js";
9
+ // Input schemas
10
+ const StartCombatInput = z.object({
11
+ sessionId: z.string(),
12
+ characterIds: z.array(z.string()),
13
+ enemyIds: z.array(z.string()),
14
+ });
15
+ const RollInitiativeInput = z.object({
16
+ sessionId: z.string(),
17
+ });
18
+ const AttackInput = z.object({
19
+ sessionId: z.string(),
20
+ attackerId: z.string(),
21
+ defenderId: z.string(),
22
+ weaponIndex: z.number().optional().default(0),
23
+ advantageSources: z.array(z.string()).optional().describe("Sources granting advantage (e.g., 'flanking', 'high ground')"),
24
+ disadvantageSources: z.array(z.string()).optional().describe("Sources granting disadvantage (e.g., 'darkness', 'cover')"),
25
+ damageType: z.string().optional().default("physical").describe("Damage type for resistance/vulnerability calculation"),
26
+ });
27
+ const ApplyDamageInput = z.object({
28
+ sessionId: z.string(),
29
+ targetId: z.string(),
30
+ amount: z.number(),
31
+ });
32
+ // Effect schema for conditions
33
+ const EffectSchema = z.discriminatedUnion("type", [
34
+ z.object({ type: z.literal("MODIFY_ABILITY"), ability: z.enum(["STR", "AGI", "WIT", "CON"]), amount: z.number() }),
35
+ z.object({ type: z.literal("MODIFY_SKILL"), skillId: z.string(), amount: z.number() }),
36
+ z.object({ type: z.literal("MODIFY_HP"), amount: z.number() }),
37
+ z.object({ type: z.literal("MODIFY_DEFENSE"), amount: z.number() }),
38
+ z.object({ type: z.literal("GRANT_ADVANTAGE"), scope: z.enum(["attacks", "defense", "skill_tests", "all"]), skills: z.array(z.string()).optional() }),
39
+ z.object({ type: z.literal("GRANT_DISADVANTAGE"), scope: z.enum(["attacks", "defense", "skill_tests", "all"]), skills: z.array(z.string()).optional() }),
40
+ z.object({ type: z.literal("RESISTANCE"), damageType: z.string(), multiplier: z.number().optional() }),
41
+ z.object({ type: z.literal("VULNERABILITY"), damageType: z.string(), multiplier: z.number().optional() }),
42
+ ]);
43
+ const AddConditionInput = z.object({
44
+ sessionId: z.string(),
45
+ targetId: z.string(),
46
+ condition: z.object({
47
+ id: z.string(),
48
+ name: z.string(),
49
+ description: z.string(),
50
+ duration: z.union([z.number(), z.literal("permanent"), z.literal("until_rest")]),
51
+ /** Optional: duration in game minutes (will set expiresAtGameTime) */
52
+ durationMinutes: z.number().min(1).optional(),
53
+ /** Optional: effects for the condition */
54
+ effects: z.array(EffectSchema).optional(),
55
+ }),
56
+ });
57
+ const NextTurnInput = z.object({
58
+ sessionId: z.string(),
59
+ });
60
+ const EndCombatInput = z.object({
61
+ sessionId: z.string(),
62
+ outcome: z.enum(["victory", "defeat", "fled"]),
63
+ });
64
+ const GetCombatStateInput = z.object({
65
+ sessionId: z.string(),
66
+ });
67
+ /**
68
+ * Helper to get a combatant by ID
69
+ */
70
+ function getCombatant(session, id) {
71
+ return session.characters[id] || session.enemies[id] || null;
72
+ }
73
+ /**
74
+ * start_combat tool
75
+ */
76
+ export const startCombatTool = {
77
+ name: "start_combat",
78
+ description: "Initialize combat with characters and enemies",
79
+ inputSchema: {
80
+ type: "object",
81
+ properties: {
82
+ sessionId: { type: "string", description: "Session ID" },
83
+ characterIds: { type: "array", items: { type: "string" }, description: "Character IDs in combat" },
84
+ enemyIds: { type: "array", items: { type: "string" }, description: "Enemy IDs in combat" },
85
+ },
86
+ required: ["sessionId", "characterIds", "enemyIds"],
87
+ },
88
+ handler: async (args) => {
89
+ const input = StartCombatInput.parse(args);
90
+ const session = await sessionManager.get(input.sessionId);
91
+ if (!session) {
92
+ throw new Error(`Session not found: ${input.sessionId}`);
93
+ }
94
+ if (session.combat?.active) {
95
+ throw new Error("Combat is already active. End current combat first.");
96
+ }
97
+ // Validate all combatants exist
98
+ const allIds = [...input.characterIds, ...input.enemyIds];
99
+ for (const id of allIds) {
100
+ if (!getCombatant(session, id)) {
101
+ throw new Error(`Combatant not found: ${id}`);
102
+ }
103
+ }
104
+ // Initialize combat state
105
+ session.combat = {
106
+ active: true,
107
+ round: 0,
108
+ turnOrder: allIds, // Will be set properly when initiative is rolled
109
+ currentTurnId: "",
110
+ turnIndex: -1,
111
+ };
112
+ await sessionManager.save(session);
113
+ return {
114
+ message: "Combat started",
115
+ combatants: {
116
+ characters: input.characterIds,
117
+ enemies: input.enemyIds,
118
+ },
119
+ hint: "Use roll_initiative to determine turn order",
120
+ };
121
+ },
122
+ };
123
+ /**
124
+ * roll_initiative tool
125
+ */
126
+ export const rollInitiativeTool = {
127
+ name: "roll_initiative",
128
+ description: "Roll initiative for all combatants and set turn order",
129
+ inputSchema: {
130
+ type: "object",
131
+ properties: {
132
+ sessionId: { type: "string", description: "Session ID" },
133
+ },
134
+ required: ["sessionId"],
135
+ },
136
+ handler: async (args) => {
137
+ const input = RollInitiativeInput.parse(args);
138
+ const session = await sessionManager.get(input.sessionId);
139
+ if (!session) {
140
+ throw new Error(`Session not found: ${input.sessionId}`);
141
+ }
142
+ if (!session.combat?.active) {
143
+ throw new Error("No active combat. Use start_combat first.");
144
+ }
145
+ // Get all combatants
146
+ const combatants = session.combat.turnOrder
147
+ .map((id) => getCombatant(session, id))
148
+ .filter((c) => c !== null);
149
+ const rng = createRNG(session.rng);
150
+ const results = rollInitiativeDetailed(combatants, rng);
151
+ // Update turn order
152
+ session.combat.turnOrder = results.map((r) => r.characterId);
153
+ session.combat.round = 1;
154
+ session.combat.turnIndex = 0;
155
+ session.combat.currentTurnId = session.combat.turnOrder[0];
156
+ // Update RNG state
157
+ session.rng = rng.getState();
158
+ await sessionManager.save(session);
159
+ return {
160
+ message: "Initiative rolled",
161
+ round: 1,
162
+ turnOrder: results.map((r) => {
163
+ const combatant = getCombatant(session, r.characterId);
164
+ return {
165
+ id: r.characterId,
166
+ name: combatant?.name ?? r.characterId,
167
+ roll: r.roll.natural,
168
+ modifier: combatant?.abilities.AGI ?? 0,
169
+ total: r.total,
170
+ };
171
+ }),
172
+ currentTurn: session.combat.currentTurnId,
173
+ };
174
+ },
175
+ };
176
+ /**
177
+ * attack tool
178
+ */
179
+ export const attackTool = {
180
+ name: "attack",
181
+ description: "Perform an attack against a target. Supports advantage/disadvantage and damage type for resistance/vulnerability.",
182
+ inputSchema: {
183
+ type: "object",
184
+ properties: {
185
+ sessionId: { type: "string", description: "Session ID" },
186
+ attackerId: { type: "string", description: "Attacking combatant ID" },
187
+ defenderId: { type: "string", description: "Defending combatant ID" },
188
+ weaponIndex: { type: "number", description: "Index of weapon to use (default 0)" },
189
+ advantageSources: {
190
+ type: "array",
191
+ items: { type: "string" },
192
+ description: "Sources granting advantage (e.g., 'flanking', 'high ground')",
193
+ },
194
+ disadvantageSources: {
195
+ type: "array",
196
+ items: { type: "string" },
197
+ description: "Sources granting disadvantage (e.g., 'darkness', 'cover')",
198
+ },
199
+ damageType: {
200
+ type: "string",
201
+ description: "Damage type for resistance/vulnerability calculation (default: 'physical')",
202
+ },
203
+ },
204
+ required: ["sessionId", "attackerId", "defenderId"],
205
+ },
206
+ handler: async (args) => {
207
+ const input = AttackInput.parse(args);
208
+ const session = await sessionManager.get(input.sessionId);
209
+ if (!session) {
210
+ throw new Error(`Session not found: ${input.sessionId}`);
211
+ }
212
+ const attacker = getCombatant(session, input.attackerId);
213
+ if (!attacker) {
214
+ throw new Error(`Attacker not found: ${input.attackerId}`);
215
+ }
216
+ const defender = getCombatant(session, input.defenderId);
217
+ if (!defender) {
218
+ throw new Error(`Defender not found: ${input.defenderId}`);
219
+ }
220
+ // Get weapon
221
+ const weapons = "attacks" in attacker ? attacker.attacks : [];
222
+ const weaponFromEquipment = "equipment" in attacker
223
+ ? attacker.equipment.weapons.map((w) => {
224
+ // Parse weapon string like "Sword (d8)"
225
+ const match = w.match(/(.+?)\s*\(([^)]+)\)/);
226
+ return {
227
+ name: match ? match[1].trim() : w,
228
+ damage: match ? match[2] : "d4",
229
+ ability: "STR",
230
+ };
231
+ })
232
+ : [];
233
+ const allWeapons = [...weapons, ...weaponFromEquipment];
234
+ const weapon = allWeapons[input.weaponIndex];
235
+ if (!weapon) {
236
+ throw new Error(`No weapon at index ${input.weaponIndex}`);
237
+ }
238
+ // Load rules context for the session (from world pack if set)
239
+ const rules = await getRulesForSession(session);
240
+ const rng = createRNG(session.rng);
241
+ const result = resolveAttack({
242
+ attacker,
243
+ defender,
244
+ weapon,
245
+ rng,
246
+ advantageSources: input.advantageSources,
247
+ disadvantageSources: input.disadvantageSources,
248
+ damageType: input.damageType,
249
+ rules,
250
+ });
251
+ // Apply damage if hit
252
+ if (result.hit && result.damage !== undefined) {
253
+ defender.hp.current = Math.max(0, defender.hp.current - result.damage);
254
+ }
255
+ // Update RNG state
256
+ session.rng = rng.getState();
257
+ await sessionManager.save(session);
258
+ // Build roll info with advantage details
259
+ const rollInfo = {
260
+ natural: result.roll.natural,
261
+ total: result.roll.total,
262
+ };
263
+ if (result.roll.advantage) {
264
+ rollInfo.advantage = {
265
+ bothRolls: result.roll.advantage.bothRolls,
266
+ selected: result.roll.advantage.selected,
267
+ };
268
+ }
269
+ // Build response
270
+ const response = {
271
+ attacker: attacker.name,
272
+ defender: defender.name,
273
+ weapon: weapon.name,
274
+ hit: result.hit,
275
+ advantageState: result.advantageState,
276
+ roll: rollInfo,
277
+ critical: result.critical,
278
+ damage: result.damage,
279
+ defenderHp: {
280
+ current: defender.hp.current,
281
+ max: defender.hp.max,
282
+ },
283
+ defeated: defender.hp.current <= 0,
284
+ };
285
+ // Include damage modification info if resistance/vulnerability applied
286
+ if (result.damageModification) {
287
+ response.damageModification = result.damageModification;
288
+ }
289
+ return response;
290
+ },
291
+ };
292
+ /**
293
+ * apply_damage tool
294
+ */
295
+ export const applyDamageTool = {
296
+ name: "apply_damage",
297
+ description: "Apply damage directly to a combatant (bypassing attack roll)",
298
+ inputSchema: {
299
+ type: "object",
300
+ properties: {
301
+ sessionId: { type: "string", description: "Session ID" },
302
+ targetId: { type: "string", description: "Target combatant ID" },
303
+ amount: { type: "number", description: "Damage amount" },
304
+ },
305
+ required: ["sessionId", "targetId", "amount"],
306
+ },
307
+ handler: async (args) => {
308
+ const input = ApplyDamageInput.parse(args);
309
+ const session = await sessionManager.get(input.sessionId);
310
+ if (!session) {
311
+ throw new Error(`Session not found: ${input.sessionId}`);
312
+ }
313
+ const target = getCombatant(session, input.targetId);
314
+ if (!target) {
315
+ throw new Error(`Target not found: ${input.targetId}`);
316
+ }
317
+ const previousHp = target.hp.current;
318
+ target.hp.current = Math.max(0, target.hp.current - input.amount);
319
+ await sessionManager.save(session);
320
+ return {
321
+ target: target.name,
322
+ damage: input.amount,
323
+ hp: {
324
+ previous: previousHp,
325
+ current: target.hp.current,
326
+ max: target.hp.max,
327
+ },
328
+ defeated: target.hp.current <= 0,
329
+ };
330
+ },
331
+ };
332
+ /**
333
+ * add_combat_condition tool
334
+ */
335
+ export const addCombatConditionTool = {
336
+ name: "add_combat_condition",
337
+ description: "Add a condition to a combatant. Supports advantage/disadvantage and resistance/vulnerability effects.",
338
+ inputSchema: {
339
+ type: "object",
340
+ properties: {
341
+ sessionId: { type: "string", description: "Session ID" },
342
+ targetId: { type: "string", description: "Target combatant ID" },
343
+ condition: {
344
+ type: "object",
345
+ properties: {
346
+ id: { type: "string" },
347
+ name: { type: "string" },
348
+ description: { type: "string" },
349
+ duration: { oneOf: [{ type: "number" }, { type: "string", enum: ["permanent", "until_rest"] }] },
350
+ durationMinutes: { type: "number", minimum: 1, description: "Duration in game minutes (sets time-based expiration)" },
351
+ effects: {
352
+ type: "array",
353
+ description: "Effects of the condition",
354
+ items: {
355
+ type: "object",
356
+ properties: {
357
+ type: {
358
+ type: "string",
359
+ enum: ["MODIFY_ABILITY", "MODIFY_SKILL", "MODIFY_HP", "MODIFY_DEFENSE", "GRANT_ADVANTAGE", "GRANT_DISADVANTAGE", "RESISTANCE", "VULNERABILITY"],
360
+ },
361
+ ability: { type: "string", enum: ["STR", "AGI", "WIT", "CON"] },
362
+ skillId: { type: "string" },
363
+ amount: { type: "number" },
364
+ scope: { type: "string", enum: ["attacks", "defense", "skill_tests", "all"] },
365
+ skills: { type: "array", items: { type: "string" } },
366
+ damageType: { type: "string" },
367
+ multiplier: { type: "number" },
368
+ },
369
+ required: ["type"],
370
+ },
371
+ },
372
+ },
373
+ required: ["id", "name", "description", "duration"],
374
+ },
375
+ },
376
+ required: ["sessionId", "targetId", "condition"],
377
+ },
378
+ handler: async (args) => {
379
+ const input = AddConditionInput.parse(args);
380
+ const session = await sessionManager.get(input.sessionId);
381
+ if (!session) {
382
+ throw new Error(`Session not found: ${input.sessionId}`);
383
+ }
384
+ const target = getCombatant(session, input.targetId);
385
+ if (!target) {
386
+ throw new Error(`Target not found: ${input.targetId}`);
387
+ }
388
+ // Handle sessions created before gameTime was added
389
+ if (!session.gameTime) {
390
+ session.gameTime = createInitialGameTime();
391
+ }
392
+ const condition = {
393
+ id: input.condition.id,
394
+ name: input.condition.name,
395
+ description: input.condition.description,
396
+ duration: input.condition.duration,
397
+ effects: input.condition.effects ?? [],
398
+ stackable: false,
399
+ };
400
+ // If durationMinutes specified, calculate expiration time
401
+ if (input.condition.durationMinutes) {
402
+ condition.expiresAtGameTime = advanceGameTime(session.gameTime, input.condition.durationMinutes);
403
+ }
404
+ target.conditions.push(condition);
405
+ await sessionManager.save(session);
406
+ const result = {
407
+ target: target.name,
408
+ condition: condition.name,
409
+ message: `${condition.name} applied to ${target.name}`,
410
+ };
411
+ if (condition.expiresAtGameTime) {
412
+ const hour12 = condition.expiresAtGameTime.hour % 12 || 12;
413
+ const ampm = condition.expiresAtGameTime.hour < 12 ? "AM" : "PM";
414
+ const min = condition.expiresAtGameTime.minute.toString().padStart(2, "0");
415
+ result.expiresAt = `Day ${condition.expiresAtGameTime.day}, ${hour12}:${min} ${ampm}`;
416
+ result.durationMinutes = input.condition.durationMinutes;
417
+ }
418
+ return result;
419
+ },
420
+ };
421
+ /**
422
+ * next_turn tool
423
+ */
424
+ export const nextTurnTool = {
425
+ name: "next_turn",
426
+ description: "Advance to the next turn in combat",
427
+ inputSchema: {
428
+ type: "object",
429
+ properties: {
430
+ sessionId: { type: "string", description: "Session ID" },
431
+ },
432
+ required: ["sessionId"],
433
+ },
434
+ handler: async (args) => {
435
+ const input = NextTurnInput.parse(args);
436
+ const session = await sessionManager.get(input.sessionId);
437
+ if (!session) {
438
+ throw new Error(`Session not found: ${input.sessionId}`);
439
+ }
440
+ if (!session.combat?.active) {
441
+ throw new Error("No active combat");
442
+ }
443
+ // Advance turn
444
+ session.combat.turnIndex++;
445
+ // Check for new round
446
+ if (session.combat.turnIndex >= session.combat.turnOrder.length) {
447
+ session.combat.turnIndex = 0;
448
+ session.combat.round++;
449
+ // Decrement condition durations
450
+ for (const id of session.combat.turnOrder) {
451
+ const combatant = getCombatant(session, id);
452
+ if (combatant) {
453
+ combatant.conditions = combatant.conditions.filter((c) => {
454
+ if (typeof c.duration === "number") {
455
+ c.duration--;
456
+ return c.duration > 0;
457
+ }
458
+ return true;
459
+ });
460
+ }
461
+ }
462
+ }
463
+ session.combat.currentTurnId = session.combat.turnOrder[session.combat.turnIndex];
464
+ await sessionManager.save(session);
465
+ const currentCombatant = getCombatant(session, session.combat.currentTurnId);
466
+ return {
467
+ round: session.combat.round,
468
+ turnIndex: session.combat.turnIndex,
469
+ currentTurn: {
470
+ id: session.combat.currentTurnId,
471
+ name: currentCombatant?.name ?? session.combat.currentTurnId,
472
+ },
473
+ turnOrder: session.combat.turnOrder.map((id, idx) => {
474
+ const c = getCombatant(session, id);
475
+ return {
476
+ id,
477
+ name: c?.name ?? id,
478
+ current: idx === session.combat.turnIndex,
479
+ hp: c?.hp,
480
+ };
481
+ }),
482
+ };
483
+ },
484
+ };
485
+ /**
486
+ * end_combat tool
487
+ */
488
+ export const endCombatTool = {
489
+ name: "end_combat",
490
+ description: "End the current combat",
491
+ inputSchema: {
492
+ type: "object",
493
+ properties: {
494
+ sessionId: { type: "string", description: "Session ID" },
495
+ outcome: { type: "string", enum: ["victory", "defeat", "fled"], description: "Combat outcome" },
496
+ },
497
+ required: ["sessionId", "outcome"],
498
+ },
499
+ handler: async (args) => {
500
+ const input = EndCombatInput.parse(args);
501
+ const session = await sessionManager.get(input.sessionId);
502
+ if (!session) {
503
+ throw new Error(`Session not found: ${input.sessionId}`);
504
+ }
505
+ if (!session.combat?.active) {
506
+ throw new Error("No active combat to end");
507
+ }
508
+ const summary = {
509
+ rounds: session.combat.round,
510
+ outcome: input.outcome,
511
+ survivors: session.combat.turnOrder
512
+ .map((id) => getCombatant(session, id))
513
+ .filter((c) => c !== null && c.hp.current > 0)
514
+ .map((c) => ({ id: c.id, name: c.name, hp: c.hp })),
515
+ };
516
+ session.combat = null;
517
+ await sessionManager.save(session);
518
+ return {
519
+ message: `Combat ended: ${input.outcome}`,
520
+ ...summary,
521
+ };
522
+ },
523
+ };
524
+ /**
525
+ * get_combat_state tool
526
+ */
527
+ export const getCombatStateTool = {
528
+ name: "get_combat_state",
529
+ description: "Get the current combat state",
530
+ inputSchema: {
531
+ type: "object",
532
+ properties: {
533
+ sessionId: { type: "string", description: "Session ID" },
534
+ },
535
+ required: ["sessionId"],
536
+ },
537
+ handler: async (args) => {
538
+ const input = GetCombatStateInput.parse(args);
539
+ const session = await sessionManager.get(input.sessionId);
540
+ if (!session) {
541
+ throw new Error(`Session not found: ${input.sessionId}`);
542
+ }
543
+ if (!session.combat) {
544
+ return { active: false, message: "No combat in progress" };
545
+ }
546
+ return {
547
+ active: session.combat.active,
548
+ round: session.combat.round,
549
+ turnIndex: session.combat.turnIndex,
550
+ currentTurn: session.combat.currentTurnId,
551
+ combatants: session.combat.turnOrder.map((id, idx) => {
552
+ const c = getCombatant(session, id);
553
+ return {
554
+ id,
555
+ name: c?.name ?? id,
556
+ hp: c?.hp,
557
+ conditions: c?.conditions.map((cond) => cond.name) ?? [],
558
+ current: idx === session.combat.turnIndex,
559
+ };
560
+ }),
561
+ };
562
+ },
563
+ };
564
+ export const combatTools = [
565
+ startCombatTool,
566
+ rollInitiativeTool,
567
+ attackTool,
568
+ applyDamageTool,
569
+ addCombatConditionTool,
570
+ nextTurnTool,
571
+ endCombatTool,
572
+ getCombatStateTool,
573
+ ];
574
+ //# sourceMappingURL=combat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combat.js","sourceRoot":"","sources":["../../src/tools/combat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dice tools - rolling dice and tests
3
+ */
4
+ import type { MCPToolEntry } from "@mythxengine/types";
5
+ export declare const rollDiceTool: MCPToolEntry;
6
+ export declare const rollTestTool: MCPToolEntry;
7
+ export declare const rollCustomTestTool: MCPToolEntry;
8
+ export declare const diceTools: MCPToolEntry[];
9
+ //# sourceMappingURL=dice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dice.d.ts","sourceRoot":"","sources":["../../src/tools/dice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAsDzE,eAAO,MAAM,YAAY,EAAE,YAoD1B,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,YAiI1B,CAAC;AAMF,eAAO,MAAM,kBAAkB,EAAE,YA6GhC,CAAC;AAMF,eAAO,MAAM,SAAS,gBAAmD,CAAC"}