@vezlo/assistant-server 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 (113) hide show
  1. package/Dockerfile +64 -0
  2. package/LICENSE +661 -0
  3. package/README.md +432 -0
  4. package/bin/vezlo-server.js +36 -0
  5. package/database-schema.sql +154 -0
  6. package/dist/knexfile.d.ts +6 -0
  7. package/dist/knexfile.d.ts.map +1 -0
  8. package/dist/knexfile.js +85 -0
  9. package/dist/knexfile.js.map +1 -0
  10. package/dist/src/config/database.d.ts +4 -0
  11. package/dist/src/config/database.d.ts.map +1 -0
  12. package/dist/src/config/database.js +30 -0
  13. package/dist/src/config/database.js.map +1 -0
  14. package/dist/src/config/global.d.ts +65 -0
  15. package/dist/src/config/global.d.ts.map +1 -0
  16. package/dist/src/config/global.js +113 -0
  17. package/dist/src/config/global.js.map +1 -0
  18. package/dist/src/config/knex.d.ts +9 -0
  19. package/dist/src/config/knex.d.ts.map +1 -0
  20. package/dist/src/config/knex.js +67 -0
  21. package/dist/src/config/knex.js.map +1 -0
  22. package/dist/src/config/logger.d.ts +4 -0
  23. package/dist/src/config/logger.d.ts.map +1 -0
  24. package/dist/src/config/logger.js +30 -0
  25. package/dist/src/config/logger.js.map +1 -0
  26. package/dist/src/config/swagger.d.ts +18 -0
  27. package/dist/src/config/swagger.d.ts.map +1 -0
  28. package/dist/src/config/swagger.js +230 -0
  29. package/dist/src/config/swagger.js.map +1 -0
  30. package/dist/src/controllers/ChatController.d.ts +16 -0
  31. package/dist/src/controllers/ChatController.d.ts.map +1 -0
  32. package/dist/src/controllers/ChatController.js +281 -0
  33. package/dist/src/controllers/ChatController.js.map +1 -0
  34. package/dist/src/controllers/KnowledgeController.d.ts +13 -0
  35. package/dist/src/controllers/KnowledgeController.d.ts.map +1 -0
  36. package/dist/src/controllers/KnowledgeController.js +210 -0
  37. package/dist/src/controllers/KnowledgeController.js.map +1 -0
  38. package/dist/src/middleware/errorHandler.d.ts +63 -0
  39. package/dist/src/middleware/errorHandler.d.ts.map +1 -0
  40. package/dist/src/middleware/errorHandler.js +226 -0
  41. package/dist/src/middleware/errorHandler.js.map +1 -0
  42. package/dist/src/migrations/001_initial_schema.d.ts +4 -0
  43. package/dist/src/migrations/001_initial_schema.d.ts.map +1 -0
  44. package/dist/src/migrations/001_initial_schema.js +144 -0
  45. package/dist/src/migrations/001_initial_schema.js.map +1 -0
  46. package/dist/src/schemas/ConversationSchemas.d.ts +132 -0
  47. package/dist/src/schemas/ConversationSchemas.d.ts.map +1 -0
  48. package/dist/src/schemas/ConversationSchemas.js +71 -0
  49. package/dist/src/schemas/ConversationSchemas.js.map +1 -0
  50. package/dist/src/schemas/FeedbackSchemas.d.ts +222 -0
  51. package/dist/src/schemas/FeedbackSchemas.d.ts.map +1 -0
  52. package/dist/src/schemas/FeedbackSchemas.js +116 -0
  53. package/dist/src/schemas/FeedbackSchemas.js.map +1 -0
  54. package/dist/src/schemas/KnowledgeSchemas.d.ts +266 -0
  55. package/dist/src/schemas/KnowledgeSchemas.d.ts.map +1 -0
  56. package/dist/src/schemas/KnowledgeSchemas.js +115 -0
  57. package/dist/src/schemas/KnowledgeSchemas.js.map +1 -0
  58. package/dist/src/schemas/MessageSchemas.d.ts +145 -0
  59. package/dist/src/schemas/MessageSchemas.d.ts.map +1 -0
  60. package/dist/src/schemas/MessageSchemas.js +79 -0
  61. package/dist/src/schemas/MessageSchemas.js.map +1 -0
  62. package/dist/src/schemas/index.d.ts +752 -0
  63. package/dist/src/schemas/index.d.ts.map +1 -0
  64. package/dist/src/schemas/index.js +31 -0
  65. package/dist/src/schemas/index.js.map +1 -0
  66. package/dist/src/server.d.ts +2 -0
  67. package/dist/src/server.d.ts.map +1 -0
  68. package/dist/src/server.js +609 -0
  69. package/dist/src/server.js.map +1 -0
  70. package/dist/src/services/AIService.d.ts +17 -0
  71. package/dist/src/services/AIService.d.ts.map +1 -0
  72. package/dist/src/services/AIService.js +174 -0
  73. package/dist/src/services/AIService.js.map +1 -0
  74. package/dist/src/services/ChatManager.d.ts +18 -0
  75. package/dist/src/services/ChatManager.d.ts.map +1 -0
  76. package/dist/src/services/ChatManager.js +174 -0
  77. package/dist/src/services/ChatManager.js.map +1 -0
  78. package/dist/src/services/KnowledgeBaseService.d.ts +72 -0
  79. package/dist/src/services/KnowledgeBaseService.d.ts.map +1 -0
  80. package/dist/src/services/KnowledgeBaseService.js +442 -0
  81. package/dist/src/services/KnowledgeBaseService.js.map +1 -0
  82. package/dist/src/storage/ConversationRepository.d.ts +15 -0
  83. package/dist/src/storage/ConversationRepository.d.ts.map +1 -0
  84. package/dist/src/storage/ConversationRepository.js +123 -0
  85. package/dist/src/storage/ConversationRepository.js.map +1 -0
  86. package/dist/src/storage/FeedbackRepository.d.ts +15 -0
  87. package/dist/src/storage/FeedbackRepository.d.ts.map +1 -0
  88. package/dist/src/storage/FeedbackRepository.js +141 -0
  89. package/dist/src/storage/FeedbackRepository.js.map +1 -0
  90. package/dist/src/storage/MessageRepository.d.ts +13 -0
  91. package/dist/src/storage/MessageRepository.d.ts.map +1 -0
  92. package/dist/src/storage/MessageRepository.js +165 -0
  93. package/dist/src/storage/MessageRepository.js.map +1 -0
  94. package/dist/src/storage/SupabaseStorage.d.ts +20 -0
  95. package/dist/src/storage/SupabaseStorage.d.ts.map +1 -0
  96. package/dist/src/storage/SupabaseStorage.js +347 -0
  97. package/dist/src/storage/SupabaseStorage.js.map +1 -0
  98. package/dist/src/storage/UnifiedStorage.d.ts +45 -0
  99. package/dist/src/storage/UnifiedStorage.d.ts.map +1 -0
  100. package/dist/src/storage/UnifiedStorage.js +94 -0
  101. package/dist/src/storage/UnifiedStorage.js.map +1 -0
  102. package/dist/src/storage/index.d.ts +11 -0
  103. package/dist/src/storage/index.d.ts.map +1 -0
  104. package/dist/src/storage/index.js +21 -0
  105. package/dist/src/storage/index.js.map +1 -0
  106. package/dist/src/types/index.d.ts +163 -0
  107. package/dist/src/types/index.d.ts.map +1 -0
  108. package/dist/src/types/index.js +3 -0
  109. package/dist/src/types/index.js.map +1 -0
  110. package/docker-compose.yml +32 -0
  111. package/env.example +46 -0
  112. package/knexfile.ts +86 -0
  113. package/package.json +92 -0
@@ -0,0 +1,442 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeBaseService = void 0;
4
+ class KnowledgeBaseService {
5
+ constructor(config) {
6
+ this.supabase = config.supabase;
7
+ this.tableName = config.tableName || 'knowledge_items';
8
+ }
9
+ async createItem(item) {
10
+ try {
11
+ // Convert parent_id from UUID to internal ID if provided
12
+ let parentId = null;
13
+ if (item.parent_id) {
14
+ const parentQuery = await this.supabase
15
+ .from(this.tableName)
16
+ .select('id')
17
+ .eq('uuid', item.parent_id)
18
+ .single();
19
+ if (parentQuery.data && !parentQuery.error) {
20
+ parentId = parentQuery.data.id;
21
+ }
22
+ }
23
+ const insertData = {
24
+ parent_id: parentId,
25
+ company_id: item.company_id || 1,
26
+ title: item.title,
27
+ description: item.description,
28
+ type: item.type,
29
+ content: item.content,
30
+ file_url: item.file_url,
31
+ file_size: item.file_size,
32
+ file_type: item.file_type,
33
+ metadata: item.metadata || {},
34
+ created_by: item.created_by,
35
+ created_at: new Date().toISOString(),
36
+ updated_at: new Date().toISOString()
37
+ };
38
+ // Generate embedding for content-based items
39
+ if (item.content && (item.type === 'document' || item.type === 'file')) {
40
+ console.log('Attempting to generate embedding for content:', item.content.substring(0, 100) + '...');
41
+ const embedding = await this.generateEmbedding(item.content);
42
+ if (embedding) {
43
+ console.log('Embedding generated successfully, length:', embedding.length);
44
+ insertData.embedding = embedding;
45
+ insertData.processed_at = new Date().toISOString();
46
+ }
47
+ else {
48
+ console.log('Embedding generation returned null');
49
+ }
50
+ }
51
+ const { data, error } = await this.supabase
52
+ .from(this.tableName)
53
+ .insert(insertData)
54
+ .select('uuid')
55
+ .single();
56
+ if (error)
57
+ throw new Error(`Failed to create knowledge item: ${error.message}`);
58
+ return data.uuid;
59
+ }
60
+ catch (error) {
61
+ throw new Error(`Failed to create knowledge item: ${error instanceof Error ? error.message : 'Unknown error'}`);
62
+ }
63
+ }
64
+ async getItem(itemId) {
65
+ try {
66
+ const { data, error } = await this.supabase
67
+ .from(this.tableName)
68
+ .select(`
69
+ uuid,
70
+ parent_id,
71
+ company_id,
72
+ title,
73
+ description,
74
+ type,
75
+ content,
76
+ file_url,
77
+ file_size,
78
+ file_type,
79
+ metadata,
80
+ created_by,
81
+ created_at,
82
+ updated_at,
83
+ parent:knowledge_items!parent_id(uuid)
84
+ `)
85
+ .eq('uuid', itemId)
86
+ .single();
87
+ if (error) {
88
+ if (error.code === 'PGRST116')
89
+ return null;
90
+ throw new Error(`Failed to get knowledge item: ${error.message}`);
91
+ }
92
+ return {
93
+ id: data.uuid,
94
+ parent_id: data.parent ? data.parent.uuid : undefined,
95
+ company_id: data.company_id,
96
+ title: data.title,
97
+ description: data.description,
98
+ type: data.type,
99
+ content: data.content,
100
+ file_url: data.file_url,
101
+ file_size: data.file_size,
102
+ file_type: data.file_type,
103
+ metadata: data.metadata,
104
+ created_by: data.created_by
105
+ };
106
+ }
107
+ catch (error) {
108
+ throw new Error(`Failed to get knowledge item: ${error instanceof Error ? error.message : 'Unknown error'}`);
109
+ }
110
+ }
111
+ async listItems(options = {}) {
112
+ try {
113
+ let query = this.supabase
114
+ .from(this.tableName)
115
+ .select(`
116
+ uuid,
117
+ parent_id,
118
+ company_id,
119
+ title,
120
+ description,
121
+ type,
122
+ file_url,
123
+ file_size,
124
+ file_type,
125
+ metadata,
126
+ created_by,
127
+ created_at,
128
+ updated_at,
129
+ parent:knowledge_items!parent_id(uuid)
130
+ `, { count: 'exact' });
131
+ // Filter by parent
132
+ if (options.parent_id) {
133
+ // Get parent internal ID
134
+ const parentQuery = await this.supabase
135
+ .from(this.tableName)
136
+ .select('id')
137
+ .eq('uuid', options.parent_id)
138
+ .single();
139
+ if (parentQuery.data && !parentQuery.error) {
140
+ query = query.eq('parent_id', parentQuery.data.id);
141
+ }
142
+ else {
143
+ return { items: [], total: 0 };
144
+ }
145
+ }
146
+ else if (options.parent_id === null) {
147
+ query = query.is('parent_id', null);
148
+ }
149
+ // Filter by company
150
+ if (options.company_id) {
151
+ query = query.eq('company_id', options.company_id);
152
+ }
153
+ // Filter by type
154
+ if (options.type) {
155
+ query = query.eq('type', options.type);
156
+ }
157
+ // Pagination
158
+ const limit = options.limit || 50;
159
+ const offset = options.offset || 0;
160
+ query = query.range(offset, offset + limit - 1);
161
+ // Order by creation date
162
+ query = query.order('created_at', { ascending: false });
163
+ const { data, error, count } = await query;
164
+ if (error)
165
+ throw new Error(`Failed to list knowledge items: ${error.message}`);
166
+ const items = data.map((row) => ({
167
+ id: row.uuid,
168
+ parent_id: row.parent ? row.parent.uuid : undefined,
169
+ company_id: row.company_id,
170
+ title: row.title,
171
+ description: row.description,
172
+ type: row.type,
173
+ file_url: row.file_url,
174
+ file_size: row.file_size,
175
+ file_type: row.file_type,
176
+ metadata: row.metadata,
177
+ created_by: row.created_by
178
+ }));
179
+ return { items, total: count || 0 };
180
+ }
181
+ catch (error) {
182
+ throw new Error(`Failed to list knowledge items: ${error instanceof Error ? error.message : 'Unknown error'}`);
183
+ }
184
+ }
185
+ async updateItem(itemId, updates) {
186
+ try {
187
+ const updateData = {
188
+ updated_at: new Date().toISOString()
189
+ };
190
+ if (updates.title !== undefined)
191
+ updateData.title = updates.title;
192
+ if (updates.description !== undefined)
193
+ updateData.description = updates.description;
194
+ if (updates.content !== undefined)
195
+ updateData.content = updates.content;
196
+ if (updates.file_url !== undefined)
197
+ updateData.file_url = updates.file_url;
198
+ if (updates.file_size !== undefined)
199
+ updateData.file_size = updates.file_size;
200
+ if (updates.file_type !== undefined)
201
+ updateData.file_type = updates.file_type;
202
+ if (updates.metadata !== undefined)
203
+ updateData.metadata = updates.metadata;
204
+ // Regenerate embedding if content changed
205
+ if (updates.content !== undefined) {
206
+ const embedding = await this.generateEmbedding(updates.content);
207
+ if (embedding) {
208
+ updateData.embedding = embedding;
209
+ updateData.processed_at = new Date().toISOString();
210
+ }
211
+ }
212
+ const { error } = await this.supabase
213
+ .from(this.tableName)
214
+ .update(updateData)
215
+ .eq('uuid', itemId);
216
+ if (error)
217
+ throw new Error(`Failed to update knowledge item: ${error.message}`);
218
+ return true;
219
+ }
220
+ catch (error) {
221
+ throw new Error(`Failed to update knowledge item: ${error instanceof Error ? error.message : 'Unknown error'}`);
222
+ }
223
+ }
224
+ async deleteItem(itemId) {
225
+ try {
226
+ const { error } = await this.supabase
227
+ .from(this.tableName)
228
+ .delete()
229
+ .eq('uuid', itemId);
230
+ if (error)
231
+ throw new Error(`Failed to delete knowledge item: ${error.message}`);
232
+ return true;
233
+ }
234
+ catch (error) {
235
+ throw new Error(`Failed to delete knowledge item: ${error instanceof Error ? error.message : 'Unknown error'}`);
236
+ }
237
+ }
238
+ async search(query, options = {}) {
239
+ try {
240
+ const limit = options.limit || 5;
241
+ const threshold = options.threshold || 0.7;
242
+ const type = options.type || 'hybrid';
243
+ if (type === 'semantic') {
244
+ return await this.semanticSearch(query, limit, threshold, options.company_id);
245
+ }
246
+ else if (type === 'keyword') {
247
+ return await this.keywordSearch(query, limit, options.company_id);
248
+ }
249
+ else {
250
+ // Hybrid search - combine both approaches
251
+ const semanticResults = await this.semanticSearch(query, Math.ceil(limit / 2), threshold, options.company_id);
252
+ const keywordResults = await this.keywordSearch(query, Math.ceil(limit / 2), options.company_id);
253
+ // Merge and deduplicate results
254
+ const combined = [...semanticResults, ...keywordResults];
255
+ const unique = combined.filter((item, index, self) => index === self.findIndex(t => t.id === item.id));
256
+ return unique.slice(0, limit);
257
+ }
258
+ }
259
+ catch (error) {
260
+ throw new Error(`Failed to search knowledge items: ${error instanceof Error ? error.message : 'Unknown error'}`);
261
+ }
262
+ }
263
+ async semanticSearch(query, limit, threshold, companyId) {
264
+ try {
265
+ const queryEmbedding = await this.generateEmbedding(query);
266
+ if (!queryEmbedding)
267
+ return [];
268
+ // Get all items with embeddings from database
269
+ let dbQuery = this.supabase
270
+ .from(this.tableName)
271
+ .select('uuid, title, description, content, type, metadata, embedding')
272
+ .not('embedding', 'is', null);
273
+ if (companyId) {
274
+ dbQuery = dbQuery.eq('company_id', companyId);
275
+ }
276
+ const { data, error } = await dbQuery;
277
+ if (error)
278
+ throw new Error(`Semantic search failed: ${error.message}`);
279
+ // Calculate cosine similarity for each item (same as original implementation)
280
+ const results = [];
281
+ data.forEach((item) => {
282
+ if (item.embedding) {
283
+ // Ensure embedding is an array of numbers
284
+ let embedding = item.embedding;
285
+ if (typeof embedding === 'string') {
286
+ try {
287
+ embedding = JSON.parse(embedding);
288
+ }
289
+ catch (e) {
290
+ console.error('Failed to parse embedding string:', e);
291
+ return;
292
+ }
293
+ }
294
+ if (Array.isArray(embedding) && embedding.length > 0) {
295
+ const similarity = this.cosineSimilarity(queryEmbedding, embedding);
296
+ if (similarity >= threshold) {
297
+ results.push({
298
+ id: item.uuid,
299
+ title: item.title,
300
+ description: item.description,
301
+ content: item.content,
302
+ type: item.type,
303
+ score: similarity,
304
+ metadata: item.metadata
305
+ });
306
+ }
307
+ }
308
+ else {
309
+ console.error('Invalid embedding format for item:', item.uuid);
310
+ }
311
+ }
312
+ });
313
+ // Sort by similarity score and limit results
314
+ return results
315
+ .sort((a, b) => b.score - a.score)
316
+ .slice(0, limit);
317
+ }
318
+ catch (error) {
319
+ console.error('Semantic search error:', error);
320
+ return [];
321
+ }
322
+ }
323
+ // Add cosine similarity function (from original implementation)
324
+ cosineSimilarity(a, b) {
325
+ try {
326
+ // Validate inputs
327
+ if (!Array.isArray(a) || !Array.isArray(b)) {
328
+ console.error('Cosine similarity: inputs are not arrays', typeof a, typeof b);
329
+ return 0;
330
+ }
331
+ if (a.length !== b.length) {
332
+ console.error('Cosine similarity: arrays have different lengths', a.length, b.length);
333
+ return 0;
334
+ }
335
+ if (a.length === 0) {
336
+ console.error('Cosine similarity: arrays are empty');
337
+ return 0;
338
+ }
339
+ const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0);
340
+ const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));
341
+ const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0));
342
+ if (magnitudeA === 0 || magnitudeB === 0) {
343
+ return 0;
344
+ }
345
+ return dotProduct / (magnitudeA * magnitudeB);
346
+ }
347
+ catch (error) {
348
+ console.error('Error in cosine similarity calculation:', error);
349
+ return 0;
350
+ }
351
+ }
352
+ async keywordSearch(query, limit, companyId) {
353
+ try {
354
+ let dbQuery = this.supabase
355
+ .from(this.tableName)
356
+ .select(`
357
+ uuid,
358
+ title,
359
+ description,
360
+ content,
361
+ type,
362
+ metadata
363
+ `)
364
+ .textSearch('title,description,content', query, {
365
+ type: 'websearch',
366
+ config: 'english'
367
+ })
368
+ .limit(limit);
369
+ if (companyId) {
370
+ dbQuery = dbQuery.eq('company_id', companyId);
371
+ }
372
+ const { data, error } = await dbQuery;
373
+ if (error)
374
+ throw new Error(`Keyword search failed: ${error.message}`);
375
+ return data.map(item => ({
376
+ id: item.uuid,
377
+ title: item.title,
378
+ description: item.description,
379
+ content: item.content,
380
+ type: item.type,
381
+ score: 0.8, // Default score for keyword matches
382
+ metadata: item.metadata
383
+ }));
384
+ }
385
+ catch (error) {
386
+ return [];
387
+ }
388
+ }
389
+ async generateEmbedding(text) {
390
+ const maxRetries = 3;
391
+ const retryDelay = 1000; // 1 second
392
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
393
+ try {
394
+ console.log(`Generating embedding with OpenAI API... (attempt ${attempt}/${maxRetries})`);
395
+ if (!process.env.OPENAI_API_KEY) {
396
+ console.error('OPENAI_API_KEY environment variable is not set');
397
+ return null;
398
+ }
399
+ // Use OpenAI API with timeout
400
+ const controller = new AbortController();
401
+ const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout
402
+ const response = await fetch('https://api.openai.com/v1/embeddings', {
403
+ method: 'POST',
404
+ headers: {
405
+ 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
406
+ 'Content-Type': 'application/json'
407
+ },
408
+ body: JSON.stringify({
409
+ model: 'text-embedding-ada-002',
410
+ input: text.substring(0, 8000) // Limit text length to avoid token limits
411
+ }),
412
+ signal: controller.signal
413
+ });
414
+ clearTimeout(timeoutId);
415
+ if (!response.ok) {
416
+ const errorText = await response.text();
417
+ console.error(`OpenAI API error: ${response.status} - ${errorText}`);
418
+ throw new Error(`OpenAI API error: ${response.status} - ${errorText}`);
419
+ }
420
+ const data = await response.json();
421
+ console.log('OpenAI API response received, embedding length:', data.data[0].embedding.length);
422
+ return data.data[0].embedding;
423
+ }
424
+ catch (error) {
425
+ console.error(`Embedding generation failed (attempt ${attempt}/${maxRetries}):`, error);
426
+ // If it's a network/DNS error and we have retries left, wait and retry
427
+ if (attempt < maxRetries && (error instanceof Error && (error.message.includes('EAI_AGAIN') ||
428
+ error.message.includes('fetch failed') ||
429
+ error.message.includes('getaddrinfo')))) {
430
+ console.log(`Retrying in ${retryDelay}ms...`);
431
+ await new Promise(resolve => setTimeout(resolve, retryDelay));
432
+ continue;
433
+ }
434
+ // If it's the last attempt or not a network error, return null
435
+ return null;
436
+ }
437
+ }
438
+ return null;
439
+ }
440
+ }
441
+ exports.KnowledgeBaseService = KnowledgeBaseService;
442
+ //# sourceMappingURL=KnowledgeBaseService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeBaseService.js","sourceRoot":"","sources":["../../../src/services/KnowledgeBaseService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ import { ChatConversation } from '../types';
3
+ export declare class ConversationRepository {
4
+ private supabase;
5
+ private tablePrefix;
6
+ constructor(supabase: SupabaseClient, tablePrefix?: string);
7
+ private getTableName;
8
+ saveConversation(conversation: ChatConversation): Promise<ChatConversation>;
9
+ getConversation(conversationId: string): Promise<ChatConversation | null>;
10
+ updateConversation(conversationId: string, updates: Partial<ChatConversation>): Promise<ChatConversation>;
11
+ deleteConversation(conversationId: string): Promise<boolean>;
12
+ getUserConversations(userId: string, organizationId?: string): Promise<ChatConversation[]>;
13
+ private rowToConversation;
14
+ }
15
+ //# sourceMappingURL=ConversationRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationRepository.d.ts","sourceRoot":"","sources":["../../../src/storage/ConversationRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,QAAQ,EAAE,cAAc,EAAE,WAAW,GAAE,MAAW;IAK9D,OAAO,CAAC,YAAY;IAId,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0C3E,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAiBzE,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBzG,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5D,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAoBhG,OAAO,CAAC,iBAAiB;CAY1B"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConversationRepository = void 0;
4
+ class ConversationRepository {
5
+ constructor(supabase, tablePrefix = '') {
6
+ this.supabase = supabase;
7
+ this.tablePrefix = tablePrefix;
8
+ }
9
+ getTableName(table) {
10
+ return this.tablePrefix ? `${this.tablePrefix}_${table}` : table;
11
+ }
12
+ async saveConversation(conversation) {
13
+ const tableName = this.getTableName('conversations');
14
+ if (conversation.id) {
15
+ // Update existing conversation
16
+ const { data, error } = await this.supabase
17
+ .from(tableName)
18
+ .update({
19
+ title: conversation.title,
20
+ message_count: conversation.messageCount,
21
+ updated_at: conversation.updatedAt || new Date().toISOString()
22
+ })
23
+ .eq('uuid', conversation.id)
24
+ .select()
25
+ .single();
26
+ if (error)
27
+ throw new Error(`Failed to update conversation: ${error.message}`);
28
+ return this.rowToConversation(data);
29
+ }
30
+ else {
31
+ // Create new conversation
32
+ // Convert string IDs to integers (dummy IDs for now)
33
+ const companyId = conversation.organizationId ? parseInt(conversation.organizationId) || 1 : 1;
34
+ const creatorId = parseInt(conversation.userId) || 1;
35
+ const { data, error } = await this.supabase
36
+ .from(tableName)
37
+ .insert({
38
+ company_id: companyId,
39
+ title: conversation.title || 'New Conversation',
40
+ creator_id: creatorId,
41
+ message_count: conversation.messageCount || 0,
42
+ created_at: conversation.createdAt?.toISOString() || new Date().toISOString(),
43
+ updated_at: conversation.updatedAt?.toISOString() || new Date().toISOString()
44
+ })
45
+ .select()
46
+ .single();
47
+ if (error)
48
+ throw new Error(`Failed to create conversation: ${error.message}`);
49
+ return this.rowToConversation(data);
50
+ }
51
+ }
52
+ async getConversation(conversationId) {
53
+ const tableName = this.getTableName('conversations');
54
+ const { data, error } = await this.supabase
55
+ .from(tableName)
56
+ .select('*')
57
+ .eq('uuid', conversationId)
58
+ .single();
59
+ if (error) {
60
+ if (error.code === 'PGRST116')
61
+ return null; // Not found
62
+ throw new Error(`Failed to get conversation: ${error.message}`);
63
+ }
64
+ return this.rowToConversation(data);
65
+ }
66
+ async updateConversation(conversationId, updates) {
67
+ const tableName = this.getTableName('conversations');
68
+ const updateData = {};
69
+ if (updates.title !== undefined)
70
+ updateData.title = updates.title;
71
+ if (updates.messageCount !== undefined)
72
+ updateData.message_count = updates.messageCount;
73
+ updateData.updated_at = new Date().toISOString();
74
+ const { data, error } = await this.supabase
75
+ .from(tableName)
76
+ .update(updateData)
77
+ .eq('uuid', conversationId)
78
+ .select()
79
+ .single();
80
+ if (error)
81
+ throw new Error(`Failed to update conversation: ${error.message}`);
82
+ return this.rowToConversation(data);
83
+ }
84
+ async deleteConversation(conversationId) {
85
+ const tableName = this.getTableName('conversations');
86
+ const { error } = await this.supabase
87
+ .from(tableName)
88
+ .delete()
89
+ .eq('uuid', conversationId);
90
+ if (error)
91
+ throw new Error(`Failed to delete conversation: ${error.message}`);
92
+ return true;
93
+ }
94
+ async getUserConversations(userId, organizationId) {
95
+ const tableName = this.getTableName('conversations');
96
+ let query = this.supabase
97
+ .from(tableName)
98
+ .select('*')
99
+ .eq('creator_id', parseInt(userId) || 1)
100
+ .order('updated_at', { ascending: false });
101
+ if (organizationId) {
102
+ query = query.eq('company_id', parseInt(organizationId) || 1);
103
+ }
104
+ const { data, error } = await query;
105
+ if (error)
106
+ throw new Error(`Failed to get user conversations: ${error.message}`);
107
+ return (data || []).map(row => this.rowToConversation(row));
108
+ }
109
+ rowToConversation(row) {
110
+ return {
111
+ id: row.uuid,
112
+ threadId: row.uuid, // Use UUID as threadId for conversations
113
+ title: row.title,
114
+ userId: row.creator_id?.toString() || '1',
115
+ organizationId: row.company_id?.toString(),
116
+ messageCount: row.message_count || 0,
117
+ createdAt: new Date(row.created_at),
118
+ updatedAt: row.updated_at ? new Date(row.updated_at) : new Date(row.created_at)
119
+ };
120
+ }
121
+ }
122
+ exports.ConversationRepository = ConversationRepository;
123
+ //# sourceMappingURL=ConversationRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationRepository.js","sourceRoot":"","sources":["../../../src/storage/ConversationRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ import { Feedback } from '../types';
3
+ export declare class FeedbackRepository {
4
+ private supabase;
5
+ private tablePrefix;
6
+ constructor(supabase: SupabaseClient, tablePrefix?: string);
7
+ private getTableName;
8
+ saveFeedback(feedback: Feedback): Promise<Feedback>;
9
+ getFeedback(messageId: string): Promise<Feedback[]>;
10
+ getFeedbackById(feedbackId: string): Promise<Feedback | null>;
11
+ getUserFeedback(userId: string, limit?: number, offset?: number): Promise<Feedback[]>;
12
+ deleteFeedback(feedbackId: string): Promise<boolean>;
13
+ private rowToFeedback;
14
+ }
15
+ //# sourceMappingURL=FeedbackRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackRepository.d.ts","sourceRoot":"","sources":["../../../src/storage/FeedbackRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,QAAQ,EAAE,cAAc,EAAE,WAAW,GAAE,MAAW;IAK9D,OAAO,CAAC,YAAY;IAId,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IA6DnD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAyBnD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAiB7D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAe5E,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1D,OAAO,CAAC,aAAa;CAatB"}