@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.
- package/Dockerfile +64 -0
- package/LICENSE +661 -0
- package/README.md +432 -0
- package/bin/vezlo-server.js +36 -0
- package/database-schema.sql +154 -0
- package/dist/knexfile.d.ts +6 -0
- package/dist/knexfile.d.ts.map +1 -0
- package/dist/knexfile.js +85 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/src/config/database.d.ts +4 -0
- package/dist/src/config/database.d.ts.map +1 -0
- package/dist/src/config/database.js +30 -0
- package/dist/src/config/database.js.map +1 -0
- package/dist/src/config/global.d.ts +65 -0
- package/dist/src/config/global.d.ts.map +1 -0
- package/dist/src/config/global.js +113 -0
- package/dist/src/config/global.js.map +1 -0
- package/dist/src/config/knex.d.ts +9 -0
- package/dist/src/config/knex.d.ts.map +1 -0
- package/dist/src/config/knex.js +67 -0
- package/dist/src/config/knex.js.map +1 -0
- package/dist/src/config/logger.d.ts +4 -0
- package/dist/src/config/logger.d.ts.map +1 -0
- package/dist/src/config/logger.js +30 -0
- package/dist/src/config/logger.js.map +1 -0
- package/dist/src/config/swagger.d.ts +18 -0
- package/dist/src/config/swagger.d.ts.map +1 -0
- package/dist/src/config/swagger.js +230 -0
- package/dist/src/config/swagger.js.map +1 -0
- package/dist/src/controllers/ChatController.d.ts +16 -0
- package/dist/src/controllers/ChatController.d.ts.map +1 -0
- package/dist/src/controllers/ChatController.js +281 -0
- package/dist/src/controllers/ChatController.js.map +1 -0
- package/dist/src/controllers/KnowledgeController.d.ts +13 -0
- package/dist/src/controllers/KnowledgeController.d.ts.map +1 -0
- package/dist/src/controllers/KnowledgeController.js +210 -0
- package/dist/src/controllers/KnowledgeController.js.map +1 -0
- package/dist/src/middleware/errorHandler.d.ts +63 -0
- package/dist/src/middleware/errorHandler.d.ts.map +1 -0
- package/dist/src/middleware/errorHandler.js +226 -0
- package/dist/src/middleware/errorHandler.js.map +1 -0
- package/dist/src/migrations/001_initial_schema.d.ts +4 -0
- package/dist/src/migrations/001_initial_schema.d.ts.map +1 -0
- package/dist/src/migrations/001_initial_schema.js +144 -0
- package/dist/src/migrations/001_initial_schema.js.map +1 -0
- package/dist/src/schemas/ConversationSchemas.d.ts +132 -0
- package/dist/src/schemas/ConversationSchemas.d.ts.map +1 -0
- package/dist/src/schemas/ConversationSchemas.js +71 -0
- package/dist/src/schemas/ConversationSchemas.js.map +1 -0
- package/dist/src/schemas/FeedbackSchemas.d.ts +222 -0
- package/dist/src/schemas/FeedbackSchemas.d.ts.map +1 -0
- package/dist/src/schemas/FeedbackSchemas.js +116 -0
- package/dist/src/schemas/FeedbackSchemas.js.map +1 -0
- package/dist/src/schemas/KnowledgeSchemas.d.ts +266 -0
- package/dist/src/schemas/KnowledgeSchemas.d.ts.map +1 -0
- package/dist/src/schemas/KnowledgeSchemas.js +115 -0
- package/dist/src/schemas/KnowledgeSchemas.js.map +1 -0
- package/dist/src/schemas/MessageSchemas.d.ts +145 -0
- package/dist/src/schemas/MessageSchemas.d.ts.map +1 -0
- package/dist/src/schemas/MessageSchemas.js +79 -0
- package/dist/src/schemas/MessageSchemas.js.map +1 -0
- package/dist/src/schemas/index.d.ts +752 -0
- package/dist/src/schemas/index.d.ts.map +1 -0
- package/dist/src/schemas/index.js +31 -0
- package/dist/src/schemas/index.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +609 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/services/AIService.d.ts +17 -0
- package/dist/src/services/AIService.d.ts.map +1 -0
- package/dist/src/services/AIService.js +174 -0
- package/dist/src/services/AIService.js.map +1 -0
- package/dist/src/services/ChatManager.d.ts +18 -0
- package/dist/src/services/ChatManager.d.ts.map +1 -0
- package/dist/src/services/ChatManager.js +174 -0
- package/dist/src/services/ChatManager.js.map +1 -0
- package/dist/src/services/KnowledgeBaseService.d.ts +72 -0
- package/dist/src/services/KnowledgeBaseService.d.ts.map +1 -0
- package/dist/src/services/KnowledgeBaseService.js +442 -0
- package/dist/src/services/KnowledgeBaseService.js.map +1 -0
- package/dist/src/storage/ConversationRepository.d.ts +15 -0
- package/dist/src/storage/ConversationRepository.d.ts.map +1 -0
- package/dist/src/storage/ConversationRepository.js +123 -0
- package/dist/src/storage/ConversationRepository.js.map +1 -0
- package/dist/src/storage/FeedbackRepository.d.ts +15 -0
- package/dist/src/storage/FeedbackRepository.d.ts.map +1 -0
- package/dist/src/storage/FeedbackRepository.js +141 -0
- package/dist/src/storage/FeedbackRepository.js.map +1 -0
- package/dist/src/storage/MessageRepository.d.ts +13 -0
- package/dist/src/storage/MessageRepository.d.ts.map +1 -0
- package/dist/src/storage/MessageRepository.js +165 -0
- package/dist/src/storage/MessageRepository.js.map +1 -0
- package/dist/src/storage/SupabaseStorage.d.ts +20 -0
- package/dist/src/storage/SupabaseStorage.d.ts.map +1 -0
- package/dist/src/storage/SupabaseStorage.js +347 -0
- package/dist/src/storage/SupabaseStorage.js.map +1 -0
- package/dist/src/storage/UnifiedStorage.d.ts +45 -0
- package/dist/src/storage/UnifiedStorage.d.ts.map +1 -0
- package/dist/src/storage/UnifiedStorage.js +94 -0
- package/dist/src/storage/UnifiedStorage.js.map +1 -0
- package/dist/src/storage/index.d.ts +11 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +21 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/types/index.d.ts +163 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/docker-compose.yml +32 -0
- package/env.example +46 -0
- package/knexfile.ts +86 -0
- 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 @@
|
|
|
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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"}
|