@elliotding/ai-agent-mcp 0.1.26 → 0.1.28

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 (186) hide show
  1. package/README.md +330 -30
  2. package/dist/api/cached-client.d.ts +48 -0
  3. package/dist/api/cached-client.d.ts.map +1 -0
  4. package/dist/api/cached-client.js +126 -0
  5. package/dist/api/cached-client.js.map +1 -0
  6. package/dist/api/client.d.ts +295 -0
  7. package/dist/api/client.d.ts.map +1 -0
  8. package/dist/api/client.js +385 -0
  9. package/dist/api/client.js.map +1 -0
  10. package/dist/auth/index.d.ts +8 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +26 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/middleware.d.ts +36 -0
  15. package/dist/auth/middleware.d.ts.map +1 -0
  16. package/dist/auth/middleware.js +194 -0
  17. package/dist/auth/middleware.js.map +1 -0
  18. package/dist/auth/permissions.d.ts +60 -0
  19. package/dist/auth/permissions.d.ts.map +1 -0
  20. package/dist/auth/permissions.js +262 -0
  21. package/dist/auth/permissions.js.map +1 -0
  22. package/dist/auth/token-validator.d.ts +52 -0
  23. package/dist/auth/token-validator.d.ts.map +1 -0
  24. package/dist/auth/token-validator.js +215 -0
  25. package/dist/auth/token-validator.js.map +1 -0
  26. package/dist/cache/cache-manager.d.ts +49 -0
  27. package/dist/cache/cache-manager.d.ts.map +1 -0
  28. package/dist/cache/cache-manager.js +191 -0
  29. package/dist/cache/cache-manager.js.map +1 -0
  30. package/dist/cache/index.d.ts +6 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +12 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/redis-client.d.ts +45 -0
  35. package/dist/cache/redis-client.d.ts.map +1 -0
  36. package/dist/cache/redis-client.js +210 -0
  37. package/dist/cache/redis-client.js.map +1 -0
  38. package/dist/config/constants.d.ts +28 -0
  39. package/dist/config/constants.d.ts.map +1 -0
  40. package/dist/config/constants.js +31 -0
  41. package/dist/config/constants.js.map +1 -0
  42. package/dist/config/index.d.ts +71 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +190 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/filesystem/manager.d.ts +45 -0
  47. package/dist/filesystem/manager.d.ts.map +1 -0
  48. package/dist/filesystem/manager.js +246 -0
  49. package/dist/filesystem/manager.js.map +1 -0
  50. package/dist/git/multi-source-manager.d.ts +105 -0
  51. package/dist/git/multi-source-manager.d.ts.map +1 -0
  52. package/dist/git/multi-source-manager.js +677 -0
  53. package/dist/git/multi-source-manager.js.map +1 -0
  54. package/dist/git/operations.d.ts +27 -0
  55. package/dist/git/operations.d.ts.map +1 -0
  56. package/dist/git/operations.js +83 -0
  57. package/dist/git/operations.js.map +1 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +122 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/monitoring/health.d.ts +35 -0
  63. package/dist/monitoring/health.d.ts.map +1 -0
  64. package/dist/monitoring/health.js +105 -0
  65. package/dist/monitoring/health.js.map +1 -0
  66. package/dist/prompts/cache.d.ts +69 -0
  67. package/dist/prompts/cache.d.ts.map +1 -0
  68. package/dist/prompts/cache.js +163 -0
  69. package/dist/prompts/cache.js.map +1 -0
  70. package/dist/prompts/generator.d.ts +49 -0
  71. package/dist/prompts/generator.d.ts.map +1 -0
  72. package/dist/prompts/generator.js +160 -0
  73. package/dist/prompts/generator.js.map +1 -0
  74. package/dist/prompts/index.d.ts +13 -0
  75. package/dist/prompts/index.d.ts.map +1 -0
  76. package/dist/prompts/index.js +24 -0
  77. package/dist/prompts/index.js.map +1 -0
  78. package/dist/prompts/manager.d.ts +213 -0
  79. package/dist/prompts/manager.d.ts.map +1 -0
  80. package/dist/prompts/manager.js +587 -0
  81. package/dist/prompts/manager.js.map +1 -0
  82. package/dist/resources/index.d.ts +6 -0
  83. package/dist/resources/index.d.ts.map +1 -0
  84. package/dist/resources/index.js +10 -0
  85. package/dist/resources/index.js.map +1 -0
  86. package/dist/resources/loader.d.ts +88 -0
  87. package/dist/resources/loader.d.ts.map +1 -0
  88. package/dist/resources/loader.js +492 -0
  89. package/dist/resources/loader.js.map +1 -0
  90. package/dist/server/http.d.ts +57 -0
  91. package/dist/server/http.d.ts.map +1 -0
  92. package/dist/server/http.js +435 -0
  93. package/dist/server/http.js.map +1 -0
  94. package/dist/server.d.ts +13 -0
  95. package/dist/server.d.ts.map +1 -0
  96. package/dist/server.js +201 -0
  97. package/dist/server.js.map +1 -0
  98. package/dist/session/manager.d.ts +91 -0
  99. package/dist/session/manager.d.ts.map +1 -0
  100. package/dist/session/manager.js +251 -0
  101. package/dist/session/manager.js.map +1 -0
  102. package/dist/telemetry/index.d.ts +3 -0
  103. package/dist/telemetry/index.d.ts.map +1 -0
  104. package/dist/telemetry/index.js +7 -0
  105. package/dist/telemetry/index.js.map +1 -0
  106. package/dist/telemetry/manager.d.ts +151 -0
  107. package/dist/telemetry/manager.d.ts.map +1 -0
  108. package/dist/telemetry/manager.js +367 -0
  109. package/dist/telemetry/manager.js.map +1 -0
  110. package/dist/tools/index.d.ts +13 -0
  111. package/dist/tools/index.d.ts.map +1 -0
  112. package/dist/tools/index.js +29 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/manage-subscription.d.ts +47 -0
  115. package/dist/tools/manage-subscription.d.ts.map +1 -0
  116. package/dist/tools/manage-subscription.js +317 -0
  117. package/dist/tools/manage-subscription.js.map +1 -0
  118. package/dist/tools/registry.d.ts +40 -0
  119. package/dist/tools/registry.d.ts.map +1 -0
  120. package/dist/tools/registry.js +85 -0
  121. package/dist/tools/registry.js.map +1 -0
  122. package/dist/tools/resolve-prompt-content.d.ts +35 -0
  123. package/dist/tools/resolve-prompt-content.d.ts.map +1 -0
  124. package/dist/tools/resolve-prompt-content.js +99 -0
  125. package/dist/tools/resolve-prompt-content.js.map +1 -0
  126. package/dist/tools/search-resources.d.ts +35 -0
  127. package/dist/tools/search-resources.d.ts.map +1 -0
  128. package/dist/tools/search-resources.js +159 -0
  129. package/dist/tools/search-resources.js.map +1 -0
  130. package/dist/tools/sync-resources.d.ts +54 -0
  131. package/dist/tools/sync-resources.d.ts.map +1 -0
  132. package/dist/tools/sync-resources.js +793 -0
  133. package/dist/tools/sync-resources.js.map +1 -0
  134. package/dist/tools/track-usage.d.ts +63 -0
  135. package/dist/tools/track-usage.d.ts.map +1 -0
  136. package/dist/tools/track-usage.js +90 -0
  137. package/dist/tools/track-usage.js.map +1 -0
  138. package/dist/tools/uninstall-resource.d.ts +30 -0
  139. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  140. package/dist/tools/uninstall-resource.js +186 -0
  141. package/dist/tools/uninstall-resource.js.map +1 -0
  142. package/dist/tools/upload-resource.d.ts +81 -0
  143. package/dist/tools/upload-resource.d.ts.map +1 -0
  144. package/dist/tools/upload-resource.js +393 -0
  145. package/dist/tools/upload-resource.js.map +1 -0
  146. package/dist/transport/sse.d.ts +29 -0
  147. package/dist/transport/sse.d.ts.map +1 -0
  148. package/dist/transport/sse.js +271 -0
  149. package/dist/transport/sse.js.map +1 -0
  150. package/dist/types/errors.d.ts +60 -0
  151. package/dist/types/errors.d.ts.map +1 -0
  152. package/dist/types/errors.js +112 -0
  153. package/dist/types/errors.js.map +1 -0
  154. package/dist/types/index.d.ts +7 -0
  155. package/dist/types/index.d.ts.map +1 -0
  156. package/dist/types/index.js +23 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/mcp.d.ts +50 -0
  159. package/dist/types/mcp.d.ts.map +1 -0
  160. package/dist/types/mcp.js +6 -0
  161. package/dist/types/mcp.js.map +1 -0
  162. package/dist/types/resources.d.ts +109 -0
  163. package/dist/types/resources.d.ts.map +1 -0
  164. package/dist/types/resources.js +7 -0
  165. package/dist/types/resources.js.map +1 -0
  166. package/dist/types/tools.d.ts +274 -0
  167. package/dist/types/tools.d.ts.map +1 -0
  168. package/dist/types/tools.js +6 -0
  169. package/dist/types/tools.js.map +1 -0
  170. package/dist/utils/cursor-paths.d.ts +84 -0
  171. package/dist/utils/cursor-paths.d.ts.map +1 -0
  172. package/dist/utils/cursor-paths.js +166 -0
  173. package/dist/utils/cursor-paths.js.map +1 -0
  174. package/dist/utils/log-cleaner.d.ts +18 -0
  175. package/dist/utils/log-cleaner.d.ts.map +1 -0
  176. package/dist/utils/log-cleaner.js +112 -0
  177. package/dist/utils/log-cleaner.js.map +1 -0
  178. package/dist/utils/logger.d.ts +59 -0
  179. package/dist/utils/logger.d.ts.map +1 -0
  180. package/dist/utils/logger.js +292 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/utils/validation.d.ts +58 -0
  183. package/dist/utils/validation.d.ts.map +1 -0
  184. package/dist/utils/validation.js +214 -0
  185. package/dist/utils/validation.js.map +1 -0
  186. package/package.json +1 -1
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Token Validation via CSP API
3
+ * Validates tokens by calling CSP /user/permissions endpoint
4
+ */
5
+ /**
6
+ * Token validation payload structure
7
+ */
8
+ export interface TokenPayload {
9
+ userId: string;
10
+ email: string;
11
+ groups: string[];
12
+ roles?: string[];
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Start cache cleanup interval
17
+ */
18
+ export declare function startCacheCleanup(): void;
19
+ /**
20
+ * Stop cache cleanup interval
21
+ */
22
+ export declare function stopCacheCleanup(): void;
23
+ /**
24
+ * Verify token by calling CSP API /user/permissions
25
+ * @param token - The JWT token to verify
26
+ * @returns Token payload if valid, null otherwise
27
+ */
28
+ export declare function verifyTokenViaAPI(token: string): Promise<TokenPayload | null>;
29
+ /**
30
+ * Verify token with caching
31
+ * Uses cached result if available to reduce API calls
32
+ * @param token - The token to verify
33
+ * @returns Token payload if valid, null otherwise
34
+ */
35
+ export declare function verifyToken(token: string): Promise<TokenPayload | null>;
36
+ /**
37
+ * Clear token from cache (e.g., after logout)
38
+ * @param token - The token to invalidate
39
+ */
40
+ export declare function invalidateToken(token: string): void;
41
+ /**
42
+ * Clear all cached tokens
43
+ */
44
+ export declare function clearTokenCache(): void;
45
+ /**
46
+ * Get cache statistics
47
+ */
48
+ export declare function getTokenCacheStats(): {
49
+ size: number;
50
+ tokens: string[];
51
+ };
52
+ //# sourceMappingURL=token-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-validator.d.ts","sourceRoot":"","sources":["../../src/auth/token-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA+CD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CASxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAKD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkGnF;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqD7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMnD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;EAMjC"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * Token Validation via CSP API
4
+ * Validates tokens by calling CSP /user/permissions endpoint
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.startCacheCleanup = startCacheCleanup;
8
+ exports.stopCacheCleanup = stopCacheCleanup;
9
+ exports.verifyTokenViaAPI = verifyTokenViaAPI;
10
+ exports.verifyToken = verifyToken;
11
+ exports.invalidateToken = invalidateToken;
12
+ exports.clearTokenCache = clearTokenCache;
13
+ exports.getTokenCacheStats = getTokenCacheStats;
14
+ const client_1 = require("../api/client");
15
+ const logger_1 = require("../utils/logger");
16
+ /**
17
+ * Token validation cache (in-memory, 5 minute TTL)
18
+ */
19
+ const tokenCache = new Map();
20
+ /**
21
+ * Cache cleanup interval reference (for cleanup on shutdown)
22
+ */
23
+ let cacheCleanupInterval = null;
24
+ /**
25
+ * Clean expired cache entries
26
+ */
27
+ function cleanExpiredCache() {
28
+ const now = Date.now();
29
+ let cleaned = 0;
30
+ for (const [token, entry] of tokenCache.entries()) {
31
+ if (entry.expireAt < now) {
32
+ tokenCache.delete(token);
33
+ cleaned++;
34
+ }
35
+ }
36
+ if (cleaned > 0) {
37
+ logger_1.logger.debug({ type: 'cache_cleanup', cleaned, remaining: tokenCache.size }, `Cleaned ${cleaned} expired token(s) from cache`);
38
+ }
39
+ }
40
+ /**
41
+ * Start cache cleanup interval
42
+ */
43
+ function startCacheCleanup() {
44
+ if (cacheCleanupInterval) {
45
+ logger_1.logger.warn('Cache cleanup interval already running');
46
+ return;
47
+ }
48
+ // Clean cache every minute
49
+ cacheCleanupInterval = setInterval(cleanExpiredCache, 60000);
50
+ logger_1.logger.info('Token cache cleanup interval started (60s)');
51
+ }
52
+ /**
53
+ * Stop cache cleanup interval
54
+ */
55
+ function stopCacheCleanup() {
56
+ if (cacheCleanupInterval) {
57
+ clearInterval(cacheCleanupInterval);
58
+ cacheCleanupInterval = null;
59
+ logger_1.logger.info('Token cache cleanup interval stopped');
60
+ }
61
+ }
62
+ // Start cleanup on module load
63
+ startCacheCleanup();
64
+ /**
65
+ * Verify token by calling CSP API /user/permissions
66
+ * @param token - The JWT token to verify
67
+ * @returns Token payload if valid, null otherwise
68
+ */
69
+ async function verifyTokenViaAPI(token) {
70
+ const tokenPreview = token.substring(0, 10) + '...' + token.substring(token.length - 10);
71
+ const startTime = Date.now();
72
+ try {
73
+ logger_1.logger.debug({
74
+ type: 'auth',
75
+ operation: 'verify_token_api',
76
+ tokenPreview,
77
+ timestamp: new Date().toISOString()
78
+ }, 'Calling CSP API /user/permissions to validate token');
79
+ // Call CSP API to validate the token presented in the SSE Authorization header.
80
+ const response = await client_1.apiClient.get('/csp/api/user/permissions', {
81
+ headers: {
82
+ 'Authorization': `Bearer ${token}`,
83
+ },
84
+ timeout: 5000, // 5 second timeout for auth check
85
+ });
86
+ const duration = Date.now() - startTime;
87
+ // Check response code (2000 means success)
88
+ if (response.code === 2000 && response.data) {
89
+ const payload = {
90
+ userId: response.data.user_id,
91
+ email: response.data.email,
92
+ groups: response.data.groups || [],
93
+ roles: response.data.groups || [], // Alias for backward compatibility
94
+ };
95
+ logger_1.logger.info({
96
+ type: 'auth',
97
+ operation: 'verify_token_api',
98
+ userId: payload.userId,
99
+ email: payload.email,
100
+ groups: payload.groups,
101
+ duration,
102
+ timestamp: new Date().toISOString()
103
+ }, `Token validated successfully for user ${payload.userId}`);
104
+ (0, logger_1.logAuthAttempt)('token_validation', true, {
105
+ userId: payload.userId,
106
+ email: payload.email,
107
+ groups: payload.groups,
108
+ duration
109
+ });
110
+ return payload;
111
+ }
112
+ logger_1.logger.warn({
113
+ type: 'auth',
114
+ operation: 'verify_token_api',
115
+ code: response.code,
116
+ message: response.message,
117
+ tokenPreview,
118
+ duration,
119
+ timestamp: new Date().toISOString()
120
+ }, 'Token validation failed - invalid or expired token');
121
+ (0, logger_1.logAuthAttempt)('token_validation', false, {
122
+ code: response.code,
123
+ message: response.message,
124
+ duration
125
+ });
126
+ return null;
127
+ }
128
+ catch (error) {
129
+ const duration = Date.now() - startTime;
130
+ (0, logger_1.logError)(error, {
131
+ type: 'auth',
132
+ operation: 'verify_token_api',
133
+ tokenPreview,
134
+ duration,
135
+ timestamp: new Date().toISOString()
136
+ });
137
+ (0, logger_1.logAuthAttempt)('token_validation', false, {
138
+ error: error instanceof Error ? error.message : String(error),
139
+ duration
140
+ });
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Verify token with caching
146
+ * Uses cached result if available to reduce API calls
147
+ * @param token - The token to verify
148
+ * @returns Token payload if valid, null otherwise
149
+ */
150
+ async function verifyToken(token) {
151
+ const tokenPreview = token.substring(0, 10) + '...' + token.substring(token.length - 10);
152
+ // Check cache first
153
+ const cached = tokenCache.get(token);
154
+ if (cached && cached.expireAt > Date.now()) {
155
+ logger_1.logger.debug({
156
+ type: 'auth',
157
+ operation: 'verify_token',
158
+ userId: cached.payload.userId,
159
+ email: cached.payload.email,
160
+ cacheHit: true,
161
+ tokenPreview,
162
+ timestamp: new Date().toISOString()
163
+ }, 'Token validation cache hit');
164
+ return cached.payload;
165
+ }
166
+ logger_1.logger.debug({
167
+ type: 'auth',
168
+ operation: 'verify_token',
169
+ cacheHit: false,
170
+ tokenPreview,
171
+ timestamp: new Date().toISOString()
172
+ }, 'Token validation cache miss, calling API');
173
+ // Validate via API
174
+ const payload = await verifyTokenViaAPI(token);
175
+ // Cache the result if valid (5 minute TTL)
176
+ if (payload) {
177
+ const expireAt = Date.now() + 5 * 60 * 1000; // 5 minutes
178
+ tokenCache.set(token, { payload, expireAt });
179
+ logger_1.logger.debug({
180
+ type: 'auth',
181
+ operation: 'verify_token',
182
+ userId: payload.userId,
183
+ email: payload.email,
184
+ cacheTTL: '5min',
185
+ timestamp: new Date().toISOString()
186
+ }, 'Token validation result cached (5 min TTL)');
187
+ }
188
+ return payload;
189
+ }
190
+ /**
191
+ * Clear token from cache (e.g., after logout)
192
+ * @param token - The token to invalidate
193
+ */
194
+ function invalidateToken(token) {
195
+ tokenCache.delete(token);
196
+ logger_1.logger.debug({ type: 'auth', operation: 'invalidate_token' }, 'Token removed from cache');
197
+ }
198
+ /**
199
+ * Clear all cached tokens
200
+ */
201
+ function clearTokenCache() {
202
+ tokenCache.clear();
203
+ logger_1.logger.info({ type: 'auth', operation: 'clear_cache' }, 'All cached tokens cleared');
204
+ }
205
+ /**
206
+ * Get cache statistics
207
+ */
208
+ function getTokenCacheStats() {
209
+ cleanExpiredCache();
210
+ return {
211
+ size: tokenCache.size,
212
+ tokens: Array.from(tokenCache.keys()).map(t => t.substring(0, 10) + '...'),
213
+ };
214
+ }
215
+ //# sourceMappingURL=token-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-validator.js","sourceRoot":"","sources":["../../src/auth/token-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Multi-Layer Cache Manager
3
+ * L1: In-memory LRU cache
4
+ * L2: Redis persistent cache
5
+ */
6
+ export interface CacheStats {
7
+ l1Hits: number;
8
+ l2Hits: number;
9
+ misses: number;
10
+ hitRate: number;
11
+ }
12
+ export declare class CacheManager {
13
+ private static instance;
14
+ private readonly l1;
15
+ private readonly l2;
16
+ private readonly defaultTtlSeconds;
17
+ private readonly defaultNamespace;
18
+ private l1Hits;
19
+ private l2Hits;
20
+ private misses;
21
+ private constructor();
22
+ static getInstance(options?: {
23
+ namespace?: string;
24
+ }): CacheManager;
25
+ static resetInstance(): Promise<void>;
26
+ private buildKey;
27
+ private getRedisPattern;
28
+ connect(): Promise<void>;
29
+ /**
30
+ * Get value from cache. Checks L1 first, then L2.
31
+ * On L2 hit, promotes value to L1.
32
+ */
33
+ get(key: string, namespace?: string): Promise<unknown | null>;
34
+ /**
35
+ * Set value in both L1 and L2 caches.
36
+ */
37
+ set(key: string, value: unknown, ttl?: number, namespace?: string): Promise<void>;
38
+ /**
39
+ * Delete key from both caches.
40
+ */
41
+ del(key: string, namespace?: string): Promise<void>;
42
+ /**
43
+ * Clear all cache layers. If namespace provided, clear only that namespace.
44
+ */
45
+ clear(namespace?: string): Promise<void>;
46
+ getStats(): CacheStats;
47
+ resetStats(): void;
48
+ }
49
+ //# sourceMappingURL=cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO;IAyBP,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY;WAOrD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3C,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,eAAe;IAKjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiDnE;;OAEG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyBhB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD;;OAEG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC9C,QAAQ,IAAI,UAAU;IAWtB,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-Layer Cache Manager
4
+ * L1: In-memory LRU cache
5
+ * L2: Redis persistent cache
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CacheManager = void 0;
9
+ const lru_cache_1 = require("lru-cache");
10
+ const config_1 = require("../config");
11
+ const logger_1 = require("../utils/logger");
12
+ const redis_client_1 = require("./redis-client");
13
+ const CACHE_KEY_PREFIX = 'csp:cache';
14
+ class CacheManager {
15
+ static instance = null;
16
+ l1;
17
+ l2;
18
+ defaultTtlSeconds;
19
+ defaultNamespace;
20
+ l1Hits = 0;
21
+ l2Hits = 0;
22
+ misses = 0;
23
+ constructor(options) {
24
+ const ttlMs = (config_1.config.cache.redis?.ttl ?? 900) * 1000;
25
+ this.defaultTtlSeconds = config_1.config.cache.redis?.ttl ?? 900;
26
+ this.defaultNamespace = options?.namespace ?? 'default';
27
+ this.l1 = new lru_cache_1.LRUCache({
28
+ max: 100,
29
+ ttl: ttlMs,
30
+ ttlAutopurge: true,
31
+ });
32
+ this.l2 = redis_client_1.redisClient;
33
+ logger_1.logger.info({
34
+ type: 'cache',
35
+ message: 'CacheManager initialized',
36
+ l1Max: 100,
37
+ ttlSeconds: this.defaultTtlSeconds,
38
+ namespace: this.defaultNamespace,
39
+ }, 'Multi-layer cache initialized');
40
+ }
41
+ static getInstance(options) {
42
+ if (CacheManager.instance === null) {
43
+ CacheManager.instance = new CacheManager(options);
44
+ }
45
+ return CacheManager.instance;
46
+ }
47
+ static async resetInstance() {
48
+ if (CacheManager.instance) {
49
+ await CacheManager.instance.clear();
50
+ await CacheManager.instance.l2.disconnect();
51
+ CacheManager.instance = null;
52
+ }
53
+ }
54
+ buildKey(key, namespace) {
55
+ const ns = namespace ?? this.defaultNamespace;
56
+ return `${CACHE_KEY_PREFIX}:${ns}:${key}`;
57
+ }
58
+ getRedisPattern(namespace) {
59
+ const ns = namespace ?? this.defaultNamespace;
60
+ return `${CACHE_KEY_PREFIX}:${ns}:*`;
61
+ }
62
+ async connect() {
63
+ await this.l2.connect();
64
+ }
65
+ /**
66
+ * Get value from cache. Checks L1 first, then L2.
67
+ * On L2 hit, promotes value to L1.
68
+ */
69
+ async get(key, namespace) {
70
+ const fullKey = this.buildKey(key, namespace);
71
+ const l1Value = this.l1.get(fullKey);
72
+ if (l1Value !== undefined) {
73
+ this.l1Hits++;
74
+ logger_1.logger.debug({ type: 'cache', key: fullKey, layer: 'L1' }, 'Cache L1 hit');
75
+ return l1Value;
76
+ }
77
+ let l2Value = null;
78
+ try {
79
+ l2Value = await this.l2.get(fullKey);
80
+ }
81
+ catch (error) {
82
+ logger_1.logger.debug({ type: 'cache', key: fullKey, error: error.message }, 'L2 get failed, Redis may be unavailable');
83
+ }
84
+ if (l2Value !== null) {
85
+ this.l2Hits++;
86
+ try {
87
+ const parsed = JSON.parse(l2Value);
88
+ if (parsed !== null && parsed !== undefined) {
89
+ this.l1.set(fullKey, parsed);
90
+ }
91
+ logger_1.logger.debug({ type: 'cache', key: fullKey, layer: 'L2' }, 'Cache L2 hit, promoted to L1');
92
+ return parsed;
93
+ }
94
+ catch (error) {
95
+ logger_1.logger.warn({ type: 'cache', key: fullKey, error: error.message }, 'Failed to parse L2 cache value');
96
+ try {
97
+ await this.l2.del(fullKey);
98
+ }
99
+ catch {
100
+ /* Redis may be unavailable */
101
+ }
102
+ this.misses++;
103
+ return null;
104
+ }
105
+ }
106
+ this.misses++;
107
+ logger_1.logger.debug({ type: 'cache', key: fullKey }, 'Cache miss');
108
+ return null;
109
+ }
110
+ /**
111
+ * Set value in both L1 and L2 caches.
112
+ */
113
+ async set(key, value, ttl, namespace) {
114
+ const fullKey = this.buildKey(key, namespace);
115
+ const ttlSeconds = ttl ?? this.defaultTtlSeconds;
116
+ const ttlMs = ttlSeconds * 1000;
117
+ if (value !== null && value !== undefined) {
118
+ this.l1.set(fullKey, value, { ttl: ttlMs });
119
+ }
120
+ const serialized = JSON.stringify(value);
121
+ try {
122
+ await this.l2.set(fullKey, serialized, ttlSeconds);
123
+ }
124
+ catch (error) {
125
+ logger_1.logger.debug({ type: 'cache', key: fullKey, error: error.message }, 'L2 set failed, Redis may be unavailable');
126
+ }
127
+ logger_1.logger.debug({ type: 'cache', key: fullKey, ttlSeconds }, 'Cache set');
128
+ }
129
+ /**
130
+ * Delete key from both caches.
131
+ */
132
+ async del(key, namespace) {
133
+ const fullKey = this.buildKey(key, namespace);
134
+ this.l1.delete(fullKey);
135
+ try {
136
+ await this.l2.del(fullKey);
137
+ }
138
+ catch (error) {
139
+ logger_1.logger.debug({ type: 'cache', key: fullKey, error: error.message }, 'L2 del failed, Redis may be unavailable');
140
+ }
141
+ logger_1.logger.debug({ type: 'cache', key: fullKey }, 'Cache del');
142
+ }
143
+ /**
144
+ * Clear all cache layers. If namespace provided, clear only that namespace.
145
+ */
146
+ async clear(namespace) {
147
+ if (namespace !== undefined) {
148
+ const pattern = this.getRedisPattern(namespace);
149
+ const prefix = `${CACHE_KEY_PREFIX}:${namespace}:`;
150
+ for (const k of this.l1.keys()) {
151
+ if (k.startsWith(prefix)) {
152
+ this.l1.delete(k);
153
+ }
154
+ }
155
+ try {
156
+ await this.l2.clear(pattern);
157
+ }
158
+ catch (error) {
159
+ logger_1.logger.debug({ type: 'cache', namespace, error: error.message }, 'L2 clear failed, Redis may be unavailable');
160
+ }
161
+ logger_1.logger.info({ type: 'cache', namespace }, 'Cache cleared for namespace');
162
+ }
163
+ else {
164
+ this.l1.clear();
165
+ try {
166
+ await this.l2.clear(`${CACHE_KEY_PREFIX}:*`);
167
+ }
168
+ catch (error) {
169
+ logger_1.logger.debug({ type: 'cache', error: error.message }, 'L2 clear failed, Redis may be unavailable');
170
+ }
171
+ logger_1.logger.info({ type: 'cache' }, 'Cache cleared');
172
+ }
173
+ }
174
+ getStats() {
175
+ const total = this.l1Hits + this.l2Hits + this.misses;
176
+ const hitRate = total > 0 ? (this.l1Hits + this.l2Hits) / total : 0;
177
+ return {
178
+ l1Hits: this.l1Hits,
179
+ l2Hits: this.l2Hits,
180
+ misses: this.misses,
181
+ hitRate,
182
+ };
183
+ }
184
+ resetStats() {
185
+ this.l1Hits = 0;
186
+ this.l2Hits = 0;
187
+ this.misses = 0;
188
+ }
189
+ }
190
+ exports.CacheManager = CacheManager;
191
+ //# sourceMappingURL=cache-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/cache/cache-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Cache module exports
3
+ */
4
+ export { CacheManager, type CacheStats } from './cache-manager';
5
+ export { redisClient, RedisClient } from './redis-client';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Cache module exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisClient = exports.redisClient = exports.CacheManager = void 0;
7
+ var cache_manager_1 = require("./cache-manager");
8
+ Object.defineProperty(exports, "CacheManager", { enumerable: true, get: function () { return cache_manager_1.CacheManager; } });
9
+ var redis_client_1 = require("./redis-client");
10
+ Object.defineProperty(exports, "redisClient", { enumerable: true, get: function () { return redis_client_1.redisClient; } });
11
+ Object.defineProperty(exports, "RedisClient", { enumerable: true, get: function () { return redis_client_1.RedisClient; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iDAAgE;AAAvD,6GAAA,YAAY,OAAA;AACrB,+CAA0D;AAAjD,2GAAA,WAAW,OAAA;AAAE,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Redis Client Module
3
+ * Connection management with retry strategy and basic cache operations
4
+ */
5
+ export declare class RedisClient {
6
+ private static instance;
7
+ private client;
8
+ private isConnecting;
9
+ private constructor();
10
+ static getInstance(): RedisClient;
11
+ /**
12
+ * Connect to Redis with config and retry strategy
13
+ */
14
+ connect(): Promise<void>;
15
+ /**
16
+ * Gracefully disconnect from Redis
17
+ */
18
+ disconnect(): Promise<void>;
19
+ /**
20
+ * Check if Redis client is connected
21
+ */
22
+ isConnected(): boolean;
23
+ /**
24
+ * Get value by key
25
+ */
26
+ get(key: string): Promise<string | null>;
27
+ /**
28
+ * Set value with optional TTL (seconds)
29
+ */
30
+ set(key: string, value: string, ttl?: number): Promise<void>;
31
+ /**
32
+ * Delete key
33
+ */
34
+ del(key: string): Promise<void>;
35
+ /**
36
+ * Clear all keys matching a pattern. Use with caution.
37
+ */
38
+ clear(pattern?: string): Promise<void>;
39
+ /**
40
+ * Check if key exists
41
+ */
42
+ exists(key: string): Promise<boolean>;
43
+ }
44
+ export declare const redisClient: RedisClient;
45
+ //# sourceMappingURL=redis-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-client.d.ts","sourceRoot":"","sources":["../../src/cache/redis-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqF9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAe9C;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrC;;OAEG;IACG,KAAK,CAAC,OAAO,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAc5C;AAED,eAAO,MAAM,WAAW,aAA4B,CAAC"}