@hirohsu/user-web-feedback 2.8.12 → 2.8.13

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.
Files changed (34) hide show
  1. package/README.md +953 -953
  2. package/dist/cli.cjs +33267 -46031
  3. package/dist/index.cjs +35731 -48497
  4. package/dist/static/app.js +385 -385
  5. package/dist/static/components/navbar.css +406 -406
  6. package/dist/static/components/navbar.html +49 -49
  7. package/dist/static/components/navbar.js +211 -211
  8. package/dist/static/dashboard.css +495 -495
  9. package/dist/static/dashboard.html +95 -95
  10. package/dist/static/dashboard.js +540 -540
  11. package/dist/static/favicon.svg +27 -27
  12. package/dist/static/index.html +541 -541
  13. package/dist/static/logs.html +376 -376
  14. package/dist/static/logs.js +442 -442
  15. package/dist/static/mcp-settings.html +797 -797
  16. package/dist/static/mcp-settings.js +884 -884
  17. package/dist/static/modules/app-core.js +124 -124
  18. package/dist/static/modules/conversation-panel.js +247 -247
  19. package/dist/static/modules/feedback-handler.js +1420 -1420
  20. package/dist/static/modules/image-handler.js +155 -155
  21. package/dist/static/modules/log-viewer.js +296 -296
  22. package/dist/static/modules/mcp-manager.js +474 -474
  23. package/dist/static/modules/prompt-manager.js +364 -364
  24. package/dist/static/modules/settings-manager.js +299 -299
  25. package/dist/static/modules/socket-manager.js +170 -170
  26. package/dist/static/modules/state-manager.js +352 -352
  27. package/dist/static/modules/timer-controller.js +243 -243
  28. package/dist/static/modules/ui-helpers.js +246 -246
  29. package/dist/static/settings.html +426 -426
  30. package/dist/static/settings.js +767 -767
  31. package/dist/static/style.css +2156 -2156
  32. package/dist/static/terminals.html +357 -357
  33. package/dist/static/terminals.js +321 -321
  34. package/package.json +95 -95
@@ -1,352 +1,352 @@
1
- /**
2
- * state-manager.js
3
- * 全域狀態管理模組
4
- * 集中管理 app.js 中的所有全域狀態變數
5
- */
6
-
7
- const AppState = {
8
- // Socket.IO 連線
9
- socket: null,
10
- sessionId: null,
11
-
12
- // 專案資訊
13
- currentProjectName: null,
14
- currentProjectPath: null,
15
-
16
- // AI 相關
17
- workSummary: null,
18
- aiSettings: null,
19
- maxToolRounds: 5,
20
- debugMode: false,
21
-
22
- // 圖片
23
- currentImages: [],
24
-
25
- // 提示詞
26
- prompts: [],
27
- isEditingPrompt: false,
28
- editingPromptId: null,
29
-
30
- // 使用者偏好
31
- preferences: {},
32
-
33
- // 計時器狀態
34
- DIALOG_TIMEOUT_SECONDS: 60,
35
- AUTO_REPLY_TIMER_SECONDS: 300,
36
- autoReplyTimerRemaining: 0,
37
- autoReplyTimerPaused: false,
38
- autoReplyPausedByFocus: false,
39
- autoReplyData: null,
40
-
41
- // 計時器 ID
42
- dialogTimeoutInterval: null,
43
- closeCountdownInterval: null,
44
- autoReplyTimerInterval: null,
45
- autoReplyCountdownInterval: null,
46
- autoReplyWarningTimeout: null,
47
- autoReplyConfirmationTimeout: null,
48
-
49
- // Streaming
50
- streamingAbortController: null,
51
-
52
- // MCP Servers
53
- mcpServers: [],
54
- editingMcpServerId: null,
55
-
56
- // 日誌
57
- currentLogPage: 1,
58
- totalLogPages: 1,
59
- logSources: [],
60
- };
61
-
62
- // Getter 函數
63
- export function getSocket() {
64
- return AppState.socket;
65
- }
66
-
67
- export function getSessionId() {
68
- return AppState.sessionId;
69
- }
70
-
71
- export function getWorkSummary() {
72
- return AppState.workSummary;
73
- }
74
-
75
- export function getCurrentImages() {
76
- return AppState.currentImages;
77
- }
78
-
79
- export function getPrompts() {
80
- return AppState.prompts;
81
- }
82
-
83
- export function getAISettings() {
84
- return AppState.aiSettings;
85
- }
86
-
87
- export function getPreferences() {
88
- return AppState.preferences;
89
- }
90
-
91
- export function getMaxToolRounds() {
92
- return AppState.maxToolRounds;
93
- }
94
-
95
- export function getDebugMode() {
96
- return AppState.debugMode;
97
- }
98
-
99
- export function getDialogTimeoutSeconds() {
100
- return AppState.DIALOG_TIMEOUT_SECONDS;
101
- }
102
-
103
- export function getAutoReplyTimerSeconds() {
104
- return AppState.AUTO_REPLY_TIMER_SECONDS;
105
- }
106
-
107
- export function getCurrentProjectName() {
108
- return AppState.currentProjectName;
109
- }
110
-
111
- export function getCurrentProjectPath() {
112
- return AppState.currentProjectPath;
113
- }
114
-
115
- export function getStreamingAbortController() {
116
- return AppState.streamingAbortController;
117
- }
118
-
119
- export function getMcpServers() {
120
- return AppState.mcpServers;
121
- }
122
-
123
- export function getEditingMcpServerId() {
124
- return AppState.editingMcpServerId;
125
- }
126
-
127
- export function isEditingPrompt() {
128
- return AppState.isEditingPrompt;
129
- }
130
-
131
- export function getEditingPromptId() {
132
- return AppState.editingPromptId;
133
- }
134
-
135
- export function getAutoReplyTimerRemaining() {
136
- return AppState.autoReplyTimerRemaining;
137
- }
138
-
139
- export function isAutoReplyTimerPaused() {
140
- return AppState.autoReplyTimerPaused;
141
- }
142
-
143
- export function isAutoReplyPausedByFocus() {
144
- return AppState.autoReplyPausedByFocus;
145
- }
146
-
147
- export function getAutoReplyData() {
148
- return AppState.autoReplyData;
149
- }
150
-
151
- // Timer ID getters
152
- export function getDialogTimeoutInterval() {
153
- return AppState.dialogTimeoutInterval;
154
- }
155
-
156
- export function getCloseCountdownInterval() {
157
- return AppState.closeCountdownInterval;
158
- }
159
-
160
- export function getAutoReplyTimerInterval() {
161
- return AppState.autoReplyTimerInterval;
162
- }
163
-
164
- export function getAutoReplyCountdownInterval() {
165
- return AppState.autoReplyCountdownInterval;
166
- }
167
-
168
- export function getAutoReplyWarningTimeout() {
169
- return AppState.autoReplyWarningTimeout;
170
- }
171
-
172
- export function getAutoReplyConfirmationTimeout() {
173
- return AppState.autoReplyConfirmationTimeout;
174
- }
175
-
176
- // Log getters
177
- export function getCurrentLogPage() {
178
- return AppState.currentLogPage;
179
- }
180
-
181
- export function getTotalLogPages() {
182
- return AppState.totalLogPages;
183
- }
184
-
185
- export function getLogSources() {
186
- return AppState.logSources;
187
- }
188
-
189
- // Setter 函數
190
- export function setSocket(socket) {
191
- AppState.socket = socket;
192
- }
193
-
194
- export function setSessionId(id) {
195
- AppState.sessionId = id;
196
- }
197
-
198
- export function setWorkSummary(summary) {
199
- AppState.workSummary = summary;
200
- }
201
-
202
- export function setCurrentImages(images) {
203
- AppState.currentImages = images;
204
- }
205
-
206
- export function addImage(image) {
207
- AppState.currentImages.push(image);
208
- }
209
-
210
- export function removeImageAt(index) {
211
- AppState.currentImages.splice(index, 1);
212
- }
213
-
214
- export function clearImages() {
215
- AppState.currentImages = [];
216
- }
217
-
218
- export function setPrompts(prompts) {
219
- AppState.prompts = prompts;
220
- }
221
-
222
- export function setAISettings(settings) {
223
- AppState.aiSettings = settings;
224
- }
225
-
226
- export function setPreferences(prefs) {
227
- AppState.preferences = prefs;
228
- }
229
-
230
- export function setMaxToolRounds(rounds) {
231
- AppState.maxToolRounds = rounds;
232
- }
233
-
234
- export function setDebugMode(mode) {
235
- AppState.debugMode = mode;
236
- }
237
-
238
- export function setDialogTimeoutSeconds(seconds) {
239
- AppState.DIALOG_TIMEOUT_SECONDS = seconds;
240
- }
241
-
242
- export function setAutoReplyTimerSeconds(seconds) {
243
- AppState.AUTO_REPLY_TIMER_SECONDS = seconds;
244
- }
245
-
246
- export function setCurrentProjectName(name) {
247
- AppState.currentProjectName = name;
248
- }
249
-
250
- export function setCurrentProjectPath(path) {
251
- AppState.currentProjectPath = path;
252
- }
253
-
254
- export function setStreamingAbortController(controller) {
255
- AppState.streamingAbortController = controller;
256
- }
257
-
258
- export function setMcpServers(servers) {
259
- AppState.mcpServers = servers;
260
- }
261
-
262
- export function setEditingMcpServerId(id) {
263
- AppState.editingMcpServerId = id;
264
- }
265
-
266
- export function setIsEditingPrompt(editing) {
267
- AppState.isEditingPrompt = editing;
268
- }
269
-
270
- export function setEditingPromptId(id) {
271
- AppState.editingPromptId = id;
272
- }
273
-
274
- export function setAutoReplyTimerRemaining(remaining) {
275
- AppState.autoReplyTimerRemaining = remaining;
276
- }
277
-
278
- export function setAutoReplyTimerPaused(paused) {
279
- AppState.autoReplyTimerPaused = paused;
280
- }
281
-
282
- export function setAutoReplyPausedByFocus(paused) {
283
- AppState.autoReplyPausedByFocus = paused;
284
- }
285
-
286
- export function setAutoReplyData(data) {
287
- AppState.autoReplyData = data;
288
- }
289
-
290
- // Timer ID setters
291
- export function setDialogTimeoutInterval(id) {
292
- AppState.dialogTimeoutInterval = id;
293
- }
294
-
295
- export function setCloseCountdownInterval(id) {
296
- AppState.closeCountdownInterval = id;
297
- }
298
-
299
- export function setAutoReplyTimerInterval(id) {
300
- AppState.autoReplyTimerInterval = id;
301
- }
302
-
303
- export function setAutoReplyCountdownInterval(id) {
304
- AppState.autoReplyCountdownInterval = id;
305
- }
306
-
307
- export function setAutoReplyWarningTimeout(id) {
308
- AppState.autoReplyWarningTimeout = id;
309
- }
310
-
311
- export function setAutoReplyConfirmationTimeout(id) {
312
- AppState.autoReplyConfirmationTimeout = id;
313
- }
314
-
315
- // Log setters
316
- export function setCurrentLogPage(page) {
317
- AppState.currentLogPage = page;
318
- }
319
-
320
- export function setTotalLogPages(pages) {
321
- AppState.totalLogPages = pages;
322
- }
323
-
324
- export function setLogSources(sources) {
325
- AppState.logSources = sources;
326
- }
327
-
328
- // 工具函數
329
- export function findPromptById(id) {
330
- return AppState.prompts.find((p) => p.id === id);
331
- }
332
-
333
- export function findMcpServerById(id) {
334
- return AppState.mcpServers.find((s) => s.id === id);
335
- }
336
-
337
- // 清除所有計時器 ID
338
- export function clearAllTimerIds() {
339
- AppState.dialogTimeoutInterval = null;
340
- AppState.closeCountdownInterval = null;
341
- AppState.autoReplyTimerInterval = null;
342
- AppState.autoReplyCountdownInterval = null;
343
- AppState.autoReplyWarningTimeout = null;
344
- AppState.autoReplyConfirmationTimeout = null;
345
- }
346
-
347
- // 匯出整個狀態(僅供調試)
348
- export function getFullState() {
349
- return { ...AppState };
350
- }
351
-
352
- export default AppState;
1
+ /**
2
+ * state-manager.js
3
+ * 全域狀態管理模組
4
+ * 集中管理 app.js 中的所有全域狀態變數
5
+ */
6
+
7
+ const AppState = {
8
+ // Socket.IO 連線
9
+ socket: null,
10
+ sessionId: null,
11
+
12
+ // 專案資訊
13
+ currentProjectName: null,
14
+ currentProjectPath: null,
15
+
16
+ // AI 相關
17
+ workSummary: null,
18
+ aiSettings: null,
19
+ maxToolRounds: 5,
20
+ debugMode: false,
21
+
22
+ // 圖片
23
+ currentImages: [],
24
+
25
+ // 提示詞
26
+ prompts: [],
27
+ isEditingPrompt: false,
28
+ editingPromptId: null,
29
+
30
+ // 使用者偏好
31
+ preferences: {},
32
+
33
+ // 計時器狀態
34
+ DIALOG_TIMEOUT_SECONDS: 60,
35
+ AUTO_REPLY_TIMER_SECONDS: 300,
36
+ autoReplyTimerRemaining: 0,
37
+ autoReplyTimerPaused: false,
38
+ autoReplyPausedByFocus: false,
39
+ autoReplyData: null,
40
+
41
+ // 計時器 ID
42
+ dialogTimeoutInterval: null,
43
+ closeCountdownInterval: null,
44
+ autoReplyTimerInterval: null,
45
+ autoReplyCountdownInterval: null,
46
+ autoReplyWarningTimeout: null,
47
+ autoReplyConfirmationTimeout: null,
48
+
49
+ // Streaming
50
+ streamingAbortController: null,
51
+
52
+ // MCP Servers
53
+ mcpServers: [],
54
+ editingMcpServerId: null,
55
+
56
+ // 日誌
57
+ currentLogPage: 1,
58
+ totalLogPages: 1,
59
+ logSources: [],
60
+ };
61
+
62
+ // Getter 函數
63
+ export function getSocket() {
64
+ return AppState.socket;
65
+ }
66
+
67
+ export function getSessionId() {
68
+ return AppState.sessionId;
69
+ }
70
+
71
+ export function getWorkSummary() {
72
+ return AppState.workSummary;
73
+ }
74
+
75
+ export function getCurrentImages() {
76
+ return AppState.currentImages;
77
+ }
78
+
79
+ export function getPrompts() {
80
+ return AppState.prompts;
81
+ }
82
+
83
+ export function getAISettings() {
84
+ return AppState.aiSettings;
85
+ }
86
+
87
+ export function getPreferences() {
88
+ return AppState.preferences;
89
+ }
90
+
91
+ export function getMaxToolRounds() {
92
+ return AppState.maxToolRounds;
93
+ }
94
+
95
+ export function getDebugMode() {
96
+ return AppState.debugMode;
97
+ }
98
+
99
+ export function getDialogTimeoutSeconds() {
100
+ return AppState.DIALOG_TIMEOUT_SECONDS;
101
+ }
102
+
103
+ export function getAutoReplyTimerSeconds() {
104
+ return AppState.AUTO_REPLY_TIMER_SECONDS;
105
+ }
106
+
107
+ export function getCurrentProjectName() {
108
+ return AppState.currentProjectName;
109
+ }
110
+
111
+ export function getCurrentProjectPath() {
112
+ return AppState.currentProjectPath;
113
+ }
114
+
115
+ export function getStreamingAbortController() {
116
+ return AppState.streamingAbortController;
117
+ }
118
+
119
+ export function getMcpServers() {
120
+ return AppState.mcpServers;
121
+ }
122
+
123
+ export function getEditingMcpServerId() {
124
+ return AppState.editingMcpServerId;
125
+ }
126
+
127
+ export function isEditingPrompt() {
128
+ return AppState.isEditingPrompt;
129
+ }
130
+
131
+ export function getEditingPromptId() {
132
+ return AppState.editingPromptId;
133
+ }
134
+
135
+ export function getAutoReplyTimerRemaining() {
136
+ return AppState.autoReplyTimerRemaining;
137
+ }
138
+
139
+ export function isAutoReplyTimerPaused() {
140
+ return AppState.autoReplyTimerPaused;
141
+ }
142
+
143
+ export function isAutoReplyPausedByFocus() {
144
+ return AppState.autoReplyPausedByFocus;
145
+ }
146
+
147
+ export function getAutoReplyData() {
148
+ return AppState.autoReplyData;
149
+ }
150
+
151
+ // Timer ID getters
152
+ export function getDialogTimeoutInterval() {
153
+ return AppState.dialogTimeoutInterval;
154
+ }
155
+
156
+ export function getCloseCountdownInterval() {
157
+ return AppState.closeCountdownInterval;
158
+ }
159
+
160
+ export function getAutoReplyTimerInterval() {
161
+ return AppState.autoReplyTimerInterval;
162
+ }
163
+
164
+ export function getAutoReplyCountdownInterval() {
165
+ return AppState.autoReplyCountdownInterval;
166
+ }
167
+
168
+ export function getAutoReplyWarningTimeout() {
169
+ return AppState.autoReplyWarningTimeout;
170
+ }
171
+
172
+ export function getAutoReplyConfirmationTimeout() {
173
+ return AppState.autoReplyConfirmationTimeout;
174
+ }
175
+
176
+ // Log getters
177
+ export function getCurrentLogPage() {
178
+ return AppState.currentLogPage;
179
+ }
180
+
181
+ export function getTotalLogPages() {
182
+ return AppState.totalLogPages;
183
+ }
184
+
185
+ export function getLogSources() {
186
+ return AppState.logSources;
187
+ }
188
+
189
+ // Setter 函數
190
+ export function setSocket(socket) {
191
+ AppState.socket = socket;
192
+ }
193
+
194
+ export function setSessionId(id) {
195
+ AppState.sessionId = id;
196
+ }
197
+
198
+ export function setWorkSummary(summary) {
199
+ AppState.workSummary = summary;
200
+ }
201
+
202
+ export function setCurrentImages(images) {
203
+ AppState.currentImages = images;
204
+ }
205
+
206
+ export function addImage(image) {
207
+ AppState.currentImages.push(image);
208
+ }
209
+
210
+ export function removeImageAt(index) {
211
+ AppState.currentImages.splice(index, 1);
212
+ }
213
+
214
+ export function clearImages() {
215
+ AppState.currentImages = [];
216
+ }
217
+
218
+ export function setPrompts(prompts) {
219
+ AppState.prompts = prompts;
220
+ }
221
+
222
+ export function setAISettings(settings) {
223
+ AppState.aiSettings = settings;
224
+ }
225
+
226
+ export function setPreferences(prefs) {
227
+ AppState.preferences = prefs;
228
+ }
229
+
230
+ export function setMaxToolRounds(rounds) {
231
+ AppState.maxToolRounds = rounds;
232
+ }
233
+
234
+ export function setDebugMode(mode) {
235
+ AppState.debugMode = mode;
236
+ }
237
+
238
+ export function setDialogTimeoutSeconds(seconds) {
239
+ AppState.DIALOG_TIMEOUT_SECONDS = seconds;
240
+ }
241
+
242
+ export function setAutoReplyTimerSeconds(seconds) {
243
+ AppState.AUTO_REPLY_TIMER_SECONDS = seconds;
244
+ }
245
+
246
+ export function setCurrentProjectName(name) {
247
+ AppState.currentProjectName = name;
248
+ }
249
+
250
+ export function setCurrentProjectPath(path) {
251
+ AppState.currentProjectPath = path;
252
+ }
253
+
254
+ export function setStreamingAbortController(controller) {
255
+ AppState.streamingAbortController = controller;
256
+ }
257
+
258
+ export function setMcpServers(servers) {
259
+ AppState.mcpServers = servers;
260
+ }
261
+
262
+ export function setEditingMcpServerId(id) {
263
+ AppState.editingMcpServerId = id;
264
+ }
265
+
266
+ export function setIsEditingPrompt(editing) {
267
+ AppState.isEditingPrompt = editing;
268
+ }
269
+
270
+ export function setEditingPromptId(id) {
271
+ AppState.editingPromptId = id;
272
+ }
273
+
274
+ export function setAutoReplyTimerRemaining(remaining) {
275
+ AppState.autoReplyTimerRemaining = remaining;
276
+ }
277
+
278
+ export function setAutoReplyTimerPaused(paused) {
279
+ AppState.autoReplyTimerPaused = paused;
280
+ }
281
+
282
+ export function setAutoReplyPausedByFocus(paused) {
283
+ AppState.autoReplyPausedByFocus = paused;
284
+ }
285
+
286
+ export function setAutoReplyData(data) {
287
+ AppState.autoReplyData = data;
288
+ }
289
+
290
+ // Timer ID setters
291
+ export function setDialogTimeoutInterval(id) {
292
+ AppState.dialogTimeoutInterval = id;
293
+ }
294
+
295
+ export function setCloseCountdownInterval(id) {
296
+ AppState.closeCountdownInterval = id;
297
+ }
298
+
299
+ export function setAutoReplyTimerInterval(id) {
300
+ AppState.autoReplyTimerInterval = id;
301
+ }
302
+
303
+ export function setAutoReplyCountdownInterval(id) {
304
+ AppState.autoReplyCountdownInterval = id;
305
+ }
306
+
307
+ export function setAutoReplyWarningTimeout(id) {
308
+ AppState.autoReplyWarningTimeout = id;
309
+ }
310
+
311
+ export function setAutoReplyConfirmationTimeout(id) {
312
+ AppState.autoReplyConfirmationTimeout = id;
313
+ }
314
+
315
+ // Log setters
316
+ export function setCurrentLogPage(page) {
317
+ AppState.currentLogPage = page;
318
+ }
319
+
320
+ export function setTotalLogPages(pages) {
321
+ AppState.totalLogPages = pages;
322
+ }
323
+
324
+ export function setLogSources(sources) {
325
+ AppState.logSources = sources;
326
+ }
327
+
328
+ // 工具函數
329
+ export function findPromptById(id) {
330
+ return AppState.prompts.find((p) => p.id === id);
331
+ }
332
+
333
+ export function findMcpServerById(id) {
334
+ return AppState.mcpServers.find((s) => s.id === id);
335
+ }
336
+
337
+ // 清除所有計時器 ID
338
+ export function clearAllTimerIds() {
339
+ AppState.dialogTimeoutInterval = null;
340
+ AppState.closeCountdownInterval = null;
341
+ AppState.autoReplyTimerInterval = null;
342
+ AppState.autoReplyCountdownInterval = null;
343
+ AppState.autoReplyWarningTimeout = null;
344
+ AppState.autoReplyConfirmationTimeout = null;
345
+ }
346
+
347
+ // 匯出整個狀態(僅供調試)
348
+ export function getFullState() {
349
+ return { ...AppState };
350
+ }
351
+
352
+ export default AppState;