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,218 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes, scrypt, createHash, timingSafeEqual } from 'crypto';
2
+ import { promisify } from 'util';
3
+ import { logger } from '../../utils/logger.js';
4
+ const scryptAsync = promisify(scrypt);
5
+ /**
6
+ * Token Encryption Manager
7
+ * Provides AES-256-GCM encryption for tokens at rest
8
+ */
9
+ export class TokenEncryption {
10
+ algorithm = 'aes-256-gcm';
11
+ saltLength = 32;
12
+ tagLength = 16;
13
+ ivLength = 16;
14
+ keyLength = 32;
15
+ /**
16
+ * Encrypt a token using AES-256-GCM
17
+ * Returns encrypted data and a hash for indexing
18
+ */
19
+ async encryptToken(plaintext) {
20
+ if (!plaintext) {
21
+ throw new Error('Cannot encrypt empty token');
22
+ }
23
+ const encryptionKey = this.getEncryptionKey();
24
+ // Generate salt and IV for this encryption
25
+ const salt = randomBytes(this.saltLength);
26
+ const iv = randomBytes(this.ivLength);
27
+ // Derive key from master key and salt
28
+ const key = await this.deriveKey(encryptionKey, salt);
29
+ // Create cipher
30
+ const cipher = createCipheriv(this.algorithm, key, iv);
31
+ // Encrypt the token
32
+ const encrypted = Buffer.concat([
33
+ cipher.update(plaintext, 'utf8'),
34
+ cipher.final(),
35
+ ]);
36
+ // Get the authentication tag
37
+ const tag = cipher.getAuthTag();
38
+ // Combine salt, iv, tag, and encrypted data
39
+ const combined = Buffer.concat([salt, iv, tag, encrypted]);
40
+ // Generate hash for indexing (allows searching without decryption)
41
+ const hash = this.hashToken(plaintext);
42
+ const result = {
43
+ encrypted: combined.toString('base64url'),
44
+ hash,
45
+ };
46
+ logger.debug(`Token encrypted, length: ${result.encrypted.length}`);
47
+ return result;
48
+ }
49
+ /**
50
+ * Decrypt a token
51
+ */
52
+ async decryptToken(encryptedData) {
53
+ if (!encryptedData) {
54
+ throw new Error('Cannot decrypt empty data');
55
+ }
56
+ const encryptionKey = this.getEncryptionKey();
57
+ try {
58
+ // Parse the combined buffer
59
+ const combined = Buffer.from(encryptedData, 'base64url');
60
+ if (combined.length < this.saltLength + this.ivLength + this.tagLength) {
61
+ throw new Error('Invalid encrypted data format');
62
+ }
63
+ // Extract components
64
+ const salt = combined.slice(0, this.saltLength);
65
+ const iv = combined.slice(this.saltLength, this.saltLength + this.ivLength);
66
+ const tag = combined.slice(this.saltLength + this.ivLength, this.saltLength + this.ivLength + this.tagLength);
67
+ const encrypted = combined.slice(this.saltLength + this.ivLength + this.tagLength);
68
+ // Derive the same key
69
+ const key = await this.deriveKey(encryptionKey, salt);
70
+ // Create decipher
71
+ const decipher = createDecipheriv(this.algorithm, key, iv);
72
+ decipher.setAuthTag(tag);
73
+ // Decrypt
74
+ const decrypted = Buffer.concat([
75
+ decipher.update(encrypted),
76
+ decipher.final(),
77
+ ]);
78
+ const result = decrypted.toString('utf8');
79
+ logger.debug('Token decrypted successfully');
80
+ return result;
81
+ }
82
+ catch (error) {
83
+ logger.error('Token decryption failed:', error);
84
+ throw new Error('Failed to decrypt token');
85
+ }
86
+ }
87
+ /**
88
+ * Hash a token for indexing
89
+ * Uses SHA256 for consistent hashing
90
+ */
91
+ hashToken(token) {
92
+ const hash = createHash('sha256')
93
+ .update(token)
94
+ .digest('base64url');
95
+ return hash;
96
+ }
97
+ /**
98
+ * Verify a plaintext token matches a hash
99
+ */
100
+ verifyTokenHash(plaintext, hash) {
101
+ const computedHash = this.hashToken(plaintext);
102
+ // Constant-time comparison
103
+ if (computedHash.length !== hash.length) {
104
+ return false;
105
+ }
106
+ const bufferA = Buffer.from(computedHash);
107
+ const bufferB = Buffer.from(hash);
108
+ try {
109
+ return timingSafeEqual(bufferA, bufferB);
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ /**
116
+ * Encrypt sensitive data (generic, not just tokens)
117
+ */
118
+ async encrypt(text) {
119
+ const { encrypted } = await this.encryptToken(text);
120
+ return encrypted;
121
+ }
122
+ /**
123
+ * Decrypt sensitive data (generic)
124
+ */
125
+ async decrypt(encryptedData) {
126
+ return this.decryptToken(encryptedData);
127
+ }
128
+ /**
129
+ * Derive encryption key from password and salt
130
+ * Uses scrypt for key derivation
131
+ */
132
+ async deriveKey(password, salt) {
133
+ const key = await scryptAsync(password, salt, this.keyLength);
134
+ return key;
135
+ }
136
+ /**
137
+ * Get the master encryption key
138
+ * In production, this should come from a secure key management service
139
+ */
140
+ getEncryptionKey() {
141
+ const key = process.env.ENCRYPTION_KEY;
142
+ if (!key) {
143
+ throw new Error('ENCRYPTION_KEY environment variable not set');
144
+ }
145
+ // Validate key strength (should be at least 32 characters)
146
+ if (key.length < 32) {
147
+ throw new Error('ENCRYPTION_KEY must be at least 32 characters');
148
+ }
149
+ return key;
150
+ }
151
+ /**
152
+ * Rotate encryption (re-encrypt with new salt/IV)
153
+ * Useful for key rotation scenarios
154
+ */
155
+ async rotateEncryption(encryptedData) {
156
+ // Decrypt with old parameters
157
+ const plaintext = await this.decryptToken(encryptedData);
158
+ // Re-encrypt with new salt/IV
159
+ return this.encryptToken(plaintext);
160
+ }
161
+ /**
162
+ * Batch encrypt multiple tokens
163
+ * More efficient than individual encryption
164
+ */
165
+ async encryptBatch(tokens) {
166
+ return Promise.all(tokens.map(token => this.encryptToken(token)));
167
+ }
168
+ /**
169
+ * Batch decrypt multiple tokens
170
+ */
171
+ async decryptBatch(encryptedTokens) {
172
+ return Promise.all(encryptedTokens.map(token => this.decryptToken(token)));
173
+ }
174
+ /**
175
+ * Generate a secure random token
176
+ * Useful for generating access/refresh tokens
177
+ */
178
+ generateSecureToken(length = 32) {
179
+ return randomBytes(length).toString('base64url');
180
+ }
181
+ /**
182
+ * Validate encryption key on startup
183
+ * Ensures the key meets security requirements
184
+ */
185
+ validateEncryptionSetup() {
186
+ try {
187
+ const key = this.getEncryptionKey();
188
+ // Check key entropy (rough estimate)
189
+ const uniqueChars = new Set(key).size;
190
+ if (uniqueChars < 10) {
191
+ logger.warn('Encryption key has low entropy');
192
+ return false;
193
+ }
194
+ // Test encryption/decryption
195
+ const testData = 'test_encryption_validation';
196
+ this.encryptToken(testData)
197
+ .then(encrypted => this.decryptToken(encrypted.encrypted))
198
+ .then(decrypted => {
199
+ if (decrypted !== testData) {
200
+ throw new Error('Encryption validation failed');
201
+ }
202
+ });
203
+ logger.info('Token encryption setup validated successfully');
204
+ return true;
205
+ }
206
+ catch (error) {
207
+ logger.error('Encryption setup validation failed:', error);
208
+ return false;
209
+ }
210
+ }
211
+ }
212
+ // Export singleton instance
213
+ export const tokenEncryption = new TokenEncryption();
214
+ // Validate encryption on module load
215
+ if (process.env.NODE_ENV !== 'test') {
216
+ tokenEncryption.validateEncryptionSetup();
217
+ }
218
+ //# sourceMappingURL=tokenEncryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenEncryption.js","sourceRoot":"","sources":["../../../src/server/oauth/tokenEncryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare function saveCheckpoint(args: any): Promise<{
2
+ error: string;
3
+ details?: any;
4
+ } | {
5
+ checkpoint_id: string;
6
+ next_step: {
7
+ id: string;
8
+ order: number;
9
+ type: "prompt" | "checkpoint" | "summary";
10
+ content: {
11
+ prompt?: string;
12
+ checkpoint_key?: string;
13
+ instructions?: string;
14
+ };
15
+ optional: boolean;
16
+ } | null | undefined;
17
+ journey_complete: boolean;
18
+ message: string;
19
+ }>;
20
+ export declare function getCheckpoints(args: any): Promise<{
21
+ error: string;
22
+ details?: any;
23
+ } | {
24
+ session_id: any;
25
+ checkpoints: {
26
+ id: string;
27
+ createdAt: Date;
28
+ sessionId: string;
29
+ stepId: string;
30
+ key: string;
31
+ value: unknown;
32
+ }[];
33
+ count: number;
34
+ }>;
35
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/tools/checkpoint.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG;;;;;;;;;;kBA0BpB,CAAC;0BAEnB,CAAD;wBACI,CAAC;;;;;;GAmEX;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG;;;;;;;;;;;;;;GAgC7C"}
@@ -0,0 +1,125 @@
1
+ import { getDb } from '../db/client.js';
2
+ import { sessions, journeys, checkpoints } from '../db/schema.js';
3
+ import { eq } from 'drizzle-orm';
4
+ import { SaveCheckpointSchema } from '../types/checkpoint.js';
5
+ import { handleError, NotFoundError } from '../utils/errors.js';
6
+ import { logger } from '../utils/logger.js';
7
+ export async function saveCheckpoint(args) {
8
+ try {
9
+ const input = SaveCheckpointSchema.parse(args);
10
+ const db = getDb();
11
+ // Verify session exists and is active
12
+ const [session] = await db
13
+ .select()
14
+ .from(sessions)
15
+ .where(eq(sessions.id, input.session_id))
16
+ .limit(1);
17
+ if (!session) {
18
+ throw new NotFoundError('Session', input.session_id);
19
+ }
20
+ if (session.status !== 'active') {
21
+ throw new Error(`Session is ${session.status}, not active`);
22
+ }
23
+ // Get current step ID
24
+ let stepId = 'freeform';
25
+ let nextStep = null;
26
+ let journeyComplete = false;
27
+ if (session.journeyId) {
28
+ const [journey] = await db
29
+ .select()
30
+ .from(journeys)
31
+ .where(eq(journeys.id, session.journeyId))
32
+ .limit(1);
33
+ if (journey && journey.steps) {
34
+ const currentStepData = journey.steps[session.currentStep];
35
+ if (currentStepData) {
36
+ stepId = currentStepData.id;
37
+ }
38
+ // Advance to next step if requested
39
+ if (input.advance_step) {
40
+ const nextStepIndex = session.currentStep + 1;
41
+ if (nextStepIndex < journey.steps.length) {
42
+ nextStep = journey.steps[nextStepIndex];
43
+ // Update session's current step
44
+ await db
45
+ .update(sessions)
46
+ .set({
47
+ currentStep: nextStepIndex,
48
+ lastActiveAt: new Date(),
49
+ })
50
+ .where(eq(sessions.id, session.id));
51
+ }
52
+ else {
53
+ // Journey complete
54
+ journeyComplete = true;
55
+ await db
56
+ .update(sessions)
57
+ .set({
58
+ status: 'completed',
59
+ completedAt: new Date(),
60
+ lastActiveAt: new Date(),
61
+ })
62
+ .where(eq(sessions.id, session.id));
63
+ }
64
+ }
65
+ }
66
+ }
67
+ // Save checkpoint
68
+ const checkpointResult = await db
69
+ .insert(checkpoints)
70
+ .values({
71
+ sessionId: input.session_id,
72
+ stepId: stepId,
73
+ key: input.key,
74
+ value: input.value,
75
+ })
76
+ .returning();
77
+ const checkpoint = checkpointResult[0];
78
+ logger.info(`Saved checkpoint: ${checkpoint.id} for session: ${session.id}`);
79
+ return {
80
+ checkpoint_id: checkpoint.id,
81
+ next_step: nextStep,
82
+ journey_complete: journeyComplete,
83
+ message: journeyComplete
84
+ ? 'Journey completed! Well done.'
85
+ : nextStep
86
+ ? `Checkpoint saved. ${nextStep.content?.prompt || 'Continue to next step.'}`
87
+ : 'Checkpoint saved.',
88
+ };
89
+ }
90
+ catch (error) {
91
+ logger.error('Error saving checkpoint:', error);
92
+ return handleError(error);
93
+ }
94
+ }
95
+ export async function getCheckpoints(args) {
96
+ try {
97
+ const { session_id } = args;
98
+ const db = getDb();
99
+ // Verify session exists
100
+ const [session] = await db
101
+ .select()
102
+ .from(sessions)
103
+ .where(eq(sessions.id, session_id))
104
+ .limit(1);
105
+ if (!session) {
106
+ throw new NotFoundError('Session', session_id);
107
+ }
108
+ // Get all checkpoints
109
+ const sessionCheckpoints = await db
110
+ .select()
111
+ .from(checkpoints)
112
+ .where(eq(checkpoints.sessionId, session_id))
113
+ .orderBy(checkpoints.createdAt);
114
+ return {
115
+ session_id: session_id,
116
+ checkpoints: sessionCheckpoints,
117
+ count: sessionCheckpoints.length,
118
+ };
119
+ }
120
+ catch (error) {
121
+ logger.error('Error getting checkpoints:', error);
122
+ return handleError(error);
123
+ }
124
+ }
125
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/tools/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAS;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,sCAAsC;QACtC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;aACxC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;QAC9D,CAAC;QAED,sBAAsB;QACtB,IAAI,MAAM,GAAG,UAAU,CAAC;QACxB,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;iBACvB,MAAM,EAAE;iBACR,IAAI,CAAC,QAAQ,CAAC;iBACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;iBACzC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEZ,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC;gBAC9B,CAAC;gBAED,oCAAoC;gBACpC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;oBAC9C,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBACzC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;wBACxC,gCAAgC;wBAChC,MAAM,EAAE;6BACL,MAAM,CAAC,QAAQ,CAAC;6BAChB,GAAG,CAAC;4BACH,WAAW,EAAE,aAAa;4BAC1B,YAAY,EAAE,IAAI,IAAI,EAAE;yBACzB,CAAC;6BACD,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,mBAAmB;wBACnB,eAAe,GAAG,IAAI,CAAC;wBACvB,MAAM,EAAE;6BACL,MAAM,CAAC,QAAQ,CAAC;6BAChB,GAAG,CAAC;4BACH,MAAM,EAAE,WAAW;4BACnB,WAAW,EAAE,IAAI,IAAI,EAAE;4BACvB,YAAY,EAAE,IAAI,IAAI,EAAE;yBACzB,CAAC;6BACD,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,gBAAgB,GAAG,MAAM,EAAE;aAC9B,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC;YACN,SAAS,EAAE,KAAK,CAAC,UAAU;YAC3B,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC;aACD,SAAS,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;QAExC,MAAM,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,EAAE,iBAAiB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE7E,OAAO;YACL,aAAa,EAAE,UAAU,CAAC,EAAE;YAC5B,SAAS,EAAE,QAAQ;YACnB,gBAAgB,EAAE,eAAe;YACjC,OAAO,EAAE,eAAe;gBACtB,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,qBAAqB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,wBAAwB,EAAE;oBAC7E,CAAC,CAAC,mBAAmB;SACxB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAS;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,wBAAwB;QACxB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;aAClC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC;QAED,sBAAsB;QACtB,MAAM,kBAAkB,GAAG,MAAM,EAAE;aAChC,MAAM,EAAE;aACR,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;aAC5C,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,WAAW,EAAE,kBAAkB;YAC/B,KAAK,EAAE,kBAAkB,CAAC,MAAM;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}