@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.
- package/README.md +227 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +128 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +21 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +108 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/server/mcp-server.d.ts +46 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +216 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/web-server.d.ts +90 -0
- package/dist/server/web-server.d.ts.map +1 -0
- package/dist/server/web-server.js +477 -0
- package/dist/server/web-server.js.map +1 -0
- package/dist/static/app.d.ts +50 -0
- package/dist/static/app.d.ts.map +1 -0
- package/dist/static/app.js +584 -0
- package/dist/static/app.js.map +1 -0
- package/dist/static/index.html +75 -0
- package/dist/static/styles.css +421 -0
- package/dist/types/index.d.ts +105 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +77 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +189 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +79 -0
|
@@ -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"}
|