cache-overflow-mcp 0.3.7 → 0.3.8
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 +28 -76
- package/dist/client.d.ts +5 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +157 -9
- package/dist/client.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/tools/find-solution.d.ts.map +1 -1
- package/dist/tools/find-solution.js +74 -3
- package/dist/tools/find-solution.js.map +1 -1
- package/dist/tools/publish-solution.d.ts.map +1 -1
- package/dist/tools/publish-solution.js +68 -3
- package/dist/tools/publish-solution.js.map +1 -1
- package/dist/tools/submit-feedback.d.ts.map +1 -1
- package/dist/tools/submit-feedback.js +62 -2
- package/dist/tools/submit-feedback.js.map +1 -1
- package/dist/tools/submit-verification.d.ts.map +1 -1
- package/dist/tools/submit-verification.js +62 -2
- package/dist/tools/submit-verification.js.map +1 -1
- package/dist/tools/unlock-solution.d.ts.map +1 -1
- package/dist/tools/unlock-solution.js +57 -2
- package/dist/tools/unlock-solution.js.map +1 -1
- package/dist/ui/verification-dialog.d.ts +1 -1
- package/dist/ui/verification-dialog.d.ts.map +1 -1
- package/dist/ui/verification-dialog.js +78 -4
- package/dist/ui/verification-dialog.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +177 -9
- package/src/config.ts +1 -1
- package/src/tools/find-solution.ts +75 -3
- package/src/tools/publish-solution.ts +71 -3
- package/src/tools/submit-feedback.ts +62 -2
- package/src/tools/submit-verification.ts +62 -2
- package/src/tools/unlock-solution.ts +56 -2
- package/src/ui/verification-dialog.ts +84 -4
- package/E2E-TESTING.md +0 -195
- package/TROUBLESHOOTING.md +0 -219
- package/scripts/mock-server.js +0 -37
- package/scripts/view-logs.js +0 -125
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-solution.js","sourceRoot":"","sources":["../../src/tools/publish-solution.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publish-solution.js","sourceRoot":"","sources":["../../src/tools/publish-solution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-feedback.d.ts","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"submit-feedback.d.ts","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoC5C,eAAO,MAAM,cAAc,EAAE,cA6D5B,CAAC"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
import { config } from '../config.js';
|
|
2
|
+
// #6 - Improve error messages with context
|
|
3
|
+
function getErrorTitle(error) {
|
|
4
|
+
if (error.includes('timeout') || error.includes('timed out'))
|
|
5
|
+
return 'Request Timed Out';
|
|
6
|
+
if (error.includes('network') || error.includes('fetch'))
|
|
7
|
+
return 'Network Connection Failed';
|
|
8
|
+
if (error.includes('auth') || error.includes('Authentication'))
|
|
9
|
+
return 'Authentication Failed';
|
|
10
|
+
if (error.includes('Rate limit'))
|
|
11
|
+
return 'Rate Limit Exceeded';
|
|
12
|
+
if (error.includes('not found') || error.includes('404'))
|
|
13
|
+
return 'Solution Not Found';
|
|
14
|
+
if (error.includes('already submitted'))
|
|
15
|
+
return 'Feedback Already Submitted';
|
|
16
|
+
return 'Operation Failed';
|
|
17
|
+
}
|
|
18
|
+
function getRecoverySuggestions(error) {
|
|
19
|
+
if (error.includes('timeout') || error.includes('timed out')) {
|
|
20
|
+
return '- Check your internet connection\n- Try again in a moment\n- The server may be experiencing high load';
|
|
21
|
+
}
|
|
22
|
+
if (error.includes('auth') || error.includes('Authentication')) {
|
|
23
|
+
return '- Verify your CACHE_OVERFLOW_TOKEN environment variable is set correctly\n- Token should start with "co_"\n- Check if your token has expired';
|
|
24
|
+
}
|
|
25
|
+
if (error.includes('Rate limit')) {
|
|
26
|
+
return '- Wait the specified time before retrying';
|
|
27
|
+
}
|
|
28
|
+
if (error.includes('not found') || error.includes('404')) {
|
|
29
|
+
return '- Verify the solution_id is correct\n- The solution may have been deleted';
|
|
30
|
+
}
|
|
31
|
+
if (error.includes('already submitted')) {
|
|
32
|
+
return '- You have already submitted feedback for this solution\n- No action needed';
|
|
33
|
+
}
|
|
34
|
+
if (error.includes('network') || error.includes('fetch')) {
|
|
35
|
+
return '- Check your internet connection\n- Verify the CACHE_OVERFLOW_URL is correct\n- Try again in a moment';
|
|
36
|
+
}
|
|
37
|
+
return '- Check the log file for details\n- Verify your CACHE_OVERFLOW_TOKEN is valid\n- Try again in a moment';
|
|
38
|
+
}
|
|
1
39
|
export const submitFeedback = {
|
|
2
40
|
definition: {
|
|
3
41
|
name: 'submit_feedback',
|
|
@@ -18,12 +56,34 @@ export const submitFeedback = {
|
|
|
18
56
|
},
|
|
19
57
|
},
|
|
20
58
|
handler: async (args, client) => {
|
|
21
|
-
|
|
59
|
+
// #5 - Add input validation
|
|
60
|
+
const solutionId = (args.solution_id || '').trim();
|
|
22
61
|
const isUseful = args.is_useful;
|
|
62
|
+
if (!solutionId) {
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: 'text', text: 'Error: solution_id cannot be empty. Please provide a valid solution ID.' }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (typeof isUseful !== 'boolean') {
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: 'text', text: 'Error: is_useful must be a boolean (true or false).' }],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
23
72
|
const result = await client.submitFeedback(solutionId, isUseful);
|
|
24
73
|
if (!result.success) {
|
|
74
|
+
// #6 - Improve error messages with context
|
|
75
|
+
const errorMessage = [
|
|
76
|
+
`❌ ${getErrorTitle(result.error || '')}`,
|
|
77
|
+
'',
|
|
78
|
+
result.error,
|
|
79
|
+
'',
|
|
80
|
+
'💡 **What to try:**',
|
|
81
|
+
getRecoverySuggestions(result.error || ''),
|
|
82
|
+
'',
|
|
83
|
+
`📋 **Logs**: Check ${config.logging.logDir || '~/.cache-overflow'}/cache-overflow-mcp.log for details`,
|
|
84
|
+
].join('\n');
|
|
25
85
|
return {
|
|
26
|
-
content: [{ type: 'text', text:
|
|
86
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
27
87
|
};
|
|
28
88
|
}
|
|
29
89
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-feedback.js","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submit-feedback.js","sourceRoot":"","sources":["../../src/tools/submit-feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-verification.d.ts","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"submit-verification.d.ts","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoC5C,eAAO,MAAM,kBAAkB,EAAE,cA6DhC,CAAC"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
import { config } from '../config.js';
|
|
2
|
+
// #6 - Improve error messages with context
|
|
3
|
+
function getErrorTitle(error) {
|
|
4
|
+
if (error.includes('timeout') || error.includes('timed out'))
|
|
5
|
+
return 'Request Timed Out';
|
|
6
|
+
if (error.includes('network') || error.includes('fetch'))
|
|
7
|
+
return 'Network Connection Failed';
|
|
8
|
+
if (error.includes('auth') || error.includes('Authentication'))
|
|
9
|
+
return 'Authentication Failed';
|
|
10
|
+
if (error.includes('Rate limit'))
|
|
11
|
+
return 'Rate Limit Exceeded';
|
|
12
|
+
if (error.includes('not found') || error.includes('404'))
|
|
13
|
+
return 'Solution Not Found';
|
|
14
|
+
if (error.includes('already verified'))
|
|
15
|
+
return 'Already Verified';
|
|
16
|
+
return 'Operation Failed';
|
|
17
|
+
}
|
|
18
|
+
function getRecoverySuggestions(error) {
|
|
19
|
+
if (error.includes('timeout') || error.includes('timed out')) {
|
|
20
|
+
return '- Check your internet connection\n- Try again in a moment\n- The server may be experiencing high load';
|
|
21
|
+
}
|
|
22
|
+
if (error.includes('auth') || error.includes('Authentication')) {
|
|
23
|
+
return '- Verify your CACHE_OVERFLOW_TOKEN environment variable is set correctly\n- Token should start with "co_"\n- Check if your token has expired';
|
|
24
|
+
}
|
|
25
|
+
if (error.includes('Rate limit')) {
|
|
26
|
+
return '- Wait the specified time before retrying';
|
|
27
|
+
}
|
|
28
|
+
if (error.includes('not found') || error.includes('404')) {
|
|
29
|
+
return '- Verify the solution_id is correct\n- The solution may have been deleted';
|
|
30
|
+
}
|
|
31
|
+
if (error.includes('already verified')) {
|
|
32
|
+
return '- You have already verified this solution\n- No action needed';
|
|
33
|
+
}
|
|
34
|
+
if (error.includes('network') || error.includes('fetch')) {
|
|
35
|
+
return '- Check your internet connection\n- Verify the CACHE_OVERFLOW_URL is correct\n- Try again in a moment';
|
|
36
|
+
}
|
|
37
|
+
return '- Check the log file for details\n- Verify your CACHE_OVERFLOW_TOKEN is valid\n- Try again in a moment';
|
|
38
|
+
}
|
|
1
39
|
export const submitVerification = {
|
|
2
40
|
definition: {
|
|
3
41
|
name: 'submit_verification',
|
|
@@ -18,12 +56,34 @@ export const submitVerification = {
|
|
|
18
56
|
},
|
|
19
57
|
},
|
|
20
58
|
handler: async (args, client) => {
|
|
21
|
-
|
|
59
|
+
// #5 - Add input validation
|
|
60
|
+
const solutionId = (args.solution_id || '').trim();
|
|
22
61
|
const isSafe = args.is_safe;
|
|
62
|
+
if (!solutionId) {
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: 'text', text: 'Error: solution_id cannot be empty. Please provide a valid solution ID.' }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (typeof isSafe !== 'boolean') {
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: 'text', text: 'Error: is_safe must be a boolean (true or false).' }],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
23
72
|
const result = await client.submitVerification(solutionId, isSafe);
|
|
24
73
|
if (!result.success) {
|
|
74
|
+
// #6 - Improve error messages with context
|
|
75
|
+
const errorMessage = [
|
|
76
|
+
`❌ ${getErrorTitle(result.error || '')}`,
|
|
77
|
+
'',
|
|
78
|
+
result.error,
|
|
79
|
+
'',
|
|
80
|
+
'💡 **What to try:**',
|
|
81
|
+
getRecoverySuggestions(result.error || ''),
|
|
82
|
+
'',
|
|
83
|
+
`📋 **Logs**: Check ${config.logging.logDir || '~/.cache-overflow'}/cache-overflow-mcp.log for details`,
|
|
84
|
+
].join('\n');
|
|
25
85
|
return {
|
|
26
|
-
content: [{ type: 'text', text:
|
|
86
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
27
87
|
};
|
|
28
88
|
}
|
|
29
89
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-verification.js","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submit-verification.js","sourceRoot":"","sources":["../../src/tools/submit-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unlock-solution.d.ts","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"unlock-solution.d.ts","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoC5C,eAAO,MAAM,cAAc,EAAE,cAoD5B,CAAC"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
import { config } from '../config.js';
|
|
2
|
+
// #6 - Improve error messages with context
|
|
3
|
+
function getErrorTitle(error) {
|
|
4
|
+
if (error.includes('timeout') || error.includes('timed out'))
|
|
5
|
+
return 'Request Timed Out';
|
|
6
|
+
if (error.includes('network') || error.includes('fetch'))
|
|
7
|
+
return 'Network Connection Failed';
|
|
8
|
+
if (error.includes('balance') || error.includes('insufficient'))
|
|
9
|
+
return 'Insufficient Token Balance';
|
|
10
|
+
if (error.includes('auth') || error.includes('Authentication'))
|
|
11
|
+
return 'Authentication Failed';
|
|
12
|
+
if (error.includes('Rate limit'))
|
|
13
|
+
return 'Rate Limit Exceeded';
|
|
14
|
+
if (error.includes('not found') || error.includes('404'))
|
|
15
|
+
return 'Solution Not Found';
|
|
16
|
+
return 'Operation Failed';
|
|
17
|
+
}
|
|
18
|
+
function getRecoverySuggestions(error) {
|
|
19
|
+
if (error.includes('timeout') || error.includes('timed out')) {
|
|
20
|
+
return '- Check your internet connection\n- Try again in a moment\n- The server may be experiencing high load';
|
|
21
|
+
}
|
|
22
|
+
if (error.includes('balance') || error.includes('insufficient')) {
|
|
23
|
+
return '- Check your balance with another tool or API call\n- Earn tokens by publishing solutions\n- Look for solutions with human_verification_required=false';
|
|
24
|
+
}
|
|
25
|
+
if (error.includes('auth') || error.includes('Authentication')) {
|
|
26
|
+
return '- Verify your CACHE_OVERFLOW_TOKEN environment variable is set correctly\n- Token should start with "co_"\n- Check if your token has expired';
|
|
27
|
+
}
|
|
28
|
+
if (error.includes('Rate limit')) {
|
|
29
|
+
return '- Wait the specified time before retrying\n- Consider using solutions with human_verification_required=false to avoid token costs';
|
|
30
|
+
}
|
|
31
|
+
if (error.includes('not found') || error.includes('404')) {
|
|
32
|
+
return '- Verify the solution_id is correct\n- The solution may have been deleted\n- Try searching again with find_solution';
|
|
33
|
+
}
|
|
34
|
+
if (error.includes('network') || error.includes('fetch')) {
|
|
35
|
+
return '- Check your internet connection\n- Verify the CACHE_OVERFLOW_URL is correct\n- Try again in a moment';
|
|
36
|
+
}
|
|
37
|
+
return '- Check the log file for details\n- Verify your CACHE_OVERFLOW_TOKEN is valid\n- Try again in a moment';
|
|
38
|
+
}
|
|
1
39
|
export const unlockSolution = {
|
|
2
40
|
definition: {
|
|
3
41
|
name: 'unlock_solution',
|
|
@@ -14,11 +52,28 @@ export const unlockSolution = {
|
|
|
14
52
|
},
|
|
15
53
|
},
|
|
16
54
|
handler: async (args, client) => {
|
|
17
|
-
|
|
55
|
+
// #5 - Add input validation
|
|
56
|
+
const solutionId = (args.solution_id || '').trim();
|
|
57
|
+
if (!solutionId) {
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: 'text', text: 'Error: solution_id cannot be empty. Please provide a valid solution ID from find_solution results.' }],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
18
62
|
const result = await client.unlockSolution(solutionId);
|
|
19
63
|
if (!result.success) {
|
|
64
|
+
// #6 - Improve error messages with context
|
|
65
|
+
const errorMessage = [
|
|
66
|
+
`❌ ${getErrorTitle(result.error || '')}`,
|
|
67
|
+
'',
|
|
68
|
+
result.error,
|
|
69
|
+
'',
|
|
70
|
+
'💡 **What to try:**',
|
|
71
|
+
getRecoverySuggestions(result.error || ''),
|
|
72
|
+
'',
|
|
73
|
+
`📋 **Logs**: Check ${config.logging.logDir || '~/.cache-overflow'}/cache-overflow-mcp.log for details`,
|
|
74
|
+
].join('\n');
|
|
20
75
|
return {
|
|
21
|
-
content: [{ type: 'text', text:
|
|
76
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
22
77
|
};
|
|
23
78
|
}
|
|
24
79
|
const feedbackReminder = '\n\n⚠️ REQUIRED: You MUST now call submit_feedback with this solution_id after you have tried applying the solution. Report whether it was helpful (is_useful=true/false).';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unlock-solution.js","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unlock-solution.js","sourceRoot":"","sources":["../../src/tools/unlock-solution.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shows a modern verification dialog in the browser.
|
|
3
3
|
* @param title The solution's query title
|
|
4
4
|
* @param body The solution body (if available/unlocked)
|
|
5
|
-
* @returns true if user clicked "Safe", false if "Unsafe", null if cancelled
|
|
5
|
+
* @returns true if user clicked "Safe", false if "Unsafe", null if cancelled, or error object if failed
|
|
6
6
|
*/
|
|
7
7
|
export declare function showVerificationDialog(title: string, body?: string): Promise<boolean | null>;
|
|
8
8
|
//# sourceMappingURL=verification-dialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"AAuUA;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CA6HzB"}
|
|
@@ -224,9 +224,35 @@ const generateHTML = (title, body) => `
|
|
|
224
224
|
font-size: 18px;
|
|
225
225
|
color: rgba(255, 255, 255, 0.5);
|
|
226
226
|
}
|
|
227
|
+
|
|
228
|
+
.timer {
|
|
229
|
+
position: fixed;
|
|
230
|
+
top: 20px;
|
|
231
|
+
right: 20px;
|
|
232
|
+
background: rgba(139, 92, 246, 0.2);
|
|
233
|
+
border: 1px solid rgba(139, 92, 246, 0.4);
|
|
234
|
+
padding: 12px 20px;
|
|
235
|
+
border-radius: 8px;
|
|
236
|
+
font-weight: 600;
|
|
237
|
+
font-size: 14px;
|
|
238
|
+
color: #A78BFA;
|
|
239
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
|
|
240
|
+
transition: all 0.3s ease;
|
|
241
|
+
}
|
|
242
|
+
.timer.warning {
|
|
243
|
+
background: rgba(255, 68, 68, 0.25);
|
|
244
|
+
border-color: rgba(255, 68, 68, 0.5);
|
|
245
|
+
color: #FF6B6B;
|
|
246
|
+
animation: pulse-warning 1s ease-in-out infinite;
|
|
247
|
+
}
|
|
248
|
+
@keyframes pulse-warning {
|
|
249
|
+
0%, 100% { transform: scale(1); }
|
|
250
|
+
50% { transform: scale(1.05); }
|
|
251
|
+
}
|
|
227
252
|
</style>
|
|
228
253
|
</head>
|
|
229
254
|
<body>
|
|
255
|
+
<div class="timer" id="timer">Time remaining: <span id="countdown">55</span>s</div>
|
|
230
256
|
<div class="card" id="main-card">
|
|
231
257
|
<div class="badge">Verification Required</div>
|
|
232
258
|
|
|
@@ -265,6 +291,22 @@ const generateHTML = (title, body) => `
|
|
|
265
291
|
if (e.key === 's' || e.key === 'S') submit('safe');
|
|
266
292
|
if (e.key === 'u' || e.key === 'U') submit('unsafe');
|
|
267
293
|
});
|
|
294
|
+
|
|
295
|
+
// #9 - Add countdown timer
|
|
296
|
+
let timeLeft = 55;
|
|
297
|
+
const countdown = document.getElementById('countdown');
|
|
298
|
+
const timer = document.getElementById('timer');
|
|
299
|
+
|
|
300
|
+
const interval = setInterval(() => {
|
|
301
|
+
timeLeft--;
|
|
302
|
+
if (countdown) countdown.textContent = timeLeft.toString();
|
|
303
|
+
if (timeLeft <= 10 && timer) {
|
|
304
|
+
timer.classList.add('warning');
|
|
305
|
+
}
|
|
306
|
+
if (timeLeft <= 0) {
|
|
307
|
+
clearInterval(interval);
|
|
308
|
+
}
|
|
309
|
+
}, 1000);
|
|
268
310
|
</script>
|
|
269
311
|
</body>
|
|
270
312
|
</html>
|
|
@@ -281,7 +323,7 @@ function escapeHtml(text) {
|
|
|
281
323
|
* Shows a modern verification dialog in the browser.
|
|
282
324
|
* @param title The solution's query title
|
|
283
325
|
* @param body The solution body (if available/unlocked)
|
|
284
|
-
* @returns true if user clicked "Safe", false if "Unsafe", null if cancelled
|
|
326
|
+
* @returns true if user clicked "Safe", false if "Unsafe", null if cancelled, or error object if failed
|
|
285
327
|
*/
|
|
286
328
|
export async function showVerificationDialog(title, body) {
|
|
287
329
|
return new Promise((resolve) => {
|
|
@@ -291,11 +333,33 @@ export async function showVerificationDialog(title, body) {
|
|
|
291
333
|
const url = new URL(req.url || '/', `http://localhost`);
|
|
292
334
|
if (url.pathname === '/result') {
|
|
293
335
|
const value = url.searchParams.get('value');
|
|
294
|
-
|
|
295
|
-
|
|
336
|
+
// #4 - Handle HTTP response errors
|
|
337
|
+
try {
|
|
338
|
+
res.writeHead(200, { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*' });
|
|
339
|
+
res.end('OK');
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
logger.error('Error sending response to verification dialog', error, {
|
|
343
|
+
solutionTitle: title,
|
|
344
|
+
errorType: 'RESPONSE_WRITE_ERROR',
|
|
345
|
+
});
|
|
346
|
+
// Continue with resolution anyway - user already made choice
|
|
347
|
+
}
|
|
296
348
|
if (!resolved) {
|
|
297
349
|
resolved = true;
|
|
298
|
-
server
|
|
350
|
+
// #14 - Improve server cleanup
|
|
351
|
+
server.close((err) => {
|
|
352
|
+
if (err) {
|
|
353
|
+
logger.error('Error closing verification dialog server', err, {
|
|
354
|
+
solutionTitle: title,
|
|
355
|
+
errorType: 'SERVER_CLOSE_ERROR',
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
// Destroy all active sockets to speed up cleanup (Node 18.2+)
|
|
360
|
+
if (typeof server.closeAllConnections === 'function') {
|
|
361
|
+
server.closeAllConnections();
|
|
362
|
+
}
|
|
299
363
|
switch (value) {
|
|
300
364
|
case 'safe':
|
|
301
365
|
logger.info('User verified solution as safe', { solutionTitle: title });
|
|
@@ -319,6 +383,7 @@ export async function showVerificationDialog(title, body) {
|
|
|
319
383
|
res.end(html);
|
|
320
384
|
}
|
|
321
385
|
});
|
|
386
|
+
// #15 - Distinguish error types
|
|
322
387
|
server.on('error', (error) => {
|
|
323
388
|
logger.error('Verification dialog HTTP server error', error, {
|
|
324
389
|
solutionTitle: title,
|
|
@@ -326,6 +391,7 @@ export async function showVerificationDialog(title, body) {
|
|
|
326
391
|
});
|
|
327
392
|
if (!resolved) {
|
|
328
393
|
resolved = true;
|
|
394
|
+
// Return null for errors (treated same as cancellation for now)
|
|
329
395
|
resolve(null);
|
|
330
396
|
}
|
|
331
397
|
});
|
|
@@ -337,12 +403,19 @@ export async function showVerificationDialog(title, body) {
|
|
|
337
403
|
port: address.port,
|
|
338
404
|
solutionTitle: title
|
|
339
405
|
});
|
|
406
|
+
// #3 - Fix verification dialog browser open failure
|
|
340
407
|
open(url).catch((error) => {
|
|
341
408
|
logger.error('Failed to open verification dialog in browser', error, {
|
|
342
409
|
url,
|
|
343
410
|
solutionTitle: title,
|
|
344
411
|
errorType: 'BROWSER_OPEN_FAILURE',
|
|
345
412
|
});
|
|
413
|
+
// Provide fallback manual URL when browser open fails
|
|
414
|
+
console.error(`\n${'='.repeat(60)}`);
|
|
415
|
+
console.error('⚠️ Could not open browser automatically');
|
|
416
|
+
console.error('Please open this URL manually to verify the solution:');
|
|
417
|
+
console.error(`\n ${url}\n`);
|
|
418
|
+
console.error(`${'='.repeat(60)}\n`);
|
|
346
419
|
});
|
|
347
420
|
// Timeout after 55 seconds (within MCP client default 60s limit)
|
|
348
421
|
setTimeout(() => {
|
|
@@ -350,6 +423,7 @@ export async function showVerificationDialog(title, body) {
|
|
|
350
423
|
resolved = true;
|
|
351
424
|
server.close();
|
|
352
425
|
logger.warn('Verification dialog timed out', { solutionTitle: title });
|
|
426
|
+
// Return null for timeout (treated as cancellation)
|
|
353
427
|
resolve(null);
|
|
354
428
|
}
|
|
355
429
|
}, 55 * 1000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-dialog.js","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,IAAa,EAAU,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"verification-dialog.js","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"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"}
|