@elliotding/ai-agent-mcp 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 (191) hide show
  1. package/dist/api/cached-client.d.ts +48 -0
  2. package/dist/api/cached-client.d.ts.map +1 -0
  3. package/dist/api/cached-client.js +126 -0
  4. package/dist/api/cached-client.js.map +1 -0
  5. package/dist/api/client.d.ts +213 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +326 -0
  8. package/dist/api/client.js.map +1 -0
  9. package/dist/auth/index.d.ts +8 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +26 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/middleware.d.ts +36 -0
  14. package/dist/auth/middleware.d.ts.map +1 -0
  15. package/dist/auth/middleware.js +194 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/permissions.d.ts +60 -0
  18. package/dist/auth/permissions.d.ts.map +1 -0
  19. package/dist/auth/permissions.js +256 -0
  20. package/dist/auth/permissions.js.map +1 -0
  21. package/dist/auth/token-validator.d.ts +52 -0
  22. package/dist/auth/token-validator.d.ts.map +1 -0
  23. package/dist/auth/token-validator.js +217 -0
  24. package/dist/auth/token-validator.js.map +1 -0
  25. package/dist/cache/cache-manager.d.ts +49 -0
  26. package/dist/cache/cache-manager.d.ts.map +1 -0
  27. package/dist/cache/cache-manager.js +191 -0
  28. package/dist/cache/cache-manager.js.map +1 -0
  29. package/dist/cache/index.d.ts +6 -0
  30. package/dist/cache/index.d.ts.map +1 -0
  31. package/dist/cache/index.js +12 -0
  32. package/dist/cache/index.js.map +1 -0
  33. package/dist/cache/redis-client.d.ts +45 -0
  34. package/dist/cache/redis-client.d.ts.map +1 -0
  35. package/dist/cache/redis-client.js +210 -0
  36. package/dist/cache/redis-client.js.map +1 -0
  37. package/dist/config/constants.d.ts +28 -0
  38. package/dist/config/constants.d.ts.map +1 -0
  39. package/dist/config/constants.js +31 -0
  40. package/dist/config/constants.js.map +1 -0
  41. package/dist/config/index.d.ts +54 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +168 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/filesystem/manager.d.ts +45 -0
  46. package/dist/filesystem/manager.d.ts.map +1 -0
  47. package/dist/filesystem/manager.js +246 -0
  48. package/dist/filesystem/manager.js.map +1 -0
  49. package/dist/git/multi-source-manager.d.ts +62 -0
  50. package/dist/git/multi-source-manager.d.ts.map +1 -0
  51. package/dist/git/multi-source-manager.js +293 -0
  52. package/dist/git/multi-source-manager.js.map +1 -0
  53. package/dist/git/operations.d.ts +27 -0
  54. package/dist/git/operations.d.ts.map +1 -0
  55. package/dist/git/operations.js +83 -0
  56. package/dist/git/operations.js.map +1 -0
  57. package/dist/index.d.ts +6 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +109 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/monitoring/health.d.ts +35 -0
  62. package/dist/monitoring/health.d.ts.map +1 -0
  63. package/dist/monitoring/health.js +105 -0
  64. package/dist/monitoring/health.js.map +1 -0
  65. package/dist/resources/index.d.ts +6 -0
  66. package/dist/resources/index.d.ts.map +1 -0
  67. package/dist/resources/index.js +10 -0
  68. package/dist/resources/index.js.map +1 -0
  69. package/dist/resources/loader.d.ts +87 -0
  70. package/dist/resources/loader.d.ts.map +1 -0
  71. package/dist/resources/loader.js +452 -0
  72. package/dist/resources/loader.js.map +1 -0
  73. package/dist/server/http.d.ts +57 -0
  74. package/dist/server/http.d.ts.map +1 -0
  75. package/dist/server/http.js +336 -0
  76. package/dist/server/http.js.map +1 -0
  77. package/dist/server.d.ts +13 -0
  78. package/dist/server.d.ts.map +1 -0
  79. package/dist/server.js +157 -0
  80. package/dist/server.js.map +1 -0
  81. package/dist/session/manager.d.ts +91 -0
  82. package/dist/session/manager.d.ts.map +1 -0
  83. package/dist/session/manager.js +251 -0
  84. package/dist/session/manager.js.map +1 -0
  85. package/dist/tools/index.d.ts +11 -0
  86. package/dist/tools/index.d.ts.map +1 -0
  87. package/dist/tools/index.js +27 -0
  88. package/dist/tools/index.js.map +1 -0
  89. package/dist/tools/manage-subscription.d.ts +43 -0
  90. package/dist/tools/manage-subscription.d.ts.map +1 -0
  91. package/dist/tools/manage-subscription.js +268 -0
  92. package/dist/tools/manage-subscription.js.map +1 -0
  93. package/dist/tools/registry.d.ts +40 -0
  94. package/dist/tools/registry.d.ts.map +1 -0
  95. package/dist/tools/registry.js +85 -0
  96. package/dist/tools/registry.js.map +1 -0
  97. package/dist/tools/search-resources.d.ts +31 -0
  98. package/dist/tools/search-resources.d.ts.map +1 -0
  99. package/dist/tools/search-resources.js +154 -0
  100. package/dist/tools/search-resources.js.map +1 -0
  101. package/dist/tools/sync-resources.d.ts +41 -0
  102. package/dist/tools/sync-resources.d.ts.map +1 -0
  103. package/dist/tools/sync-resources.js +606 -0
  104. package/dist/tools/sync-resources.js.map +1 -0
  105. package/dist/tools/uninstall-resource.d.ts +30 -0
  106. package/dist/tools/uninstall-resource.d.ts.map +1 -0
  107. package/dist/tools/uninstall-resource.js +259 -0
  108. package/dist/tools/uninstall-resource.js.map +1 -0
  109. package/dist/tools/upload-resource.d.ts +77 -0
  110. package/dist/tools/upload-resource.d.ts.map +1 -0
  111. package/dist/tools/upload-resource.js +252 -0
  112. package/dist/tools/upload-resource.js.map +1 -0
  113. package/dist/transport/sse.d.ts +29 -0
  114. package/dist/transport/sse.d.ts.map +1 -0
  115. package/dist/transport/sse.js +271 -0
  116. package/dist/transport/sse.js.map +1 -0
  117. package/dist/types/errors.d.ts +60 -0
  118. package/dist/types/errors.d.ts.map +1 -0
  119. package/dist/types/errors.js +112 -0
  120. package/dist/types/errors.js.map +1 -0
  121. package/dist/types/index.d.ts +7 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +23 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/types/mcp.d.ts +50 -0
  126. package/dist/types/mcp.d.ts.map +1 -0
  127. package/dist/types/mcp.js +6 -0
  128. package/dist/types/mcp.js.map +1 -0
  129. package/dist/types/resources.d.ts +109 -0
  130. package/dist/types/resources.d.ts.map +1 -0
  131. package/dist/types/resources.js +7 -0
  132. package/dist/types/resources.js.map +1 -0
  133. package/dist/types/tools.d.ts +147 -0
  134. package/dist/types/tools.d.ts.map +1 -0
  135. package/dist/types/tools.js +6 -0
  136. package/dist/types/tools.js.map +1 -0
  137. package/dist/utils/cursor-paths.d.ts +49 -0
  138. package/dist/utils/cursor-paths.d.ts.map +1 -0
  139. package/dist/utils/cursor-paths.js +116 -0
  140. package/dist/utils/cursor-paths.js.map +1 -0
  141. package/dist/utils/log-cleaner.d.ts +18 -0
  142. package/dist/utils/log-cleaner.d.ts.map +1 -0
  143. package/dist/utils/log-cleaner.js +112 -0
  144. package/dist/utils/log-cleaner.js.map +1 -0
  145. package/dist/utils/logger.d.ts +59 -0
  146. package/dist/utils/logger.d.ts.map +1 -0
  147. package/dist/utils/logger.js +292 -0
  148. package/dist/utils/logger.js.map +1 -0
  149. package/dist/utils/validation.d.ts +58 -0
  150. package/dist/utils/validation.d.ts.map +1 -0
  151. package/dist/utils/validation.js +214 -0
  152. package/dist/utils/validation.js.map +1 -0
  153. package/package.json +58 -0
  154. package/src/api/cached-client.ts +144 -0
  155. package/src/api/client.ts +578 -0
  156. package/src/auth/index.ts +11 -0
  157. package/src/auth/middleware.ts +244 -0
  158. package/src/auth/permissions.ts +317 -0
  159. package/src/auth/token-validator.ts +294 -0
  160. package/src/cache/cache-manager.ts +243 -0
  161. package/src/cache/index.ts +6 -0
  162. package/src/cache/redis-client.ts +249 -0
  163. package/src/config/constants.ts +33 -0
  164. package/src/config/index.ts +228 -0
  165. package/src/filesystem/manager.ts +235 -0
  166. package/src/git/multi-source-manager.ts +333 -0
  167. package/src/git/operations.ts +93 -0
  168. package/src/index.ts +139 -0
  169. package/src/monitoring/health.ts +132 -0
  170. package/src/resources/index.ts +13 -0
  171. package/src/resources/loader.ts +530 -0
  172. package/src/server/http.ts +427 -0
  173. package/src/server.ts +191 -0
  174. package/src/session/manager.ts +296 -0
  175. package/src/tools/index.ts +11 -0
  176. package/src/tools/manage-subscription.ts +332 -0
  177. package/src/tools/registry.ts +97 -0
  178. package/src/tools/search-resources.ts +177 -0
  179. package/src/tools/sync-resources.ts +662 -0
  180. package/src/tools/uninstall-resource.ts +248 -0
  181. package/src/tools/upload-resource.ts +258 -0
  182. package/src/transport/sse.ts +308 -0
  183. package/src/types/errors.ts +146 -0
  184. package/src/types/index.ts +7 -0
  185. package/src/types/mcp.ts +61 -0
  186. package/src/types/resources.ts +141 -0
  187. package/src/types/tools.ts +175 -0
  188. package/src/utils/cursor-paths.ts +83 -0
  189. package/src/utils/log-cleaner.ts +92 -0
  190. package/src/utils/logger.ts +333 -0
  191. package/src/utils/validation.ts +262 -0
@@ -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"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Redis Client Module
4
+ * Connection management with retry strategy and basic cache operations
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.redisClient = exports.RedisClient = void 0;
11
+ const ioredis_1 = __importDefault(require("ioredis"));
12
+ const logger_1 = require("../utils/logger");
13
+ const config_1 = require("../config");
14
+ const RETRY_BASE_MS = 100;
15
+ const RETRY_MAX_MS = 5000;
16
+ const RETRY_MAX_ATTEMPTS = 10;
17
+ /**
18
+ * Exponential backoff: base * 2^times, capped at max
19
+ */
20
+ function exponentialBackoff(times) {
21
+ if (times > RETRY_MAX_ATTEMPTS) {
22
+ return 0; // Stop retrying
23
+ }
24
+ const delay = Math.min(RETRY_BASE_MS * Math.pow(2, times), RETRY_MAX_MS);
25
+ return delay;
26
+ }
27
+ class RedisClient {
28
+ static instance = null;
29
+ client = null;
30
+ isConnecting = false;
31
+ constructor() { }
32
+ static getInstance() {
33
+ if (RedisClient.instance === null) {
34
+ RedisClient.instance = new RedisClient();
35
+ }
36
+ return RedisClient.instance;
37
+ }
38
+ /**
39
+ * Connect to Redis with config and retry strategy
40
+ */
41
+ async connect() {
42
+ const redisConfig = config_1.config.cache?.redis;
43
+ if (!redisConfig?.url) {
44
+ logger_1.logger.warn({ type: 'redis', event: 'connect_skipped' }, 'Redis URL not configured (REDIS_URL), skipping connection');
45
+ return;
46
+ }
47
+ if (this.client && this.isConnected()) {
48
+ logger_1.logger.debug({ type: 'redis', event: 'connect' }, 'Redis already connected');
49
+ return;
50
+ }
51
+ if (this.isConnecting) {
52
+ logger_1.logger.debug({ type: 'redis', event: 'connect' }, 'Redis connection in progress');
53
+ return;
54
+ }
55
+ this.isConnecting = true;
56
+ try {
57
+ this.client = new ioredis_1.default(redisConfig.url, {
58
+ retryStrategy: (times) => {
59
+ const delay = exponentialBackoff(times);
60
+ if (delay === 0) {
61
+ logger_1.logger.error({ type: 'redis', event: 'retry_exhausted', times }, 'Redis retry exhausted, giving up');
62
+ return undefined;
63
+ }
64
+ logger_1.logger.warn({ type: 'redis', event: 'retry', times, delayMs: delay }, `Redis reconnecting in ${delay}ms (attempt ${times})`);
65
+ return delay;
66
+ },
67
+ maxRetriesPerRequest: null,
68
+ connectTimeout: 10000,
69
+ lazyConnect: true,
70
+ });
71
+ this.client.on('connect', () => {
72
+ logger_1.logger.info({ type: 'redis', event: 'connect' }, 'Redis connection established');
73
+ });
74
+ this.client.on('ready', () => {
75
+ this.isConnecting = false;
76
+ logger_1.logger.info({ type: 'redis', event: 'ready' }, 'Redis client ready');
77
+ });
78
+ this.client.on('error', (err) => {
79
+ logger_1.logger.error({ type: 'redis', event: 'error', error: err.message }, `Redis error: ${err.message}`);
80
+ });
81
+ this.client.on('close', () => {
82
+ logger_1.logger.info({ type: 'redis', event: 'close' }, 'Redis connection closed');
83
+ });
84
+ await this.client.connect();
85
+ }
86
+ catch (error) {
87
+ this.isConnecting = false;
88
+ if (this.client) {
89
+ this.client.disconnect();
90
+ this.client = null;
91
+ }
92
+ (0, logger_1.logError)(error, { type: 'redis', event: 'connect_failed' });
93
+ throw error;
94
+ }
95
+ }
96
+ /**
97
+ * Gracefully disconnect from Redis
98
+ */
99
+ async disconnect() {
100
+ if (!this.client) {
101
+ logger_1.logger.debug({ type: 'redis', event: 'disconnect' }, 'Redis not connected');
102
+ return;
103
+ }
104
+ try {
105
+ await this.client.quit();
106
+ this.client = null;
107
+ logger_1.logger.info({ type: 'redis', event: 'disconnect' }, 'Redis disconnected gracefully');
108
+ }
109
+ catch (error) {
110
+ (0, logger_1.logError)(error, { type: 'redis', event: 'disconnect_failed' });
111
+ this.client = null;
112
+ throw error;
113
+ }
114
+ }
115
+ /**
116
+ * Check if Redis client is connected
117
+ */
118
+ isConnected() {
119
+ return this.client?.status === 'ready';
120
+ }
121
+ /**
122
+ * Get value by key
123
+ */
124
+ async get(key) {
125
+ if (!this.client) {
126
+ logger_1.logger.warn({ type: 'redis', operation: 'get', key }, 'Redis not connected');
127
+ return null;
128
+ }
129
+ try {
130
+ const value = await this.client.get(key);
131
+ return value;
132
+ }
133
+ catch (error) {
134
+ (0, logger_1.logError)(error, { type: 'redis', operation: 'get', key });
135
+ throw error;
136
+ }
137
+ }
138
+ /**
139
+ * Set value with optional TTL (seconds)
140
+ */
141
+ async set(key, value, ttl) {
142
+ if (!this.client) {
143
+ logger_1.logger.warn({ type: 'redis', operation: 'set', key }, 'Redis not connected');
144
+ throw new Error('Redis not connected');
145
+ }
146
+ try {
147
+ const ttlSeconds = ttl ?? config_1.config.cache?.redis?.ttl ?? 900;
148
+ await this.client.set(key, value, 'EX', ttlSeconds);
149
+ }
150
+ catch (error) {
151
+ (0, logger_1.logError)(error, { type: 'redis', operation: 'set', key });
152
+ throw error;
153
+ }
154
+ }
155
+ /**
156
+ * Delete key
157
+ */
158
+ async del(key) {
159
+ if (!this.client) {
160
+ logger_1.logger.warn({ type: 'redis', operation: 'del', key }, 'Redis not connected');
161
+ throw new Error('Redis not connected');
162
+ }
163
+ try {
164
+ await this.client.del(key);
165
+ }
166
+ catch (error) {
167
+ (0, logger_1.logError)(error, { type: 'redis', operation: 'del', key });
168
+ throw error;
169
+ }
170
+ }
171
+ /**
172
+ * Clear all keys matching a pattern. Use with caution.
173
+ */
174
+ async clear(pattern = '*') {
175
+ if (!this.client) {
176
+ logger_1.logger.warn({ type: 'redis', operation: 'clear', pattern }, 'Redis not connected');
177
+ throw new Error('Redis not connected');
178
+ }
179
+ try {
180
+ const keys = await this.client.keys(pattern);
181
+ if (keys.length > 0) {
182
+ await this.client.del(...keys);
183
+ }
184
+ }
185
+ catch (error) {
186
+ (0, logger_1.logError)(error, { type: 'redis', operation: 'clear', pattern });
187
+ throw error;
188
+ }
189
+ }
190
+ /**
191
+ * Check if key exists
192
+ */
193
+ async exists(key) {
194
+ if (!this.client) {
195
+ logger_1.logger.warn({ type: 'redis', operation: 'exists', key }, 'Redis not connected');
196
+ return false;
197
+ }
198
+ try {
199
+ const result = await this.client.exists(key);
200
+ return result === 1;
201
+ }
202
+ catch (error) {
203
+ (0, logger_1.logError)(error, { type: 'redis', operation: 'exists', key });
204
+ throw error;
205
+ }
206
+ }
207
+ }
208
+ exports.RedisClient = RedisClient;
209
+ exports.redisClient = RedisClient.getInstance();
210
+ //# sourceMappingURL=redis-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-client.js","sourceRoot":"","sources":["../../src/cache/redis-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Configuration Constants
3
+ */
4
+ export declare const APP_NAME = "csp-ai-agent-mcp";
5
+ export declare const APP_VERSION = "0.1.0";
6
+ export declare const DEFAULT_PORT = 5090;
7
+ export declare const DEFAULT_LOG_LEVEL = "info";
8
+ export declare const DEFAULT_API_TIMEOUT = 30000;
9
+ export declare const LOG_RETENTION_DAYS = 3;
10
+ export declare const LOG_DIR = "logs";
11
+ export declare const LOG_FILE_PATTERN = "app-{date}.log";
12
+ export declare const CACHE_TTL_SECONDS = 900;
13
+ export declare const MEMORY_CACHE_SIZE = 20;
14
+ export declare const TOOL_NAMES: {
15
+ readonly SYNC_RESOURCES: "sync_resources";
16
+ readonly MANAGE_SUBSCRIPTION: "manage_subscription";
17
+ readonly SEARCH_RESOURCES: "search_resources";
18
+ readonly UPLOAD_RESOURCE: "upload_resource";
19
+ readonly UNINSTALL_RESOURCE: "uninstall_resource";
20
+ };
21
+ export declare const TOOL_TIMEOUTS: {
22
+ readonly search_resources: 10000;
23
+ readonly sync_resources: 60000;
24
+ readonly upload_resource: 120000;
25
+ readonly manage_subscription: 15000;
26
+ readonly uninstall_resource: 5000;
27
+ };
28
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAC3C,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,iBAAiB,SAAS,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration Constants
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TOOL_TIMEOUTS = exports.TOOL_NAMES = exports.MEMORY_CACHE_SIZE = exports.CACHE_TTL_SECONDS = exports.LOG_FILE_PATTERN = exports.LOG_DIR = exports.LOG_RETENTION_DAYS = exports.DEFAULT_API_TIMEOUT = exports.DEFAULT_LOG_LEVEL = exports.DEFAULT_PORT = exports.APP_VERSION = exports.APP_NAME = void 0;
7
+ exports.APP_NAME = 'csp-ai-agent-mcp';
8
+ exports.APP_VERSION = '0.1.0';
9
+ exports.DEFAULT_PORT = 5090;
10
+ exports.DEFAULT_LOG_LEVEL = 'info';
11
+ exports.DEFAULT_API_TIMEOUT = 30000;
12
+ exports.LOG_RETENTION_DAYS = 3;
13
+ exports.LOG_DIR = 'logs';
14
+ exports.LOG_FILE_PATTERN = 'app-{date}.log';
15
+ exports.CACHE_TTL_SECONDS = 900; // 15 minutes
16
+ exports.MEMORY_CACHE_SIZE = 20;
17
+ exports.TOOL_NAMES = {
18
+ SYNC_RESOURCES: 'sync_resources',
19
+ MANAGE_SUBSCRIPTION: 'manage_subscription',
20
+ SEARCH_RESOURCES: 'search_resources',
21
+ UPLOAD_RESOURCE: 'upload_resource',
22
+ UNINSTALL_RESOURCE: 'uninstall_resource',
23
+ };
24
+ exports.TOOL_TIMEOUTS = {
25
+ [exports.TOOL_NAMES.SEARCH_RESOURCES]: 10000, // 10s
26
+ [exports.TOOL_NAMES.SYNC_RESOURCES]: 60000, // 60s
27
+ [exports.TOOL_NAMES.UPLOAD_RESOURCE]: 120000, // 120s
28
+ [exports.TOOL_NAMES.MANAGE_SUBSCRIPTION]: 15000, // 15s
29
+ [exports.TOOL_NAMES.UNINSTALL_RESOURCE]: 5000, // 5s
30
+ };
31
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,QAAQ,GAAG,kBAAkB,CAAC;AAC9B,QAAA,WAAW,GAAG,OAAO,CAAC;AAEtB,QAAA,YAAY,GAAG,IAAI,CAAC;AACpB,QAAA,iBAAiB,GAAG,MAAM,CAAC;AAC3B,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAE5B,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,OAAO,GAAG,MAAM,CAAC;AACjB,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEpC,QAAA,iBAAiB,GAAG,GAAG,CAAC,CAAC,aAAa;AACtC,QAAA,iBAAiB,GAAG,EAAE,CAAC;AAEvB,QAAA,UAAU,GAAG;IACxB,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEE,QAAA,aAAa,GAAG;IAC3B,CAAC,kBAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM;IAC5C,CAAC,kBAAU,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM;IAC1C,CAAC,kBAAU,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO;IAC7C,CAAC,kBAAU,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,MAAM;IAC/C,CAAC,kBAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAK;CACpC,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Configuration Management Module
3
+ * Loads and validates configuration from environment variables
4
+ */
5
+ export interface Config {
6
+ nodeEnv: 'development' | 'production' | 'test';
7
+ port: number;
8
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
9
+ transport: {
10
+ mode: 'stdio' | 'sse';
11
+ };
12
+ http?: {
13
+ host: string;
14
+ port: number;
15
+ };
16
+ session?: {
17
+ timeout: number;
18
+ };
19
+ csp: {
20
+ apiBaseUrl: string;
21
+ apiToken: string;
22
+ timeout: number;
23
+ };
24
+ git: {
25
+ userName: string;
26
+ userEmail: string;
27
+ };
28
+ resource: Record<string, never>;
29
+ cache: {
30
+ enabled: boolean;
31
+ redis?: {
32
+ url: string;
33
+ ttl: number;
34
+ };
35
+ memory: {
36
+ maxSize: number;
37
+ };
38
+ };
39
+ database?: {
40
+ url: string;
41
+ };
42
+ metrics: {
43
+ enabled: boolean;
44
+ port?: number;
45
+ };
46
+ logging: {
47
+ dir: string;
48
+ retentionDays: number;
49
+ };
50
+ }
51
+ export declare function loadConfig(): Config;
52
+ declare let config: Config;
53
+ export { config };
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;IAG/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG9C,SAAS,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;KACvB,CAAC;IAGF,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAGF,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAGF,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAGF,GAAG,EAAE;QACH,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAKF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGhC,KAAK,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE;YACN,GAAG,EAAE,MAAM,CAAC;YACZ,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;QACF,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IAGF,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IAGF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAGF,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAC;QACZ,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAoCD,wBAAgB,UAAU,IAAI,MAAM,CAoEnC;AAGD,QAAA,IAAI,MAAM,EAAE,MAAM,CAAC;AAmBnB,OAAO,EAAE,MAAM,EAAE,CAAC"}