run-dmcp 0.1.0 → 0.3.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 (141) hide show
  1. package/README.md +101 -11
  2. package/dist/bin/run-dmcp.d.ts +2 -0
  3. package/dist/bin/run-dmcp.js +55 -0
  4. package/dist/db/connection.d.ts +32 -0
  5. package/dist/db/connection.js +38 -16
  6. package/dist/db/schema.d.ts +29 -1
  7. package/dist/db/schema.js +594 -10
  8. package/dist/http/server.js +25 -4
  9. package/dist/index.d.ts +69 -2
  10. package/dist/index.js +262 -92
  11. package/dist/mcp-server.d.ts +49 -0
  12. package/dist/mcp-server.js +127 -0
  13. package/dist/reader/turnReader.d.ts +185 -0
  14. package/dist/reader/turnReader.js +288 -0
  15. package/dist/register/batch.js +5 -79
  16. package/dist/register/mcp-resources.d.ts +9 -0
  17. package/dist/register/mcp-resources.js +16 -62
  18. package/dist/register/render.d.ts +17 -0
  19. package/dist/register/render.js +50 -0
  20. package/dist/register/resolve.d.ts +14 -0
  21. package/dist/register/resolve.js +102 -0
  22. package/dist/register/resources.js +13 -6
  23. package/dist/register/timeline.d.ts +2 -0
  24. package/dist/register/timeline.js +311 -0
  25. package/dist/rpg/index.d.ts +29 -0
  26. package/dist/rpg/index.js +55 -0
  27. package/dist/rpg/register/abilities.d.ts +2 -0
  28. package/dist/rpg/register/abilities.js +165 -0
  29. package/dist/rpg/register/batch.d.ts +2 -0
  30. package/dist/rpg/register/batch.js +92 -0
  31. package/dist/rpg/register/combat.d.ts +2 -0
  32. package/dist/rpg/register/combat.js +207 -0
  33. package/dist/rpg/register/mcp-prompts.d.ts +2 -0
  34. package/dist/rpg/register/mcp-prompts.js +684 -0
  35. package/dist/rpg/register/mcp-resources.d.ts +2 -0
  36. package/dist/rpg/register/mcp-resources.js +61 -0
  37. package/dist/rpg/register/quests.d.ts +2 -0
  38. package/dist/rpg/register/quests.js +118 -0
  39. package/dist/rpg/register/status.d.ts +2 -0
  40. package/dist/rpg/register/status.js +130 -0
  41. package/dist/rpg/register/tables.d.ts +2 -0
  42. package/dist/rpg/register/tables.js +146 -0
  43. package/dist/rpg/tools/ability.d.ts +48 -0
  44. package/dist/rpg/tools/ability.js +238 -0
  45. package/dist/rpg/tools/combat.d.ts +13 -0
  46. package/dist/rpg/tools/combat.js +195 -0
  47. package/dist/rpg/tools/dice.d.ts +23 -0
  48. package/dist/rpg/tools/dice.js +111 -0
  49. package/dist/rpg/tools/quest.d.ts +34 -0
  50. package/dist/rpg/tools/quest.js +164 -0
  51. package/dist/rpg/tools/status.d.ts +36 -0
  52. package/dist/rpg/tools/status.js +218 -0
  53. package/dist/rpg/tools/tables.d.ts +33 -0
  54. package/dist/rpg/tools/tables.js +209 -0
  55. package/dist/schemas/index.d.ts +12 -12
  56. package/dist/timeline/adjudication.d.ts +150 -0
  57. package/dist/timeline/adjudication.js +174 -0
  58. package/dist/timeline/changes.d.ts +108 -0
  59. package/dist/timeline/changes.js +169 -0
  60. package/dist/timeline/checkpoint.d.ts +69 -0
  61. package/dist/timeline/checkpoint.js +131 -0
  62. package/dist/timeline/clock.d.ts +89 -0
  63. package/dist/timeline/clock.js +173 -0
  64. package/dist/timeline/constrained.d.ts +220 -0
  65. package/dist/timeline/constrained.js +671 -0
  66. package/dist/timeline/export.d.ts +181 -0
  67. package/dist/timeline/export.js +339 -0
  68. package/dist/timeline/irreversible.d.ts +87 -0
  69. package/dist/timeline/irreversible.js +108 -0
  70. package/dist/timeline/kinds.d.ts +14 -0
  71. package/dist/timeline/kinds.js +22 -0
  72. package/dist/timeline/narration.d.ts +175 -0
  73. package/dist/timeline/narration.js +259 -0
  74. package/dist/timeline/projection.d.ts +97 -0
  75. package/dist/timeline/projection.js +330 -0
  76. package/dist/timeline/provenance.d.ts +66 -0
  77. package/dist/timeline/provenance.js +45 -0
  78. package/dist/timeline/registry.d.ts +95 -0
  79. package/dist/timeline/registry.js +124 -0
  80. package/dist/timeline/render.d.ts +121 -0
  81. package/dist/timeline/render.js +187 -0
  82. package/dist/timeline/replay.d.ts +86 -0
  83. package/dist/timeline/replay.js +126 -0
  84. package/dist/timeline/resolve.d.ts +262 -0
  85. package/dist/timeline/resolve.js +226 -0
  86. package/dist/timeline/schema.d.ts +13 -0
  87. package/dist/timeline/schema.js +264 -0
  88. package/dist/timeline/t.d.ts +80 -0
  89. package/dist/timeline/t.js +37 -0
  90. package/dist/tools/audio.js +13 -9
  91. package/dist/tools/constraint.d.ts +44 -80
  92. package/dist/tools/constraint.js +115 -124
  93. package/dist/tools/game.js +33 -1
  94. package/dist/tools/images.js +17 -10
  95. package/dist/tools/relationship.d.ts +83 -2
  96. package/dist/tools/relationship.js +139 -62
  97. package/dist/tools/resource.d.ts +33 -8
  98. package/dist/tools/resource.js +106 -153
  99. package/dist/tools/time.js +18 -3
  100. package/dist/types/index.d.ts +20 -2
  101. package/dist/utils/media-path.d.ts +52 -0
  102. package/dist/utils/media-path.js +106 -0
  103. package/dist/utils/output-schemas.d.ts +594 -3
  104. package/dist/utils/output-schemas.js +4 -1
  105. package/dist/utils/webui.d.ts +32 -0
  106. package/dist/utils/webui.js +54 -1
  107. package/package.json +25 -5
  108. package/dist/__tests__/engineVocabulary.test.d.ts +0 -1
  109. package/dist/__tests__/engineVocabulary.test.js +0 -147
  110. package/dist/db/__tests__/connection.test.d.ts +0 -1
  111. package/dist/db/__tests__/connection.test.js +0 -72
  112. package/dist/db/__tests__/testDb.d.ts +0 -33
  113. package/dist/db/__tests__/testDb.js +0 -41
  114. package/dist/test-setup.d.ts +0 -1
  115. package/dist/test-setup.js +0 -13
  116. package/dist/tools/__tests__/audio.test.d.ts +0 -1
  117. package/dist/tools/__tests__/audio.test.js +0 -59
  118. package/dist/tools/__tests__/conserved.test.d.ts +0 -1
  119. package/dist/tools/__tests__/conserved.test.js +0 -488
  120. package/dist/tools/__tests__/constraint.test.d.ts +0 -1
  121. package/dist/tools/__tests__/constraint.test.js +0 -212
  122. package/dist/tools/__tests__/expiry-consequences.test.d.ts +0 -1
  123. package/dist/tools/__tests__/expiry-consequences.test.js +0 -110
  124. package/dist/tools/__tests__/images.test.d.ts +0 -1
  125. package/dist/tools/__tests__/images.test.js +0 -59
  126. package/dist/tools/__tests__/relationship.test.d.ts +0 -1
  127. package/dist/tools/__tests__/relationship.test.js +0 -132
  128. package/dist/tools/__tests__/resource-constraints.test.d.ts +0 -1
  129. package/dist/tools/__tests__/resource-constraints.test.js +0 -131
  130. package/dist/tools/__tests__/resource.test.d.ts +0 -1
  131. package/dist/tools/__tests__/resource.test.js +0 -190
  132. package/dist/tools/__tests__/time.test.d.ts +0 -1
  133. package/dist/tools/__tests__/time.test.js +0 -404
  134. package/dist/tools/__tests__/timers.test.d.ts +0 -1
  135. package/dist/tools/__tests__/timers.test.js +0 -426
  136. package/dist/tools/__tests__/world.test.d.ts +0 -1
  137. package/dist/tools/__tests__/world.test.js +0 -70
  138. package/dist/utils/__tests__/json.test.d.ts +0 -1
  139. package/dist/utils/__tests__/json.test.js +0 -55
  140. package/dist/utils/__tests__/validation.test.d.ts +0 -1
  141. package/dist/utils/__tests__/validation.test.js +0 -90
@@ -0,0 +1,207 @@
1
+ import { z } from "zod";
2
+ import * as combatTools from "../tools/combat.js";
3
+ import * as diceTools from "../tools/dice.js";
4
+ import { LIMITS } from "../../utils/validation.js";
5
+ import { ANNOTATIONS } from "../../utils/tool-annotations.js";
6
+ export function registerCombatTools(server) {
7
+ // ============================================================================
8
+ // DICE & CHECK TOOLS
9
+ // ============================================================================
10
+ server.registerTool("roll", {
11
+ description: "Roll dice using standard notation",
12
+ inputSchema: {
13
+ expression: z.string().max(100).describe("Dice expression (e.g., '2d6+3', '1d20', '4d6-2')"),
14
+ },
15
+ annotations: ANNOTATIONS.READ_ONLY,
16
+ }, async ({ expression }) => {
17
+ try {
18
+ const result = diceTools.roll(expression);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
21
+ };
22
+ }
23
+ catch (error) {
24
+ return {
25
+ content: [{ type: "text", text: error.message }],
26
+ isError: true,
27
+ };
28
+ }
29
+ });
30
+ server.registerTool("check", {
31
+ description: "Perform a skill or ability check",
32
+ inputSchema: {
33
+ gameId: z.string().max(100).describe("The game ID"),
34
+ characterId: z.string().max(100).describe("The character making the check"),
35
+ skill: z.string().max(100).optional().describe("Skill to use"),
36
+ attribute: z.string().max(100).optional().describe("Attribute to use"),
37
+ difficulty: z.number().describe("Difficulty threshold"),
38
+ bonusModifier: z.number().optional().describe("Additional modifier"),
39
+ },
40
+ annotations: ANNOTATIONS.READ_ONLY,
41
+ }, async (params) => {
42
+ try {
43
+ const result = diceTools.check(params);
44
+ return {
45
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ content: [{ type: "text", text: error.message }],
51
+ isError: true,
52
+ };
53
+ }
54
+ });
55
+ server.registerTool("contest", {
56
+ description: "Opposed check between two characters",
57
+ inputSchema: {
58
+ gameId: z.string().max(100).describe("The game ID"),
59
+ attackerId: z.string().max(100).describe("First character ID"),
60
+ defenderId: z.string().max(100).describe("Second character ID"),
61
+ attackerSkill: z.string().max(100).optional().describe("Skill for first character"),
62
+ defenderSkill: z.string().max(100).optional().describe("Skill for second character"),
63
+ attackerAttribute: z.string().max(100).optional().describe("Attribute for first character"),
64
+ defenderAttribute: z.string().max(100).optional().describe("Attribute for second character"),
65
+ },
66
+ annotations: ANNOTATIONS.READ_ONLY,
67
+ }, async (params) => {
68
+ try {
69
+ const result = diceTools.contest(params);
70
+ return {
71
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ content: [{ type: "text", text: error.message }],
77
+ isError: true,
78
+ };
79
+ }
80
+ });
81
+ // ============================================================================
82
+ // COMBAT TOOLS
83
+ // ============================================================================
84
+ server.registerTool("start_combat", {
85
+ description: "Initialize a combat encounter",
86
+ inputSchema: {
87
+ gameId: z.string().max(100).describe("The game ID"),
88
+ locationId: z.string().max(100).describe("Location where combat occurs"),
89
+ participantIds: z.array(z.string().max(100)).max(LIMITS.ARRAY_MAX).describe("Character IDs of all combatants"),
90
+ },
91
+ annotations: ANNOTATIONS.CREATE,
92
+ }, async (params) => {
93
+ const combat = combatTools.startCombat(params);
94
+ return {
95
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
96
+ };
97
+ });
98
+ server.registerTool("get_combat", {
99
+ description: "Get current combat state",
100
+ inputSchema: {
101
+ combatId: z.string().max(100).describe("The combat ID"),
102
+ },
103
+ annotations: ANNOTATIONS.READ_ONLY,
104
+ }, async ({ combatId }) => {
105
+ const combat = combatTools.getCombat(combatId);
106
+ if (!combat) {
107
+ return {
108
+ content: [{ type: "text", text: "Combat not found" }],
109
+ isError: true,
110
+ };
111
+ }
112
+ return {
113
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
114
+ };
115
+ });
116
+ server.registerTool("get_active_combat", {
117
+ description: "Get the active combat for a game",
118
+ inputSchema: {
119
+ gameId: z.string().max(100).describe("The game ID"),
120
+ },
121
+ annotations: ANNOTATIONS.READ_ONLY,
122
+ }, async ({ gameId }) => {
123
+ const combat = combatTools.getActiveCombat(gameId);
124
+ if (!combat) {
125
+ return {
126
+ content: [{ type: "text", text: "No active combat" }],
127
+ };
128
+ }
129
+ return {
130
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
131
+ };
132
+ });
133
+ server.registerTool("next_turn", {
134
+ description: "Advance to the next combatant's turn",
135
+ inputSchema: {
136
+ combatId: z.string().max(100).describe("The combat ID"),
137
+ },
138
+ annotations: ANNOTATIONS.UPDATE,
139
+ }, async ({ combatId }) => {
140
+ const combat = combatTools.nextTurn(combatId);
141
+ if (!combat) {
142
+ return {
143
+ content: [{ type: "text", text: "Combat not found or ended" }],
144
+ isError: true,
145
+ };
146
+ }
147
+ return {
148
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
149
+ };
150
+ });
151
+ server.registerTool("add_combat_log", {
152
+ description: "Add an entry to the combat log",
153
+ inputSchema: {
154
+ combatId: z.string().max(100).describe("The combat ID"),
155
+ entry: z.string().max(LIMITS.DESCRIPTION_MAX).describe("Log entry text"),
156
+ },
157
+ annotations: ANNOTATIONS.UPDATE,
158
+ }, async ({ combatId, entry }) => {
159
+ const combat = combatTools.addCombatLog(combatId, entry);
160
+ if (!combat) {
161
+ return {
162
+ content: [{ type: "text", text: "Combat not found" }],
163
+ isError: true,
164
+ };
165
+ }
166
+ return {
167
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
168
+ };
169
+ });
170
+ server.registerTool("remove_combatant", {
171
+ description: "Remove a character from combat (defeated, fled, etc.)",
172
+ inputSchema: {
173
+ combatId: z.string().max(100).describe("The combat ID"),
174
+ characterId: z.string().max(100).describe("The character to remove"),
175
+ },
176
+ annotations: ANNOTATIONS.DESTRUCTIVE,
177
+ }, async ({ combatId, characterId }) => {
178
+ const combat = combatTools.removeParticipant(combatId, characterId);
179
+ if (!combat) {
180
+ return {
181
+ content: [{ type: "text", text: "Combat not found" }],
182
+ isError: true,
183
+ };
184
+ }
185
+ return {
186
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
187
+ };
188
+ });
189
+ server.registerTool("end_combat", {
190
+ description: "End a combat encounter",
191
+ inputSchema: {
192
+ combatId: z.string().max(100).describe("The combat ID"),
193
+ },
194
+ annotations: ANNOTATIONS.UPDATE,
195
+ }, async ({ combatId }) => {
196
+ const combat = combatTools.endCombat(combatId);
197
+ if (!combat) {
198
+ return {
199
+ content: [{ type: "text", text: "Combat not found" }],
200
+ isError: true,
201
+ };
202
+ }
203
+ return {
204
+ content: [{ type: "text", text: JSON.stringify(combat, null, 2) }],
205
+ };
206
+ });
207
+ }
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMcpPrompts(server: McpServer): void;