@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,471 @@
1
+ /**
2
+ * NPC Relationship Tracking Tools
3
+ *
4
+ * Tools for tracking NPC attitudes and interaction history.
5
+ * Supports the GM Mastery principle: "Track how players treated them."
6
+ */
7
+ import { z } from "zod";
8
+ import { sessionManager } from "../state/manager.js";
9
+ // Attitude levels
10
+ const ATTITUDES = ["hostile", "unfriendly", "neutral", "friendly", "allied"];
11
+ // Impact levels
12
+ const IMPACTS = ["very_negative", "negative", "neutral", "positive", "very_positive"];
13
+ // Input schemas
14
+ const GetRelationshipInput = z.object({
15
+ sessionId: z.string(),
16
+ npcId: z.string(),
17
+ });
18
+ const UpdateRelationshipInput = z.object({
19
+ sessionId: z.string(),
20
+ npcId: z.string(),
21
+ interaction: z.string().describe("Description of what happened"),
22
+ impact: z.enum(IMPACTS).describe("How this affected the relationship"),
23
+ attitudeChange: z.enum(ATTITUDES).optional().describe("Explicit attitude change"),
24
+ addKnows: z.array(z.string()).optional(),
25
+ addOwes: z.array(z.string()).optional(),
26
+ addFears: z.array(z.string()).optional(),
27
+ addWants: z.array(z.string()).optional(),
28
+ removeKnows: z.array(z.string()).optional(),
29
+ removeOwes: z.array(z.string()).optional(),
30
+ removeFears: z.array(z.string()).optional(),
31
+ removeWants: z.array(z.string()).optional(),
32
+ });
33
+ const ListRelationshipsInput = z.object({
34
+ sessionId: z.string(),
35
+ attitudeFilter: z.enum(ATTITUDES).optional(),
36
+ });
37
+ const GetDispositionInput = z.object({
38
+ sessionId: z.string(),
39
+ npcId: z.string(),
40
+ });
41
+ const InitializeRelationshipInput = z.object({
42
+ sessionId: z.string(),
43
+ npcId: z.string(),
44
+ npcName: z.string(),
45
+ initialAttitude: z.enum(ATTITUDES).default("neutral"),
46
+ knows: z.array(z.string()).optional(),
47
+ wants: z.array(z.string()).optional(),
48
+ });
49
+ /**
50
+ * Format game time as human-readable string
51
+ */
52
+ function formatGameTime(time) {
53
+ const hour12 = time.hour % 12 || 12;
54
+ const ampm = time.hour < 12 ? "AM" : "PM";
55
+ const min = time.minute.toString().padStart(2, "0");
56
+ return `Day ${time.day}, ${hour12}:${min} ${ampm}`;
57
+ }
58
+ /**
59
+ * Calculate attitude shift from impact
60
+ */
61
+ function calculateAttitudeShift(currentAttitude, impact) {
62
+ const attitudeIndex = ATTITUDES.indexOf(currentAttitude);
63
+ let shift = 0;
64
+ switch (impact) {
65
+ case "very_negative":
66
+ shift = -2;
67
+ break;
68
+ case "negative":
69
+ shift = -1;
70
+ break;
71
+ case "neutral":
72
+ shift = 0;
73
+ break;
74
+ case "positive":
75
+ shift = 1;
76
+ break;
77
+ case "very_positive":
78
+ shift = 2;
79
+ break;
80
+ }
81
+ const newIndex = Math.max(0, Math.min(ATTITUDES.length - 1, attitudeIndex + shift));
82
+ return ATTITUDES[newIndex];
83
+ }
84
+ /**
85
+ * Get relationship summary text
86
+ */
87
+ function getAttitudeSummary(attitude) {
88
+ switch (attitude) {
89
+ case "hostile":
90
+ return "Actively antagonistic, may attack or sabotage";
91
+ case "unfriendly":
92
+ return "Distrustful, uncooperative, may withhold help";
93
+ case "neutral":
94
+ return "No strong feelings, will deal fairly";
95
+ case "friendly":
96
+ return "Positive disposition, inclined to help";
97
+ case "allied":
98
+ return "Strong bond, will go out of their way to assist";
99
+ }
100
+ }
101
+ /**
102
+ * get_relationship tool
103
+ */
104
+ export const getRelationshipTool = {
105
+ name: "get_relationship",
106
+ description: "Get an NPC's current attitude and interaction history with the party.",
107
+ inputSchema: {
108
+ type: "object",
109
+ properties: {
110
+ sessionId: { type: "string", description: "Session ID" },
111
+ npcId: { type: "string", description: "NPC ID" },
112
+ },
113
+ required: ["sessionId", "npcId"],
114
+ },
115
+ handler: async (args) => {
116
+ const input = GetRelationshipInput.parse(args);
117
+ const session = await sessionManager.get(input.sessionId);
118
+ if (!session) {
119
+ throw new Error(`Session not found: ${input.sessionId}`);
120
+ }
121
+ if (!session.relationships || !session.relationships[input.npcId]) {
122
+ return {
123
+ message: `No relationship tracked for NPC: ${input.npcId}`,
124
+ exists: false,
125
+ hint: "Use initialize_relationship or update_relationship to start tracking",
126
+ };
127
+ }
128
+ const rel = session.relationships[input.npcId];
129
+ return {
130
+ npcId: rel.npcId,
131
+ npcName: rel.npcName,
132
+ attitude: rel.attitude,
133
+ attitudeSummary: getAttitudeSummary(rel.attitude),
134
+ history: rel.history.map(h => ({
135
+ timestamp: formatGameTime(h.timestamp),
136
+ interaction: h.interaction,
137
+ impact: h.impact,
138
+ })),
139
+ knows: rel.knows,
140
+ owes: rel.owes,
141
+ fears: rel.fears,
142
+ wants: rel.wants,
143
+ characterAttitudes: rel.characterAttitudes,
144
+ };
145
+ },
146
+ };
147
+ /**
148
+ * initialize_relationship tool
149
+ */
150
+ export const initializeRelationshipTool = {
151
+ name: "initialize_relationship",
152
+ description: "Start tracking a relationship with an NPC.",
153
+ inputSchema: {
154
+ type: "object",
155
+ properties: {
156
+ sessionId: { type: "string", description: "Session ID" },
157
+ npcId: { type: "string", description: "NPC ID" },
158
+ npcName: { type: "string", description: "NPC name for display" },
159
+ initialAttitude: {
160
+ type: "string",
161
+ enum: ATTITUDES,
162
+ description: "Starting attitude (default: neutral)",
163
+ },
164
+ knows: {
165
+ type: "array",
166
+ items: { type: "string" },
167
+ description: "What the NPC knows about the party",
168
+ },
169
+ wants: {
170
+ type: "array",
171
+ items: { type: "string" },
172
+ description: "What the NPC wants from the party",
173
+ },
174
+ },
175
+ required: ["sessionId", "npcId", "npcName"],
176
+ },
177
+ handler: async (args) => {
178
+ const input = InitializeRelationshipInput.parse(args);
179
+ const session = await sessionManager.get(input.sessionId);
180
+ if (!session) {
181
+ throw new Error(`Session not found: ${input.sessionId}`);
182
+ }
183
+ // Initialize relationships if needed
184
+ if (!session.relationships) {
185
+ session.relationships = {};
186
+ }
187
+ // Check if already exists
188
+ if (session.relationships[input.npcId]) {
189
+ return {
190
+ message: `Relationship already exists for ${input.npcName}`,
191
+ exists: true,
192
+ relationship: session.relationships[input.npcId],
193
+ };
194
+ }
195
+ // Create new relationship
196
+ const relationship = {
197
+ npcId: input.npcId,
198
+ npcName: input.npcName,
199
+ attitude: input.initialAttitude,
200
+ history: [],
201
+ knows: input.knows || [],
202
+ owes: [],
203
+ fears: [],
204
+ wants: input.wants || [],
205
+ };
206
+ session.relationships[input.npcId] = relationship;
207
+ await sessionManager.save(session);
208
+ return {
209
+ message: `Relationship initialized for ${input.npcName}`,
210
+ relationship: {
211
+ npcId: relationship.npcId,
212
+ npcName: relationship.npcName,
213
+ attitude: relationship.attitude,
214
+ attitudeSummary: getAttitudeSummary(relationship.attitude),
215
+ knows: relationship.knows,
216
+ wants: relationship.wants,
217
+ },
218
+ };
219
+ },
220
+ };
221
+ /**
222
+ * update_relationship tool
223
+ */
224
+ export const updateRelationshipTool = {
225
+ name: "update_relationship",
226
+ description: "Record an interaction and update NPC relationship. Automatically adjusts attitude based on impact.",
227
+ inputSchema: {
228
+ type: "object",
229
+ properties: {
230
+ sessionId: { type: "string", description: "Session ID" },
231
+ npcId: { type: "string", description: "NPC ID" },
232
+ interaction: { type: "string", description: "What happened" },
233
+ impact: {
234
+ type: "string",
235
+ enum: IMPACTS,
236
+ description: "How this affected the relationship",
237
+ },
238
+ attitudeChange: {
239
+ type: "string",
240
+ enum: ATTITUDES,
241
+ description: "Explicit attitude override (optional)",
242
+ },
243
+ addKnows: { type: "array", items: { type: "string" }, description: "Add to what NPC knows" },
244
+ addOwes: { type: "array", items: { type: "string" }, description: "Add debts/favors" },
245
+ addFears: { type: "array", items: { type: "string" }, description: "Add fears" },
246
+ addWants: { type: "array", items: { type: "string" }, description: "Add wants" },
247
+ removeKnows: { type: "array", items: { type: "string" }, description: "Remove from knows" },
248
+ removeOwes: { type: "array", items: { type: "string" }, description: "Remove debts" },
249
+ removeFears: { type: "array", items: { type: "string" }, description: "Remove fears" },
250
+ removeWants: { type: "array", items: { type: "string" }, description: "Remove wants" },
251
+ },
252
+ required: ["sessionId", "npcId", "interaction", "impact"],
253
+ },
254
+ handler: async (args) => {
255
+ const input = UpdateRelationshipInput.parse(args);
256
+ const session = await sessionManager.get(input.sessionId);
257
+ if (!session) {
258
+ throw new Error(`Session not found: ${input.sessionId}`);
259
+ }
260
+ // Initialize relationships if needed
261
+ if (!session.relationships) {
262
+ session.relationships = {};
263
+ }
264
+ // Get or create relationship
265
+ let rel = session.relationships[input.npcId];
266
+ let isNew = false;
267
+ if (!rel) {
268
+ // Try to get NPC name from session NPCs
269
+ const npc = session.npcs[input.npcId];
270
+ const npcName = npc?.name || input.npcId;
271
+ rel = {
272
+ npcId: input.npcId,
273
+ npcName: npcName,
274
+ attitude: "neutral",
275
+ history: [],
276
+ knows: [],
277
+ owes: [],
278
+ fears: [],
279
+ wants: [],
280
+ };
281
+ session.relationships[input.npcId] = rel;
282
+ isNew = true;
283
+ }
284
+ const previousAttitude = rel.attitude;
285
+ // Calculate new attitude
286
+ const newAttitude = input.attitudeChange || calculateAttitudeShift(rel.attitude, input.impact);
287
+ rel.attitude = newAttitude;
288
+ // Add history entry
289
+ rel.history.push({
290
+ timestamp: { ...session.gameTime },
291
+ interaction: input.interaction,
292
+ impact: input.impact,
293
+ });
294
+ // Update lists
295
+ if (input.addKnows) {
296
+ rel.knows.push(...input.addKnows.filter(k => !rel.knows.includes(k)));
297
+ }
298
+ if (input.addOwes) {
299
+ rel.owes.push(...input.addOwes.filter(o => !rel.owes.includes(o)));
300
+ }
301
+ if (input.addFears) {
302
+ rel.fears.push(...input.addFears.filter(f => !rel.fears.includes(f)));
303
+ }
304
+ if (input.addWants) {
305
+ rel.wants.push(...input.addWants.filter(w => !rel.wants.includes(w)));
306
+ }
307
+ if (input.removeKnows) {
308
+ rel.knows = rel.knows.filter(k => !input.removeKnows.includes(k));
309
+ }
310
+ if (input.removeOwes) {
311
+ rel.owes = rel.owes.filter(o => !input.removeOwes.includes(o));
312
+ }
313
+ if (input.removeFears) {
314
+ rel.fears = rel.fears.filter(f => !input.removeFears.includes(f));
315
+ }
316
+ if (input.removeWants) {
317
+ rel.wants = rel.wants.filter(w => !input.removeWants.includes(w));
318
+ }
319
+ await sessionManager.save(session);
320
+ const attitudeChanged = previousAttitude !== newAttitude;
321
+ return {
322
+ message: isNew
323
+ ? `Relationship created and updated for ${rel.npcName}`
324
+ : `Relationship updated for ${rel.npcName}`,
325
+ npcId: rel.npcId,
326
+ npcName: rel.npcName,
327
+ interaction: input.interaction,
328
+ impact: input.impact,
329
+ attitudeChange: attitudeChanged ? {
330
+ from: previousAttitude,
331
+ to: newAttitude,
332
+ summary: getAttitudeSummary(newAttitude),
333
+ } : null,
334
+ currentAttitude: {
335
+ level: rel.attitude,
336
+ summary: getAttitudeSummary(rel.attitude),
337
+ },
338
+ totalInteractions: rel.history.length,
339
+ };
340
+ },
341
+ };
342
+ /**
343
+ * list_relationships tool
344
+ */
345
+ export const listRelationshipsTool = {
346
+ name: "list_relationships",
347
+ description: "List all tracked NPC relationships.",
348
+ inputSchema: {
349
+ type: "object",
350
+ properties: {
351
+ sessionId: { type: "string", description: "Session ID" },
352
+ attitudeFilter: {
353
+ type: "string",
354
+ enum: ATTITUDES,
355
+ description: "Filter by attitude level",
356
+ },
357
+ },
358
+ required: ["sessionId"],
359
+ },
360
+ handler: async (args) => {
361
+ const input = ListRelationshipsInput.parse(args);
362
+ const session = await sessionManager.get(input.sessionId);
363
+ if (!session) {
364
+ throw new Error(`Session not found: ${input.sessionId}`);
365
+ }
366
+ if (!session.relationships || Object.keys(session.relationships).length === 0) {
367
+ return {
368
+ message: "No relationships tracked",
369
+ relationships: [],
370
+ };
371
+ }
372
+ let relationships = Object.values(session.relationships);
373
+ if (input.attitudeFilter) {
374
+ relationships = relationships.filter(r => r.attitude === input.attitudeFilter);
375
+ }
376
+ // Sort by attitude (hostile first, then by interaction count)
377
+ relationships.sort((a, b) => {
378
+ const attitudeOrder = ATTITUDES.indexOf(a.attitude) - ATTITUDES.indexOf(b.attitude);
379
+ if (attitudeOrder !== 0)
380
+ return attitudeOrder;
381
+ return b.history.length - a.history.length;
382
+ });
383
+ const result = relationships.map(rel => ({
384
+ npcId: rel.npcId,
385
+ npcName: rel.npcName,
386
+ attitude: rel.attitude,
387
+ attitudeSummary: getAttitudeSummary(rel.attitude),
388
+ interactionCount: rel.history.length,
389
+ lastInteraction: rel.history.length > 0
390
+ ? {
391
+ when: formatGameTime(rel.history[rel.history.length - 1].timestamp),
392
+ what: rel.history[rel.history.length - 1].interaction,
393
+ impact: rel.history[rel.history.length - 1].impact,
394
+ }
395
+ : null,
396
+ hasDebts: rel.owes.length > 0,
397
+ hasFears: rel.fears.length > 0,
398
+ hasWants: rel.wants.length > 0,
399
+ }));
400
+ return {
401
+ message: `${result.length} relationship(s) tracked`,
402
+ relationships: result,
403
+ };
404
+ },
405
+ };
406
+ /**
407
+ * get_npc_disposition tool
408
+ */
409
+ export const getNpcDispositionTool = {
410
+ name: "get_npc_disposition",
411
+ description: "Quick check: How does this NPC feel about the party?",
412
+ inputSchema: {
413
+ type: "object",
414
+ properties: {
415
+ sessionId: { type: "string", description: "Session ID" },
416
+ npcId: { type: "string", description: "NPC ID" },
417
+ },
418
+ required: ["sessionId", "npcId"],
419
+ },
420
+ handler: async (args) => {
421
+ const input = GetDispositionInput.parse(args);
422
+ const session = await sessionManager.get(input.sessionId);
423
+ if (!session) {
424
+ throw new Error(`Session not found: ${input.sessionId}`);
425
+ }
426
+ if (!session.relationships || !session.relationships[input.npcId]) {
427
+ // Check if NPC exists in session
428
+ const npc = session.npcs[input.npcId];
429
+ if (npc) {
430
+ return {
431
+ npcId: input.npcId,
432
+ npcName: npc.name,
433
+ attitude: "unknown",
434
+ summary: "No interactions recorded yet",
435
+ suggestion: "Consider initializing relationship when first meaningful interaction occurs",
436
+ };
437
+ }
438
+ return {
439
+ npcId: input.npcId,
440
+ attitude: "unknown",
441
+ summary: "NPC not found in session",
442
+ };
443
+ }
444
+ const rel = session.relationships[input.npcId];
445
+ const recentHistory = rel.history.slice(-3);
446
+ return {
447
+ npcId: rel.npcId,
448
+ npcName: rel.npcName,
449
+ attitude: rel.attitude,
450
+ summary: getAttitudeSummary(rel.attitude),
451
+ recentInteractions: recentHistory.map(h => ({
452
+ interaction: h.interaction,
453
+ impact: h.impact,
454
+ })),
455
+ keyContext: {
456
+ knows: rel.knows.slice(0, 3),
457
+ owes: rel.owes.slice(0, 2),
458
+ fears: rel.fears.slice(0, 2),
459
+ wants: rel.wants.slice(0, 2),
460
+ },
461
+ };
462
+ },
463
+ };
464
+ export const relationshipTools = [
465
+ getRelationshipTool,
466
+ initializeRelationshipTool,
467
+ updateRelationshipTool,
468
+ listRelationshipsTool,
469
+ getNpcDispositionTool,
470
+ ];
471
+ //# sourceMappingURL=relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../src/tools/relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Scene Framing Tools
3
+ *
4
+ * Helps with pacing and scene transitions.
5
+ * Based on the Alexandrian principle: "Cut to the next meaningful choice."
6
+ */
7
+ import type { MCPToolEntry } from "@mythxengine/types";
8
+ /**
9
+ * analyze_scene tool
10
+ */
11
+ export declare const analyzeSceneTool: MCPToolEntry;
12
+ /**
13
+ * suggest_scene_cut tool
14
+ */
15
+ export declare const suggestSceneCutTool: MCPToolEntry;
16
+ /**
17
+ * frame_scene tool
18
+ */
19
+ export declare const frameSceneTool: MCPToolEntry;
20
+ export declare const sceneFramingTools: MCPToolEntry[];
21
+ //# sourceMappingURL=scene-framing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-framing.d.ts","sourceRoot":"","sources":["../../src/tools/scene-framing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,oBAAoB,CAAC;AA2EjE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAkH9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,YA0GjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAqG5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBAI7B,CAAC"}