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,349 @@
1
+ import { z } from 'zod';
2
+ import { logger } from '../utils/logger.js';
3
+ import { CircuitBreaker } from '../utils/circuitBreaker.js';
4
+ import { RetryStrategy } from '../utils/retryStrategy.js';
5
+ import { crisisCache } from '../utils/responseCache.js';
6
+ import { performanceMonitor } from '../utils/performanceMonitor.js';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ // Configuration with differentiated timeouts
9
+ // Made as a function to allow dynamic reading of environment variables
10
+ const getConfig = () => ({
11
+ baseUrl: process.env.SHRINK_CHAT_API_URL || 'http://localhost:3000',
12
+ timeout: {
13
+ default: parseInt(process.env.SHRINK_CHAT_TIMEOUT || '30000'),
14
+ regular: parseInt(process.env.SHRINK_CHAT_TIMEOUT_REGULAR || '15000'),
15
+ crisis: parseInt(process.env.SHRINK_CHAT_TIMEOUT_CRISIS || '45000'),
16
+ stream: parseInt(process.env.SHRINK_CHAT_TIMEOUT_STREAM || '60000'),
17
+ },
18
+ });
19
+ // Response Schema based on actual shrink-chat API
20
+ export const ShrinkResponseSchema = z.object({
21
+ // shrink-chat returns 'reply' or 'response_text' instead of 'content'
22
+ reply: z.string().optional(),
23
+ response_text: z.string().optional(),
24
+ content: z.string().optional(), // Keep for backward compatibility
25
+ messageId: z.string().optional(),
26
+ crisisDetected: z.boolean().optional(),
27
+ crisisLevel: z.union([z.number().min(0).max(10), z.string()]).optional(), // Can be number or "none"
28
+ crisis_level: z.union([z.string(), z.number()]).optional(), // Alternative field name
29
+ crisisHandled: z.boolean().optional(),
30
+ crisis_confidence: z.number().min(0).max(1).optional(), // Crisis detection confidence
31
+ emotions: z.array(z.string()).optional(),
32
+ therapeuticTechnique: z.string().optional(),
33
+ resources: z.array(z.object({
34
+ type: z.string(),
35
+ title: z.string(),
36
+ url: z.string().optional(),
37
+ phone: z.string().optional(),
38
+ description: z.string().optional(),
39
+ })).optional(),
40
+ escalationPath: z.string().optional(),
41
+ threadId: z.string().optional(),
42
+ meta: z.object({
43
+ rag_confidence: z.number().min(0).max(1).optional(), // Memory retrieval confidence
44
+ emotionalTone: z.array(z.string()).optional(),
45
+ therapeuticElements: z.array(z.string()).optional(),
46
+ }).optional(),
47
+ memory_high_relevance_count: z.number().optional(),
48
+ error: z.string().optional(),
49
+ error_type: z.string().optional(),
50
+ message: z.string().optional(), // Error message format
51
+ });
52
+ export const ErrorResponseSchema = z.object({
53
+ error: z.string().optional(),
54
+ message: z.string().optional(),
55
+ error_type: z.string().optional(),
56
+ code: z.string().optional(),
57
+ details: z.any().optional(),
58
+ });
59
+ export class ShrinkChatClient {
60
+ circuitBreaker;
61
+ retryStrategy;
62
+ constructor() {
63
+ this.circuitBreaker = new CircuitBreaker({
64
+ failureThreshold: parseInt(process.env.CIRCUIT_BREAKER_THRESHOLD || '5'),
65
+ resetTimeout: parseInt(process.env.CIRCUIT_BREAKER_RESET || '30000'),
66
+ halfOpenMaxAttempts: 3,
67
+ });
68
+ this.retryStrategy = new RetryStrategy();
69
+ }
70
+ /**
71
+ * Detect if a message contains crisis indicators
72
+ */
73
+ detectCrisisContent(message) {
74
+ const crisisPatterns = [
75
+ /\b(suicide|suicidal)\b/i,
76
+ /\b(kill\s+(myself|me))\b/i,
77
+ /\b(self[- ]?harm)\b/i,
78
+ /\b(end\s+(it|my\s+life))\b/i,
79
+ /\b(hurt\s+myself)\b/i,
80
+ /\b(take\s+my\s+(own\s+)?life)\b/i,
81
+ /\b(want\s+to\s+die)\b/i,
82
+ /\b(better\s+off\s+dead)\b/i,
83
+ /\b(overdose)\b/i,
84
+ /\b(cutting|cut\s+myself)\b/i,
85
+ ];
86
+ return crisisPatterns.some(pattern => pattern.test(message));
87
+ }
88
+ async request(endpoint, options = {}, timeoutMs) {
89
+ const config = getConfig();
90
+ const controller = new AbortController();
91
+ const timeout = setTimeout(() => controller.abort(), timeoutMs || config.timeout.default);
92
+ try {
93
+ const response = await this.circuitBreaker.execute(`shrink-chat-${endpoint}`, async () => {
94
+ const res = await fetch(`${config.baseUrl}${endpoint}`, {
95
+ ...options,
96
+ headers: {
97
+ 'Content-Type': 'application/json',
98
+ 'X-Source': 'mcp-server',
99
+ ...options.headers,
100
+ },
101
+ signal: controller.signal,
102
+ });
103
+ if (!res.ok) {
104
+ const errorData = await res.json().catch(() => ({
105
+ error: res.statusText,
106
+ error_type: 'http_error'
107
+ }));
108
+ throw new Error(errorData.message ||
109
+ errorData.error ||
110
+ `Shrink-Chat API error: ${res.statusText}`);
111
+ }
112
+ return res.json();
113
+ });
114
+ clearTimeout(timeout);
115
+ return response;
116
+ }
117
+ catch (error) {
118
+ clearTimeout(timeout);
119
+ if (error instanceof Error && error.name === 'AbortError') {
120
+ throw new Error(`Shrink-Chat API timeout after ${timeoutMs || config.timeout.default}ms`);
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ /**
126
+ * Send a message through the shrink-chat therapeutic stack
127
+ * Note: Threads are created lazily - no need for separate thread creation
128
+ */
129
+ async sendMessage(threadId, prompt, options) {
130
+ logger.debug(`Sending message to thread ${threadId}`);
131
+ const config = getConfig();
132
+ // Detect crisis content to determine timeout
133
+ const isCrisis = this.detectCrisisContent(prompt);
134
+ const timeout = isCrisis ? config.timeout.crisis : config.timeout.regular;
135
+ // Track performance metrics
136
+ const operationName = isCrisis
137
+ ? 'shrink-chat.crisis-message'
138
+ : 'shrink-chat.regular-message';
139
+ return performanceMonitor.measure(operationName, async () => {
140
+ if (isCrisis) {
141
+ logger.info(`Crisis content detected, using extended timeout of ${timeout}ms`);
142
+ // Check cache for crisis patterns
143
+ if (crisisCache.shouldCache(prompt)) {
144
+ const cachedResponse = crisisCache.get(prompt);
145
+ if (cachedResponse) {
146
+ logger.info('Using cached crisis response');
147
+ // Record cache hit metric
148
+ performanceMonitor.record(operationName + '.cache-hit', 0, true, {
149
+ threadId,
150
+ cached: true,
151
+ });
152
+ return cachedResponse;
153
+ }
154
+ }
155
+ }
156
+ const headers = {};
157
+ if (options?.idempotencyKey) {
158
+ headers['x-idempotency-key'] = options.idempotencyKey;
159
+ }
160
+ const body = {
161
+ prompt,
162
+ threadId,
163
+ memoryContext: options?.memoryContext || '',
164
+ enhancedContext: options?.enhancedContext || {},
165
+ history: options?.history || [],
166
+ systemPrompt: options?.systemPrompt,
167
+ conversationType: options?.conversationType,
168
+ };
169
+ // Use retry strategy for crisis messages or when explicitly requested
170
+ const shouldUseRetry = isCrisis || options?.conversationType === 'crisis';
171
+ const response = shouldUseRetry
172
+ ? await this.retryStrategy.execute(() => this.request('/api/shrink?stream=false', {
173
+ method: 'POST',
174
+ headers,
175
+ body: JSON.stringify(body),
176
+ }, timeout), {
177
+ maxAttempts: isCrisis ? 3 : 2,
178
+ initialDelay: 2000,
179
+ maxDelay: 10000,
180
+ shouldRetry: (error) => {
181
+ // Don't retry on explicit client errors
182
+ if (error.message.includes('400') || error.message.includes('401')) {
183
+ return false;
184
+ }
185
+ // Always retry crisis messages on timeout
186
+ if (isCrisis && error.message.includes('timeout')) {
187
+ logger.warn('Retrying crisis message after timeout');
188
+ return true;
189
+ }
190
+ // Default retry logic
191
+ return true;
192
+ },
193
+ onRetry: (attempt, error) => {
194
+ logger.warn(`Retrying message (attempt ${attempt}): ${error.message}`);
195
+ },
196
+ })
197
+ : await this.request('/api/shrink?stream=false', {
198
+ method: 'POST',
199
+ headers,
200
+ body: JSON.stringify(body),
201
+ }, timeout);
202
+ // Log raw response for debugging
203
+ logger.info('Raw shrink-chat response:', JSON.stringify(response, null, 2));
204
+ const validated = ShrinkResponseSchema.parse(response);
205
+ // Map 'reply' or 'response_text' to 'content' for consistency
206
+ if (!validated.content && (validated.reply || validated.response_text)) {
207
+ validated.content = validated.reply || validated.response_text;
208
+ }
209
+ // Normalize crisis_level field
210
+ if (validated.crisis_level !== undefined && validated.crisisLevel === undefined) {
211
+ // Convert "none" to 0 for consistency
212
+ validated.crisisLevel = validated.crisis_level === "none" ? 0 :
213
+ typeof validated.crisis_level === 'number' ? validated.crisis_level :
214
+ parseInt(validated.crisis_level) || 0;
215
+ }
216
+ // Log parsed response
217
+ logger.debug(`Parsed response - content: "${validated.content || '(empty)'}", length: ${validated.content?.length || 0}`);
218
+ // Log crisis detection
219
+ if (validated.crisisLevel && Number(validated.crisisLevel) > 7) {
220
+ logger.warn(`Crisis detected in thread ${threadId}: Level ${validated.crisisLevel}`);
221
+ }
222
+ // Cache crisis responses for future use
223
+ if (isCrisis && crisisCache.shouldCache(prompt)) {
224
+ crisisCache.set(prompt, validated);
225
+ logger.debug('Cached crisis response for future use');
226
+ }
227
+ return validated;
228
+ }, {
229
+ threadId,
230
+ isCrisis,
231
+ cached: false,
232
+ messageLength: prompt.length,
233
+ hasMemoryContext: !!options?.memoryContext,
234
+ });
235
+ }
236
+ /**
237
+ * Stream a message response (SSE)
238
+ */
239
+ async *streamMessage(prompt, threadId, options) {
240
+ const config = getConfig();
241
+ const url = `${config.baseUrl}/api/shrink?stream=true`;
242
+ const response = await fetch(url, {
243
+ method: 'POST',
244
+ headers: {
245
+ 'Content-Type': 'application/json',
246
+ 'X-Source': 'mcp-server',
247
+ },
248
+ body: JSON.stringify({
249
+ prompt,
250
+ threadId,
251
+ memoryContext: options?.memoryContext || '',
252
+ enhancedContext: options?.enhancedContext || {},
253
+ history: options?.history || [],
254
+ systemPrompt: options?.systemPrompt,
255
+ conversationType: options?.conversationType,
256
+ }),
257
+ signal: options?.signal,
258
+ });
259
+ if (!response.ok || !response.body) {
260
+ throw new Error(`Stream failed: ${response.statusText}`);
261
+ }
262
+ const reader = response.body.getReader();
263
+ const decoder = new TextDecoder();
264
+ try {
265
+ while (true) {
266
+ const { done, value } = await reader.read();
267
+ if (done)
268
+ break;
269
+ const chunk = decoder.decode(value);
270
+ const lines = chunk.split('\n');
271
+ for (const line of lines) {
272
+ if (line.startsWith('data: ')) {
273
+ const data = line.slice(6);
274
+ if (data === '[DONE]') {
275
+ return;
276
+ }
277
+ try {
278
+ const parsed = JSON.parse(data);
279
+ yield parsed;
280
+ }
281
+ catch (e) {
282
+ // Skip invalid JSON
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ finally {
289
+ reader.releaseLock();
290
+ }
291
+ }
292
+ /**
293
+ * Get recent messages for a thread
294
+ */
295
+ async getRecentMessages(threadId, limit = 10) {
296
+ const params = new URLSearchParams({ threadId, limit: String(limit) });
297
+ return this.request(`/api/messages/recent?${params}`, {
298
+ method: 'GET',
299
+ });
300
+ }
301
+ /**
302
+ * Log a message (for offline/manual logging)
303
+ */
304
+ async logMessage(threadId, role, content, idempotencyKey) {
305
+ const headers = {};
306
+ if (idempotencyKey) {
307
+ headers['x-idempotency-key'] = idempotencyKey;
308
+ }
309
+ return this.request('/api/chat/log', {
310
+ method: 'POST',
311
+ headers,
312
+ body: JSON.stringify({ threadId, role, content }),
313
+ });
314
+ }
315
+ /**
316
+ * Health check for the shrink-chat API
317
+ */
318
+ async healthCheck() {
319
+ try {
320
+ await this.request('/api/health', { method: 'GET' });
321
+ return true;
322
+ }
323
+ catch {
324
+ return false;
325
+ }
326
+ }
327
+ /**
328
+ * Generate a new thread ID (client-side)
329
+ * Threads are created lazily server-side when first message is sent
330
+ */
331
+ generateThreadId() {
332
+ return uuidv4();
333
+ }
334
+ /**
335
+ * Get circuit breaker status
336
+ */
337
+ getCircuitBreakerStatus() {
338
+ return this.circuitBreaker.getStatistics();
339
+ }
340
+ }
341
+ // Singleton instance
342
+ let clientInstance = null;
343
+ export function getShrinkChatClient() {
344
+ if (!clientInstance) {
345
+ clientInstance = new ShrinkChatClient();
346
+ }
347
+ return clientInstance;
348
+ }
349
+ //# sourceMappingURL=shrinkChatClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shrinkChatClient.js","sourceRoot":"","sources":["../../src/clients/shrinkChatClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,6CAA6C;AAC7C,uEAAuE;AACvE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,uBAAuB;IACnE,OAAO,EAAE;QACP,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;QAC7D,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC;QACrE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,CAAC;QACnE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,CAAC;KACpE;CACF,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,sEAAsE;IACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,kCAAkC;IAClE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACtC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,0BAA0B;IACpG,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,yBAAyB;IACrF,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,8BAA8B;IACtF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,8BAA8B;QACnF,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC7C,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACpD,CAAC,CAAC,QAAQ,EAAE;IACb,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,uBAAuB;CACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAKH,MAAM,OAAO,gBAAgB;IACnB,cAAc,CAAiB;IAC/B,aAAa,CAAgB;IAErC;QACE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC;YACvC,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,GAAG,CAAC;YACxE,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC;YACpE,mBAAmB,EAAE,CAAC;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,OAAe;QACzC,MAAM,cAAc,GAAG;YACrB,yBAAyB;YACzB,2BAA2B;YAC3B,sBAAsB;YACtB,6BAA6B;YAC7B,sBAAsB;YACtB,kCAAkC;YAClC,wBAAwB;YACxB,4BAA4B;YAC5B,iBAAiB;YACjB,6BAA6B;SAC9B,CAAC;QAEF,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,QAAgB,EAChB,UAAuB,EAAE,EACzB,SAAkB;QAElB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CACpC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAChD,eAAe,QAAQ,EAAE,EACzB,KAAK,IAAI,EAAE;gBACT,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;oBACtD,GAAG,OAAO;oBACV,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,UAAU,EAAE,YAAY;wBACxB,GAAG,OAAO,CAAC,OAAO;qBACnB;oBACD,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;wBAC9C,KAAK,EAAE,GAAG,CAAC,UAAU;wBACrB,UAAU,EAAE,YAAY;qBACzB,CAAC,CAAQ,CAAC;oBAEX,MAAM,IAAI,KAAK,CACb,SAAS,CAAC,OAAO;wBACjB,SAAS,CAAC,KAAK;wBACf,0BAA0B,GAAG,CAAC,UAAU,EAAE,CAC3C,CAAC;gBACJ,CAAC;gBAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC,CACF,CAAC;YAEF,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,QAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAC5F,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,MAAc,EACd,OAOC;QAED,MAAM,CAAC,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAE1E,4BAA4B;QAC5B,MAAM,aAAa,GAAG,QAAQ;YAC5B,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,6BAA6B,CAAC;QAElC,OAAO,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;YAE5D,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,sDAAsD,OAAO,IAAI,CAAC,CAAC;gBAE/E,kCAAkC;gBAClC,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAI,cAAc,EAAE,CAAC;wBACnB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;wBAC5C,0BAA0B;wBAC1B,kBAAkB,CAAC,MAAM,CAAC,aAAa,GAAG,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE;4BAC/D,QAAQ;4BACR,MAAM,EAAE,IAAI;yBACb,CAAC,CAAC;wBACH,OAAO,cAAgC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;gBAC5B,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;YACxD,CAAC;YAED,MAAM,IAAI,GAAG;gBACX,MAAM;gBACN,QAAQ;gBACR,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE;gBAC3C,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,EAAE;gBAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC/B,YAAY,EAAE,OAAO,EAAE,YAAY;gBACnC,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;aAC5C,CAAC;YAEF,sEAAsE;YACtE,MAAM,cAAc,GAAG,QAAQ,IAAI,OAAO,EAAE,gBAAgB,KAAK,QAAQ,CAAC;YAE1E,MAAM,QAAQ,GAAG,cAAc;gBAC7B,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAChB,0BAA0B,EAC1B;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;iBAC3B,EACD,OAAO,CACR,EACD;oBACE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7B,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,KAAK;oBACf,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;wBACrB,wCAAwC;wBACxC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;4BACnE,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,0CAA0C;wBAC1C,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;4BAClD,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;4BACrD,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,sBAAsB;wBACtB,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,EAAE,CAAC,OAAe,EAAE,KAAY,EAAE,EAAE;wBACzC,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;oBACzE,CAAC;iBACF,CACF;gBACH,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAChB,0BAA0B,EAC1B;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;iBAC3B,EACD,OAAO,CACR,CAAC;YAEN,iCAAiC;YACjC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5E,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEvD,8DAA8D;YAC9D,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,aAAa,CAAC;YACjE,CAAC;YAED,+BAA+B;YAC/B,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBAChF,sCAAsC;gBACtC,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,OAAO,SAAS,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;wBACrE,QAAQ,CAAC,SAAS,CAAC,YAAsB,CAAC,IAAI,CAAC,CAAC;YAC1E,CAAC;YAED,sBAAsB;YACtB,MAAM,CAAC,KAAK,CAAC,+BAA+B,SAAS,CAAC,OAAO,IAAI,SAAS,cAAc,SAAS,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YAE1H,uBAAuB;YACvB,IAAI,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/D,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,WAAW,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YACvF,CAAC;YAED,wCAAwC;YACxC,IAAI,QAAQ,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACnC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,SAAS,CAAC;QACjB,CAAC,EAAE;YACD,QAAQ;YACR,QAAQ;YACR,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,aAAa;SAC3C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAA,CAAE,aAAa,CAClB,MAAc,EACd,QAAgB,EAChB,OAOC;QAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,yBAAyB,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,UAAU,EAAE,YAAY;aACzB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM;gBACN,QAAQ;gBACR,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE;gBAC3C,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,EAAE;gBAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC/B,YAAY,EAAE,OAAO,EAAE,YAAY;gBACnC,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;aAC5C,CAAC;YACF,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACtB,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAChC,MAAM,MAAM,CAAC;wBACf,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,oBAAoB;wBACtB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,QAAgB,EAAE;QAElB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,QAAgB,EAChB,IAA0B,EAC1B,OAAe,EACf,cAAuB;QAEvB,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,mBAAmB,CAAC,GAAG,cAAc,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;IAC7C,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import postgres from 'postgres';
3
+ import { createClient } from '@supabase/supabase-js';
4
+ declare let db: ReturnType<typeof drizzle> | null;
5
+ declare let supabase: ReturnType<typeof createClient> | null;
6
+ export declare function initDatabase(): Promise<{
7
+ db: import("drizzle-orm/postgres-js").PostgresJsDatabase<Record<string, unknown>>;
8
+ supabase: import("@supabase/supabase-js").SupabaseClient<unknown, {
9
+ PostgrestVersion: string;
10
+ }, never, never, {
11
+ PostgrestVersion: string;
12
+ }> | null;
13
+ sql: postgres.Sql<{}>;
14
+ }>;
15
+ export declare function getDb(): import("drizzle-orm/postgres-js").PostgresJsDatabase<Record<string, unknown>>;
16
+ export declare function getSupabase(): import("@supabase/supabase-js").SupabaseClient<unknown, {
17
+ PostgrestVersion: string;
18
+ }, never, never, {
19
+ PostgrestVersion: string;
20
+ }> | null;
21
+ export declare function closeDatabase(): Promise<void>;
22
+ export { db, supabase };
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,QAAA,IAAI,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,IAAW,CAAC;AACjD,QAAA,IAAI,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,IAAW,CAAC;AAG5D,wBAAsB,YAAY;;;;;;;;GAkDjC;AAED,wBAAgB,KAAK,kFAKpB;AAED,wBAAgB,WAAW;;;;UAM1B;AAED,wBAAsB,aAAa,kBAQlC;AAED,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import postgres from 'postgres';
3
+ import { createClient } from '@supabase/supabase-js';
4
+ import { logger } from '../utils/logger.js';
5
+ import * as schema from './schema.js';
6
+ let db = null;
7
+ let supabase = null;
8
+ let sql = null;
9
+ export async function initDatabase() {
10
+ try {
11
+ const databaseUrl = process.env.DATABASE_URL;
12
+ const supabaseUrl = process.env.SUPABASE_URL;
13
+ const supabaseAnonKey = process.env.SUPABASE_ANON_KEY;
14
+ const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY;
15
+ if (!databaseUrl) {
16
+ throw new Error('DATABASE_URL is not configured');
17
+ }
18
+ // Make Supabase optional - MCP server can work with just database
19
+ const hasSupabase = supabaseUrl && supabaseAnonKey &&
20
+ supabaseServiceKey &&
21
+ !supabaseUrl.includes('xxx') &&
22
+ !supabaseAnonKey.includes('your-') &&
23
+ !supabaseServiceKey.includes('your-');
24
+ // Initialize Postgres connection for Drizzle
25
+ sql = postgres(databaseUrl, {
26
+ max: 10, // Max connections
27
+ idle_timeout: 20,
28
+ connect_timeout: 10,
29
+ });
30
+ // Initialize Drizzle ORM
31
+ db = drizzle(sql, { schema });
32
+ // Initialize Supabase client only if configuration is valid
33
+ if (hasSupabase) {
34
+ supabase = createClient(supabaseUrl, supabaseServiceKey, {
35
+ auth: {
36
+ autoRefreshToken: false,
37
+ persistSession: false,
38
+ },
39
+ });
40
+ logger.info('Supabase client initialized');
41
+ }
42
+ else {
43
+ logger.info('Supabase configuration incomplete or uses placeholders - running without Supabase client');
44
+ }
45
+ // Test the connection
46
+ await sql `SELECT 1`;
47
+ logger.info('Database connection established successfully');
48
+ return { db, supabase, sql };
49
+ }
50
+ catch (error) {
51
+ logger.error('Failed to initialize database:', error);
52
+ throw error;
53
+ }
54
+ }
55
+ export function getDb() {
56
+ if (!db) {
57
+ throw new Error('Database not initialized. Call initDatabase() first.');
58
+ }
59
+ return db;
60
+ }
61
+ export function getSupabase() {
62
+ if (!supabase) {
63
+ logger.warn('Supabase client not initialized - check environment configuration');
64
+ return null;
65
+ }
66
+ return supabase;
67
+ }
68
+ export async function closeDatabase() {
69
+ if (sql) {
70
+ await sql.end();
71
+ sql = null;
72
+ db = null;
73
+ supabase = null;
74
+ logger.info('Database connections closed');
75
+ }
76
+ }
77
+ export { db, supabase };
78
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ declare function runMigrations(): Promise<void>;
3
+ export { runMigrations };
4
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":";AASA,iBAAe,aAAa,kBAsB3B;AAOD,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { config } from 'dotenv';
3
+ import { drizzle } from 'drizzle-orm/postgres-js';
4
+ import { migrate } from 'drizzle-orm/postgres-js/migrator';
5
+ import postgres from 'postgres';
6
+ import { logger } from '../utils/logger.js';
7
+ config();
8
+ async function runMigrations() {
9
+ const databaseUrl = process.env.DATABASE_URL;
10
+ if (!databaseUrl) {
11
+ logger.error('DATABASE_URL is not set');
12
+ process.exit(1);
13
+ }
14
+ logger.info('Running database migrations...');
15
+ const sql = postgres(databaseUrl, { max: 1 });
16
+ const db = drizzle(sql);
17
+ try {
18
+ await migrate(db, { migrationsFolder: './src/db/migrations' });
19
+ logger.info('Migrations completed successfully');
20
+ }
21
+ catch (error) {
22
+ logger.error('Migration failed:', error);
23
+ process.exit(1);
24
+ }
25
+ finally {
26
+ await sql.end();
27
+ }
28
+ }
29
+ // Run if called directly
30
+ if (import.meta.url === `file://${process.argv[1]}`) {
31
+ runMigrations();
32
+ }
33
+ export { runMigrations };
34
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,EAAE,CAAC;AAET,KAAK,UAAU,aAAa;IAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,aAAa,EAAE,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}