@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,216 @@
1
+ /**
2
+ * MCP Feedback Collector - MCP 服務器實現
3
+ */
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { z } from 'zod';
7
+ import { MCPError } from '../types/index.js';
8
+ import { logger } from '../utils/logger.js';
9
+ import { WebServer } from './web-server.js';
10
+ /**
11
+ * MCP 服務器類
12
+ */
13
+ export class MCPServer {
14
+ mcpServer;
15
+ webServer;
16
+ config;
17
+ isRunning = false;
18
+ constructor(config) {
19
+ this.config = config;
20
+ // 創建 MCP 服務器實例
21
+ this.mcpServer = new McpServer({
22
+ name: 'user-feedback',
23
+ version: '3.0.0'
24
+ }, {
25
+ capabilities: {
26
+ tools: {},
27
+ logging: {}
28
+ }
29
+ });
30
+ // 創建 Web 服務器實例
31
+ this.webServer = new WebServer(config);
32
+ // 註冊 MCP 工具函數
33
+ this.registerTools();
34
+ }
35
+ /**
36
+ * 註冊 MCP 工具函數
37
+ */
38
+ registerTools() {
39
+ // 使用類型斷言避免深層類型推斷問題
40
+ this.mcpServer.registerTool('collect_feedback', {
41
+ description: 'Collect feedback from users about AI work summary. This tool opens a web interface for users to provide feedback on the AI\'s work.',
42
+ inputSchema: {
43
+ work_summary: z.string().describe('AI 工作彙報內容,描述 AI 完成的工作和結果')
44
+ }
45
+ }, async (args) => {
46
+ const params = {
47
+ work_summary: args.work_summary
48
+ };
49
+ logger.mcp('collect_feedback', params);
50
+ try {
51
+ const result = await this.collectFeedback(params);
52
+ logger.mcp('collect_feedback', params, result);
53
+ return result;
54
+ }
55
+ catch (error) {
56
+ logger.error('collect_feedback 工具調用失敗:', error);
57
+ if (error instanceof MCPError) {
58
+ throw error;
59
+ }
60
+ throw new MCPError('Failed to collect feedback', 'COLLECT_FEEDBACK_ERROR', error);
61
+ }
62
+ });
63
+ logger.info('MCP 工具函數註冊完成');
64
+ }
65
+ /**
66
+ * 實現 collect_feedback 功能
67
+ */
68
+ async collectFeedback(params) {
69
+ const { work_summary } = params;
70
+ const timeout_seconds = this.config.dialogTimeout;
71
+ logger.info(`開始收集反饋,工作彙報長度: ${work_summary.length} 字符,超時: ${timeout_seconds} 秒`);
72
+ try {
73
+ // 啟動 Web 服務器(如果未運行)
74
+ if (!this.webServer.isRunning()) {
75
+ await this.webServer.start();
76
+ }
77
+ // 收集用戶反饋
78
+ const feedback = await this.webServer.collectFeedback(work_summary, timeout_seconds);
79
+ logger.info('反饋收集完成');
80
+ // 格式化反饋數據為 MCP 內容
81
+ const content = this.formatFeedbackForMCP(feedback);
82
+ return {
83
+ content,
84
+ isError: false
85
+ };
86
+ }
87
+ catch (error) {
88
+ logger.error('反饋收集失敗:', error);
89
+ const errorMessage = error instanceof MCPError ? error.message : 'Failed to collect user feedback';
90
+ return {
91
+ content: [{
92
+ type: 'text',
93
+ text: `錯誤: ${errorMessage}`
94
+ }],
95
+ isError: true
96
+ };
97
+ }
98
+ }
99
+ /**
100
+ * 將反饋數據格式化為 MCP 內容
101
+ */
102
+ formatFeedbackForMCP(feedback) {
103
+ const content = [];
104
+ // 添加文字反饋
105
+ if (feedback.text) {
106
+ content.push({
107
+ type: 'text',
108
+ text: `文字反饋: ${feedback.text}`
109
+ });
110
+ }
111
+ // 添加圖片
112
+ if (feedback.images && feedback.images.length > 0) {
113
+ content.push({
114
+ type: 'text',
115
+ text: `圖片數量: ${feedback.images.length}`
116
+ });
117
+ feedback.images.forEach((img, imgIndex) => {
118
+ content.push({
119
+ type: 'text',
120
+ text: `圖片 ${imgIndex + 1}: ${img.name} (${img.type}, ${(img.size / 1024).toFixed(1)}KB)`
121
+ });
122
+ if (img.data) {
123
+ const base64Data = img.data.replace(/^data:image\/[^;]+;base64,/, '');
124
+ content.push({
125
+ type: 'image',
126
+ data: base64Data,
127
+ mimeType: img.type
128
+ });
129
+ }
130
+ });
131
+ }
132
+ // 添加時間戳
133
+ content.push({
134
+ type: 'text',
135
+ text: `提交時間: ${new Date(feedback.timestamp).toLocaleString()}`
136
+ });
137
+ return content.length > 0 ? content : [{ type: 'text', text: '未收到用戶反饋' }];
138
+ }
139
+ /**
140
+ * 啟動 MCP 服務器
141
+ */
142
+ async start() {
143
+ if (this.isRunning) {
144
+ logger.warn('MCP 服務器已在運行中');
145
+ return;
146
+ }
147
+ try {
148
+ logger.info('正在啟動 MCP 服務器...');
149
+ // 連接 MCP 傳輸
150
+ const transport = new StdioServerTransport();
151
+ transport.onerror = (error) => {
152
+ logger.error('MCP 傳輸錯誤:', error);
153
+ };
154
+ transport.onclose = () => {
155
+ logger.info('MCP 傳輸連接已關閉');
156
+ this.isRunning = false;
157
+ };
158
+ await this.mcpServer.connect(transport);
159
+ // Web 服務器將在 collect_feedback 被調用時才啟動
160
+ // 這樣可以避免端口衝突
161
+ this.isRunning = true;
162
+ logger.info('MCP 服務器啟動成功');
163
+ }
164
+ catch (error) {
165
+ logger.error('MCP 服務器啟動失敗:', error);
166
+ throw new MCPError('Failed to start MCP server', 'SERVER_START_ERROR', error);
167
+ }
168
+ }
169
+ /**
170
+ * 僅啟動 Web 模式
171
+ */
172
+ async startWebOnly() {
173
+ try {
174
+ logger.info('正在啟動 Web 模式...');
175
+ await this.webServer.start();
176
+ this.isRunning = true;
177
+ logger.info('Web 服務器啟動成功');
178
+ process.stdin.resume();
179
+ }
180
+ catch (error) {
181
+ logger.error('Web 服務器啟動失敗:', error);
182
+ throw new MCPError('Failed to start web server', 'WEB_SERVER_START_ERROR', error);
183
+ }
184
+ }
185
+ /**
186
+ * 停止服務器
187
+ */
188
+ async stop() {
189
+ if (!this.isRunning) {
190
+ return;
191
+ }
192
+ try {
193
+ logger.info('正在停止服務器...');
194
+ await this.webServer.stop();
195
+ if (this.mcpServer) {
196
+ await this.mcpServer.close();
197
+ }
198
+ this.isRunning = false;
199
+ logger.info('服務器已停止');
200
+ }
201
+ catch (error) {
202
+ logger.error('停止服務器時出錯:', error);
203
+ throw new MCPError('Failed to stop server', 'SERVER_STOP_ERROR', error);
204
+ }
205
+ }
206
+ /**
207
+ * 獲取服務器狀態
208
+ */
209
+ getStatus() {
210
+ return {
211
+ running: this.isRunning,
212
+ webPort: this.webServer.isRunning() ? this.webServer.getPort() : undefined
213
+ };
214
+ }
215
+ }
216
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * MCP Feedback Collector - Web 服務器實現
3
+ */
4
+ import { Config, FeedbackData } from '../types/index.js';
5
+ /**
6
+ * Web 服務器類
7
+ */
8
+ export declare class WebServer {
9
+ private app;
10
+ private server;
11
+ private io;
12
+ private config;
13
+ private port;
14
+ private isServerRunning;
15
+ private sessions;
16
+ constructor(config: Config);
17
+ /**
18
+ * 設置優雅退出處理
19
+ */
20
+ private setupGracefulShutdown;
21
+ /**
22
+ * 設置中間件
23
+ */
24
+ private setupMiddleware;
25
+ /**
26
+ * 設置路由
27
+ */
28
+ private setupRoutes;
29
+ /**
30
+ * 設置 Socket.IO 事件處理
31
+ */
32
+ private setupSocketHandlers;
33
+ /**
34
+ * 處理反饋提交
35
+ */
36
+ private handleFeedbackSubmission;
37
+ /**
38
+ * 收集用戶反饋
39
+ */
40
+ collectFeedback(workSummary: string, timeoutSeconds: number): Promise<FeedbackData>;
41
+ /**
42
+ * 生成反饋頁面 URL
43
+ */
44
+ private generateFeedbackUrl;
45
+ /**
46
+ * 打開反饋頁面
47
+ */
48
+ private openFeedbackPage;
49
+ /**
50
+ * 獲取罐頭語儲存路徑
51
+ */
52
+ private getQuickRepliesPath;
53
+ /**
54
+ * 讀取罐頭語
55
+ */
56
+ private loadQuickReplies;
57
+ /**
58
+ * 儲存罐頭語
59
+ */
60
+ private saveQuickReplies;
61
+ /**
62
+ * 生成會話 ID
63
+ */
64
+ private generateSessionId;
65
+ /**
66
+ * 檢查端口是否可用
67
+ */
68
+ private isPortAvailable;
69
+ /**
70
+ * 尋找可用端口
71
+ */
72
+ private findAvailablePort;
73
+ /**
74
+ * 啟動 Web 服務器
75
+ */
76
+ start(): Promise<void>;
77
+ /**
78
+ * 停止 Web 服務器
79
+ */
80
+ stop(): Promise<void>;
81
+ /**
82
+ * 檢查服務器是否運行
83
+ */
84
+ isRunning(): boolean;
85
+ /**
86
+ * 獲取服務器端口
87
+ */
88
+ getPort(): number;
89
+ }
90
+ //# sourceMappingURL=web-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../../src/server/web-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAG5E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAmC;gBAEvC,MAAM,EAAE,MAAM;IAuB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;IACH,OAAO,CAAC,WAAW;IA4DnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0D3B;;OAEG;YACW,wBAAwB;IA4CtC;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqCzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,gBAAgB;IAc9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;YACW,eAAe;IAqB7B;;OAEG;YACW,iBAAiB;IAiC/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB"}