@hirohsu/user-web-feedback 2.8.2 → 2.8.9
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 +953 -953
- package/dist/cli.cjs +35128 -22228
- package/dist/index.cjs +39895 -26993
- package/dist/static/app.js +385 -385
- package/dist/static/components/navbar.css +406 -406
- package/dist/static/components/navbar.html +49 -49
- package/dist/static/components/navbar.js +211 -211
- package/dist/static/dashboard.css +495 -495
- package/dist/static/dashboard.html +95 -95
- package/dist/static/dashboard.js +540 -540
- package/dist/static/favicon.svg +27 -27
- package/dist/static/index.html +541 -541
- package/dist/static/logs.html +376 -376
- package/dist/static/logs.js +442 -442
- package/dist/static/mcp-settings.html +797 -797
- package/dist/static/mcp-settings.js +884 -884
- package/dist/static/modules/app-core.js +124 -124
- package/dist/static/modules/conversation-panel.js +247 -247
- package/dist/static/modules/feedback-handler.js +1420 -1420
- package/dist/static/modules/image-handler.js +155 -155
- package/dist/static/modules/log-viewer.js +296 -296
- package/dist/static/modules/mcp-manager.js +474 -474
- package/dist/static/modules/prompt-manager.js +364 -364
- package/dist/static/modules/settings-manager.js +299 -299
- package/dist/static/modules/socket-manager.js +170 -170
- package/dist/static/modules/state-manager.js +352 -352
- package/dist/static/modules/timer-controller.js +243 -243
- package/dist/static/modules/ui-helpers.js +246 -246
- package/dist/static/settings.html +426 -417
- package/dist/static/settings.js +767 -705
- package/dist/static/style.css +2156 -2156
- package/dist/static/terminals.html +357 -357
- package/dist/static/terminals.js +321 -321
- package/package.json +95 -93
|
@@ -1,170 +1,170 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* socket-manager.js
|
|
3
|
-
* Socket.IO 連線和事件管理模組
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
setSocket,
|
|
8
|
-
setSessionId,
|
|
9
|
-
setWorkSummary,
|
|
10
|
-
setCurrentProjectName,
|
|
11
|
-
setCurrentProjectPath,
|
|
12
|
-
getSocket,
|
|
13
|
-
getSessionId,
|
|
14
|
-
} from "./state-manager.js";
|
|
15
|
-
|
|
16
|
-
import {
|
|
17
|
-
showToast,
|
|
18
|
-
displayProjectInfo,
|
|
19
|
-
displayAIMessage,
|
|
20
|
-
} from "./ui-helpers.js";
|
|
21
|
-
|
|
22
|
-
import { startCloseCountdown } from "./timer-controller.js";
|
|
23
|
-
|
|
24
|
-
// 動態導入以避免循環依賴
|
|
25
|
-
async function loadClearSubmissionInputs() {
|
|
26
|
-
const module = await import("./feedback-handler.js");
|
|
27
|
-
return module.clearSubmissionInputs;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 初始化 Socket.IO 連線
|
|
32
|
-
*/
|
|
33
|
-
export function initSocketIO() {
|
|
34
|
-
const socket = io();
|
|
35
|
-
setSocket(socket);
|
|
36
|
-
|
|
37
|
-
socket.on("connect", () => {
|
|
38
|
-
console.log("已連線到伺服器");
|
|
39
|
-
updateConnectionStatus(true);
|
|
40
|
-
// 請求會話
|
|
41
|
-
socket.emit("request_session");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
socket.on("disconnect", () => {
|
|
45
|
-
console.log("與伺服器斷線");
|
|
46
|
-
updateConnectionStatus(false);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
socket.on("session_assigned", (data) => {
|
|
50
|
-
console.log("收到會話分配:", data);
|
|
51
|
-
// 注意:伺服器使用蛇形命名 (session_id, work_summary 等)
|
|
52
|
-
setSessionId(data.session_id);
|
|
53
|
-
setWorkSummary(data.work_summary);
|
|
54
|
-
setCurrentProjectName(data.project_name || null);
|
|
55
|
-
setCurrentProjectPath(data.project_path || null);
|
|
56
|
-
|
|
57
|
-
displayProjectInfo(data.project_name, data.project_path);
|
|
58
|
-
displayAIMessage(data.work_summary);
|
|
59
|
-
|
|
60
|
-
// 通知伺服器 session 已就緒
|
|
61
|
-
socket.emit("session_ready", {
|
|
62
|
-
sessionId: data.session_id,
|
|
63
|
-
workSummary: data.work_summary,
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
socket.on("feedback_submitted", async (data) => {
|
|
68
|
-
console.log("反饋已提交:", data);
|
|
69
|
-
|
|
70
|
-
if (data.success) {
|
|
71
|
-
showToast("success", "提交成功", "您的回應已送出,頁面將在 3 秒後關閉");
|
|
72
|
-
const clearFn = await loadClearSubmissionInputs();
|
|
73
|
-
if (clearFn) clearFn();
|
|
74
|
-
|
|
75
|
-
// 啟動 3 秒關閉倒數
|
|
76
|
-
startCloseCountdown();
|
|
77
|
-
} else {
|
|
78
|
-
showToast("error", "提交失敗", data.error || "請稍後再試");
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
socket.on("auto_reply", (data) => {
|
|
83
|
-
console.log("收到自動回覆觸發:", data);
|
|
84
|
-
if (data.autoSubmit) {
|
|
85
|
-
console.log("準備自動提交...");
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
socket.on("error", (error) => {
|
|
90
|
-
console.error("Socket 錯誤:", error);
|
|
91
|
-
showToast("error", "連線錯誤", error.message || "請檢查網路連線");
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
socket.on("close_session", () => {
|
|
95
|
-
console.log("收到關閉會話訊號");
|
|
96
|
-
window.close();
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
return socket;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* 更新連線狀態顯示
|
|
104
|
-
* @param {boolean} connected - 是否已連線
|
|
105
|
-
*/
|
|
106
|
-
export function updateConnectionStatus(connected) {
|
|
107
|
-
const containerEl = document.getElementById("connectionStatus");
|
|
108
|
-
if (!containerEl) return;
|
|
109
|
-
|
|
110
|
-
const dotEl = containerEl.querySelector(".status-dot");
|
|
111
|
-
const textEl = containerEl.querySelector(".status-text");
|
|
112
|
-
|
|
113
|
-
if (connected) {
|
|
114
|
-
containerEl.classList.remove("disconnected");
|
|
115
|
-
containerEl.classList.add("connected");
|
|
116
|
-
if (dotEl) dotEl.classList.add("online");
|
|
117
|
-
if (textEl) textEl.textContent = "已連線";
|
|
118
|
-
} else {
|
|
119
|
-
containerEl.classList.remove("connected");
|
|
120
|
-
containerEl.classList.add("disconnected");
|
|
121
|
-
if (dotEl) dotEl.classList.remove("online");
|
|
122
|
-
if (textEl) textEl.textContent = "已斷線";
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* 通知伺服器使用者活動
|
|
128
|
-
*/
|
|
129
|
-
export function emitUserActivity() {
|
|
130
|
-
const socket = getSocket();
|
|
131
|
-
const sessionId = getSessionId();
|
|
132
|
-
|
|
133
|
-
if (socket && sessionId) {
|
|
134
|
-
socket.emit("user_activity", {
|
|
135
|
-
sessionId: sessionId,
|
|
136
|
-
timestamp: Date.now(),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* 發送反饋到伺服器
|
|
143
|
-
* @param {Object} feedbackData - 反饋資料
|
|
144
|
-
*/
|
|
145
|
-
export function emitSubmitFeedback(feedbackData) {
|
|
146
|
-
const socket = getSocket();
|
|
147
|
-
if (socket) {
|
|
148
|
-
socket.emit("submit_feedback", feedbackData);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* 取消自動回覆
|
|
154
|
-
*/
|
|
155
|
-
export function emitCancelAutoReply() {
|
|
156
|
-
const socket = getSocket();
|
|
157
|
-
const sessionId = getSessionId();
|
|
158
|
-
|
|
159
|
-
if (socket && sessionId) {
|
|
160
|
-
socket.emit("cancel_auto_reply", { sessionId });
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export default {
|
|
165
|
-
initSocketIO,
|
|
166
|
-
updateConnectionStatus,
|
|
167
|
-
emitUserActivity,
|
|
168
|
-
emitSubmitFeedback,
|
|
169
|
-
emitCancelAutoReply,
|
|
170
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* socket-manager.js
|
|
3
|
+
* Socket.IO 連線和事件管理模組
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
setSocket,
|
|
8
|
+
setSessionId,
|
|
9
|
+
setWorkSummary,
|
|
10
|
+
setCurrentProjectName,
|
|
11
|
+
setCurrentProjectPath,
|
|
12
|
+
getSocket,
|
|
13
|
+
getSessionId,
|
|
14
|
+
} from "./state-manager.js";
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
showToast,
|
|
18
|
+
displayProjectInfo,
|
|
19
|
+
displayAIMessage,
|
|
20
|
+
} from "./ui-helpers.js";
|
|
21
|
+
|
|
22
|
+
import { startCloseCountdown } from "./timer-controller.js";
|
|
23
|
+
|
|
24
|
+
// 動態導入以避免循環依賴
|
|
25
|
+
async function loadClearSubmissionInputs() {
|
|
26
|
+
const module = await import("./feedback-handler.js");
|
|
27
|
+
return module.clearSubmissionInputs;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 初始化 Socket.IO 連線
|
|
32
|
+
*/
|
|
33
|
+
export function initSocketIO() {
|
|
34
|
+
const socket = io();
|
|
35
|
+
setSocket(socket);
|
|
36
|
+
|
|
37
|
+
socket.on("connect", () => {
|
|
38
|
+
console.log("已連線到伺服器");
|
|
39
|
+
updateConnectionStatus(true);
|
|
40
|
+
// 請求會話
|
|
41
|
+
socket.emit("request_session");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
socket.on("disconnect", () => {
|
|
45
|
+
console.log("與伺服器斷線");
|
|
46
|
+
updateConnectionStatus(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
socket.on("session_assigned", (data) => {
|
|
50
|
+
console.log("收到會話分配:", data);
|
|
51
|
+
// 注意:伺服器使用蛇形命名 (session_id, work_summary 等)
|
|
52
|
+
setSessionId(data.session_id);
|
|
53
|
+
setWorkSummary(data.work_summary);
|
|
54
|
+
setCurrentProjectName(data.project_name || null);
|
|
55
|
+
setCurrentProjectPath(data.project_path || null);
|
|
56
|
+
|
|
57
|
+
displayProjectInfo(data.project_name, data.project_path);
|
|
58
|
+
displayAIMessage(data.work_summary);
|
|
59
|
+
|
|
60
|
+
// 通知伺服器 session 已就緒
|
|
61
|
+
socket.emit("session_ready", {
|
|
62
|
+
sessionId: data.session_id,
|
|
63
|
+
workSummary: data.work_summary,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
socket.on("feedback_submitted", async (data) => {
|
|
68
|
+
console.log("反饋已提交:", data);
|
|
69
|
+
|
|
70
|
+
if (data.success) {
|
|
71
|
+
showToast("success", "提交成功", "您的回應已送出,頁面將在 3 秒後關閉");
|
|
72
|
+
const clearFn = await loadClearSubmissionInputs();
|
|
73
|
+
if (clearFn) clearFn();
|
|
74
|
+
|
|
75
|
+
// 啟動 3 秒關閉倒數
|
|
76
|
+
startCloseCountdown();
|
|
77
|
+
} else {
|
|
78
|
+
showToast("error", "提交失敗", data.error || "請稍後再試");
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
socket.on("auto_reply", (data) => {
|
|
83
|
+
console.log("收到自動回覆觸發:", data);
|
|
84
|
+
if (data.autoSubmit) {
|
|
85
|
+
console.log("準備自動提交...");
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
socket.on("error", (error) => {
|
|
90
|
+
console.error("Socket 錯誤:", error);
|
|
91
|
+
showToast("error", "連線錯誤", error.message || "請檢查網路連線");
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
socket.on("close_session", () => {
|
|
95
|
+
console.log("收到關閉會話訊號");
|
|
96
|
+
window.close();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return socket;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 更新連線狀態顯示
|
|
104
|
+
* @param {boolean} connected - 是否已連線
|
|
105
|
+
*/
|
|
106
|
+
export function updateConnectionStatus(connected) {
|
|
107
|
+
const containerEl = document.getElementById("connectionStatus");
|
|
108
|
+
if (!containerEl) return;
|
|
109
|
+
|
|
110
|
+
const dotEl = containerEl.querySelector(".status-dot");
|
|
111
|
+
const textEl = containerEl.querySelector(".status-text");
|
|
112
|
+
|
|
113
|
+
if (connected) {
|
|
114
|
+
containerEl.classList.remove("disconnected");
|
|
115
|
+
containerEl.classList.add("connected");
|
|
116
|
+
if (dotEl) dotEl.classList.add("online");
|
|
117
|
+
if (textEl) textEl.textContent = "已連線";
|
|
118
|
+
} else {
|
|
119
|
+
containerEl.classList.remove("connected");
|
|
120
|
+
containerEl.classList.add("disconnected");
|
|
121
|
+
if (dotEl) dotEl.classList.remove("online");
|
|
122
|
+
if (textEl) textEl.textContent = "已斷線";
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 通知伺服器使用者活動
|
|
128
|
+
*/
|
|
129
|
+
export function emitUserActivity() {
|
|
130
|
+
const socket = getSocket();
|
|
131
|
+
const sessionId = getSessionId();
|
|
132
|
+
|
|
133
|
+
if (socket && sessionId) {
|
|
134
|
+
socket.emit("user_activity", {
|
|
135
|
+
sessionId: sessionId,
|
|
136
|
+
timestamp: Date.now(),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* 發送反饋到伺服器
|
|
143
|
+
* @param {Object} feedbackData - 反饋資料
|
|
144
|
+
*/
|
|
145
|
+
export function emitSubmitFeedback(feedbackData) {
|
|
146
|
+
const socket = getSocket();
|
|
147
|
+
if (socket) {
|
|
148
|
+
socket.emit("submit_feedback", feedbackData);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 取消自動回覆
|
|
154
|
+
*/
|
|
155
|
+
export function emitCancelAutoReply() {
|
|
156
|
+
const socket = getSocket();
|
|
157
|
+
const sessionId = getSessionId();
|
|
158
|
+
|
|
159
|
+
if (socket && sessionId) {
|
|
160
|
+
socket.emit("cancel_auto_reply", { sessionId });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export default {
|
|
165
|
+
initSocketIO,
|
|
166
|
+
updateConnectionStatus,
|
|
167
|
+
emitUserActivity,
|
|
168
|
+
emitSubmitFeedback,
|
|
169
|
+
emitCancelAutoReply,
|
|
170
|
+
};
|