couchloop-eq-mcp 1.0.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 (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +358 -0
  3. package/assets/logo/README.md +12 -0
  4. package/assets/logo/couchloop_EQ-IconLogo.png +0 -0
  5. package/dist/auth/middleware.d.ts +8 -0
  6. package/dist/auth/middleware.d.ts.map +1 -0
  7. package/dist/auth/middleware.js +59 -0
  8. package/dist/auth/middleware.js.map +1 -0
  9. package/dist/clients/shrinkChatClient.d.ts +195 -0
  10. package/dist/clients/shrinkChatClient.d.ts.map +1 -0
  11. package/dist/clients/shrinkChatClient.js +349 -0
  12. package/dist/clients/shrinkChatClient.js.map +1 -0
  13. package/dist/db/client.d.ts +23 -0
  14. package/dist/db/client.d.ts.map +1 -0
  15. package/dist/db/client.js +78 -0
  16. package/dist/db/client.js.map +1 -0
  17. package/dist/db/migrate.d.ts +4 -0
  18. package/dist/db/migrate.d.ts.map +1 -0
  19. package/dist/db/migrate.js +34 -0
  20. package/dist/db/migrate.js.map +1 -0
  21. package/dist/db/migrations/schema.d.ts +1074 -0
  22. package/dist/db/migrations/schema.d.ts.map +1 -0
  23. package/dist/db/migrations/schema.js +160 -0
  24. package/dist/db/migrations/schema.js.map +1 -0
  25. package/dist/db/schema.d.ts +1213 -0
  26. package/dist/db/schema.d.ts.map +1 -0
  27. package/dist/db/schema.js +157 -0
  28. package/dist/db/schema.js.map +1 -0
  29. package/dist/db/seed.d.ts +4 -0
  30. package/dist/db/seed.d.ts.map +1 -0
  31. package/dist/db/seed.js +57 -0
  32. package/dist/db/seed.js.map +1 -0
  33. package/dist/db/seedOAuth.d.ts +4 -0
  34. package/dist/db/seedOAuth.d.ts.map +1 -0
  35. package/dist/db/seedOAuth.js +76 -0
  36. package/dist/db/seedOAuth.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +93 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/index.d.ts +11 -0
  42. package/dist/resources/index.d.ts.map +1 -0
  43. package/dist/resources/index.js +56 -0
  44. package/dist/resources/index.js.map +1 -0
  45. package/dist/resources/journey-status.d.ts +2 -0
  46. package/dist/resources/journey-status.d.ts.map +1 -0
  47. package/dist/resources/journey-status.js +42 -0
  48. package/dist/resources/journey-status.js.map +1 -0
  49. package/dist/resources/session-summary.d.ts +2 -0
  50. package/dist/resources/session-summary.d.ts.map +1 -0
  51. package/dist/resources/session-summary.js +85 -0
  52. package/dist/resources/session-summary.js.map +1 -0
  53. package/dist/resources/user-context.d.ts +2 -0
  54. package/dist/resources/user-context.d.ts.map +1 -0
  55. package/dist/resources/user-context.js +79 -0
  56. package/dist/resources/user-context.js.map +1 -0
  57. package/dist/server/index.d.ts +3 -0
  58. package/dist/server/index.d.ts.map +1 -0
  59. package/dist/server/index.js +385 -0
  60. package/dist/server/index.js.map +1 -0
  61. package/dist/server/middleware/auth.d.ts +30 -0
  62. package/dist/server/middleware/auth.d.ts.map +1 -0
  63. package/dist/server/middleware/auth.js +157 -0
  64. package/dist/server/middleware/auth.js.map +1 -0
  65. package/dist/server/oauth/anomalyDetection.d.ts +146 -0
  66. package/dist/server/oauth/anomalyDetection.d.ts.map +1 -0
  67. package/dist/server/oauth/anomalyDetection.js +405 -0
  68. package/dist/server/oauth/anomalyDetection.js.map +1 -0
  69. package/dist/server/oauth/authServer.d.ts +61 -0
  70. package/dist/server/oauth/authServer.d.ts.map +1 -0
  71. package/dist/server/oauth/authServer.js +283 -0
  72. package/dist/server/oauth/authServer.js.map +1 -0
  73. package/dist/server/oauth/dpop.d.ts +135 -0
  74. package/dist/server/oauth/dpop.d.ts.map +1 -0
  75. package/dist/server/oauth/dpop.js +338 -0
  76. package/dist/server/oauth/dpop.js.map +1 -0
  77. package/dist/server/oauth/gdpr/consent.d.ts +173 -0
  78. package/dist/server/oauth/gdpr/consent.d.ts.map +1 -0
  79. package/dist/server/oauth/gdpr/consent.js +388 -0
  80. package/dist/server/oauth/gdpr/consent.js.map +1 -0
  81. package/dist/server/oauth/gdpr/dataPortability.d.ts +214 -0
  82. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +1 -0
  83. package/dist/server/oauth/gdpr/dataPortability.js +486 -0
  84. package/dist/server/oauth/gdpr/dataPortability.js.map +1 -0
  85. package/dist/server/oauth/gdpr/index.d.ts +103 -0
  86. package/dist/server/oauth/gdpr/index.d.ts.map +1 -0
  87. package/dist/server/oauth/gdpr/index.js +273 -0
  88. package/dist/server/oauth/gdpr/index.js.map +1 -0
  89. package/dist/server/oauth/gdpr/rightToErasure.d.ts +184 -0
  90. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +1 -0
  91. package/dist/server/oauth/gdpr/rightToErasure.js +527 -0
  92. package/dist/server/oauth/gdpr/rightToErasure.js.map +1 -0
  93. package/dist/server/oauth/monitoring/securityMonitor.d.ts +218 -0
  94. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +1 -0
  95. package/dist/server/oauth/monitoring/securityMonitor.js +615 -0
  96. package/dist/server/oauth/monitoring/securityMonitor.js.map +1 -0
  97. package/dist/server/oauth/pkce.d.ts +61 -0
  98. package/dist/server/oauth/pkce.d.ts.map +1 -0
  99. package/dist/server/oauth/pkce.js +157 -0
  100. package/dist/server/oauth/pkce.js.map +1 -0
  101. package/dist/server/oauth/providers/base.d.ts +147 -0
  102. package/dist/server/oauth/providers/base.d.ts.map +1 -0
  103. package/dist/server/oauth/providers/base.js +312 -0
  104. package/dist/server/oauth/providers/base.js.map +1 -0
  105. package/dist/server/oauth/providers/github.d.ts +55 -0
  106. package/dist/server/oauth/providers/github.d.ts.map +1 -0
  107. package/dist/server/oauth/providers/github.js +225 -0
  108. package/dist/server/oauth/providers/github.js.map +1 -0
  109. package/dist/server/oauth/providers/google.d.ts +49 -0
  110. package/dist/server/oauth/providers/google.d.ts.map +1 -0
  111. package/dist/server/oauth/providers/google.js +153 -0
  112. package/dist/server/oauth/providers/google.js.map +1 -0
  113. package/dist/server/oauth/providers/index.d.ts +9 -0
  114. package/dist/server/oauth/providers/index.d.ts.map +1 -0
  115. package/dist/server/oauth/providers/index.js +24 -0
  116. package/dist/server/oauth/providers/index.js.map +1 -0
  117. package/dist/server/oauth/refreshTokenRotation.d.ts +114 -0
  118. package/dist/server/oauth/refreshTokenRotation.d.ts.map +1 -0
  119. package/dist/server/oauth/refreshTokenRotation.js +344 -0
  120. package/dist/server/oauth/refreshTokenRotation.js.map +1 -0
  121. package/dist/server/oauth/security.d.ts +101 -0
  122. package/dist/server/oauth/security.d.ts.map +1 -0
  123. package/dist/server/oauth/security.js +268 -0
  124. package/dist/server/oauth/security.js.map +1 -0
  125. package/dist/server/oauth/tokenEncryption.d.ts +80 -0
  126. package/dist/server/oauth/tokenEncryption.d.ts.map +1 -0
  127. package/dist/server/oauth/tokenEncryption.js +218 -0
  128. package/dist/server/oauth/tokenEncryption.js.map +1 -0
  129. package/dist/tools/checkpoint.d.ts +35 -0
  130. package/dist/tools/checkpoint.d.ts.map +1 -0
  131. package/dist/tools/checkpoint.js +125 -0
  132. package/dist/tools/checkpoint.js.map +1 -0
  133. package/dist/tools/index.d.ts +412 -0
  134. package/dist/tools/index.d.ts.map +1 -0
  135. package/dist/tools/index.js +262 -0
  136. package/dist/tools/index.js.map +1 -0
  137. package/dist/tools/insight.d.ts +65 -0
  138. package/dist/tools/insight.d.ts.map +1 -0
  139. package/dist/tools/insight.js +190 -0
  140. package/dist/tools/insight.js.map +1 -0
  141. package/dist/tools/journey.d.ts +45 -0
  142. package/dist/tools/journey.d.ts.map +1 -0
  143. package/dist/tools/journey.js +115 -0
  144. package/dist/tools/journey.js.map +1 -0
  145. package/dist/tools/sendMessage.d.ts +6 -0
  146. package/dist/tools/sendMessage.d.ts.map +1 -0
  147. package/dist/tools/sendMessage.js +278 -0
  148. package/dist/tools/sendMessage.js.map +1 -0
  149. package/dist/tools/session.d.ts +106 -0
  150. package/dist/tools/session.d.ts.map +1 -0
  151. package/dist/tools/session.js +161 -0
  152. package/dist/tools/session.js.map +1 -0
  153. package/dist/types/auth.d.ts +37 -0
  154. package/dist/types/auth.d.ts.map +1 -0
  155. package/dist/types/auth.js +44 -0
  156. package/dist/types/auth.js.map +1 -0
  157. package/dist/types/checkpoint.d.ts +25 -0
  158. package/dist/types/checkpoint.d.ts.map +1 -0
  159. package/dist/types/checkpoint.js +8 -0
  160. package/dist/types/checkpoint.js.map +1 -0
  161. package/dist/types/insight.d.ts +83 -0
  162. package/dist/types/insight.d.ts.map +1 -0
  163. package/dist/types/insight.js +14 -0
  164. package/dist/types/insight.js.map +1 -0
  165. package/dist/types/journey.d.ts +155 -0
  166. package/dist/types/journey.d.ts.map +1 -0
  167. package/dist/types/journey.js +29 -0
  168. package/dist/types/journey.js.map +1 -0
  169. package/dist/types/session.d.ts +82 -0
  170. package/dist/types/session.d.ts.map +1 -0
  171. package/dist/types/session.js +13 -0
  172. package/dist/types/session.js.map +1 -0
  173. package/dist/utils/circuitBreaker.d.ts +86 -0
  174. package/dist/utils/circuitBreaker.d.ts.map +1 -0
  175. package/dist/utils/circuitBreaker.js +234 -0
  176. package/dist/utils/circuitBreaker.js.map +1 -0
  177. package/dist/utils/errorHandler.d.ts +101 -0
  178. package/dist/utils/errorHandler.d.ts.map +1 -0
  179. package/dist/utils/errorHandler.js +348 -0
  180. package/dist/utils/errorHandler.js.map +1 -0
  181. package/dist/utils/errors.d.ts +36 -0
  182. package/dist/utils/errors.d.ts.map +1 -0
  183. package/dist/utils/errors.js +77 -0
  184. package/dist/utils/errors.js.map +1 -0
  185. package/dist/utils/logger.d.ts +13 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +49 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/performanceMonitor.d.ts +106 -0
  190. package/dist/utils/performanceMonitor.d.ts.map +1 -0
  191. package/dist/utils/performanceMonitor.js +312 -0
  192. package/dist/utils/performanceMonitor.js.map +1 -0
  193. package/dist/utils/responseCache.d.ts +88 -0
  194. package/dist/utils/responseCache.d.ts.map +1 -0
  195. package/dist/utils/responseCache.js +245 -0
  196. package/dist/utils/responseCache.js.map +1 -0
  197. package/dist/utils/retryStrategy.d.ts +49 -0
  198. package/dist/utils/retryStrategy.d.ts.map +1 -0
  199. package/dist/utils/retryStrategy.js +167 -0
  200. package/dist/utils/retryStrategy.js.map +1 -0
  201. package/dist/workflows/definitions/daily-reflection.d.ts +3 -0
  202. package/dist/workflows/definitions/daily-reflection.d.ts.map +1 -0
  203. package/dist/workflows/definitions/daily-reflection.js +52 -0
  204. package/dist/workflows/definitions/daily-reflection.js.map +1 -0
  205. package/dist/workflows/definitions/gratitude-practice.d.ts +3 -0
  206. package/dist/workflows/definitions/gratitude-practice.d.ts.map +1 -0
  207. package/dist/workflows/definitions/gratitude-practice.js +52 -0
  208. package/dist/workflows/definitions/gratitude-practice.js.map +1 -0
  209. package/dist/workflows/definitions/weekly-review.d.ts +3 -0
  210. package/dist/workflows/definitions/weekly-review.d.ts.map +1 -0
  211. package/dist/workflows/definitions/weekly-review.js +74 -0
  212. package/dist/workflows/definitions/weekly-review.js.map +1 -0
  213. package/dist/workflows/engine.d.ts +21 -0
  214. package/dist/workflows/engine.d.ts.map +1 -0
  215. package/dist/workflows/engine.js +149 -0
  216. package/dist/workflows/engine.js.map +1 -0
  217. package/dist/workflows/index.d.ts +26 -0
  218. package/dist/workflows/index.d.ts.map +1 -0
  219. package/dist/workflows/index.js +14 -0
  220. package/dist/workflows/index.js.map +1 -0
  221. package/package.json +98 -0
  222. package/run-mcp-server.sh +16 -0
@@ -0,0 +1,312 @@
1
+ import { logger } from './logger.js';
2
+ import { EventEmitter } from 'events';
3
+ /**
4
+ * Performance monitoring with real-time metrics and alerting
5
+ */
6
+ export class PerformanceMonitor extends EventEmitter {
7
+ metrics = new Map();
8
+ maxMetricsPerOperation = 1000;
9
+ metricsWindow = 5 * 60 * 1000; // 5 minutes
10
+ startTime = Date.now();
11
+ // Thresholds for health monitoring
12
+ thresholds = {
13
+ responseTime: parseInt(process.env.PERF_THRESHOLD_RESPONSE_TIME || '5000'),
14
+ errorRate: parseFloat(process.env.PERF_THRESHOLD_ERROR_RATE || '0.05'),
15
+ throughput: parseInt(process.env.PERF_THRESHOLD_THROUGHPUT || '10'),
16
+ };
17
+ constructor() {
18
+ super();
19
+ // Start periodic cleanup
20
+ if (process.env.ENABLE_PERFORMANCE_MONITORING !== 'false') {
21
+ this.startPeriodicCleanup();
22
+ this.startPeriodicLogging();
23
+ }
24
+ }
25
+ /**
26
+ * Measure operation performance
27
+ */
28
+ async measure(operation, fn, metadata) {
29
+ const start = performance.now();
30
+ let success = true;
31
+ try {
32
+ const result = await fn();
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ success = false;
37
+ throw error;
38
+ }
39
+ finally {
40
+ const duration = performance.now() - start;
41
+ this.record(operation, duration, success, metadata);
42
+ }
43
+ }
44
+ /**
45
+ * Measure sync operation performance
46
+ */
47
+ measureSync(operation, fn, metadata) {
48
+ const start = performance.now();
49
+ let success = true;
50
+ try {
51
+ const result = fn();
52
+ return result;
53
+ }
54
+ catch (error) {
55
+ success = false;
56
+ throw error;
57
+ }
58
+ finally {
59
+ const duration = performance.now() - start;
60
+ this.record(operation, duration, success, metadata);
61
+ }
62
+ }
63
+ /**
64
+ * Record a metric
65
+ */
66
+ record(operation, duration, success = true, metadata) {
67
+ const metric = {
68
+ operation,
69
+ duration,
70
+ success,
71
+ timestamp: new Date(),
72
+ metadata,
73
+ };
74
+ // Get or create metrics array for this operation
75
+ let operationMetrics = this.metrics.get(operation);
76
+ if (!operationMetrics) {
77
+ operationMetrics = [];
78
+ this.metrics.set(operation, operationMetrics);
79
+ }
80
+ // Add new metric
81
+ operationMetrics.push(metric);
82
+ // Limit array size
83
+ if (operationMetrics.length > this.maxMetricsPerOperation) {
84
+ operationMetrics.shift();
85
+ }
86
+ // Check for performance degradation
87
+ this.checkPerformance(operation, metric);
88
+ // Emit metric event for real-time monitoring
89
+ this.emit('metric', metric);
90
+ }
91
+ /**
92
+ * Get statistics for an operation
93
+ */
94
+ getStats(operation) {
95
+ const metrics = this.getRecentMetrics(operation);
96
+ if (metrics.length === 0) {
97
+ return null;
98
+ }
99
+ const successMetrics = metrics.filter(m => m.success);
100
+ const errorMetrics = metrics.filter(m => !m.success);
101
+ const durations = successMetrics.map(m => m.duration).sort((a, b) => a - b);
102
+ if (durations.length === 0) {
103
+ return {
104
+ count: metrics.length,
105
+ successCount: 0,
106
+ errorCount: errorMetrics.length,
107
+ totalTime: 0,
108
+ avgTime: 0,
109
+ minTime: 0,
110
+ maxTime: 0,
111
+ p50: 0,
112
+ p95: 0,
113
+ p99: 0,
114
+ errorRate: 1,
115
+ throughput: 0,
116
+ };
117
+ }
118
+ const totalTime = durations.reduce((sum, d) => sum + d, 0);
119
+ const firstMetric = metrics[0];
120
+ const timeRange = firstMetric ? Date.now() - firstMetric.timestamp.getTime() : 0;
121
+ const throughput = timeRange > 0 ? (metrics.length / timeRange) * 60000 : 0; // per minute
122
+ return {
123
+ count: metrics.length,
124
+ successCount: successMetrics.length,
125
+ errorCount: errorMetrics.length,
126
+ totalTime,
127
+ avgTime: totalTime / durations.length,
128
+ minTime: durations[0] ?? 0,
129
+ maxTime: durations[durations.length - 1] ?? 0,
130
+ p50: this.percentile(durations, 0.5),
131
+ p95: this.percentile(durations, 0.95),
132
+ p99: this.percentile(durations, 0.99),
133
+ errorRate: errorMetrics.length / metrics.length,
134
+ throughput,
135
+ };
136
+ }
137
+ /**
138
+ * Get all statistics
139
+ */
140
+ getAllStats() {
141
+ const allStats = {};
142
+ for (const operation of this.metrics.keys()) {
143
+ const stats = this.getStats(operation);
144
+ if (stats) {
145
+ allStats[operation] = stats;
146
+ }
147
+ }
148
+ return allStats;
149
+ }
150
+ /**
151
+ * Get health status
152
+ */
153
+ getHealthStatus() {
154
+ const allStats = this.getAllStats();
155
+ const operations = Object.values(allStats);
156
+ if (operations.length === 0) {
157
+ return {
158
+ status: 'healthy',
159
+ checks: {
160
+ responseTime: true,
161
+ errorRate: true,
162
+ throughput: true,
163
+ },
164
+ metrics: {
165
+ avgResponseTime: 0,
166
+ errorRate: 0,
167
+ requestsPerMinute: 0,
168
+ },
169
+ };
170
+ }
171
+ // Calculate overall metrics
172
+ const totalRequests = operations.reduce((sum, op) => sum + op.count, 0);
173
+ const totalErrors = operations.reduce((sum, op) => sum + op.errorCount, 0);
174
+ const avgResponseTime = operations.reduce((sum, op) => sum + op.avgTime, 0) / operations.length;
175
+ const errorRate = totalRequests > 0 ? totalErrors / totalRequests : 0;
176
+ const requestsPerMinute = operations.reduce((sum, op) => sum + op.throughput, 0);
177
+ // Check health criteria
178
+ const checks = {
179
+ responseTime: avgResponseTime < this.thresholds.responseTime,
180
+ errorRate: errorRate < this.thresholds.errorRate,
181
+ throughput: requestsPerMinute > this.thresholds.throughput,
182
+ };
183
+ // Determine overall status
184
+ let status = 'healthy';
185
+ const failedChecks = Object.values(checks).filter(c => !c).length;
186
+ if (failedChecks >= 2) {
187
+ status = 'unhealthy';
188
+ }
189
+ else if (failedChecks === 1) {
190
+ status = 'degraded';
191
+ }
192
+ return {
193
+ status,
194
+ checks,
195
+ metrics: {
196
+ avgResponseTime,
197
+ errorRate,
198
+ requestsPerMinute,
199
+ },
200
+ };
201
+ }
202
+ /**
203
+ * Get recent metrics for an operation
204
+ */
205
+ getRecentMetrics(operation) {
206
+ const metrics = this.metrics.get(operation) || [];
207
+ const cutoff = Date.now() - this.metricsWindow;
208
+ return metrics.filter(m => m.timestamp.getTime() > cutoff);
209
+ }
210
+ /**
211
+ * Calculate percentile
212
+ */
213
+ percentile(sortedArray, percentile) {
214
+ if (sortedArray.length === 0)
215
+ return 0;
216
+ const index = Math.floor(sortedArray.length * percentile);
217
+ return sortedArray[Math.min(index, sortedArray.length - 1)] ?? 0;
218
+ }
219
+ /**
220
+ * Check for performance issues
221
+ */
222
+ checkPerformance(operation, metric) {
223
+ // Check for slow operations
224
+ if (metric.duration > this.thresholds.responseTime) {
225
+ logger.warn(`Slow operation detected: ${operation} took ${metric.duration.toFixed(2)}ms`);
226
+ this.emit('slow-operation', { operation, duration: metric.duration });
227
+ }
228
+ // Check for errors
229
+ if (!metric.success) {
230
+ const stats = this.getStats(operation);
231
+ if (stats && stats.errorRate > this.thresholds.errorRate) {
232
+ logger.error(`High error rate for ${operation}: ${(stats.errorRate * 100).toFixed(2)}%`);
233
+ this.emit('high-error-rate', { operation, errorRate: stats.errorRate });
234
+ }
235
+ }
236
+ }
237
+ /**
238
+ * Start periodic cleanup of old metrics
239
+ */
240
+ startPeriodicCleanup() {
241
+ setInterval(() => {
242
+ for (const [operation, metrics] of this.metrics.entries()) {
243
+ const cutoff = Date.now() - this.metricsWindow;
244
+ const recentMetrics = metrics.filter(m => m.timestamp.getTime() > cutoff);
245
+ if (recentMetrics.length === 0) {
246
+ this.metrics.delete(operation);
247
+ }
248
+ else {
249
+ this.metrics.set(operation, recentMetrics);
250
+ }
251
+ }
252
+ }, 60000); // Clean up every minute
253
+ }
254
+ /**
255
+ * Start periodic logging of metrics
256
+ */
257
+ startPeriodicLogging() {
258
+ const interval = parseInt(process.env.PERFORMANCE_LOG_INTERVAL || '60000');
259
+ setInterval(() => {
260
+ const stats = this.getAllStats();
261
+ const health = this.getHealthStatus();
262
+ if (Object.keys(stats).length > 0) {
263
+ logger.info('Performance metrics:', {
264
+ health: health.status,
265
+ metrics: health.metrics,
266
+ operations: Object.entries(stats).map(([op, stat]) => ({
267
+ operation: op,
268
+ avgTime: Math.round(stat.avgTime),
269
+ p95: Math.round(stat.p95),
270
+ errorRate: Math.round(stat.errorRate * 100) / 100,
271
+ throughput: Math.round(stat.throughput),
272
+ })),
273
+ });
274
+ }
275
+ }, interval);
276
+ }
277
+ /**
278
+ * Reset all metrics
279
+ */
280
+ reset() {
281
+ this.metrics.clear();
282
+ this.startTime = Date.now();
283
+ logger.info('Performance metrics reset');
284
+ }
285
+ /**
286
+ * Get uptime
287
+ */
288
+ getUptime() {
289
+ return Date.now() - this.startTime;
290
+ }
291
+ /**
292
+ * Export metrics for external monitoring
293
+ */
294
+ export() {
295
+ return {
296
+ uptime: this.getUptime(),
297
+ health: this.getHealthStatus(),
298
+ stats: this.getAllStats(),
299
+ timestamp: new Date().toISOString(),
300
+ };
301
+ }
302
+ }
303
+ // Export singleton instance
304
+ export const performanceMonitor = new PerformanceMonitor();
305
+ // Convenience functions
306
+ export async function measure(operation, fn, metadata) {
307
+ return performanceMonitor.measure(operation, fn, metadata);
308
+ }
309
+ export function recordMetric(operation, duration, success = true, metadata) {
310
+ performanceMonitor.record(operation, duration, success, metadata);
311
+ }
312
+ //# sourceMappingURL=performanceMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performanceMonitor.js","sourceRoot":"","sources":["../../src/utils/performanceMonitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ export interface CacheEntry<T> {
2
+ data: T;
3
+ timestamp: number;
4
+ pattern: string;
5
+ hits: number;
6
+ }
7
+ export interface CacheOptions {
8
+ ttl?: number;
9
+ maxSize?: number;
10
+ enableStats?: boolean;
11
+ }
12
+ /**
13
+ * Response cache for crisis patterns with LRU eviction
14
+ */
15
+ export declare class ResponseCache<T = any> {
16
+ private cache;
17
+ private readonly options;
18
+ private stats;
19
+ constructor(options?: CacheOptions);
20
+ /**
21
+ * Extract pattern from crisis message for caching
22
+ */
23
+ private extractPattern;
24
+ /**
25
+ * Get cached response for a message
26
+ */
27
+ get(message: string): T | null;
28
+ /**
29
+ * Save response to cache
30
+ */
31
+ set(message: string, data: T): void;
32
+ /**
33
+ * Check if a message would be cached
34
+ */
35
+ has(message: string): boolean;
36
+ /**
37
+ * Clear the cache
38
+ */
39
+ clear(): void;
40
+ /**
41
+ * Get cache statistics
42
+ */
43
+ getStats(): {
44
+ hitRate: number;
45
+ size: number;
46
+ maxSize: number;
47
+ hits: number;
48
+ misses: number;
49
+ evictions: number;
50
+ saves: number;
51
+ } | null;
52
+ /**
53
+ * Get detailed cache info
54
+ */
55
+ getInfo(): {
56
+ stats: {
57
+ hitRate: number;
58
+ size: number;
59
+ maxSize: number;
60
+ hits: number;
61
+ misses: number;
62
+ evictions: number;
63
+ saves: number;
64
+ } | null;
65
+ entries: {
66
+ pattern: string;
67
+ age: number;
68
+ hits: number;
69
+ expires: number;
70
+ }[];
71
+ };
72
+ /**
73
+ * Prune expired entries
74
+ */
75
+ prune(): number;
76
+ }
77
+ /**
78
+ * Specialized cache for crisis responses
79
+ */
80
+ export declare class CrisisResponseCache extends ResponseCache {
81
+ constructor();
82
+ /**
83
+ * Check if caching should be used for this message
84
+ */
85
+ shouldCache(message: string): boolean;
86
+ }
87
+ export declare const crisisCache: CrisisResponseCache;
88
+ //# sourceMappingURL=responseCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCache.d.ts","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,GAAG;IAChC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,KAAK,CAKX;gBAEU,OAAO,GAAE,YAAiB;IAQtC;;OAEG;IACH,OAAO,CAAC,cAAc;IAwDtB;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAoC9B;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IA+BnC;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAY7B;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ;;;;;;;;;IAiBR;;OAEG;IACH,OAAO;;;;;;;;;;;;;;;;;IAcP;;OAEG;IACH,KAAK,IAAI,MAAM;CAoBhB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;;IAcpD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAgBtC;AAGD,eAAO,MAAM,WAAW,qBAA4B,CAAC"}
@@ -0,0 +1,245 @@
1
+ import { logger } from './logger.js';
2
+ import crypto from 'crypto';
3
+ /**
4
+ * Response cache for crisis patterns with LRU eviction
5
+ */
6
+ export class ResponseCache {
7
+ cache = new Map();
8
+ options;
9
+ stats = {
10
+ hits: 0,
11
+ misses: 0,
12
+ evictions: 0,
13
+ saves: 0,
14
+ };
15
+ constructor(options = {}) {
16
+ this.options = {
17
+ ttl: options.ttl ?? 5 * 60 * 1000, // 5 minutes default
18
+ maxSize: options.maxSize ?? 100, // 100 entries default
19
+ enableStats: options.enableStats ?? true,
20
+ };
21
+ }
22
+ /**
23
+ * Extract pattern from crisis message for caching
24
+ */
25
+ extractPattern(message) {
26
+ const normalized = message.toLowerCase().trim();
27
+ // Define crisis pattern categories
28
+ const patterns = {
29
+ 'suicide_ideation': [
30
+ /\b(thinking about|considering|planning) (suicide|killing myself)\b/i,
31
+ /\bsuicidal thoughts?\b/i,
32
+ /\bwant to (die|end it|kill myself)\b/i,
33
+ ],
34
+ 'self_harm': [
35
+ /\bself[- ]?harm/i,
36
+ /\b(cutting|cut) myself\b/i,
37
+ /\bhurt(ing)? myself\b/i,
38
+ ],
39
+ 'suicide_intent': [
40
+ /\b(going to|will|plan to) (kill myself|end my life|commit suicide)\b/i,
41
+ /\bhave a plan to\b.*\b(die|suicide)\b/i,
42
+ ],
43
+ 'overdose': [
44
+ /\boverdos/i,
45
+ /\btake all (the|my) (pills|medication)\b/i,
46
+ ],
47
+ 'hopelessness': [
48
+ /\bno point in living\b/i,
49
+ /\bbetter off dead\b/i,
50
+ /\bcan'?t go on\b/i,
51
+ ],
52
+ };
53
+ // Check for exact pattern matches
54
+ for (const [category, regexes] of Object.entries(patterns)) {
55
+ for (const regex of regexes) {
56
+ if (regex.test(normalized)) {
57
+ return category;
58
+ }
59
+ }
60
+ }
61
+ // For non-matching patterns, create a hash of key phrases
62
+ const keyPhrases = normalized
63
+ .replace(/[^\w\s]/g, '') // Remove punctuation
64
+ .split(/\s+/) // Split on whitespace
65
+ .filter(word => word.length > 3) // Keep meaningful words
66
+ .sort() // Sort for consistency
67
+ .slice(0, 10) // Take first 10 words
68
+ .join('_');
69
+ // Create a short hash for the pattern
70
+ return crypto
71
+ .createHash('md5')
72
+ .update(keyPhrases)
73
+ .digest('hex')
74
+ .substring(0, 8);
75
+ }
76
+ /**
77
+ * Get cached response for a message
78
+ */
79
+ get(message) {
80
+ const pattern = this.extractPattern(message);
81
+ const entry = this.cache.get(pattern);
82
+ if (!entry) {
83
+ if (this.options.enableStats) {
84
+ this.stats.misses++;
85
+ }
86
+ logger.debug(`Cache miss for pattern: ${pattern}`);
87
+ return null;
88
+ }
89
+ // Check if entry is expired
90
+ if (Date.now() - entry.timestamp > this.options.ttl) {
91
+ this.cache.delete(pattern);
92
+ if (this.options.enableStats) {
93
+ this.stats.misses++;
94
+ this.stats.evictions++;
95
+ }
96
+ logger.debug(`Cache expired for pattern: ${pattern}`);
97
+ return null;
98
+ }
99
+ // Update hit count and move to end (LRU)
100
+ entry.hits++;
101
+ this.cache.delete(pattern);
102
+ this.cache.set(pattern, entry);
103
+ if (this.options.enableStats) {
104
+ this.stats.hits++;
105
+ }
106
+ logger.info(`Cache hit for pattern: ${pattern} (hits: ${entry.hits})`);
107
+ return entry.data;
108
+ }
109
+ /**
110
+ * Save response to cache
111
+ */
112
+ set(message, data) {
113
+ const pattern = this.extractPattern(message);
114
+ // Evict oldest entry if cache is full
115
+ if (this.cache.size >= this.options.maxSize) {
116
+ const firstKey = this.cache.keys().next().value;
117
+ if (firstKey) {
118
+ this.cache.delete(firstKey);
119
+ if (this.options.enableStats) {
120
+ this.stats.evictions++;
121
+ }
122
+ logger.debug(`Evicted oldest cache entry: ${firstKey}`);
123
+ }
124
+ }
125
+ const entry = {
126
+ data,
127
+ timestamp: Date.now(),
128
+ pattern,
129
+ hits: 0,
130
+ };
131
+ this.cache.set(pattern, entry);
132
+ if (this.options.enableStats) {
133
+ this.stats.saves++;
134
+ }
135
+ logger.debug(`Cached response for pattern: ${pattern}`);
136
+ }
137
+ /**
138
+ * Check if a message would be cached
139
+ */
140
+ has(message) {
141
+ const pattern = this.extractPattern(message);
142
+ const entry = this.cache.get(pattern);
143
+ if (!entry) {
144
+ return false;
145
+ }
146
+ // Check expiration
147
+ return Date.now() - entry.timestamp <= this.options.ttl;
148
+ }
149
+ /**
150
+ * Clear the cache
151
+ */
152
+ clear() {
153
+ const size = this.cache.size;
154
+ this.cache.clear();
155
+ logger.info(`Cleared ${size} cache entries`);
156
+ }
157
+ /**
158
+ * Get cache statistics
159
+ */
160
+ getStats() {
161
+ if (!this.options.enableStats) {
162
+ return null;
163
+ }
164
+ const hitRate = this.stats.hits + this.stats.misses > 0
165
+ ? this.stats.hits / (this.stats.hits + this.stats.misses)
166
+ : 0;
167
+ return {
168
+ ...this.stats,
169
+ hitRate: Math.round(hitRate * 100) / 100,
170
+ size: this.cache.size,
171
+ maxSize: this.options.maxSize,
172
+ };
173
+ }
174
+ /**
175
+ * Get detailed cache info
176
+ */
177
+ getInfo() {
178
+ const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({
179
+ pattern: key,
180
+ age: Date.now() - entry.timestamp,
181
+ hits: entry.hits,
182
+ expires: this.options.ttl - (Date.now() - entry.timestamp),
183
+ }));
184
+ return {
185
+ stats: this.getStats(),
186
+ entries: entries.sort((a, b) => b.hits - a.hits), // Sort by hits
187
+ };
188
+ }
189
+ /**
190
+ * Prune expired entries
191
+ */
192
+ prune() {
193
+ const now = Date.now();
194
+ let pruned = 0;
195
+ for (const [pattern, entry] of this.cache.entries()) {
196
+ if (now - entry.timestamp > this.options.ttl) {
197
+ this.cache.delete(pattern);
198
+ pruned++;
199
+ if (this.options.enableStats) {
200
+ this.stats.evictions++;
201
+ }
202
+ }
203
+ }
204
+ if (pruned > 0) {
205
+ logger.debug(`Pruned ${pruned} expired cache entries`);
206
+ }
207
+ return pruned;
208
+ }
209
+ }
210
+ /**
211
+ * Specialized cache for crisis responses
212
+ */
213
+ export class CrisisResponseCache extends ResponseCache {
214
+ constructor() {
215
+ super({
216
+ ttl: parseInt(process.env.CRISIS_CACHE_TTL || '300000'), // 5 minutes
217
+ maxSize: parseInt(process.env.CRISIS_CACHE_SIZE || '50'),
218
+ enableStats: true,
219
+ });
220
+ // Set up periodic pruning
221
+ if (process.env.CRISIS_CACHE_ENABLED !== 'false') {
222
+ setInterval(() => this.prune(), 60000); // Prune every minute
223
+ }
224
+ }
225
+ /**
226
+ * Check if caching should be used for this message
227
+ */
228
+ shouldCache(message) {
229
+ // Don't cache if disabled
230
+ if (process.env.CRISIS_CACHE_ENABLED === 'false') {
231
+ return false;
232
+ }
233
+ // Only cache messages with clear crisis indicators
234
+ const crisisKeywords = [
235
+ 'suicide', 'kill myself', 'self-harm', 'self harm',
236
+ 'end my life', 'overdose', 'cut myself', 'hurt myself',
237
+ 'want to die', 'better off dead'
238
+ ];
239
+ const normalized = message.toLowerCase();
240
+ return crisisKeywords.some(keyword => normalized.includes(keyword));
241
+ }
242
+ }
243
+ // Export singleton instance
244
+ export const crisisCache = new CrisisResponseCache();
245
+ //# sourceMappingURL=responseCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCache.js","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"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"}