@embrs/user-feedback 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.
@@ -0,0 +1,477 @@
1
+ /**
2
+ * MCP Feedback Collector - Web 服務器實現
3
+ */
4
+ import express from 'express';
5
+ import { createServer } from 'http';
6
+ import { createServer as createNetServer } from 'net';
7
+ import { Server as SocketIOServer } from 'socket.io';
8
+ import cors from 'cors';
9
+ import helmet from 'helmet';
10
+ import compression from 'compression';
11
+ import path from 'path';
12
+ import fs from 'fs';
13
+ import { fileURLToPath } from 'url';
14
+ import { MCPError } from '../types/index.js';
15
+ import { logger } from '../utils/logger.js';
16
+ /**
17
+ * Web 服務器類
18
+ */
19
+ export class WebServer {
20
+ app;
21
+ server;
22
+ io;
23
+ config;
24
+ port = 0;
25
+ isServerRunning = false;
26
+ sessions = new Map();
27
+ constructor(config) {
28
+ this.config = config;
29
+ // 創建 Express 應用
30
+ this.app = express();
31
+ // 創建 HTTP 服務器
32
+ this.server = createServer(this.app);
33
+ // 創建 Socket.IO 服務器
34
+ this.io = new SocketIOServer(this.server, {
35
+ cors: {
36
+ origin: config.corsOrigin,
37
+ methods: ['GET', 'POST']
38
+ }
39
+ });
40
+ this.setupMiddleware();
41
+ this.setupRoutes();
42
+ this.setupSocketHandlers();
43
+ this.setupGracefulShutdown();
44
+ }
45
+ /**
46
+ * 設置優雅退出處理
47
+ */
48
+ setupGracefulShutdown() {
49
+ let isShuttingDown = false;
50
+ const gracefulShutdown = async (signal) => {
51
+ if (isShuttingDown)
52
+ return;
53
+ isShuttingDown = true;
54
+ logger.info(`收到 ${signal} 信號,開始優雅關閉...`);
55
+ try {
56
+ await this.stop();
57
+ logger.info('優雅關閉完成');
58
+ process.exit(0);
59
+ }
60
+ catch (error) {
61
+ logger.error('優雅關閉失敗:', error);
62
+ process.exit(1);
63
+ }
64
+ };
65
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
66
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
67
+ }
68
+ /**
69
+ * 設置中間件
70
+ */
71
+ setupMiddleware() {
72
+ // 安全中間件
73
+ this.app.use(helmet({
74
+ contentSecurityPolicy: false
75
+ }));
76
+ // 壓縮中間件
77
+ this.app.use(compression());
78
+ // CORS 中間件
79
+ this.app.use(cors({
80
+ origin: this.config.corsOrigin,
81
+ credentials: true
82
+ }));
83
+ // JSON 解析中間件
84
+ this.app.use(express.json({ limit: '50mb' }));
85
+ this.app.use(express.urlencoded({ extended: true, limit: '50mb' }));
86
+ // 請求日誌中間件
87
+ this.app.use((req, res, next) => {
88
+ const start = Date.now();
89
+ res.on('finish', () => {
90
+ const duration = Date.now() - start;
91
+ logger.request(req.method, req.url, res.statusCode, duration);
92
+ });
93
+ next();
94
+ });
95
+ }
96
+ /**
97
+ * 設置路由
98
+ */
99
+ setupRoutes() {
100
+ const __filename = fileURLToPath(import.meta.url);
101
+ const __dirname = path.dirname(__filename);
102
+ const staticPath = path.resolve(__dirname, '../static');
103
+ // 靜態檔案服務
104
+ this.app.use(express.static(staticPath));
105
+ // 主頁路由
106
+ this.app.get('/', (req, res) => {
107
+ res.sendFile('index.html', { root: staticPath });
108
+ });
109
+ // 健康檢查路由
110
+ this.app.get('/health', (req, res) => {
111
+ res.json({
112
+ status: 'healthy',
113
+ timestamp: new Date().toISOString(),
114
+ uptime: process.uptime(),
115
+ activeSessions: this.sessions.size
116
+ });
117
+ });
118
+ // 罐頭語 API - 讀取
119
+ this.app.get('/api/quick-replies', (req, res) => {
120
+ try {
121
+ const replies = this.loadQuickReplies();
122
+ res.json({ success: true, replies });
123
+ }
124
+ catch (error) {
125
+ logger.error('讀取罐頭語失敗:', error);
126
+ res.status(500).json({ success: false, error: '讀取失敗' });
127
+ }
128
+ });
129
+ // 罐頭語 API - 儲存
130
+ this.app.post('/api/quick-replies', (req, res) => {
131
+ try {
132
+ const { replies } = req.body;
133
+ if (!Array.isArray(replies)) {
134
+ res.status(400).json({ success: false, error: '無效的資料格式' });
135
+ return;
136
+ }
137
+ this.saveQuickReplies(replies);
138
+ res.json({ success: true });
139
+ }
140
+ catch (error) {
141
+ logger.error('儲存罐頭語失敗:', error);
142
+ res.status(500).json({ success: false, error: '儲存失敗' });
143
+ }
144
+ });
145
+ // 錯誤處理中間件
146
+ this.app.use((error, req, res, next) => {
147
+ logger.error('Express 錯誤:', error);
148
+ res.status(500).json({
149
+ error: 'Internal Server Error',
150
+ message: error.message
151
+ });
152
+ });
153
+ }
154
+ /**
155
+ * 設置 Socket.IO 事件處理
156
+ */
157
+ setupSocketHandlers() {
158
+ this.io.on('connection', (socket) => {
159
+ logger.socket('connect', socket.id);
160
+ // 處理會話請求
161
+ socket.on('request_session', () => {
162
+ const activeSessions = Array.from(this.sessions.entries());
163
+ let latestSession = null;
164
+ for (const [sessionId, session] of activeSessions) {
165
+ if (session.status === 'pending' || session.status === 'active') {
166
+ if (!latestSession || session.startTime > latestSession[1].startTime) {
167
+ latestSession = [sessionId, session];
168
+ }
169
+ }
170
+ }
171
+ if (latestSession) {
172
+ const [sessionId, session] = latestSession;
173
+ session.status = 'active';
174
+ socket.emit('session_assigned', {
175
+ session_id: sessionId,
176
+ work_summary: session.workSummary,
177
+ timeout: session.timeout
178
+ });
179
+ }
180
+ else {
181
+ socket.emit('no_active_session', {
182
+ message: '當前無活躍的反饋會話'
183
+ });
184
+ }
185
+ });
186
+ // 獲取工作彙報
187
+ socket.on('get_work_summary', (data) => {
188
+ const session = this.sessions.get(data.feedback_session_id);
189
+ if (session) {
190
+ socket.emit('work_summary_data', {
191
+ work_summary: session.workSummary
192
+ });
193
+ }
194
+ else {
195
+ socket.emit('feedback_error', {
196
+ error: '會話不存在或已過期'
197
+ });
198
+ }
199
+ });
200
+ // 提交反饋
201
+ socket.on('submit_feedback', async (data) => {
202
+ await this.handleFeedbackSubmission(socket, data);
203
+ });
204
+ // 斷開連接
205
+ socket.on('disconnect', (reason) => {
206
+ logger.socket('disconnect', socket.id, { reason });
207
+ });
208
+ });
209
+ }
210
+ /**
211
+ * 處理反饋提交
212
+ */
213
+ async handleFeedbackSubmission(socket, feedbackData) {
214
+ const session = this.sessions.get(feedbackData.sessionId);
215
+ if (!session) {
216
+ socket.emit('feedback_error', {
217
+ error: '會話不存在或已過期'
218
+ });
219
+ return;
220
+ }
221
+ try {
222
+ if (!feedbackData.text && (!feedbackData.images || feedbackData.images.length === 0)) {
223
+ socket.emit('feedback_error', {
224
+ error: '請提供文字反饋或上傳圖片'
225
+ });
226
+ return;
227
+ }
228
+ // 儲存反饋
229
+ session.feedback = feedbackData;
230
+ session.status = 'completed';
231
+ // 通知提交成功
232
+ socket.emit('feedback_submitted', {
233
+ success: true,
234
+ message: '反饋提交成功'
235
+ });
236
+ // 解析反饋 Promise
237
+ if (session.resolve) {
238
+ session.resolve(feedbackData);
239
+ }
240
+ // 清理會話
241
+ this.sessions.delete(feedbackData.sessionId);
242
+ }
243
+ catch (error) {
244
+ logger.error('處理反饋提交時出錯:', error);
245
+ socket.emit('feedback_error', {
246
+ error: '伺服器處理錯誤,請稍後重試'
247
+ });
248
+ }
249
+ }
250
+ /**
251
+ * 收集用戶反饋
252
+ */
253
+ async collectFeedback(workSummary, timeoutSeconds) {
254
+ const sessionId = this.generateSessionId();
255
+ logger.info(`創建反饋會話: ${sessionId}, 超時: ${timeoutSeconds}秒`);
256
+ return new Promise((resolve, reject) => {
257
+ const session = {
258
+ id: sessionId,
259
+ workSummary,
260
+ startTime: Date.now(),
261
+ timeout: timeoutSeconds * 1000,
262
+ status: 'pending',
263
+ resolve,
264
+ reject
265
+ };
266
+ this.sessions.set(sessionId, session);
267
+ // 設置超時
268
+ const timeoutId = setTimeout(() => {
269
+ const s = this.sessions.get(sessionId);
270
+ if (s && s.status === 'pending') {
271
+ s.status = 'timeout';
272
+ this.sessions.delete(sessionId);
273
+ reject(new MCPError('反饋收集超時', 'FEEDBACK_TIMEOUT'));
274
+ }
275
+ }, timeoutSeconds * 1000);
276
+ // 打開瀏覽器
277
+ this.openFeedbackPage(sessionId).catch(error => {
278
+ clearTimeout(timeoutId);
279
+ this.sessions.delete(sessionId);
280
+ reject(error);
281
+ });
282
+ });
283
+ }
284
+ /**
285
+ * 生成反饋頁面 URL
286
+ */
287
+ generateFeedbackUrl(sessionId) {
288
+ const host = this.config.serverHost || 'localhost';
289
+ if (this.config.useFixedUrl) {
290
+ return `http://${host}:${this.port}`;
291
+ }
292
+ return `http://${host}:${this.port}/?session=${sessionId}`;
293
+ }
294
+ /**
295
+ * 打開反饋頁面
296
+ */
297
+ async openFeedbackPage(sessionId) {
298
+ const url = this.generateFeedbackUrl(sessionId);
299
+ logger.info(`打開反饋頁面: ${url}`);
300
+ try {
301
+ const open = await import('open');
302
+ await open.default(url);
303
+ logger.info('瀏覽器已打開反饋頁面');
304
+ }
305
+ catch (error) {
306
+ logger.warn('無法自動打開瀏覽器:', error);
307
+ logger.info(`請手動打開瀏覽器訪問: ${url}`);
308
+ }
309
+ }
310
+ /**
311
+ * 獲取罐頭語儲存路徑
312
+ */
313
+ getQuickRepliesPath() {
314
+ const __filename = fileURLToPath(import.meta.url);
315
+ const __dirname = path.dirname(__filename);
316
+ return path.resolve(__dirname, '../../quick-replies.json');
317
+ }
318
+ /**
319
+ * 讀取罐頭語
320
+ */
321
+ loadQuickReplies() {
322
+ const filePath = this.getQuickRepliesPath();
323
+ if (fs.existsSync(filePath)) {
324
+ const data = fs.readFileSync(filePath, 'utf-8');
325
+ return JSON.parse(data);
326
+ }
327
+ // 預設罐頭語
328
+ return [
329
+ { text: '無', value: '無' },
330
+ { text: '收到', value: '收到' },
331
+ { text: '繼續', value: '繼續' }
332
+ ];
333
+ }
334
+ /**
335
+ * 儲存罐頭語
336
+ */
337
+ saveQuickReplies(replies) {
338
+ const filePath = this.getQuickRepliesPath();
339
+ fs.writeFileSync(filePath, JSON.stringify(replies, null, 2), 'utf-8');
340
+ }
341
+ /**
342
+ * 生成會話 ID
343
+ */
344
+ generateSessionId() {
345
+ return `feedback_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
346
+ }
347
+ /**
348
+ * 檢查端口是否可用
349
+ */
350
+ async isPortAvailable(port) {
351
+ return new Promise((resolve) => {
352
+ const server = createNetServer();
353
+ const timeout = setTimeout(() => {
354
+ server.close();
355
+ resolve(false);
356
+ }, 1000);
357
+ server.listen(port, () => {
358
+ clearTimeout(timeout);
359
+ server.close(() => resolve(true));
360
+ });
361
+ server.on('error', () => {
362
+ clearTimeout(timeout);
363
+ resolve(false);
364
+ });
365
+ });
366
+ }
367
+ /**
368
+ * 尋找可用端口
369
+ */
370
+ async findAvailablePort(preferredPort) {
371
+ // 先嘗試首選端口
372
+ if (await this.isPortAvailable(preferredPort)) {
373
+ return preferredPort;
374
+ }
375
+ logger.info(`端口 ${preferredPort} 已被佔用,尋找替代端口...`);
376
+ // 嘗試相鄰端口 (±1 到 ±10)
377
+ for (let offset = 1; offset <= 10; offset++) {
378
+ const ports = [preferredPort + offset, preferredPort - offset]
379
+ .filter(p => p > 1024 && p < 65535);
380
+ for (const port of ports) {
381
+ if (await this.isPortAvailable(port)) {
382
+ logger.info(`找到可用端口: ${port}`);
383
+ return port;
384
+ }
385
+ }
386
+ }
387
+ // 最後嘗試隨機端口
388
+ for (let i = 0; i < 10; i++) {
389
+ const randomPort = Math.floor(Math.random() * (65535 - 3000) + 3000);
390
+ if (await this.isPortAvailable(randomPort)) {
391
+ logger.info(`找到隨機可用端口: ${randomPort}`);
392
+ return randomPort;
393
+ }
394
+ }
395
+ throw new MCPError('無法找到可用端口', 'NO_AVAILABLE_PORT');
396
+ }
397
+ /**
398
+ * 啟動 Web 服務器
399
+ */
400
+ async start() {
401
+ if (this.isServerRunning) {
402
+ logger.warn('Web 服務器已在運行中');
403
+ return;
404
+ }
405
+ try {
406
+ // 動態尋找可用端口
407
+ this.port = await this.findAvailablePort(this.config.webPort);
408
+ await new Promise((resolve, reject) => {
409
+ const timeout = setTimeout(() => {
410
+ reject(new Error('Server start timeout'));
411
+ }, 10000);
412
+ this.server.listen(this.port, () => {
413
+ clearTimeout(timeout);
414
+ resolve();
415
+ });
416
+ this.server.on('error', (error) => {
417
+ clearTimeout(timeout);
418
+ reject(error);
419
+ });
420
+ });
421
+ this.isServerRunning = true;
422
+ logger.info(`Web 服務器啟動成功: http://localhost:${this.port}`);
423
+ }
424
+ catch (error) {
425
+ logger.error('Web 服務器啟動失敗:', error);
426
+ throw new MCPError('Failed to start web server', 'WEB_SERVER_START_ERROR', error);
427
+ }
428
+ }
429
+ /**
430
+ * 停止 Web 服務器
431
+ */
432
+ async stop() {
433
+ if (!this.isServerRunning) {
434
+ return;
435
+ }
436
+ logger.info('正在停止 Web 服務器...');
437
+ try {
438
+ // 清理所有會話
439
+ for (const [sessionId, session] of this.sessions) {
440
+ if (session.reject) {
441
+ session.reject(new MCPError('伺服器關閉', 'SERVER_SHUTDOWN'));
442
+ }
443
+ }
444
+ this.sessions.clear();
445
+ // 關閉 Socket.IO
446
+ this.io.close();
447
+ // 關閉 HTTP 服務器
448
+ await new Promise((resolve, reject) => {
449
+ this.server.close((error) => {
450
+ if (error)
451
+ reject(error);
452
+ else
453
+ resolve();
454
+ });
455
+ });
456
+ this.isServerRunning = false;
457
+ logger.info('Web 服務器已停止');
458
+ }
459
+ catch (error) {
460
+ logger.error('停止 Web 服務器時出錯:', error);
461
+ throw error;
462
+ }
463
+ }
464
+ /**
465
+ * 檢查服務器是否運行
466
+ */
467
+ isRunning() {
468
+ return this.isServerRunning;
469
+ }
470
+ /**
471
+ * 獲取服務器端口
472
+ */
473
+ getPort() {
474
+ return this.port;
475
+ }
476
+ }
477
+ //# sourceMappingURL=web-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-server.js","sourceRoot":"","sources":["../../src/server/web-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ declare function init(): void;
2
+ declare function initSocket(): void;
3
+ declare function displayWorkSummary(content: any): void;
4
+ declare function initDropZone(): void;
5
+ declare function handleFiles(files: any): void;
6
+ declare function renderImagePreviews(): void;
7
+ declare function removeImage(index: any): void;
8
+ declare function handleDragStart(e: any): void;
9
+ declare function handleDragEnd(e: any): void;
10
+ declare function handleDragOver(e: any): void;
11
+ declare function handleDrop(e: any): void;
12
+ declare function initQuickReplies(): void;
13
+ declare function initAddReplyButton(): void;
14
+ declare function editQuickReply(btn: any): void;
15
+ declare function addNewQuickReply(): void;
16
+ declare function saveQuickRepliesToStorage(): Promise<void>;
17
+ declare function ensureAddButtonVisible(): void;
18
+ declare function loadQuickRepliesFromStorage(): Promise<void>;
19
+ declare function createQuickReplyButton(text: any, value: any): HTMLButtonElement;
20
+ declare function initSubmitButton(): void;
21
+ declare function submitQuickReply(text: any): void;
22
+ declare function submitFeedback(): void;
23
+ declare function resetForm(): void;
24
+ declare function initModal(): void;
25
+ declare function openModal(imageSrc: any): void;
26
+ declare function closeModal(): void;
27
+ declare function showToast(message: any, type?: string): void;
28
+ declare namespace state {
29
+ let sessionId: null;
30
+ let images: never[];
31
+ let socket: null;
32
+ let connected: boolean;
33
+ }
34
+ declare namespace elements {
35
+ let workSummary: HTMLElement | null;
36
+ let feedbackText: HTMLElement | null;
37
+ let dropZone: HTMLElement | null;
38
+ let fileInput: HTMLElement | null;
39
+ let imagePreview: HTMLElement | null;
40
+ let quickReplies: HTMLElement | null;
41
+ let submitBtn: HTMLElement | null;
42
+ let addReplyBtn: HTMLElement | null;
43
+ let modal: HTMLElement | null;
44
+ let modalImage: HTMLElement | null;
45
+ let modalClose: HTMLElement | null;
46
+ let toast: HTMLElement | null;
47
+ }
48
+ declare let draggedIndex: null;
49
+ declare let draggedItem: null;
50
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/static/app.js"],"names":[],"mappings":"AA6BA,8BAWC;AAGD,oCA4CC;AAGD,wDAsBC;AAGD,sCAyBC;AAGD,+CAoBC;AAGD,6CA+BC;AAGD,+CAGC;AAMD,+CAKC;AAED,6CAIC;AAED,8CAEC;AAED,0CAyBC;AAGD,0CAeC;AAGD,4CAIC;AAGD,gDAuCC;AAGD,0CA2DC;AAGD,4DAmBC;AAGD,gDAIC;AAGD,8DAiBC;AAGD,kFA4CC;AAGD,0CAEC;AAGD,mDAcC;AAGD,wCAgCC;AAGD,mCAMC;AAGD,mCAaC;AAGD,gDAGC;AAGD,oCAGC;AAGD,8DAOC;;;;;;;;;;;;;;;;;;;;;AAtXD,+BAAwB;AACxB,8BAAuB"}