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.
- package/LICENSE +21 -0
- package/README.md +358 -0
- package/assets/logo/README.md +12 -0
- package/assets/logo/couchloop_EQ-IconLogo.png +0 -0
- package/dist/auth/middleware.d.ts +8 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +59 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/clients/shrinkChatClient.d.ts +195 -0
- package/dist/clients/shrinkChatClient.d.ts.map +1 -0
- package/dist/clients/shrinkChatClient.js +349 -0
- package/dist/clients/shrinkChatClient.js.map +1 -0
- package/dist/db/client.d.ts +23 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +78 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +4 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +34 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/schema.d.ts +1074 -0
- package/dist/db/migrations/schema.d.ts.map +1 -0
- package/dist/db/migrations/schema.js +160 -0
- package/dist/db/migrations/schema.js.map +1 -0
- package/dist/db/schema.d.ts +1213 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +157 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +4 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +57 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/db/seedOAuth.d.ts +4 -0
- package/dist/db/seedOAuth.d.ts.map +1 -0
- package/dist/db/seedOAuth.js +76 -0
- package/dist/db/seedOAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +11 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +56 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/journey-status.d.ts +2 -0
- package/dist/resources/journey-status.d.ts.map +1 -0
- package/dist/resources/journey-status.js +42 -0
- package/dist/resources/journey-status.js.map +1 -0
- package/dist/resources/session-summary.d.ts +2 -0
- package/dist/resources/session-summary.d.ts.map +1 -0
- package/dist/resources/session-summary.js +85 -0
- package/dist/resources/session-summary.js.map +1 -0
- package/dist/resources/user-context.d.ts +2 -0
- package/dist/resources/user-context.d.ts.map +1 -0
- package/dist/resources/user-context.js +79 -0
- package/dist/resources/user-context.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +385 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +30 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +157 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/oauth/anomalyDetection.d.ts +146 -0
- package/dist/server/oauth/anomalyDetection.d.ts.map +1 -0
- package/dist/server/oauth/anomalyDetection.js +405 -0
- package/dist/server/oauth/anomalyDetection.js.map +1 -0
- package/dist/server/oauth/authServer.d.ts +61 -0
- package/dist/server/oauth/authServer.d.ts.map +1 -0
- package/dist/server/oauth/authServer.js +283 -0
- package/dist/server/oauth/authServer.js.map +1 -0
- package/dist/server/oauth/dpop.d.ts +135 -0
- package/dist/server/oauth/dpop.d.ts.map +1 -0
- package/dist/server/oauth/dpop.js +338 -0
- package/dist/server/oauth/dpop.js.map +1 -0
- package/dist/server/oauth/gdpr/consent.d.ts +173 -0
- package/dist/server/oauth/gdpr/consent.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/consent.js +388 -0
- package/dist/server/oauth/gdpr/consent.js.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts +214 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.js +486 -0
- package/dist/server/oauth/gdpr/dataPortability.js.map +1 -0
- package/dist/server/oauth/gdpr/index.d.ts +103 -0
- package/dist/server/oauth/gdpr/index.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/index.js +273 -0
- package/dist/server/oauth/gdpr/index.js.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +184 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.js +527 -0
- package/dist/server/oauth/gdpr/rightToErasure.js.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +218 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.js +615 -0
- package/dist/server/oauth/monitoring/securityMonitor.js.map +1 -0
- package/dist/server/oauth/pkce.d.ts +61 -0
- package/dist/server/oauth/pkce.d.ts.map +1 -0
- package/dist/server/oauth/pkce.js +157 -0
- package/dist/server/oauth/pkce.js.map +1 -0
- package/dist/server/oauth/providers/base.d.ts +147 -0
- package/dist/server/oauth/providers/base.d.ts.map +1 -0
- package/dist/server/oauth/providers/base.js +312 -0
- package/dist/server/oauth/providers/base.js.map +1 -0
- package/dist/server/oauth/providers/github.d.ts +55 -0
- package/dist/server/oauth/providers/github.d.ts.map +1 -0
- package/dist/server/oauth/providers/github.js +225 -0
- package/dist/server/oauth/providers/github.js.map +1 -0
- package/dist/server/oauth/providers/google.d.ts +49 -0
- package/dist/server/oauth/providers/google.d.ts.map +1 -0
- package/dist/server/oauth/providers/google.js +153 -0
- package/dist/server/oauth/providers/google.js.map +1 -0
- package/dist/server/oauth/providers/index.d.ts +9 -0
- package/dist/server/oauth/providers/index.d.ts.map +1 -0
- package/dist/server/oauth/providers/index.js +24 -0
- package/dist/server/oauth/providers/index.js.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts +114 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.js +344 -0
- package/dist/server/oauth/refreshTokenRotation.js.map +1 -0
- package/dist/server/oauth/security.d.ts +101 -0
- package/dist/server/oauth/security.d.ts.map +1 -0
- package/dist/server/oauth/security.js +268 -0
- package/dist/server/oauth/security.js.map +1 -0
- package/dist/server/oauth/tokenEncryption.d.ts +80 -0
- package/dist/server/oauth/tokenEncryption.d.ts.map +1 -0
- package/dist/server/oauth/tokenEncryption.js +218 -0
- package/dist/server/oauth/tokenEncryption.js.map +1 -0
- package/dist/tools/checkpoint.d.ts +35 -0
- package/dist/tools/checkpoint.d.ts.map +1 -0
- package/dist/tools/checkpoint.js +125 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/index.d.ts +412 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +262 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/insight.d.ts +65 -0
- package/dist/tools/insight.d.ts.map +1 -0
- package/dist/tools/insight.js +190 -0
- package/dist/tools/insight.js.map +1 -0
- package/dist/tools/journey.d.ts +45 -0
- package/dist/tools/journey.d.ts.map +1 -0
- package/dist/tools/journey.js +115 -0
- package/dist/tools/journey.js.map +1 -0
- package/dist/tools/sendMessage.d.ts +6 -0
- package/dist/tools/sendMessage.d.ts.map +1 -0
- package/dist/tools/sendMessage.js +278 -0
- package/dist/tools/sendMessage.js.map +1 -0
- package/dist/tools/session.d.ts +106 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +161 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/types/auth.d.ts +37 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +44 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/checkpoint.d.ts +25 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/insight.d.ts +83 -0
- package/dist/types/insight.d.ts.map +1 -0
- package/dist/types/insight.js +14 -0
- package/dist/types/insight.js.map +1 -0
- package/dist/types/journey.d.ts +155 -0
- package/dist/types/journey.d.ts.map +1 -0
- package/dist/types/journey.js +29 -0
- package/dist/types/journey.js.map +1 -0
- package/dist/types/session.d.ts +82 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +13 -0
- package/dist/types/session.js.map +1 -0
- package/dist/utils/circuitBreaker.d.ts +86 -0
- package/dist/utils/circuitBreaker.d.ts.map +1 -0
- package/dist/utils/circuitBreaker.js +234 -0
- package/dist/utils/circuitBreaker.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +101 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +348 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +77 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performanceMonitor.d.ts +106 -0
- package/dist/utils/performanceMonitor.d.ts.map +1 -0
- package/dist/utils/performanceMonitor.js +312 -0
- package/dist/utils/performanceMonitor.js.map +1 -0
- package/dist/utils/responseCache.d.ts +88 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +245 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/retryStrategy.d.ts +49 -0
- package/dist/utils/retryStrategy.d.ts.map +1 -0
- package/dist/utils/retryStrategy.js +167 -0
- package/dist/utils/retryStrategy.js.map +1 -0
- package/dist/workflows/definitions/daily-reflection.d.ts +3 -0
- package/dist/workflows/definitions/daily-reflection.d.ts.map +1 -0
- package/dist/workflows/definitions/daily-reflection.js +52 -0
- package/dist/workflows/definitions/daily-reflection.js.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts +3 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.js +52 -0
- package/dist/workflows/definitions/gratitude-practice.js.map +1 -0
- package/dist/workflows/definitions/weekly-review.d.ts +3 -0
- package/dist/workflows/definitions/weekly-review.d.ts.map +1 -0
- package/dist/workflows/definitions/weekly-review.js +74 -0
- package/dist/workflows/definitions/weekly-review.js.map +1 -0
- package/dist/workflows/engine.d.ts +21 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +149 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +26 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +14 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +98 -0
- 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":"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"}
|
|
@@ -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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"}
|