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,348 @@
1
+ import { logger } from './logger.js';
2
+ export var ErrorType;
3
+ (function (ErrorType) {
4
+ ErrorType["NETWORK"] = "NETWORK_ERROR";
5
+ ErrorType["TIMEOUT"] = "TIMEOUT_ERROR";
6
+ ErrorType["VALIDATION"] = "VALIDATION_ERROR";
7
+ ErrorType["AUTHENTICATION"] = "AUTHENTICATION_ERROR";
8
+ ErrorType["RATE_LIMIT"] = "RATE_LIMIT_ERROR";
9
+ ErrorType["SERVER"] = "SERVER_ERROR";
10
+ ErrorType["CRISIS"] = "CRISIS_HANDLING_ERROR";
11
+ ErrorType["DATABASE"] = "DATABASE_ERROR";
12
+ ErrorType["UNKNOWN"] = "UNKNOWN_ERROR";
13
+ })(ErrorType || (ErrorType = {}));
14
+ export var ErrorSeverity;
15
+ (function (ErrorSeverity) {
16
+ ErrorSeverity["LOW"] = "low";
17
+ ErrorSeverity["MEDIUM"] = "medium";
18
+ ErrorSeverity["HIGH"] = "high";
19
+ ErrorSeverity["CRITICAL"] = "critical";
20
+ })(ErrorSeverity || (ErrorSeverity = {}));
21
+ export class ApplicationError extends Error {
22
+ context;
23
+ constructor(context) {
24
+ super(context.message);
25
+ this.name = 'ApplicationError';
26
+ this.context = {
27
+ type: context.type || ErrorType.UNKNOWN,
28
+ severity: context.severity || ErrorSeverity.MEDIUM,
29
+ message: context.message,
30
+ originalError: context.originalError,
31
+ metadata: context.metadata || {},
32
+ timestamp: context.timestamp || new Date(),
33
+ recoverable: context.recoverable ?? true,
34
+ userMessage: context.userMessage,
35
+ };
36
+ }
37
+ toJSON() {
38
+ return {
39
+ name: this.name,
40
+ message: this.message,
41
+ context: this.context,
42
+ stack: this.stack,
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Error handler with recovery strategies
48
+ */
49
+ export class ErrorHandler {
50
+ errorCount = new Map();
51
+ lastError = new Map();
52
+ /**
53
+ * Classify error based on message and characteristics
54
+ */
55
+ classifyError(error) {
56
+ const message = error.message.toLowerCase();
57
+ // Network errors
58
+ if (message.includes('network') ||
59
+ message.includes('econnrefused') ||
60
+ message.includes('econnreset') ||
61
+ message.includes('fetch failed')) {
62
+ return ErrorType.NETWORK;
63
+ }
64
+ // Timeout errors
65
+ if (message.includes('timeout') ||
66
+ message.includes('timed out')) {
67
+ return ErrorType.TIMEOUT;
68
+ }
69
+ // Authentication errors
70
+ if (message.includes('401') ||
71
+ message.includes('unauthorized') ||
72
+ message.includes('authentication')) {
73
+ return ErrorType.AUTHENTICATION;
74
+ }
75
+ // Rate limiting
76
+ if (message.includes('429') ||
77
+ message.includes('rate limit') ||
78
+ message.includes('too many requests')) {
79
+ return ErrorType.RATE_LIMIT;
80
+ }
81
+ // Validation errors
82
+ if (message.includes('validation') ||
83
+ message.includes('invalid') ||
84
+ message.includes('expected')) {
85
+ return ErrorType.VALIDATION;
86
+ }
87
+ // Server errors
88
+ if (message.includes('500') ||
89
+ message.includes('502') ||
90
+ message.includes('503') ||
91
+ message.includes('server error')) {
92
+ return ErrorType.SERVER;
93
+ }
94
+ // Database errors
95
+ if (message.includes('database') ||
96
+ message.includes('connection pool') ||
97
+ message.includes('query failed')) {
98
+ return ErrorType.DATABASE;
99
+ }
100
+ // Crisis handling errors
101
+ if (message.includes('crisis') ||
102
+ message.includes('emergency')) {
103
+ return ErrorType.CRISIS;
104
+ }
105
+ return ErrorType.UNKNOWN;
106
+ }
107
+ /**
108
+ * Determine error severity
109
+ */
110
+ determineSeverity(type, _error) {
111
+ // Critical errors that need immediate attention
112
+ if (type === ErrorType.CRISIS) {
113
+ return ErrorSeverity.CRITICAL;
114
+ }
115
+ // High severity for authentication and database issues
116
+ if (type === ErrorType.AUTHENTICATION ||
117
+ type === ErrorType.DATABASE) {
118
+ return ErrorSeverity.HIGH;
119
+ }
120
+ // Medium for server and timeout errors
121
+ if (type === ErrorType.SERVER ||
122
+ type === ErrorType.TIMEOUT) {
123
+ return ErrorSeverity.MEDIUM;
124
+ }
125
+ // Low for network and rate limit (usually transient)
126
+ if (type === ErrorType.NETWORK ||
127
+ type === ErrorType.RATE_LIMIT) {
128
+ return ErrorSeverity.LOW;
129
+ }
130
+ return ErrorSeverity.MEDIUM;
131
+ }
132
+ /**
133
+ * Handle error with appropriate recovery strategy
134
+ */
135
+ async handle(error, context) {
136
+ const type = this.classifyError(error);
137
+ const severity = this.determineSeverity(type, error);
138
+ // Track error frequency
139
+ this.trackError(type);
140
+ // Create error context
141
+ const errorContext = {
142
+ type,
143
+ severity,
144
+ message: error.message,
145
+ originalError: error,
146
+ metadata: context,
147
+ timestamp: new Date(),
148
+ recoverable: this.isRecoverable(type),
149
+ userMessage: this.getUserMessage(type, error),
150
+ };
151
+ // Log based on severity
152
+ this.logError(errorContext);
153
+ // Apply recovery strategy
154
+ await this.applyRecoveryStrategy(errorContext);
155
+ return errorContext;
156
+ }
157
+ /**
158
+ * Track error frequency for monitoring
159
+ */
160
+ trackError(type) {
161
+ const count = this.errorCount.get(type) || 0;
162
+ this.errorCount.set(type, count + 1);
163
+ this.lastError.set(type, new Date());
164
+ // Alert if error frequency is too high
165
+ if (count > 10) {
166
+ logger.error(`High frequency of ${type} errors: ${count} occurrences`);
167
+ }
168
+ }
169
+ /**
170
+ * Determine if error is recoverable
171
+ */
172
+ isRecoverable(type) {
173
+ switch (type) {
174
+ case ErrorType.NETWORK:
175
+ case ErrorType.TIMEOUT:
176
+ case ErrorType.RATE_LIMIT:
177
+ case ErrorType.SERVER:
178
+ return true;
179
+ case ErrorType.AUTHENTICATION:
180
+ case ErrorType.VALIDATION:
181
+ return false;
182
+ case ErrorType.CRISIS:
183
+ return true; // Always try to recover from crisis handling errors
184
+ default:
185
+ return true;
186
+ }
187
+ }
188
+ /**
189
+ * Get user-friendly error message
190
+ */
191
+ getUserMessage(type, _error) {
192
+ switch (type) {
193
+ case ErrorType.NETWORK:
194
+ return 'Connection issue. Please check your internet and try again.';
195
+ case ErrorType.TIMEOUT:
196
+ return 'The request is taking longer than expected. Please try again.';
197
+ case ErrorType.AUTHENTICATION:
198
+ return 'Authentication failed. Please check your credentials.';
199
+ case ErrorType.RATE_LIMIT:
200
+ return 'Too many requests. Please wait a moment and try again.';
201
+ case ErrorType.VALIDATION:
202
+ return 'Invalid input provided. Please check your data and try again.';
203
+ case ErrorType.SERVER:
204
+ return 'Server error occurred. Our team has been notified.';
205
+ case ErrorType.DATABASE:
206
+ return 'Database issue encountered. Please try again later.';
207
+ case ErrorType.CRISIS:
208
+ return 'We\'re having trouble processing your message. If this is an emergency, please call 988 (Suicide & Crisis Lifeline).';
209
+ default:
210
+ return 'An unexpected error occurred. Please try again.';
211
+ }
212
+ }
213
+ /**
214
+ * Log error based on severity
215
+ */
216
+ logError(context) {
217
+ const logData = {
218
+ type: context.type,
219
+ severity: context.severity,
220
+ message: context.message,
221
+ metadata: context.metadata,
222
+ timestamp: context.timestamp,
223
+ };
224
+ switch (context.severity) {
225
+ case ErrorSeverity.CRITICAL:
226
+ logger.error('[CRITICAL]', logData);
227
+ // Could trigger alerts here
228
+ break;
229
+ case ErrorSeverity.HIGH:
230
+ logger.error('[HIGH]', logData);
231
+ break;
232
+ case ErrorSeverity.MEDIUM:
233
+ logger.warn('[MEDIUM]', logData);
234
+ break;
235
+ case ErrorSeverity.LOW:
236
+ logger.debug('[LOW]', logData);
237
+ break;
238
+ }
239
+ }
240
+ /**
241
+ * Apply recovery strategy based on error type
242
+ */
243
+ async applyRecoveryStrategy(context) {
244
+ switch (context.type) {
245
+ case ErrorType.NETWORK:
246
+ // Network errors: wait and retry
247
+ await this.delay(2000);
248
+ break;
249
+ case ErrorType.TIMEOUT:
250
+ // Timeout: increase timeout for next attempt
251
+ context.metadata = {
252
+ ...context.metadata,
253
+ suggestedTimeout: 60000,
254
+ };
255
+ break;
256
+ case ErrorType.RATE_LIMIT:
257
+ // Rate limit: exponential backoff
258
+ const waitTime = this.calculateBackoff(context.type);
259
+ await this.delay(waitTime);
260
+ break;
261
+ case ErrorType.SERVER:
262
+ // Server error: circuit breaker pattern
263
+ context.metadata = {
264
+ ...context.metadata,
265
+ useCircuitBreaker: true,
266
+ };
267
+ break;
268
+ case ErrorType.CRISIS:
269
+ // Crisis error: fallback to emergency response
270
+ context.metadata = {
271
+ ...context.metadata,
272
+ fallbackToEmergencyResponse: true,
273
+ emergencyResources: this.getEmergencyResources(),
274
+ };
275
+ break;
276
+ case ErrorType.DATABASE:
277
+ // Database error: use cache or fallback
278
+ context.metadata = {
279
+ ...context.metadata,
280
+ useCache: true,
281
+ fallbackToLocal: true,
282
+ };
283
+ break;
284
+ default:
285
+ // Unknown errors: log and continue
286
+ logger.warn('No specific recovery strategy for error type:', context.type);
287
+ }
288
+ }
289
+ /**
290
+ * Calculate backoff time based on error frequency
291
+ */
292
+ calculateBackoff(type) {
293
+ const count = this.errorCount.get(type) || 1;
294
+ return Math.min(1000 * Math.pow(2, count - 1), 30000); // Max 30 seconds
295
+ }
296
+ /**
297
+ * Simple delay helper
298
+ */
299
+ delay(ms) {
300
+ return new Promise(resolve => setTimeout(resolve, ms));
301
+ }
302
+ /**
303
+ * Get emergency resources for crisis situations
304
+ */
305
+ getEmergencyResources() {
306
+ return [
307
+ {
308
+ name: '988 Suicide & Crisis Lifeline',
309
+ phone: '988',
310
+ text: 'Text "HELLO" to 741741',
311
+ available: '24/7',
312
+ },
313
+ {
314
+ name: 'Emergency Services',
315
+ phone: '911',
316
+ available: '24/7',
317
+ },
318
+ ];
319
+ }
320
+ /**
321
+ * Get error statistics
322
+ */
323
+ getStats() {
324
+ const stats = {};
325
+ for (const [type, count] of this.errorCount.entries()) {
326
+ const lastOccurrence = this.lastError.get(type);
327
+ stats[type] = {
328
+ count,
329
+ lastOccurrence: lastOccurrence?.toISOString(),
330
+ };
331
+ }
332
+ return stats;
333
+ }
334
+ /**
335
+ * Reset error tracking
336
+ */
337
+ reset() {
338
+ this.errorCount.clear();
339
+ this.lastError.clear();
340
+ }
341
+ }
342
+ // Export singleton instance
343
+ export const errorHandler = new ErrorHandler();
344
+ // Convenience function
345
+ export async function handleError(error, context) {
346
+ return errorHandler.handle(error, context);
347
+ }
348
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare class CouchLoopError extends Error {
2
+ readonly code: string;
3
+ readonly statusCode: number;
4
+ readonly details?: any | undefined;
5
+ constructor(message: string, code: string, statusCode?: number, details?: any | undefined);
6
+ toJSON(): {
7
+ name: string;
8
+ message: string;
9
+ code: string;
10
+ statusCode: number;
11
+ details: any;
12
+ };
13
+ }
14
+ export declare class ValidationError extends CouchLoopError {
15
+ constructor(message: string, details?: any);
16
+ }
17
+ export declare class AuthenticationError extends CouchLoopError {
18
+ constructor(message?: string);
19
+ }
20
+ export declare class AuthorizationError extends CouchLoopError {
21
+ constructor(message?: string);
22
+ }
23
+ export declare class NotFoundError extends CouchLoopError {
24
+ constructor(resource: string, identifier?: string);
25
+ }
26
+ export declare class ConflictError extends CouchLoopError {
27
+ constructor(message: string, details?: any);
28
+ }
29
+ export declare class DatabaseError extends CouchLoopError {
30
+ constructor(message: string, originalError?: any);
31
+ }
32
+ export declare function handleError(error: any): {
33
+ error: string;
34
+ details?: any;
35
+ };
36
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM;aAClB,OAAO,CAAC,EAAE,GAAG;gBAH7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,GAAG,YAAA;IAO/B,MAAM;;;;;;;CASP;AAED,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,GAAE,MAAkC;CAIxD;AAED,qBAAa,kBAAmB,SAAQ,cAAc;gBACxC,OAAO,GAAE,MAAmC;CAIzD;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAOlD;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG;CAIjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAA;CAAE,CAexE"}
@@ -0,0 +1,77 @@
1
+ import { logger } from './logger.js';
2
+ export class CouchLoopError extends Error {
3
+ code;
4
+ statusCode;
5
+ details;
6
+ constructor(message, code, statusCode = 500, details) {
7
+ super(message);
8
+ this.code = code;
9
+ this.statusCode = statusCode;
10
+ this.details = details;
11
+ this.name = 'CouchLoopError';
12
+ Error.captureStackTrace(this, this.constructor);
13
+ }
14
+ toJSON() {
15
+ return {
16
+ name: this.name,
17
+ message: this.message,
18
+ code: this.code,
19
+ statusCode: this.statusCode,
20
+ details: this.details,
21
+ };
22
+ }
23
+ }
24
+ export class ValidationError extends CouchLoopError {
25
+ constructor(message, details) {
26
+ super(message, 'VALIDATION_ERROR', 400, details);
27
+ this.name = 'ValidationError';
28
+ }
29
+ }
30
+ export class AuthenticationError extends CouchLoopError {
31
+ constructor(message = 'Authentication required') {
32
+ super(message, 'AUTHENTICATION_ERROR', 401);
33
+ this.name = 'AuthenticationError';
34
+ }
35
+ }
36
+ export class AuthorizationError extends CouchLoopError {
37
+ constructor(message = 'Insufficient permissions') {
38
+ super(message, 'AUTHORIZATION_ERROR', 403);
39
+ this.name = 'AuthorizationError';
40
+ }
41
+ }
42
+ export class NotFoundError extends CouchLoopError {
43
+ constructor(resource, identifier) {
44
+ const message = identifier
45
+ ? `${resource} with id ${identifier} not found`
46
+ : `${resource} not found`;
47
+ super(message, 'NOT_FOUND', 404);
48
+ this.name = 'NotFoundError';
49
+ }
50
+ }
51
+ export class ConflictError extends CouchLoopError {
52
+ constructor(message, details) {
53
+ super(message, 'CONFLICT', 409, details);
54
+ this.name = 'ConflictError';
55
+ }
56
+ }
57
+ export class DatabaseError extends CouchLoopError {
58
+ constructor(message, originalError) {
59
+ super(message, 'DATABASE_ERROR', 500, { originalError });
60
+ this.name = 'DatabaseError';
61
+ }
62
+ }
63
+ export function handleError(error) {
64
+ if (error instanceof CouchLoopError) {
65
+ return {
66
+ error: error.message,
67
+ details: error.details,
68
+ };
69
+ }
70
+ // Log unexpected errors
71
+ logger.error('Unexpected error:', error);
72
+ return {
73
+ error: 'An unexpected error occurred',
74
+ details: process.env.NODE_ENV === 'development' ? error.message : undefined,
75
+ };
76
+ }
77
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGrB;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAY,EACZ,aAAqB,GAAG,EACxB,OAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAc;QACxB,YAAO,GAAP,OAAO,CAAM;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,UAAkB,yBAAyB;QACrD,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IACpD,YAAY,UAAkB,0BAA0B;QACtD,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,QAAgB,EAAE,UAAmB;QAC/C,MAAM,OAAO,GAAG,UAAU;YACxB,CAAC,CAAC,GAAG,QAAQ,YAAY,UAAU,YAAY;YAC/C,CAAC,CAAC,GAAG,QAAQ,YAAY,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,OAAe,EAAE,OAAa;QACxC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,OAAe,EAAE,aAAmB;QAC9C,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAEzC,OAAO;QACL,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ declare class Logger {
2
+ private level;
3
+ private isMCP;
4
+ constructor();
5
+ private log;
6
+ error(...args: any[]): void;
7
+ warn(...args: any[]): void;
8
+ info(...args: any[]): void;
9
+ debug(...args: any[]): void;
10
+ }
11
+ export declare const logger: Logger;
12
+ export {};
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AASA,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAU;;IASvB,OAAO,CAAC,GAAG;IAoBX,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAInB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAInB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;CAGrB;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,49 @@
1
+ const LOG_LEVELS = {
2
+ ERROR: 0,
3
+ WARN: 1,
4
+ INFO: 2,
5
+ DEBUG: 3,
6
+ };
7
+ class Logger {
8
+ level;
9
+ isMCP;
10
+ constructor() {
11
+ const envLevel = (process.env.LOG_LEVEL?.toUpperCase() || 'INFO');
12
+ this.level = LOG_LEVELS[envLevel] ?? LOG_LEVELS.INFO;
13
+ // Disable console logging when running as MCP server
14
+ this.isMCP = process.env.MCP_MODE === 'true' || process.argv.includes('--mcp');
15
+ }
16
+ log(level, ...args) {
17
+ // Skip all console output when running as MCP server
18
+ if (this.isMCP) {
19
+ return;
20
+ }
21
+ if (LOG_LEVELS[level] <= this.level) {
22
+ const timestamp = new Date().toISOString();
23
+ const prefix = `[${timestamp}] [${level}]`;
24
+ if (level === 'ERROR') {
25
+ console.error(prefix, ...args);
26
+ }
27
+ else if (level === 'WARN') {
28
+ console.warn(prefix, ...args);
29
+ }
30
+ else {
31
+ console.log(prefix, ...args);
32
+ }
33
+ }
34
+ }
35
+ error(...args) {
36
+ this.log('ERROR', ...args);
37
+ }
38
+ warn(...args) {
39
+ this.log('WARN', ...args);
40
+ }
41
+ info(...args) {
42
+ this.log('INFO', ...args);
43
+ }
44
+ debug(...args) {
45
+ this.log('DEBUG', ...args);
46
+ }
47
+ }
48
+ export const logger = new Logger();
49
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC;AAIX,MAAM,MAAM;IACF,KAAK,CAAS;IACd,KAAK,CAAU;IAEvB;QACE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,MAAM,CAAa,CAAC;QAC9E,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;QACrD,qDAAqD;QACrD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjF,CAAC;IAEO,GAAG,CAAC,KAAe,EAAE,GAAG,IAAW;QACzC,qDAAqD;QACrD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,MAAM,KAAK,GAAG,CAAC;YAE3C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,GAAG,IAAW;QACjB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,GAAG,IAAW;QACjB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface PerformanceMetric {
3
+ operation: string;
4
+ duration: number;
5
+ success: boolean;
6
+ timestamp: Date;
7
+ metadata?: Record<string, any>;
8
+ }
9
+ export interface PerformanceStats {
10
+ count: number;
11
+ successCount: number;
12
+ errorCount: number;
13
+ totalTime: number;
14
+ avgTime: number;
15
+ minTime: number;
16
+ maxTime: number;
17
+ p50: number;
18
+ p95: number;
19
+ p99: number;
20
+ errorRate: number;
21
+ throughput: number;
22
+ }
23
+ export interface HealthStatus {
24
+ status: 'healthy' | 'degraded' | 'unhealthy';
25
+ checks: {
26
+ responseTime: boolean;
27
+ errorRate: boolean;
28
+ throughput: boolean;
29
+ };
30
+ metrics: {
31
+ avgResponseTime: number;
32
+ errorRate: number;
33
+ requestsPerMinute: number;
34
+ };
35
+ }
36
+ /**
37
+ * Performance monitoring with real-time metrics and alerting
38
+ */
39
+ export declare class PerformanceMonitor extends EventEmitter {
40
+ private metrics;
41
+ private readonly maxMetricsPerOperation;
42
+ private readonly metricsWindow;
43
+ private startTime;
44
+ private readonly thresholds;
45
+ constructor();
46
+ /**
47
+ * Measure operation performance
48
+ */
49
+ measure<T>(operation: string, fn: () => Promise<T>, metadata?: Record<string, any>): Promise<T>;
50
+ /**
51
+ * Measure sync operation performance
52
+ */
53
+ measureSync<T>(operation: string, fn: () => T, metadata?: Record<string, any>): T;
54
+ /**
55
+ * Record a metric
56
+ */
57
+ record(operation: string, duration: number, success?: boolean, metadata?: Record<string, any>): void;
58
+ /**
59
+ * Get statistics for an operation
60
+ */
61
+ getStats(operation: string): PerformanceStats | null;
62
+ /**
63
+ * Get all statistics
64
+ */
65
+ getAllStats(): Record<string, PerformanceStats>;
66
+ /**
67
+ * Get health status
68
+ */
69
+ getHealthStatus(): HealthStatus;
70
+ /**
71
+ * Get recent metrics for an operation
72
+ */
73
+ private getRecentMetrics;
74
+ /**
75
+ * Calculate percentile
76
+ */
77
+ private percentile;
78
+ /**
79
+ * Check for performance issues
80
+ */
81
+ private checkPerformance;
82
+ /**
83
+ * Start periodic cleanup of old metrics
84
+ */
85
+ private startPeriodicCleanup;
86
+ /**
87
+ * Start periodic logging of metrics
88
+ */
89
+ private startPeriodicLogging;
90
+ /**
91
+ * Reset all metrics
92
+ */
93
+ reset(): void;
94
+ /**
95
+ * Get uptime
96
+ */
97
+ getUptime(): number;
98
+ /**
99
+ * Export metrics for external monitoring
100
+ */
101
+ export(): any;
102
+ }
103
+ export declare const performanceMonitor: PerformanceMonitor;
104
+ export declare function measure<T>(operation: string, fn: () => Promise<T>, metadata?: Record<string, any>): Promise<T>;
105
+ export declare function recordMetric(operation: string, duration: number, success?: boolean, metadata?: Record<string, any>): void;
106
+ //# sourceMappingURL=performanceMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performanceMonitor.d.ts","sourceRoot":"","sources":["../../src/utils/performanceMonitor.ts"],"names":[],"mappings":"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"}