foundryvtt-mcp 0.11.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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/character/manager.d.ts +92 -0
  4. package/dist/character/manager.d.ts.map +1 -0
  5. package/dist/character/manager.js +208 -0
  6. package/dist/character/manager.js.map +1 -0
  7. package/dist/combat/manager.d.ts +94 -0
  8. package/dist/combat/manager.d.ts.map +1 -0
  9. package/dist/combat/manager.js +373 -0
  10. package/dist/combat/manager.js.map +1 -0
  11. package/dist/config/index.d.ts +114 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +177 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/diagnostics/client.d.ts +193 -0
  16. package/dist/diagnostics/client.d.ts.map +1 -0
  17. package/dist/diagnostics/client.js +314 -0
  18. package/dist/diagnostics/client.js.map +1 -0
  19. package/dist/diagnostics/types.d.ts +414 -0
  20. package/dist/diagnostics/types.d.ts.map +1 -0
  21. package/dist/diagnostics/types.js +94 -0
  22. package/dist/diagnostics/types.js.map +1 -0
  23. package/dist/foundry/auth.d.ts +19 -0
  24. package/dist/foundry/auth.d.ts.map +1 -0
  25. package/dist/foundry/auth.js +135 -0
  26. package/dist/foundry/auth.js.map +1 -0
  27. package/dist/foundry/client.d.ts +95 -0
  28. package/dist/foundry/client.d.ts.map +1 -0
  29. package/dist/foundry/client.js +692 -0
  30. package/dist/foundry/client.js.map +1 -0
  31. package/dist/foundry/types.d.ts +805 -0
  32. package/dist/foundry/types.d.ts.map +1 -0
  33. package/dist/foundry/types.js +13 -0
  34. package/dist/foundry/types.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +199 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/resources/index.d.ts +3 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +93 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/tools/base.d.ts +80 -0
  44. package/dist/tools/base.d.ts.map +1 -0
  45. package/dist/tools/base.js +73 -0
  46. package/dist/tools/base.js.map +1 -0
  47. package/dist/tools/definitions.d.ts +414 -0
  48. package/dist/tools/definitions.d.ts.map +1 -0
  49. package/dist/tools/definitions.js +429 -0
  50. package/dist/tools/definitions.js.map +1 -0
  51. package/dist/tools/handlers/actors.d.ts +31 -0
  52. package/dist/tools/handlers/actors.d.ts.map +1 -0
  53. package/dist/tools/handlers/actors.js +76 -0
  54. package/dist/tools/handlers/actors.js.map +1 -0
  55. package/dist/tools/handlers/chat.d.ts +13 -0
  56. package/dist/tools/handlers/chat.d.ts.map +1 -0
  57. package/dist/tools/handlers/chat.js +38 -0
  58. package/dist/tools/handlers/chat.js.map +1 -0
  59. package/dist/tools/handlers/combat.d.ts +11 -0
  60. package/dist/tools/handlers/combat.d.ts.map +1 -0
  61. package/dist/tools/handlers/combat.js +48 -0
  62. package/dist/tools/handlers/combat.js.map +1 -0
  63. package/dist/tools/handlers/diagnostics.d.ts +64 -0
  64. package/dist/tools/handlers/diagnostics.d.ts.map +1 -0
  65. package/dist/tools/handlers/diagnostics.js +182 -0
  66. package/dist/tools/handlers/diagnostics.js.map +1 -0
  67. package/dist/tools/handlers/dice.d.ts +39 -0
  68. package/dist/tools/handlers/dice.d.ts.map +1 -0
  69. package/dist/tools/handlers/dice.js +53 -0
  70. package/dist/tools/handlers/dice.js.map +1 -0
  71. package/dist/tools/handlers/generation.d.ts +44 -0
  72. package/dist/tools/handlers/generation.d.ts.map +1 -0
  73. package/dist/tools/handlers/generation.js +205 -0
  74. package/dist/tools/handlers/generation.js.map +1 -0
  75. package/dist/tools/handlers/items.d.ts +21 -0
  76. package/dist/tools/handlers/items.d.ts.map +1 -0
  77. package/dist/tools/handlers/items.js +50 -0
  78. package/dist/tools/handlers/items.js.map +1 -0
  79. package/dist/tools/handlers/journals.d.ts +22 -0
  80. package/dist/tools/handlers/journals.d.ts.map +1 -0
  81. package/dist/tools/handlers/journals.js +62 -0
  82. package/dist/tools/handlers/journals.js.map +1 -0
  83. package/dist/tools/handlers/resources.d.ts +13 -0
  84. package/dist/tools/handlers/resources.d.ts.map +1 -0
  85. package/dist/tools/handlers/resources.js +188 -0
  86. package/dist/tools/handlers/resources.js.map +1 -0
  87. package/dist/tools/handlers/scenes.d.ts +18 -0
  88. package/dist/tools/handlers/scenes.d.ts.map +1 -0
  89. package/dist/tools/handlers/scenes.js +34 -0
  90. package/dist/tools/handlers/scenes.js.map +1 -0
  91. package/dist/tools/handlers/users.d.ts +11 -0
  92. package/dist/tools/handlers/users.d.ts.map +1 -0
  93. package/dist/tools/handlers/users.js +34 -0
  94. package/dist/tools/handlers/users.js.map +1 -0
  95. package/dist/tools/handlers/utils.d.ts +11 -0
  96. package/dist/tools/handlers/utils.d.ts.map +1 -0
  97. package/dist/tools/handlers/utils.js +24 -0
  98. package/dist/tools/handlers/utils.js.map +1 -0
  99. package/dist/tools/handlers/world.d.ts +26 -0
  100. package/dist/tools/handlers/world.d.ts.map +1 -0
  101. package/dist/tools/handlers/world.js +92 -0
  102. package/dist/tools/handlers/world.js.map +1 -0
  103. package/dist/tools/index.d.ts +19 -0
  104. package/dist/tools/index.d.ts.map +1 -0
  105. package/dist/tools/index.js +22 -0
  106. package/dist/tools/index.js.map +1 -0
  107. package/dist/tools/new-router.d.ts +29 -0
  108. package/dist/tools/new-router.d.ts.map +1 -0
  109. package/dist/tools/new-router.js +97 -0
  110. package/dist/tools/new-router.js.map +1 -0
  111. package/dist/tools/registry.d.ts +51 -0
  112. package/dist/tools/registry.d.ts.map +1 -0
  113. package/dist/tools/registry.js +79 -0
  114. package/dist/tools/registry.js.map +1 -0
  115. package/dist/tools/resources.d.ts +16 -0
  116. package/dist/tools/resources.d.ts.map +1 -0
  117. package/dist/tools/resources.js +63 -0
  118. package/dist/tools/resources.js.map +1 -0
  119. package/dist/tools/router.d.ts +22 -0
  120. package/dist/tools/router.d.ts.map +1 -0
  121. package/dist/tools/router.js +128 -0
  122. package/dist/tools/router.js.map +1 -0
  123. package/dist/utils/cache-instance.d.ts +25 -0
  124. package/dist/utils/cache-instance.d.ts.map +1 -0
  125. package/dist/utils/cache-instance.js +30 -0
  126. package/dist/utils/cache-instance.js.map +1 -0
  127. package/dist/utils/cache.d.ts +80 -0
  128. package/dist/utils/cache.d.ts.map +1 -0
  129. package/dist/utils/cache.js +205 -0
  130. package/dist/utils/cache.js.map +1 -0
  131. package/dist/utils/diagnostics.d.ts +114 -0
  132. package/dist/utils/diagnostics.d.ts.map +1 -0
  133. package/dist/utils/diagnostics.js +330 -0
  134. package/dist/utils/diagnostics.js.map +1 -0
  135. package/dist/utils/logger.d.ts +137 -0
  136. package/dist/utils/logger.d.ts.map +1 -0
  137. package/dist/utils/logger.js +158 -0
  138. package/dist/utils/logger.js.map +1 -0
  139. package/package.json +98 -0
@@ -0,0 +1,314 @@
1
+ /**
2
+ * @fileoverview DiagnosticsClient for accessing FoundryVTT logs and system health
3
+ *
4
+ * This module provides a client interface for accessing diagnostic information
5
+ * from FoundryVTT through the REST API module's diagnostic endpoints.
6
+ *
7
+ * @version 0.1.0
8
+ * @author FoundryVTT MCP Team
9
+ */
10
+ import { logger } from '../utils/logger.js';
11
+ import { ErrorDiagnosisSchema, LogResponseSchema, LogSearchResponseSchema, SystemHealthSchema, } from './types.js';
12
+ /**
13
+ * Client for accessing FoundryVTT diagnostic and logging information
14
+ *
15
+ * Provides methods to retrieve logs, search for specific patterns,
16
+ * monitor system health, and analyze errors through the REST API.
17
+ *
18
+ * @class DiagnosticsClient
19
+ * @example
20
+ * ```typescript
21
+ * const diagnostics = new DiagnosticsClient(foundryClient);
22
+ *
23
+ * // Get recent errors
24
+ * const errors = await diagnostics.getRecentLogs({ level: 'error', lines: 20 });
25
+ *
26
+ * // Search for specific patterns
27
+ * const matches = await diagnostics.searchLogs({ pattern: 'TypeError', timeframe: '3600' });
28
+ *
29
+ * // Check system health
30
+ * const health = await diagnostics.getSystemHealth();
31
+ * ```
32
+ */
33
+ export class DiagnosticsClient {
34
+ foundryClient;
35
+ /**
36
+ * Create a new DiagnosticsClient instance
37
+ *
38
+ * @param foundryClient - The FoundryClient instance to use for API calls
39
+ */
40
+ constructor(foundryClient) {
41
+ this.foundryClient = foundryClient;
42
+ }
43
+ /**
44
+ * Get recent log entries with optional filtering
45
+ *
46
+ * @param params - Search parameters for filtering logs
47
+ * @returns Promise resolving to log response with entries and metadata
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * // Get last 50 log entries
52
+ * const logs = await diagnostics.getRecentLogs();
53
+ *
54
+ * // Get only error logs from the last hour
55
+ * const errors = await diagnostics.getRecentLogs({
56
+ * level: 'error',
57
+ * since: new Date(Date.now() - 3600000).toISOString()
58
+ * });
59
+ *
60
+ * // Get logs with stack traces included
61
+ * const detailed = await diagnostics.getRecentLogs({
62
+ * lines: 100,
63
+ * includeStack: true
64
+ * });
65
+ * ```
66
+ */
67
+ async getRecentLogs(params = {}) {
68
+ try {
69
+ logger.debug('DiagnosticsClient | Getting recent logs', params);
70
+ const searchParams = new URLSearchParams();
71
+ if (params.lines !== undefined) {
72
+ searchParams.set('lines', params.lines.toString());
73
+ }
74
+ if (params.level) {
75
+ searchParams.set('level', params.level);
76
+ }
77
+ if (params.since) {
78
+ searchParams.set('since', params.since);
79
+ }
80
+ if (params.source) {
81
+ searchParams.set('source', params.source);
82
+ }
83
+ if (params.includeStack !== undefined) {
84
+ searchParams.set('includeStack', params.includeStack.toString());
85
+ }
86
+ const queryString = searchParams.toString();
87
+ const url = `/api/diagnostics/logs${queryString ? `?${queryString}` : ''}`;
88
+ const response = await this.foundryClient.get(url);
89
+ const parsed = LogResponseSchema.parse(response.data);
90
+ logger.debug('DiagnosticsClient | Retrieved logs', {
91
+ count: parsed.total,
92
+ bufferSize: parsed.bufferSize,
93
+ });
94
+ return parsed;
95
+ }
96
+ catch (error) {
97
+ logger.error('DiagnosticsClient | Failed to get recent logs:', error);
98
+ throw new Error(`Failed to retrieve recent logs: ${error instanceof Error ? error.message : 'Unknown error'}`);
99
+ }
100
+ }
101
+ /**
102
+ * Search log entries for specific patterns using regular expressions
103
+ *
104
+ * @param params - Search parameters including pattern and filters
105
+ * @returns Promise resolving to matching log entries
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Search for any TypeError occurrences
110
+ * const typeErrors = await diagnostics.searchLogs({
111
+ * pattern: 'TypeError'
112
+ * });
113
+ *
114
+ * // Search for network errors in the last hour
115
+ * const networkErrors = await diagnostics.searchLogs({
116
+ * pattern: 'Failed to fetch|Network Error',
117
+ * timeframe: '3600',
118
+ * level: 'error'
119
+ * });
120
+ *
121
+ * // Case-sensitive search for specific module errors
122
+ * const moduleErrors = await diagnostics.searchLogs({
123
+ * pattern: 'Module.*failed',
124
+ * caseSensitive: true
125
+ * });
126
+ * ```
127
+ */
128
+ async searchLogs(params) {
129
+ try {
130
+ logger.debug('DiagnosticsClient | Searching logs', params);
131
+ const searchParams = new URLSearchParams();
132
+ searchParams.set('pattern', params.pattern);
133
+ if (params.timeframe) {
134
+ searchParams.set('timeframe', params.timeframe);
135
+ }
136
+ if (params.level) {
137
+ searchParams.set('level', params.level);
138
+ }
139
+ if (params.caseSensitive !== undefined) {
140
+ searchParams.set('caseSensitive', params.caseSensitive.toString());
141
+ }
142
+ const url = `/api/diagnostics/search?${searchParams.toString()}`;
143
+ const response = await this.foundryClient.get(url);
144
+ const parsed = LogSearchResponseSchema.parse(response.data);
145
+ logger.debug('DiagnosticsClient | Search completed', {
146
+ pattern: params.pattern,
147
+ matches: parsed.matches,
148
+ });
149
+ return parsed;
150
+ }
151
+ catch (error) {
152
+ logger.error('DiagnosticsClient | Failed to search logs:', error);
153
+ throw new Error(`Failed to search logs: ${error instanceof Error ? error.message : 'Unknown error'}`);
154
+ }
155
+ }
156
+ /**
157
+ * Get comprehensive system health and performance metrics
158
+ *
159
+ * @returns Promise resolving to complete system health information
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const health = await diagnostics.getSystemHealth();
164
+ *
165
+ * console.log(`Server status: ${health.status}`);
166
+ * console.log(`Active users: ${health.users.active}/${health.users.total}`);
167
+ * console.log(`Recent errors: ${health.logs.recentErrors}`);
168
+ * console.log(`Health score: ${health.healthScore}%`);
169
+ *
170
+ * if (health.status === 'critical') {
171
+ * console.warn('Server requires immediate attention!');
172
+ * }
173
+ * ```
174
+ */
175
+ async getSystemHealth() {
176
+ try {
177
+ logger.debug('DiagnosticsClient | Getting system health');
178
+ const response = await this.foundryClient.get('/api/diagnostics/health');
179
+ const parsed = SystemHealthSchema.parse(response.data);
180
+ logger.debug('DiagnosticsClient | System health retrieved', {
181
+ status: parsed.status,
182
+ activeUsers: parsed.users?.active,
183
+ recentErrors: parsed.logs?.recentErrors,
184
+ });
185
+ return parsed;
186
+ }
187
+ catch (error) {
188
+ logger.error('DiagnosticsClient | Failed to get system health:', error);
189
+ throw new Error(`Failed to retrieve system health: ${error instanceof Error ? error.message : 'Unknown error'}`);
190
+ }
191
+ }
192
+ /**
193
+ * Analyze recent errors and get diagnostic suggestions
194
+ *
195
+ * @param timeframe - Time window in seconds to analyze (default: 3600)
196
+ * @returns Promise resolving to error diagnosis with suggestions
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * // Analyze errors from the last hour
201
+ * const diagnosis = await diagnostics.diagnoseErrors();
202
+ *
203
+ * // Analyze errors from the last 30 minutes
204
+ * const recentDiagnosis = await diagnostics.diagnoseErrors(1800);
205
+ *
206
+ * console.log(`Health score: ${diagnosis.healthScore}/100`);
207
+ * console.log(`Total errors: ${diagnosis.summary.totalErrors}`);
208
+ *
209
+ * // Display suggestions
210
+ * diagnosis.suggestions.forEach(suggestion => {
211
+ * console.log(`${suggestion.priority.toUpperCase()}: ${suggestion.suggestion}`);
212
+ * });
213
+ * ```
214
+ */
215
+ async diagnoseErrors(timeframe = 3600) {
216
+ try {
217
+ logger.debug('DiagnosticsClient | Diagnosing errors', { timeframe });
218
+ const searchParams = new URLSearchParams();
219
+ searchParams.set('timeframe', timeframe.toString());
220
+ const url = `/api/diagnostics/errors?${searchParams.toString()}`;
221
+ const response = await this.foundryClient.get(url);
222
+ const parsed = ErrorDiagnosisSchema.parse(response.data);
223
+ logger.debug('DiagnosticsClient | Error diagnosis completed', {
224
+ totalErrors: parsed.summary?.totalErrors,
225
+ healthScore: parsed.healthScore,
226
+ suggestionCount: parsed.suggestions?.length,
227
+ });
228
+ return parsed;
229
+ }
230
+ catch (error) {
231
+ logger.error('DiagnosticsClient | Failed to diagnose errors:', error);
232
+ throw new Error(`Failed to diagnose errors: ${error instanceof Error ? error.message : 'Unknown error'}`);
233
+ }
234
+ }
235
+ /**
236
+ * Get errors filtered by severity and time window
237
+ *
238
+ * @param timeframe - Time window in seconds (default: 3600)
239
+ * @param level - Log level to filter by (default: 'error')
240
+ * @returns Promise resolving to filtered log entries
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * // Get all errors from the last 2 hours
245
+ * const errors = await diagnostics.getErrorsOnly(7200);
246
+ *
247
+ * // Get warnings from the last 30 minutes
248
+ * const warnings = await diagnostics.getErrorsOnly(1800, 'warn');
249
+ * ```
250
+ */
251
+ async getErrorsOnly(timeframe = 3600, level = 'error') {
252
+ try {
253
+ const since = new Date(Date.now() - timeframe * 1000).toISOString();
254
+ const response = await this.getRecentLogs({
255
+ level,
256
+ since,
257
+ lines: 1000, // Get a large number to ensure we capture all errors
258
+ includeStack: true,
259
+ });
260
+ return response.logs;
261
+ }
262
+ catch (error) {
263
+ logger.error('DiagnosticsClient | Failed to get errors only:', error);
264
+ throw new Error(`Failed to retrieve ${level} logs: ${error instanceof Error ? error.message : 'Unknown error'}`);
265
+ }
266
+ }
267
+ /**
268
+ * Monitor system health and return status summary
269
+ *
270
+ * @returns Promise resolving to simplified health status
271
+ *
272
+ * @example
273
+ * ```typescript
274
+ * const status = await diagnostics.getHealthStatus();
275
+ * // Returns: { status: 'healthy' | 'warning' | 'critical', score: number }
276
+ * ```
277
+ */
278
+ async getHealthStatus() {
279
+ try {
280
+ const health = await this.getSystemHealth();
281
+ return {
282
+ status: health.status,
283
+ };
284
+ }
285
+ catch (error) {
286
+ logger.error('DiagnosticsClient | Failed to get health status:', error);
287
+ return { status: 'critical' };
288
+ }
289
+ }
290
+ /**
291
+ * Check if diagnostics API is available
292
+ *
293
+ * @returns Promise resolving to boolean indicating availability
294
+ *
295
+ * @example
296
+ * ```typescript
297
+ * const available = await diagnostics.isAvailable();
298
+ * if (!available) {
299
+ * console.log('Diagnostics API not available - check module installation');
300
+ * }
301
+ * ```
302
+ */
303
+ async isAvailable() {
304
+ try {
305
+ await this.foundryClient.get('/api/diagnostics/health');
306
+ return true;
307
+ }
308
+ catch (error) {
309
+ logger.debug('DiagnosticsClient | Diagnostics API not available:', error);
310
+ return false;
311
+ }
312
+ }
313
+ }
314
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/diagnostics/client.ts"],"names":[],"mappings":"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"}