@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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKtB,CAAC;AAGF,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,eAAe,EAChB,CAAC;AAGF,eAAO,MAAM,gBAAgB;wCAES,GAAG;CAIxC,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Schema Exports
4
+ * Central export point for all API schemas
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SchemaValidators = exports.FeedbackSchemas = exports.KnowledgeSchemas = exports.MessageSchemas = exports.ConversationSchemas = exports.AllSchemas = void 0;
8
+ const ConversationSchemas_1 = require("./ConversationSchemas");
9
+ Object.defineProperty(exports, "ConversationSchemas", { enumerable: true, get: function () { return ConversationSchemas_1.ConversationSchemas; } });
10
+ const MessageSchemas_1 = require("./MessageSchemas");
11
+ Object.defineProperty(exports, "MessageSchemas", { enumerable: true, get: function () { return MessageSchemas_1.MessageSchemas; } });
12
+ const KnowledgeSchemas_1 = require("./KnowledgeSchemas");
13
+ Object.defineProperty(exports, "KnowledgeSchemas", { enumerable: true, get: function () { return KnowledgeSchemas_1.KnowledgeSchemas; } });
14
+ const FeedbackSchemas_1 = require("./FeedbackSchemas");
15
+ Object.defineProperty(exports, "FeedbackSchemas", { enumerable: true, get: function () { return FeedbackSchemas_1.FeedbackSchemas; } });
16
+ // Combine all schemas for Swagger
17
+ exports.AllSchemas = {
18
+ ...ConversationSchemas_1.ConversationSchemas,
19
+ ...MessageSchemas_1.MessageSchemas,
20
+ ...KnowledgeSchemas_1.KnowledgeSchemas,
21
+ ...FeedbackSchemas_1.FeedbackSchemas
22
+ };
23
+ // Schema validation helpers (can be extended)
24
+ exports.SchemaValidators = {
25
+ // Add custom validation functions here if needed
26
+ validateConversationRequest: (data) => {
27
+ // Custom validation logic
28
+ return true;
29
+ }
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA4D;AAe1D,oGAfO,yCAAmB,OAeP;AAdrB,qDAAkD;AAehD,+FAfO,+BAAc,OAeP;AAdhB,yDAAsD;AAepD,iGAfO,mCAAgB,OAeP;AAdlB,uDAAoD;AAelD,gGAfO,iCAAe,OAeP;AAbjB,kCAAkC;AACrB,QAAA,UAAU,GAAG;IACxB,GAAG,yCAAmB;IACtB,GAAG,+BAAc;IACjB,GAAG,mCAAgB;IACnB,GAAG,iCAAe;CACnB,CAAC;AAUF,8CAA8C;AACjC,QAAA,gBAAgB,GAAG;IAC9B,iDAAiD;IACjD,2BAA2B,EAAE,CAAC,IAAS,EAAE,EAAE;QACzC,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,609 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ const cors_1 = __importDefault(require("cors"));
8
+ const helmet_1 = __importDefault(require("helmet"));
9
+ const compression_1 = __importDefault(require("compression"));
10
+ const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
11
+ const http_1 = require("http");
12
+ const socket_io_1 = require("socket.io");
13
+ const dotenv_1 = require("dotenv");
14
+ // Import configurations
15
+ const logger_1 = __importDefault(require("./config/logger"));
16
+ const database_1 = require("./config/database");
17
+ const swagger_1 = require("./config/swagger");
18
+ const global_1 = require("./config/global");
19
+ const errorHandler_1 = require("./middleware/errorHandler");
20
+ // Import services
21
+ const AIService_1 = require("./services/AIService");
22
+ const ChatManager_1 = require("./services/ChatManager");
23
+ const KnowledgeBaseService_1 = require("./services/KnowledgeBaseService");
24
+ const UnifiedStorage_1 = require("./storage/UnifiedStorage");
25
+ // Import controllers
26
+ const ChatController_1 = require("./controllers/ChatController");
27
+ const KnowledgeController_1 = require("./controllers/KnowledgeController");
28
+ // Load environment variables
29
+ (0, dotenv_1.config)();
30
+ // Initialize Express app
31
+ const app = (0, express_1.default)();
32
+ const server = (0, http_1.createServer)(app);
33
+ const io = new socket_io_1.Server(server, {
34
+ cors: {
35
+ origin: process.env.CORS_ORIGINS?.split(',') || '*',
36
+ credentials: true
37
+ }
38
+ });
39
+ // Middleware
40
+ app.use((0, helmet_1.default)());
41
+ app.use((0, compression_1.default)());
42
+ app.use((0, cors_1.default)({
43
+ origin: process.env.CORS_ORIGINS?.split(',') || '*',
44
+ credentials: true
45
+ }));
46
+ app.use(express_1.default.json({ limit: '10mb' }));
47
+ app.use(express_1.default.urlencoded({ extended: true }));
48
+ // Rate limiting with global config
49
+ const limiter = (0, express_rate_limit_1.default)({
50
+ windowMs: global_1.config.api.rateLimiting.windowMs,
51
+ max: global_1.config.api.rateLimiting.maxRequests,
52
+ message: {
53
+ error: {
54
+ code: 'RATE_LIMIT_EXCEEDED',
55
+ message: 'Too many requests from this IP, please try again later.',
56
+ timestamp: new Date().toISOString()
57
+ },
58
+ success: false
59
+ },
60
+ standardHeaders: true,
61
+ legacyHeaders: false
62
+ });
63
+ app.use('/api/', limiter);
64
+ // Global services
65
+ let aiService;
66
+ let chatManager;
67
+ let knowledgeBase;
68
+ let storage;
69
+ let chatController;
70
+ let knowledgeController;
71
+ async function initializeServices() {
72
+ logger_1.default.info('Initializing Vezlo services...');
73
+ try {
74
+ // Initialize Supabase
75
+ const supabase = (0, database_1.initializeSupabase)();
76
+ logger_1.default.info('Supabase client initialized');
77
+ // Initialize storage with new repository pattern
78
+ storage = new UnifiedStorage_1.UnifiedStorage(supabase);
79
+ // Initialize knowledge base
80
+ knowledgeBase = new KnowledgeBaseService_1.KnowledgeBaseService({
81
+ supabase,
82
+ tableName: 'knowledge_items'
83
+ });
84
+ // Initialize AI service
85
+ aiService = new AIService_1.AIService({
86
+ openaiApiKey: process.env.OPENAI_API_KEY,
87
+ organizationName: process.env.ORGANIZATION_NAME || 'Vezlo',
88
+ assistantName: process.env.ASSISTANT_NAME || 'Vezlo Assistant',
89
+ model: process.env.AI_MODEL || 'gpt-4',
90
+ temperature: parseFloat(process.env.AI_TEMPERATURE || '0.7'),
91
+ maxTokens: parseInt(process.env.AI_MAX_TOKENS || '1000'),
92
+ enableFeedbackDetection: process.env.ENABLE_FEEDBACK_DETECTION === 'true',
93
+ knowledgeBaseService: knowledgeBase
94
+ });
95
+ // Initialize chat manager
96
+ chatManager = new ChatManager_1.ChatManager({
97
+ aiService,
98
+ storage,
99
+ enableConversationManagement: true,
100
+ conversationTimeout: 3600000 // 1 hour
101
+ });
102
+ // Initialize controllers
103
+ chatController = new ChatController_1.ChatController(chatManager, storage);
104
+ knowledgeController = new KnowledgeController_1.KnowledgeController(knowledgeBase);
105
+ logger_1.default.info('All services initialized successfully');
106
+ }
107
+ catch (error) {
108
+ logger_1.default.error('Failed to initialize services:', error);
109
+ throw error;
110
+ }
111
+ }
112
+ // Redirect root to docs
113
+ app.get('/', (req, res) => {
114
+ res.redirect('/docs');
115
+ });
116
+ // API Documentation
117
+ app.use('/docs', swagger_1.swaggerUi.serve, swagger_1.swaggerUi.setup(swagger_1.specs, swagger_1.swaggerUiOptions));
118
+ /**
119
+ * @swagger
120
+ * /health:
121
+ * get:
122
+ * summary: Health check endpoint
123
+ * description: Check server and database connectivity status
124
+ * tags: [Health]
125
+ * responses:
126
+ * 200:
127
+ * description: Server is healthy
128
+ * content:
129
+ * application/json:
130
+ * schema:
131
+ * $ref: '#/components/schemas/HealthCheck'
132
+ * 503:
133
+ * description: Server is unhealthy
134
+ * content:
135
+ * application/json:
136
+ * schema:
137
+ * $ref: '#/components/schemas/Error'
138
+ */
139
+ app.get('/health', async (req, res) => {
140
+ try {
141
+ const healthChecks = {
142
+ server: 'healthy',
143
+ timestamp: new Date().toISOString()
144
+ };
145
+ // Check Supabase connection
146
+ try {
147
+ const supabase = (0, database_1.getSupabaseClient)();
148
+ const { data, error } = await supabase.from('conversations').select('count').limit(1);
149
+ if (!error) {
150
+ healthChecks.supabase = 'connected';
151
+ }
152
+ else {
153
+ healthChecks.supabase = 'error';
154
+ }
155
+ }
156
+ catch (error) {
157
+ healthChecks.supabase = 'disconnected';
158
+ }
159
+ res.json({
160
+ status: 'healthy',
161
+ checks: healthChecks
162
+ });
163
+ }
164
+ catch (error) {
165
+ res.status(503).json({
166
+ status: 'unhealthy',
167
+ error: error instanceof Error ? error.message : 'Unknown error'
168
+ });
169
+ }
170
+ });
171
+ // ============================================================================
172
+ // CONVERSATION APIS (New 2-API Flow)
173
+ // ============================================================================
174
+ /**
175
+ * @swagger
176
+ * /api/conversations:
177
+ * post:
178
+ * summary: Create a new conversation
179
+ * description: Create a new conversation for chat
180
+ * tags: [Conversations]
181
+ * requestBody:
182
+ * required: true
183
+ * content:
184
+ * application/json:
185
+ * schema:
186
+ * $ref: '#/components/schemas/CreateConversationRequest'
187
+ * responses:
188
+ * 200:
189
+ * description: Conversation created successfully
190
+ * content:
191
+ * application/json:
192
+ * schema:
193
+ * $ref: '#/components/schemas/ConversationResponse'
194
+ * 400:
195
+ * description: Bad request
196
+ * 500:
197
+ * description: Internal server error
198
+ */
199
+ app.post('/api/conversations', (req, res) => chatController.createConversation(req, res));
200
+ /**
201
+ * @swagger
202
+ * /api/conversations/{uuid}:
203
+ * get:
204
+ * summary: Get conversation details with messages
205
+ * description: Retrieve conversation information and message history
206
+ * tags: [Conversations]
207
+ * parameters:
208
+ * - in: path
209
+ * name: uuid
210
+ * required: true
211
+ * schema:
212
+ * type: string
213
+ * description: Conversation UUID
214
+ * responses:
215
+ * 200:
216
+ * description: Conversation details with messages
217
+ * 404:
218
+ * description: Conversation not found
219
+ * 500:
220
+ * description: Internal server error
221
+ */
222
+ app.get('/api/conversations/:uuid', (req, res) => chatController.getConversation(req, res));
223
+ /**
224
+ * @swagger
225
+ * /api/conversations/{uuid}:
226
+ * delete:
227
+ * summary: Delete conversation
228
+ * description: Soft delete a conversation and its messages
229
+ * tags: [Conversations]
230
+ * parameters:
231
+ * - in: path
232
+ * name: uuid
233
+ * required: true
234
+ * schema:
235
+ * type: string
236
+ * description: Conversation UUID
237
+ * responses:
238
+ * 200:
239
+ * description: Conversation deleted successfully
240
+ * 404:
241
+ * description: Conversation not found
242
+ * 500:
243
+ * description: Internal server error
244
+ */
245
+ app.delete('/api/conversations/:uuid', (req, res) => chatController.deleteConversation(req, res));
246
+ /**
247
+ * @swagger
248
+ * /api/conversations/{uuid}/messages:
249
+ * post:
250
+ * summary: Create user message in conversation
251
+ * description: Add a user message to the conversation
252
+ * tags: [Messages]
253
+ * parameters:
254
+ * - in: path
255
+ * name: uuid
256
+ * required: true
257
+ * schema:
258
+ * type: string
259
+ * description: Conversation UUID
260
+ * requestBody:
261
+ * required: true
262
+ * content:
263
+ * application/json:
264
+ * schema:
265
+ * $ref: '#/components/schemas/CreateMessageRequest'
266
+ * responses:
267
+ * 200:
268
+ * description: User message created successfully
269
+ * content:
270
+ * application/json:
271
+ * schema:
272
+ * $ref: '#/components/schemas/MessageResponse'
273
+ * 400:
274
+ * description: Bad request
275
+ * 404:
276
+ * description: Conversation not found
277
+ * 500:
278
+ * description: Internal server error
279
+ */
280
+ app.post('/api/conversations/:uuid/messages', (req, res) => chatController.createUserMessage(req, res));
281
+ /**
282
+ * @swagger
283
+ * /api/messages/{uuid}/generate:
284
+ * post:
285
+ * summary: Generate AI response for user message
286
+ * description: Generate AI assistant response to a user message
287
+ * tags: [Messages]
288
+ * parameters:
289
+ * - in: path
290
+ * name: uuid
291
+ * required: true
292
+ * schema:
293
+ * type: string
294
+ * description: User message UUID
295
+ * responses:
296
+ * 200:
297
+ * description: AI response generated successfully
298
+ * content:
299
+ * application/json:
300
+ * schema:
301
+ * $ref: '#/components/schemas/MessageResponse'
302
+ * 404:
303
+ * description: Message not found
304
+ * 500:
305
+ * description: Internal server error
306
+ */
307
+ app.post('/api/messages/:uuid/generate', (req, res) => chatController.generateResponse(req, res));
308
+ /**
309
+ * @swagger
310
+ * /api/users/{uuid}/conversations:
311
+ * get:
312
+ * summary: Get user's conversations
313
+ * description: Retrieve all conversations for a specific user
314
+ * tags: [Conversations]
315
+ * parameters:
316
+ * - in: path
317
+ * name: uuid
318
+ * required: true
319
+ * schema:
320
+ * type: string
321
+ * description: User UUID
322
+ * - in: query
323
+ * name: company_uuid
324
+ * schema:
325
+ * type: string
326
+ * description: Optional company UUID filter
327
+ * responses:
328
+ * 200:
329
+ * description: List of user conversations
330
+ * 500:
331
+ * description: Internal server error
332
+ */
333
+ app.get('/api/users/:uuid/conversations', (req, res) => chatController.getUserConversations(req, res));
334
+ /**
335
+ * @swagger
336
+ * /api/feedback:
337
+ * post:
338
+ * summary: Submit message feedback
339
+ * description: Submit rating and feedback for an AI response
340
+ * tags: [Messages]
341
+ * requestBody:
342
+ * required: true
343
+ * content:
344
+ * application/json:
345
+ * schema:
346
+ * $ref: '#/components/schemas/FeedbackRequest'
347
+ * responses:
348
+ * 200:
349
+ * description: Feedback submitted successfully
350
+ * content:
351
+ * application/json:
352
+ * schema:
353
+ * $ref: '#/components/schemas/FeedbackResponse'
354
+ * 400:
355
+ * description: Missing required fields
356
+ * 500:
357
+ * description: Internal server error
358
+ */
359
+ app.post('/api/feedback', (req, res) => chatController.submitFeedback(req, res));
360
+ // ============================================================================
361
+ // KNOWLEDGE BASE APIS (Unified Items)
362
+ // ============================================================================
363
+ /**
364
+ * @swagger
365
+ * /api/knowledge/items:
366
+ * post:
367
+ * summary: Create knowledge item
368
+ * description: Create a new knowledge item (folder, document, file, url, etc.)
369
+ * tags: [Knowledge]
370
+ * requestBody:
371
+ * required: true
372
+ * content:
373
+ * application/json:
374
+ * schema:
375
+ * $ref: '#/components/schemas/CreateKnowledgeItemRequest'
376
+ * responses:
377
+ * 200:
378
+ * description: Knowledge item created successfully
379
+ * 400:
380
+ * description: Bad request
381
+ * 500:
382
+ * description: Internal server error
383
+ */
384
+ app.post('/api/knowledge/items', (req, res) => knowledgeController.createItem(req, res));
385
+ /**
386
+ * @swagger
387
+ * /api/knowledge/items:
388
+ * get:
389
+ * summary: List knowledge items
390
+ * description: Get list of knowledge items with optional filtering and pagination
391
+ * tags: [Knowledge]
392
+ * parameters:
393
+ * - in: query
394
+ * name: parent_uuid
395
+ * schema:
396
+ * type: string
397
+ * description: Filter by parent UUID
398
+ * - in: query
399
+ * name: company_uuid
400
+ * schema:
401
+ * type: integer
402
+ * description: Filter by company UUID
403
+ * - in: query
404
+ * name: type
405
+ * schema:
406
+ * type: string
407
+ * description: Filter by item type
408
+ * - in: query
409
+ * name: limit
410
+ * schema:
411
+ * type: integer
412
+ * default: 50
413
+ * description: Maximum number of items to return
414
+ * - in: query
415
+ * name: offset
416
+ * schema:
417
+ * type: integer
418
+ * default: 0
419
+ * description: Number of items to skip
420
+ * responses:
421
+ * 200:
422
+ * description: List of knowledge items
423
+ * 500:
424
+ * description: Internal server error
425
+ */
426
+ app.get('/api/knowledge/items', (req, res) => knowledgeController.listItems(req, res));
427
+ /**
428
+ * @swagger
429
+ * /api/knowledge/search:
430
+ * post:
431
+ * summary: Search knowledge items
432
+ * description: Search through knowledge items using semantic or keyword search
433
+ * tags: [Knowledge]
434
+ * requestBody:
435
+ * required: true
436
+ * content:
437
+ * application/json:
438
+ * schema:
439
+ * $ref: '#/components/schemas/KnowledgeSearchRequest'
440
+ * responses:
441
+ * 200:
442
+ * description: Search results
443
+ * 400:
444
+ * description: Bad request
445
+ * 500:
446
+ * description: Internal server error
447
+ */
448
+ app.post('/api/knowledge/search', (req, res) => knowledgeController.search(req, res));
449
+ /**
450
+ * @swagger
451
+ * /api/knowledge/items/{uuid}:
452
+ * get:
453
+ * summary: Get knowledge item
454
+ * description: Retrieve a specific knowledge item by UUID
455
+ * tags: [Knowledge]
456
+ * parameters:
457
+ * - in: path
458
+ * name: uuid
459
+ * required: true
460
+ * schema:
461
+ * type: string
462
+ * description: Knowledge item UUID
463
+ * responses:
464
+ * 200:
465
+ * description: Knowledge item details
466
+ * 404:
467
+ * description: Knowledge item not found
468
+ * 500:
469
+ * description: Internal server error
470
+ */
471
+ app.get('/api/knowledge/items/:uuid', (req, res) => knowledgeController.getItem(req, res));
472
+ /**
473
+ * @swagger
474
+ * /api/knowledge/items/{uuid}:
475
+ * put:
476
+ * summary: Update knowledge item
477
+ * description: Update an existing knowledge item
478
+ * tags: [Knowledge]
479
+ * parameters:
480
+ * - in: path
481
+ * name: uuid
482
+ * required: true
483
+ * schema:
484
+ * type: string
485
+ * description: Knowledge item UUID
486
+ * requestBody:
487
+ * required: true
488
+ * content:
489
+ * application/json:
490
+ * schema:
491
+ * $ref: '#/components/schemas/UpdateKnowledgeItemRequest'
492
+ * responses:
493
+ * 200:
494
+ * description: Knowledge item updated successfully
495
+ * 404:
496
+ * description: Knowledge item not found
497
+ * 500:
498
+ * description: Internal server error
499
+ */
500
+ app.put('/api/knowledge/items/:uuid', (req, res) => knowledgeController.updateItem(req, res));
501
+ /**
502
+ * @swagger
503
+ * /api/knowledge/items/{uuid}:
504
+ * delete:
505
+ * summary: Delete knowledge item
506
+ * description: Remove a knowledge item from the knowledge base
507
+ * tags: [Knowledge]
508
+ * parameters:
509
+ * - in: path
510
+ * name: uuid
511
+ * required: true
512
+ * schema:
513
+ * type: string
514
+ * description: Knowledge item UUID
515
+ * responses:
516
+ * 200:
517
+ * description: Knowledge item deleted successfully
518
+ * 404:
519
+ * description: Knowledge item not found
520
+ * 500:
521
+ * description: Internal server error
522
+ */
523
+ app.delete('/api/knowledge/items/:uuid', (req, res) => knowledgeController.deleteItem(req, res));
524
+ // ============================================================================
525
+ // WEBSOCKET HANDLING
526
+ // ============================================================================
527
+ // WebSocket handling
528
+ io.on('connection', (socket) => {
529
+ logger_1.default.info(`Client connected: ${socket.id}`);
530
+ socket.on('join-conversation', (conversationId) => {
531
+ socket.join(`conversation:${conversationId}`);
532
+ logger_1.default.info(`Socket ${socket.id} joined conversation ${conversationId}`);
533
+ });
534
+ socket.on('message', async (data) => {
535
+ try {
536
+ const { message, conversation_id, context } = data;
537
+ const response = await chatManager.sendMessage(message, conversation_id, context);
538
+ socket.emit('response', {
539
+ message: response.content,
540
+ conversation_id: response.conversationId,
541
+ message_id: response.messageId,
542
+ feedback_detection: response.feedbackDetection,
543
+ suggested_links: response.suggestedLinks
544
+ });
545
+ // Broadcast to all clients in the conversation
546
+ if (response.conversationId) {
547
+ io.to(`conversation:${response.conversationId}`).emit('new-message', {
548
+ role: 'assistant',
549
+ content: response.content,
550
+ timestamp: new Date()
551
+ });
552
+ }
553
+ }
554
+ catch (error) {
555
+ socket.emit('error', {
556
+ message: error instanceof Error ? error.message : 'Unknown error'
557
+ });
558
+ }
559
+ });
560
+ socket.on('disconnect', () => {
561
+ logger_1.default.info(`Client disconnected: ${socket.id}`);
562
+ });
563
+ });
564
+ // Error handling middleware
565
+ // Global error handling middleware
566
+ app.use(errorHandler_1.errorHandler);
567
+ // 404 handler for undefined routes
568
+ app.use(errorHandler_1.notFoundHandler);
569
+ // Start server
570
+ const PORT = global_1.config.app.port;
571
+ async function start() {
572
+ try {
573
+ // Validate configuration
574
+ (0, global_1.validateConfig)();
575
+ await initializeServices();
576
+ server.listen(PORT, '0.0.0.0', () => {
577
+ logger_1.default.info(`🚀 ${global_1.config.app.name} v${global_1.config.app.version} running on port ${PORT}`);
578
+ logger_1.default.info(`📊 Environment: ${global_1.config.app.environment}`);
579
+ logger_1.default.info(`🌐 API available at http://localhost:${PORT}${global_1.config.api.prefix}`);
580
+ if (global_1.config.swagger.enabled) {
581
+ logger_1.default.info(`📚 API Documentation: http://localhost:${PORT}${global_1.config.swagger.path}`);
582
+ }
583
+ logger_1.default.info(`🔌 WebSocket available at ws://localhost:${PORT}`);
584
+ logger_1.default.info(`💓 Health check: http://localhost:${PORT}/health`);
585
+ });
586
+ }
587
+ catch (error) {
588
+ logger_1.default.error('Failed to start server:', error);
589
+ process.exit(1);
590
+ }
591
+ }
592
+ // Graceful shutdown
593
+ process.on('SIGTERM', async () => {
594
+ logger_1.default.info('SIGTERM received, shutting down gracefully...');
595
+ server.close(() => {
596
+ logger_1.default.info('HTTP server closed');
597
+ process.exit(0);
598
+ });
599
+ });
600
+ process.on('SIGINT', async () => {
601
+ logger_1.default.info('SIGINT received, shutting down gracefully...');
602
+ server.close(() => {
603
+ logger_1.default.info('HTTP server closed');
604
+ process.exit(0);
605
+ });
606
+ });
607
+ // Start the server
608
+ start();
609
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}