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.
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/character/manager.d.ts +92 -0
- package/dist/character/manager.d.ts.map +1 -0
- package/dist/character/manager.js +208 -0
- package/dist/character/manager.js.map +1 -0
- package/dist/combat/manager.d.ts +94 -0
- package/dist/combat/manager.d.ts.map +1 -0
- package/dist/combat/manager.js +373 -0
- package/dist/combat/manager.js.map +1 -0
- package/dist/config/index.d.ts +114 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +177 -0
- package/dist/config/index.js.map +1 -0
- package/dist/diagnostics/client.d.ts +193 -0
- package/dist/diagnostics/client.d.ts.map +1 -0
- package/dist/diagnostics/client.js +314 -0
- package/dist/diagnostics/client.js.map +1 -0
- package/dist/diagnostics/types.d.ts +414 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +94 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/foundry/auth.d.ts +19 -0
- package/dist/foundry/auth.d.ts.map +1 -0
- package/dist/foundry/auth.js +135 -0
- package/dist/foundry/auth.js.map +1 -0
- package/dist/foundry/client.d.ts +95 -0
- package/dist/foundry/client.d.ts.map +1 -0
- package/dist/foundry/client.js +692 -0
- package/dist/foundry/client.js.map +1 -0
- package/dist/foundry/types.d.ts +805 -0
- package/dist/foundry/types.d.ts.map +1 -0
- package/dist/foundry/types.js +13 -0
- package/dist/foundry/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +3 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +93 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/base.d.ts +80 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +73 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/definitions.d.ts +414 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +429 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers/actors.d.ts +31 -0
- package/dist/tools/handlers/actors.d.ts.map +1 -0
- package/dist/tools/handlers/actors.js +76 -0
- package/dist/tools/handlers/actors.js.map +1 -0
- package/dist/tools/handlers/chat.d.ts +13 -0
- package/dist/tools/handlers/chat.d.ts.map +1 -0
- package/dist/tools/handlers/chat.js +38 -0
- package/dist/tools/handlers/chat.js.map +1 -0
- package/dist/tools/handlers/combat.d.ts +11 -0
- package/dist/tools/handlers/combat.d.ts.map +1 -0
- package/dist/tools/handlers/combat.js +48 -0
- package/dist/tools/handlers/combat.js.map +1 -0
- package/dist/tools/handlers/diagnostics.d.ts +64 -0
- package/dist/tools/handlers/diagnostics.d.ts.map +1 -0
- package/dist/tools/handlers/diagnostics.js +182 -0
- package/dist/tools/handlers/diagnostics.js.map +1 -0
- package/dist/tools/handlers/dice.d.ts +39 -0
- package/dist/tools/handlers/dice.d.ts.map +1 -0
- package/dist/tools/handlers/dice.js +53 -0
- package/dist/tools/handlers/dice.js.map +1 -0
- package/dist/tools/handlers/generation.d.ts +44 -0
- package/dist/tools/handlers/generation.d.ts.map +1 -0
- package/dist/tools/handlers/generation.js +205 -0
- package/dist/tools/handlers/generation.js.map +1 -0
- package/dist/tools/handlers/items.d.ts +21 -0
- package/dist/tools/handlers/items.d.ts.map +1 -0
- package/dist/tools/handlers/items.js +50 -0
- package/dist/tools/handlers/items.js.map +1 -0
- package/dist/tools/handlers/journals.d.ts +22 -0
- package/dist/tools/handlers/journals.d.ts.map +1 -0
- package/dist/tools/handlers/journals.js +62 -0
- package/dist/tools/handlers/journals.js.map +1 -0
- package/dist/tools/handlers/resources.d.ts +13 -0
- package/dist/tools/handlers/resources.d.ts.map +1 -0
- package/dist/tools/handlers/resources.js +188 -0
- package/dist/tools/handlers/resources.js.map +1 -0
- package/dist/tools/handlers/scenes.d.ts +18 -0
- package/dist/tools/handlers/scenes.d.ts.map +1 -0
- package/dist/tools/handlers/scenes.js +34 -0
- package/dist/tools/handlers/scenes.js.map +1 -0
- package/dist/tools/handlers/users.d.ts +11 -0
- package/dist/tools/handlers/users.d.ts.map +1 -0
- package/dist/tools/handlers/users.js +34 -0
- package/dist/tools/handlers/users.js.map +1 -0
- package/dist/tools/handlers/utils.d.ts +11 -0
- package/dist/tools/handlers/utils.d.ts.map +1 -0
- package/dist/tools/handlers/utils.js +24 -0
- package/dist/tools/handlers/utils.js.map +1 -0
- package/dist/tools/handlers/world.d.ts +26 -0
- package/dist/tools/handlers/world.d.ts.map +1 -0
- package/dist/tools/handlers/world.js +92 -0
- package/dist/tools/handlers/world.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +22 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/new-router.d.ts +29 -0
- package/dist/tools/new-router.d.ts.map +1 -0
- package/dist/tools/new-router.js +97 -0
- package/dist/tools/new-router.js.map +1 -0
- package/dist/tools/registry.d.ts +51 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +79 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/resources.d.ts +16 -0
- package/dist/tools/resources.d.ts.map +1 -0
- package/dist/tools/resources.js +63 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/router.d.ts +22 -0
- package/dist/tools/router.d.ts.map +1 -0
- package/dist/tools/router.js +128 -0
- package/dist/tools/router.js.map +1 -0
- package/dist/utils/cache-instance.d.ts +25 -0
- package/dist/utils/cache-instance.d.ts.map +1 -0
- package/dist/utils/cache-instance.js +30 -0
- package/dist/utils/cache-instance.js.map +1 -0
- package/dist/utils/cache.d.ts +80 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +205 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/diagnostics.d.ts +114 -0
- package/dist/utils/diagnostics.d.ts.map +1 -0
- package/dist/utils/diagnostics.js +330 -0
- package/dist/utils/diagnostics.js.map +1 -0
- package/dist/utils/logger.d.ts +137 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +158 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Global cache instance singleton
|
|
3
|
+
*
|
|
4
|
+
* This module provides a singleton cache instance that's configured
|
|
5
|
+
* from the application configuration.
|
|
6
|
+
*/
|
|
7
|
+
import { config } from '../config/index.js';
|
|
8
|
+
import { CacheService } from './cache.js';
|
|
9
|
+
/**
|
|
10
|
+
* Global cache instance
|
|
11
|
+
* Initialized with configuration from config system
|
|
12
|
+
*/
|
|
13
|
+
export const cache = new CacheService(config?.cache || {
|
|
14
|
+
enabled: false,
|
|
15
|
+
ttlSeconds: 300,
|
|
16
|
+
maxSize: 1000,
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Cache key generators for consistent naming
|
|
20
|
+
*/
|
|
21
|
+
export const CacheKeys = {
|
|
22
|
+
worldInfo: () => 'world:info',
|
|
23
|
+
actor: (id) => `actor:${id}`,
|
|
24
|
+
actorSearch: (query, type, limit) => `actor:search:${query}:${type || 'all'}:${limit || 10}`,
|
|
25
|
+
item: (id) => `item:${id}`,
|
|
26
|
+
itemSearch: (query, type, rarity, limit) => `item:search:${query}:${type || 'all'}:${rarity || 'all'}:${limit || 10}`,
|
|
27
|
+
scene: (id) => (id ? `scene:${id}` : 'scene:current'),
|
|
28
|
+
rule: (query, system) => `rule:${query}:${system || 'default'}`,
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=cache-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-instance.js","sourceRoot":"","sources":["../../src/utils/cache-instance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,CACnC,MAAM,EAAE,KAAK,IAAI;IACf,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,IAAI;CACd,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY;IAC7B,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE;IACpC,WAAW,EAAE,CAAC,KAAa,EAAE,IAAa,EAAE,KAAc,EAAE,EAAE,CAC5D,gBAAgB,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE;IACzD,IAAI,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE;IAClC,UAAU,EAAE,CAAC,KAAa,EAAE,IAAa,EAAE,MAAe,EAAE,KAAc,EAAE,EAAE,CAC5E,eAAe,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE;IAC3E,KAAK,EAAE,CAAC,EAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAC9D,IAAI,EAAE,CAAC,KAAa,EAAE,MAAe,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,MAAM,IAAI,SAAS,EAAE;CACxE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Caching utility with TTL (Time To Live) support
|
|
3
|
+
*
|
|
4
|
+
* This module provides a simple in-memory cache with automatic expiration
|
|
5
|
+
* and configurable size limits to improve performance for quasi-static data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cache statistics for monitoring
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheStats {
|
|
11
|
+
hits: number;
|
|
12
|
+
misses: number;
|
|
13
|
+
hitRate: number;
|
|
14
|
+
size: number;
|
|
15
|
+
maxSize: number;
|
|
16
|
+
evictions: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Cache configuration options
|
|
20
|
+
*/
|
|
21
|
+
export interface CacheConfig {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
ttlSeconds: number;
|
|
24
|
+
maxSize: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Simple in-memory cache with TTL and LRU eviction
|
|
28
|
+
*/
|
|
29
|
+
export declare class CacheService {
|
|
30
|
+
private config;
|
|
31
|
+
private cache;
|
|
32
|
+
private stats;
|
|
33
|
+
private cleanupInterval;
|
|
34
|
+
constructor(config: CacheConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Get a value from the cache
|
|
37
|
+
*/
|
|
38
|
+
get<T>(key: string): T | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Set a value in the cache with custom TTL
|
|
41
|
+
*/
|
|
42
|
+
set<T>(key: string, value: T, customTtlSeconds?: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Delete a specific key from the cache
|
|
45
|
+
*/
|
|
46
|
+
delete(key: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Clear all entries from the cache
|
|
49
|
+
*/
|
|
50
|
+
clear(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get or set a value using a factory function
|
|
53
|
+
*/
|
|
54
|
+
getOrSet<T>(key: string, factory: () => Promise<T>, customTtlSeconds?: number): Promise<T>;
|
|
55
|
+
/**
|
|
56
|
+
* Get cache statistics
|
|
57
|
+
*/
|
|
58
|
+
getStats(): CacheStats;
|
|
59
|
+
/**
|
|
60
|
+
* Check if cache is enabled
|
|
61
|
+
*/
|
|
62
|
+
isEnabled(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Destroy the cache service and release resources
|
|
65
|
+
*/
|
|
66
|
+
destroy(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get cache keys (for debugging)
|
|
69
|
+
*/
|
|
70
|
+
getKeys(): string[];
|
|
71
|
+
/**
|
|
72
|
+
* Cleanup expired entries
|
|
73
|
+
*/
|
|
74
|
+
private cleanup;
|
|
75
|
+
/**
|
|
76
|
+
* Evict least recently used entry
|
|
77
|
+
*/
|
|
78
|
+
private evictLeastRecentlyUsed;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,YAAY;IASX,OAAO,CAAC,MAAM;IAR1B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,KAAK,CAIX;IACF,OAAO,CAAC,eAAe,CAA6C;gBAEhD,MAAM,EAAE,WAAW;IAqBvC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IA+BlC;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI;IAyB9D;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ5B;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACG,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAehG;;OAEG;IACH,QAAQ,IAAI,UAAU;IActB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;OAEG;IACH,OAAO,CAAC,OAAO;IAmBf;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAqB/B"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Caching utility with TTL (Time To Live) support
|
|
3
|
+
*
|
|
4
|
+
* This module provides a simple in-memory cache with automatic expiration
|
|
5
|
+
* and configurable size limits to improve performance for quasi-static data.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Simple in-memory cache with TTL and LRU eviction
|
|
10
|
+
*/
|
|
11
|
+
export class CacheService {
|
|
12
|
+
config;
|
|
13
|
+
cache = new Map();
|
|
14
|
+
stats = {
|
|
15
|
+
hits: 0,
|
|
16
|
+
misses: 0,
|
|
17
|
+
evictions: 0,
|
|
18
|
+
};
|
|
19
|
+
cleanupInterval;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
if (config.enabled) {
|
|
23
|
+
logger.info('Cache service initialized', {
|
|
24
|
+
ttlSeconds: config.ttlSeconds,
|
|
25
|
+
maxSize: config.maxSize,
|
|
26
|
+
});
|
|
27
|
+
// Clean up expired entries periodically
|
|
28
|
+
this.cleanupInterval = setInterval(() => {
|
|
29
|
+
try {
|
|
30
|
+
this.cleanup();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
logger.warn('Cache cleanup error', { error: err instanceof Error ? err.message : err });
|
|
34
|
+
}
|
|
35
|
+
}, Math.max((config.ttlSeconds * 1000) / 4, 30000));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a value from the cache
|
|
40
|
+
*/
|
|
41
|
+
get(key) {
|
|
42
|
+
if (!this.config.enabled) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const entry = this.cache.get(key);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
this.stats.misses++;
|
|
48
|
+
logger.debug('Cache miss', { key });
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
// Check if entry has expired
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
if (now - entry.timestamp > entry.ttl * 1000) {
|
|
54
|
+
this.cache.delete(key);
|
|
55
|
+
this.stats.misses++;
|
|
56
|
+
logger.debug('Cache expired', { key, age: now - entry.timestamp });
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
// Update access metadata
|
|
60
|
+
entry.accessCount++;
|
|
61
|
+
entry.lastAccessed = now;
|
|
62
|
+
this.stats.hits++;
|
|
63
|
+
logger.debug('Cache hit', { key, accessCount: entry.accessCount });
|
|
64
|
+
return entry.value;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Set a value in the cache with custom TTL
|
|
68
|
+
*/
|
|
69
|
+
set(key, value, customTtlSeconds) {
|
|
70
|
+
if (!this.config.enabled) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const ttl = customTtlSeconds ?? this.config.ttlSeconds;
|
|
74
|
+
const now = Date.now();
|
|
75
|
+
// Ensure cache doesn't exceed max size
|
|
76
|
+
if (this.cache.size >= this.config.maxSize && !this.cache.has(key)) {
|
|
77
|
+
this.evictLeastRecentlyUsed();
|
|
78
|
+
}
|
|
79
|
+
const entry = {
|
|
80
|
+
value,
|
|
81
|
+
timestamp: now,
|
|
82
|
+
ttl,
|
|
83
|
+
accessCount: 0,
|
|
84
|
+
lastAccessed: now,
|
|
85
|
+
};
|
|
86
|
+
this.cache.set(key, entry);
|
|
87
|
+
logger.debug('Cache set', { key, ttl, size: this.cache.size });
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete a specific key from the cache
|
|
91
|
+
*/
|
|
92
|
+
delete(key) {
|
|
93
|
+
const deleted = this.cache.delete(key);
|
|
94
|
+
if (deleted) {
|
|
95
|
+
logger.debug('Cache deleted', { key });
|
|
96
|
+
}
|
|
97
|
+
return deleted;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clear all entries from the cache
|
|
101
|
+
*/
|
|
102
|
+
clear() {
|
|
103
|
+
const size = this.cache.size;
|
|
104
|
+
this.cache.clear();
|
|
105
|
+
this.stats.hits = 0;
|
|
106
|
+
this.stats.misses = 0;
|
|
107
|
+
this.stats.evictions = 0;
|
|
108
|
+
logger.info('Cache cleared', { previousSize: size });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get or set a value using a factory function
|
|
112
|
+
*/
|
|
113
|
+
async getOrSet(key, factory, customTtlSeconds) {
|
|
114
|
+
if (!this.config.enabled) {
|
|
115
|
+
return await factory();
|
|
116
|
+
}
|
|
117
|
+
const cached = this.get(key);
|
|
118
|
+
if (cached !== undefined) {
|
|
119
|
+
return cached;
|
|
120
|
+
}
|
|
121
|
+
const value = await factory();
|
|
122
|
+
this.set(key, value, customTtlSeconds);
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get cache statistics
|
|
127
|
+
*/
|
|
128
|
+
getStats() {
|
|
129
|
+
const total = this.stats.hits + this.stats.misses;
|
|
130
|
+
const hitRate = total > 0 ? this.stats.hits / total : 0;
|
|
131
|
+
return {
|
|
132
|
+
hits: this.stats.hits,
|
|
133
|
+
misses: this.stats.misses,
|
|
134
|
+
hitRate: Math.round(hitRate * 100) / 100,
|
|
135
|
+
size: this.cache.size,
|
|
136
|
+
maxSize: this.config.maxSize,
|
|
137
|
+
evictions: this.stats.evictions,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Check if cache is enabled
|
|
142
|
+
*/
|
|
143
|
+
isEnabled() {
|
|
144
|
+
return this.config.enabled;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Destroy the cache service and release resources
|
|
148
|
+
*/
|
|
149
|
+
destroy() {
|
|
150
|
+
if (this.cleanupInterval) {
|
|
151
|
+
clearInterval(this.cleanupInterval);
|
|
152
|
+
this.cleanupInterval = undefined;
|
|
153
|
+
}
|
|
154
|
+
this.cache.clear();
|
|
155
|
+
logger.info('Cache service destroyed');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get cache keys (for debugging)
|
|
159
|
+
*/
|
|
160
|
+
getKeys() {
|
|
161
|
+
return Array.from(this.cache.keys());
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Cleanup expired entries
|
|
165
|
+
*/
|
|
166
|
+
cleanup() {
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
let cleaned = 0;
|
|
169
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
170
|
+
if (now - entry.timestamp > entry.ttl * 1000) {
|
|
171
|
+
this.cache.delete(key);
|
|
172
|
+
cleaned++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (cleaned > 0) {
|
|
176
|
+
logger.debug('Cache cleanup completed', {
|
|
177
|
+
cleaned,
|
|
178
|
+
remaining: this.cache.size,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Evict least recently used entry
|
|
184
|
+
*/
|
|
185
|
+
evictLeastRecentlyUsed() {
|
|
186
|
+
let lruKey;
|
|
187
|
+
let lruTime = Date.now(); // Start with current time
|
|
188
|
+
// Find the entry with the oldest lastAccessed time
|
|
189
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
190
|
+
if (entry.lastAccessed <= lruTime) {
|
|
191
|
+
lruTime = entry.lastAccessed;
|
|
192
|
+
lruKey = key;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (lruKey) {
|
|
196
|
+
this.cache.delete(lruKey);
|
|
197
|
+
this.stats.evictions++;
|
|
198
|
+
logger.debug('Cache evicted LRU entry', {
|
|
199
|
+
key: lruKey,
|
|
200
|
+
age: Date.now() - lruTime,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Diagnostic utilities for enhanced user experience
|
|
3
|
+
*
|
|
4
|
+
* Provides smart error analysis, problem detection, and actionable suggestions
|
|
5
|
+
* to help users troubleshoot and resolve common issues.
|
|
6
|
+
*/
|
|
7
|
+
import type { FoundryClient } from '../foundry/client.js';
|
|
8
|
+
/**
|
|
9
|
+
* Diagnostic result containing problem analysis and suggestions
|
|
10
|
+
*/
|
|
11
|
+
export interface DiagnosticResult {
|
|
12
|
+
/** Brief explanation of the issue */
|
|
13
|
+
explanation: string;
|
|
14
|
+
/** Actionable suggestions for resolution */
|
|
15
|
+
suggestions: string;
|
|
16
|
+
/** Severity level of the issue */
|
|
17
|
+
severity: 'info' | 'warning' | 'error' | 'critical';
|
|
18
|
+
/** Whether the feature can function with limitations */
|
|
19
|
+
canContinue: boolean;
|
|
20
|
+
/** Link to relevant documentation */
|
|
21
|
+
documentationUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Health check report for system status
|
|
25
|
+
*/
|
|
26
|
+
export interface HealthReport {
|
|
27
|
+
connectivity: {
|
|
28
|
+
status: 'connected' | 'limited' | 'offline';
|
|
29
|
+
emoji: string;
|
|
30
|
+
details: string;
|
|
31
|
+
};
|
|
32
|
+
authentication: {
|
|
33
|
+
method: 'api-key' | 'credentials' | 'none';
|
|
34
|
+
status: 'valid' | 'invalid' | 'untested';
|
|
35
|
+
emoji: string;
|
|
36
|
+
};
|
|
37
|
+
features: {
|
|
38
|
+
diceRolling: boolean;
|
|
39
|
+
actorSearch: boolean;
|
|
40
|
+
itemSearch: boolean;
|
|
41
|
+
sceneData: boolean;
|
|
42
|
+
diagnostics: boolean;
|
|
43
|
+
};
|
|
44
|
+
restApiAvailable: boolean;
|
|
45
|
+
websocketAvailable: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Enhanced diagnostic system for FoundryVTT MCP integration
|
|
49
|
+
*/
|
|
50
|
+
export declare class DiagnosticSystem {
|
|
51
|
+
private foundryClient;
|
|
52
|
+
constructor(foundryClient: FoundryClient);
|
|
53
|
+
/**
|
|
54
|
+
* Diagnose why a specific feature isn't working
|
|
55
|
+
*/
|
|
56
|
+
diagnoseFeatureProblem(feature: 'actors' | 'items' | 'scenes' | 'diagnostics'): Promise<DiagnosticResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Perform comprehensive health check
|
|
59
|
+
*/
|
|
60
|
+
performHealthCheck(): Promise<HealthReport>;
|
|
61
|
+
/**
|
|
62
|
+
* Format health report for user display
|
|
63
|
+
*/
|
|
64
|
+
formatHealthReport(report: HealthReport): string;
|
|
65
|
+
/**
|
|
66
|
+
* Create diagnostic for connectivity issues
|
|
67
|
+
*/
|
|
68
|
+
private createConnectivityDiagnostic;
|
|
69
|
+
/**
|
|
70
|
+
* Create diagnostic for REST API issues
|
|
71
|
+
*/
|
|
72
|
+
private createRestApiDiagnostic;
|
|
73
|
+
/**
|
|
74
|
+
* Create diagnostic for authentication issues
|
|
75
|
+
*/
|
|
76
|
+
private createAuthenticationDiagnostic;
|
|
77
|
+
/**
|
|
78
|
+
* Create feature-specific diagnostic
|
|
79
|
+
*/
|
|
80
|
+
private createFeatureSpecificDiagnostic;
|
|
81
|
+
/**
|
|
82
|
+
* Create generic error diagnostic
|
|
83
|
+
*/
|
|
84
|
+
private createGenericErrorDiagnostic;
|
|
85
|
+
/**
|
|
86
|
+
* Test if feature requires REST API
|
|
87
|
+
*/
|
|
88
|
+
private requiresRestApi;
|
|
89
|
+
/**
|
|
90
|
+
* Test REST API availability
|
|
91
|
+
*/
|
|
92
|
+
private testRestApiAvailability;
|
|
93
|
+
/**
|
|
94
|
+
* Test authentication
|
|
95
|
+
*/
|
|
96
|
+
private testAuthentication;
|
|
97
|
+
/**
|
|
98
|
+
* Test dice rolling functionality
|
|
99
|
+
*/
|
|
100
|
+
private testDiceRolling;
|
|
101
|
+
/**
|
|
102
|
+
* Test actor search functionality
|
|
103
|
+
*/
|
|
104
|
+
private testActorSearch;
|
|
105
|
+
/**
|
|
106
|
+
* Test item search functionality
|
|
107
|
+
*/
|
|
108
|
+
private testItemSearch;
|
|
109
|
+
/**
|
|
110
|
+
* Test scene data functionality
|
|
111
|
+
*/
|
|
112
|
+
private testSceneData;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IACpD,wDAAwD;IACxD,WAAW,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE;QACZ,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;QAC5C,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,EAAE;QACd,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;QAC3C,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEhD;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,GACrD,OAAO,CAAC,gBAAgB,CAAC;IAiC5B;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;IAyEjD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAqChD;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAepC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAwBtC;;OAEG;YACW,+BAA+B;IAe7C;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAcpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;YACW,uBAAuB;IAcrC;;OAEG;YACW,kBAAkB;IAmBhC;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,cAAc;IAU5B;;OAEG;YACW,aAAa;CAS5B"}
|