@sudu-cli/fronted-preview-mcp 1.0.0-beta.3 → 1.0.0-beta.5
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/dist/cdp/connectionManager.d.ts +57 -0
- package/dist/cdp/connectionManager.js +153 -0
- package/dist/cdp/connectionManager.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +19 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/detectors/frameworkDetector.js +17 -13
- package/dist/detectors/frameworkDetector.js.map +1 -1
- package/dist/handlers/autoFixLoop.d.ts +24 -0
- package/dist/handlers/autoFixLoop.js +81 -4
- package/dist/handlers/autoFixLoop.js.map +1 -1
- package/dist/handlers/checkPageErrors.js +11 -50
- package/dist/handlers/checkPageErrors.js.map +1 -1
- package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
- package/dist/handlers/typescriptDiagnostics.js +4 -25
- package/dist/handlers/typescriptDiagnostics.js.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/serverManager.d.ts +22 -4
- package/dist/serverManager.js +215 -140
- package/dist/serverManager.js.map +1 -1
- package/dist/strategies/baseStrategy.d.ts +27 -0
- package/dist/strategies/baseStrategy.js +23 -0
- package/dist/strategies/baseStrategy.js.map +1 -0
- package/dist/strategies/index.d.ts +9 -0
- package/dist/strategies/index.js +22 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/missingImport.d.ts +16 -0
- package/dist/strategies/missingImport.js +156 -0
- package/dist/strategies/missingImport.js.map +1 -0
- package/dist/strategies/missingProperty.d.ts +13 -0
- package/dist/strategies/missingProperty.js +134 -0
- package/dist/strategies/missingProperty.js.map +1 -0
- package/dist/strategies/networkError.d.ts +10 -0
- package/dist/strategies/networkError.js +56 -0
- package/dist/strategies/networkError.js.map +1 -0
- package/dist/strategies/nullCheckInsertion.d.ts +14 -0
- package/dist/strategies/nullCheckInsertion.js +138 -0
- package/dist/strategies/nullCheckInsertion.js.map +1 -0
- package/dist/strategies/typeAssignment.d.ts +13 -0
- package/dist/strategies/typeAssignment.js +121 -0
- package/dist/strategies/typeAssignment.js.map +1 -0
- package/dist/strategies/unusedImportRemoval.d.ts +11 -0
- package/dist/strategies/unusedImportRemoval.js +138 -0
- package/dist/strategies/unusedImportRemoval.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.js +21 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
- package/templates/init/instructions.md +1 -11
- package/templates/init/opencode.json +1 -1
- package/dist/handlers/pickElement.d.ts +0 -10
- package/dist/handlers/pickElement.js +0 -413
- package/dist/handlers/pickElement.js.map +0 -1
- package/dist/handlers/takeScreenshot.d.ts +0 -17
- package/dist/handlers/takeScreenshot.js +0 -83
- package/dist/handlers/takeScreenshot.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkPageErrors.js","sourceRoot":"","sources":["../../src/handlers/checkPageErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"checkPageErrors.js","sourceRoot":"","sources":["../../src/handlers/checkPageErrors.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,14 @@ interface GetTypeScriptDiagnosticsArgs {
|
|
|
5
5
|
files?: string[];
|
|
6
6
|
includeWarnings?: boolean;
|
|
7
7
|
}
|
|
8
|
+
export interface DiagnosticInfo {
|
|
9
|
+
file: string;
|
|
10
|
+
line: number;
|
|
11
|
+
column: number;
|
|
12
|
+
code: number;
|
|
13
|
+
message: string;
|
|
14
|
+
severity: 'error' | 'warning' | 'suggestion' | 'message';
|
|
15
|
+
category: 'typescript' | 'semantic' | 'syntactic' | 'declaration' | 'global' | 'config';
|
|
16
|
+
}
|
|
8
17
|
declare function handleGetTypeScriptDiagnostics(args: GetTypeScriptDiagnosticsArgs): Promise<MCPToolResponse>;
|
|
9
18
|
export { handleGetTypeScriptDiagnostics };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
2
|
import { Project } from 'ts-morph';
|
|
3
|
+
import { createMCPError, createMCPSuccess } from '../types.js';
|
|
3
4
|
function getSeverity(diagnostic) {
|
|
4
5
|
const category = diagnostic.getCategory();
|
|
5
6
|
if (category === 1)
|
|
@@ -72,19 +73,7 @@ async function handleGetTypeScriptDiagnostics(args) {
|
|
|
72
73
|
await fs.access(fullTsConfigPath);
|
|
73
74
|
}
|
|
74
75
|
catch {
|
|
75
|
-
return {
|
|
76
|
-
content: [
|
|
77
|
-
{
|
|
78
|
-
type: 'text',
|
|
79
|
-
text: JSON.stringify({
|
|
80
|
-
error: `tsconfig.json not found at ${fullTsConfigPath}`,
|
|
81
|
-
projectDir,
|
|
82
|
-
suggestion: 'Ensure the project has a tsconfig.json file',
|
|
83
|
-
}, null, 2),
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
isError: true,
|
|
87
|
-
};
|
|
76
|
+
return createMCPError('CONFIG_NOT_FOUND', `tsconfig.json not found at ${fullTsConfigPath}`, { projectDir }, 'Ensure the project has a tsconfig.json file');
|
|
88
77
|
}
|
|
89
78
|
// Create ts-morph project
|
|
90
79
|
const project = new Project({
|
|
@@ -130,21 +119,11 @@ async function handleGetTypeScriptDiagnostics(args) {
|
|
|
130
119
|
durationMs: Date.now() - startTime,
|
|
131
120
|
timestamp: new Date().toISOString(),
|
|
132
121
|
};
|
|
133
|
-
return
|
|
134
|
-
content: [
|
|
135
|
-
{
|
|
136
|
-
type: 'text',
|
|
137
|
-
text: JSON.stringify(report, null, 2),
|
|
138
|
-
},
|
|
139
|
-
],
|
|
140
|
-
};
|
|
122
|
+
return createMCPSuccess(report);
|
|
141
123
|
}
|
|
142
124
|
catch (err) {
|
|
143
125
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
144
|
-
return
|
|
145
|
-
content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
|
|
146
|
-
isError: true,
|
|
147
|
-
};
|
|
126
|
+
return createMCPError('TYPE_CHECK_FAILED', errorMessage);
|
|
148
127
|
}
|
|
149
128
|
}
|
|
150
129
|
export { handleGetTypeScriptDiagnostics };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescriptDiagnostics.js","sourceRoot":"","sources":["../../src/handlers/typescriptDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAoC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"typescriptDiagnostics.js","sourceRoot":"","sources":["../../src/handlers/typescriptDiagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -205,8 +205,9 @@ server.tool('get_typescript_diagnostics', 'Get TypeScript compiler diagnostics (
|
|
|
205
205
|
// ============================================================
|
|
206
206
|
server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an iterative loop. ' +
|
|
207
207
|
'Combines console error checking (via CDP) and TypeScript diagnostics ' +
|
|
208
|
-
'to identify and verify fixes automatically
|
|
209
|
-
'
|
|
208
|
+
'to identify and verify fixes automatically. Includes built-in fix strategies ' +
|
|
209
|
+
'for common TypeScript and console errors.\n\n' +
|
|
210
|
+
'Returns { success, iterations, errorsFixed, errorsRemaining, messages, errors, fixesApplied }.\n\n' +
|
|
210
211
|
'WHEN TO USE:\n' +
|
|
211
212
|
'- User wants to automatically fix all detected errors\n' +
|
|
212
213
|
'- User says "fix all errors" or "auto-fix this project"\n' +
|
|
@@ -218,8 +219,9 @@ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an
|
|
|
218
219
|
'- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
|
|
219
220
|
'AFTER THIS TOOL:\n' +
|
|
220
221
|
'- Check the result for errorsFixed vs errorsRemaining\n' +
|
|
222
|
+
'- Review fixesApplied for applied fixes and suggestions\n' +
|
|
221
223
|
'- For visual inspection, use chrome-devtools take_screenshot\n' +
|
|
222
|
-
'- If errors remain, run again with more iterations\n' +
|
|
224
|
+
'- If errors remain, run again with more iterations or fixAction: "auto"\n' +
|
|
223
225
|
'- Manual review may be needed for complex issues', {
|
|
224
226
|
projectDir: z
|
|
225
227
|
.string()
|
|
@@ -253,6 +255,10 @@ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an
|
|
|
253
255
|
.array(z.string())
|
|
254
256
|
.optional()
|
|
255
257
|
.describe('Optional: filter to specific error messages. If omitted, fixes all errors.'),
|
|
258
|
+
fixAction: z
|
|
259
|
+
.enum(['auto', 'suggest', 'none'])
|
|
260
|
+
.optional()
|
|
261
|
+
.describe('Fix behavior: "auto" = apply fixes automatically, "suggest" = only suggest fixes, "none" = only detect. Defaults to "suggest".'),
|
|
256
262
|
}, async (args) => {
|
|
257
263
|
const result = await handleAutoFixLoop(args);
|
|
258
264
|
const content = [
|
|
@@ -272,6 +278,12 @@ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an
|
|
|
272
278
|
text: `\nErrors:\n${result.errors.join('\n')}`
|
|
273
279
|
});
|
|
274
280
|
}
|
|
281
|
+
if (result.fixesApplied.length > 0) {
|
|
282
|
+
content.push({
|
|
283
|
+
type: 'text',
|
|
284
|
+
text: `\nFixes Applied:\n${result.fixesApplied.map(f => `${f.success ? '✅' : '💡'} ${f.message}`).join('\n')}`
|
|
285
|
+
});
|
|
286
|
+
}
|
|
275
287
|
return { content };
|
|
276
288
|
});
|
|
277
289
|
// ============================================================
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/serverManager.d.ts
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import type { ServerStatus } from './types.js';
|
|
2
|
-
declare
|
|
3
|
-
|
|
2
|
+
export declare class ServerManager {
|
|
3
|
+
private static instance;
|
|
4
|
+
private activeServer;
|
|
5
|
+
private startLocks;
|
|
6
|
+
private shutdownLock;
|
|
7
|
+
private constructor();
|
|
8
|
+
static getInstance(): ServerManager;
|
|
9
|
+
static resetInstance(): void;
|
|
10
|
+
private isPortAvailable;
|
|
11
|
+
private waitForServerReady;
|
|
12
|
+
startServer(projectDir: string, devCommand: string, port: number, timeoutMs?: number): Promise<ServerStatus>;
|
|
13
|
+
private doStartServer;
|
|
14
|
+
stopServer(): Promise<{
|
|
15
|
+
success: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
}>;
|
|
18
|
+
private doStopServer;
|
|
19
|
+
getServerStatus(): ServerStatus | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function startServer(projectDir: string, devCommand: string, port: number): Promise<ServerStatus>;
|
|
22
|
+
export declare function stopServer(): Promise<{
|
|
4
23
|
success: boolean;
|
|
5
24
|
message: string;
|
|
6
25
|
}>;
|
|
7
|
-
declare function getServerStatus(): ServerStatus | null;
|
|
8
|
-
export { startServer, stopServer, getServerStatus };
|
|
26
|
+
export declare function getServerStatus(): ServerStatus | null;
|
package/dist/serverManager.js
CHANGED
|
@@ -1,166 +1,241 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import * as net from 'node:net';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
import { TIMEOUTS } from './constants.js';
|
|
4
|
+
export class ServerManager {
|
|
5
|
+
static instance = null;
|
|
6
|
+
activeServer = null;
|
|
7
|
+
startLocks = new Map();
|
|
8
|
+
shutdownLock = null;
|
|
9
|
+
constructor() { }
|
|
10
|
+
static getInstance() {
|
|
11
|
+
if (!ServerManager.instance) {
|
|
12
|
+
ServerManager.instance = new ServerManager();
|
|
13
|
+
}
|
|
14
|
+
return ServerManager.instance;
|
|
15
|
+
}
|
|
16
|
+
static resetInstance() {
|
|
17
|
+
ServerManager.instance = null;
|
|
18
|
+
}
|
|
19
|
+
isPortAvailable(port) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const server = net.createServer();
|
|
22
|
+
server.once('error', () => resolve(false));
|
|
23
|
+
server.once('listening', () => {
|
|
24
|
+
server.close();
|
|
25
|
+
resolve(true);
|
|
26
|
+
});
|
|
27
|
+
server.listen(port, '127.0.0.1');
|
|
11
28
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
}
|
|
30
|
+
waitForServerReady(port, timeoutMs = TIMEOUTS.SERVER_START_TIMEOUT) {
|
|
31
|
+
const start = Date.now();
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
const check = async () => {
|
|
34
|
+
const available = await this.isPortAvailable(port);
|
|
35
|
+
if (!available) {
|
|
36
|
+
resolve(true); // port is in use = server is ready
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (Date.now() - start > timeoutMs) {
|
|
40
|
+
resolve(false); // timeout
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
setTimeout(check, TIMEOUTS.PORT_CHECK_INTERVAL);
|
|
44
|
+
};
|
|
45
|
+
check();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async startServer(projectDir, devCommand, port, timeoutMs = TIMEOUTS.SERVER_START_TIMEOUT) {
|
|
49
|
+
// Check if there's already a start in progress for this port
|
|
50
|
+
const existingLock = this.startLocks.get(port);
|
|
51
|
+
if (existingLock) {
|
|
52
|
+
return existingLock;
|
|
53
|
+
}
|
|
54
|
+
// Create the start operation with lock
|
|
55
|
+
const startPromise = this.doStartServer(projectDir, devCommand, port, timeoutMs);
|
|
56
|
+
this.startLocks.set(port, startPromise);
|
|
57
|
+
try {
|
|
58
|
+
const result = await startPromise;
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
this.startLocks.delete(port);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async doStartServer(projectDir, devCommand, port, timeoutMs) {
|
|
66
|
+
// Atomic check: if we have a running server on this port, return it
|
|
67
|
+
if (this.activeServer && this.activeServer.port === port) {
|
|
68
|
+
const isRunning = this.activeServer.process.exitCode === null;
|
|
69
|
+
if (isRunning) {
|
|
70
|
+
return {
|
|
71
|
+
url: this.activeServer.url,
|
|
72
|
+
port: this.activeServer.port,
|
|
73
|
+
pid: this.activeServer.process.pid || 0,
|
|
74
|
+
ready: true,
|
|
75
|
+
startedAt: new Date(this.activeServer.startTime).toISOString(),
|
|
76
|
+
};
|
|
27
77
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// If already running, return current status
|
|
35
|
-
if (activeServer) {
|
|
36
|
-
const isRunning = activeServer.process.exitCode === null;
|
|
37
|
-
if (isRunning) {
|
|
78
|
+
// Process died, clean up atomically
|
|
79
|
+
this.activeServer = null;
|
|
80
|
+
}
|
|
81
|
+
// Check if port is already in use (server running externally)
|
|
82
|
+
const portAvailable = await this.isPortAvailable(port);
|
|
83
|
+
if (!portAvailable) {
|
|
38
84
|
return {
|
|
39
|
-
url:
|
|
40
|
-
port
|
|
41
|
-
pid:
|
|
85
|
+
url: `http://localhost:${port}`,
|
|
86
|
+
port,
|
|
87
|
+
pid: 0,
|
|
42
88
|
ready: true,
|
|
43
|
-
startedAt: new Date(
|
|
89
|
+
startedAt: new Date().toISOString(),
|
|
44
90
|
};
|
|
45
91
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
92
|
+
// Determine shell command
|
|
93
|
+
const isWin = process.platform === 'win32';
|
|
94
|
+
const shellCmd = isWin ? `cmd /c "${devCommand}"` : devCommand;
|
|
95
|
+
const child = spawn(shellCmd, [], {
|
|
96
|
+
cwd: projectDir,
|
|
97
|
+
shell: true,
|
|
98
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
99
|
+
windowsHide: true,
|
|
100
|
+
});
|
|
101
|
+
let urlConfirmed = false;
|
|
102
|
+
child.stdout?.on('data', (data) => {
|
|
103
|
+
const text = data.toString();
|
|
104
|
+
// Vite prints local URL on stdout
|
|
105
|
+
if (text.includes('Local:')) {
|
|
106
|
+
const urlMatch = text.match(/http:\/\/localhost:\d+/);
|
|
107
|
+
if (urlMatch) {
|
|
108
|
+
urlConfirmed = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
child.stderr?.on('data', (data) => {
|
|
113
|
+
// Some frameworks output to stderr
|
|
114
|
+
});
|
|
115
|
+
// Handle process errors
|
|
116
|
+
const errorPromise = new Promise((_, reject) => {
|
|
117
|
+
child.on('error', (err) => {
|
|
118
|
+
this.activeServer = null;
|
|
119
|
+
reject(new Error(`Failed to start dev server: ${err.message}`));
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// Handle process exit
|
|
123
|
+
child.on('exit', (code) => {
|
|
124
|
+
if (this.activeServer?.process === child) {
|
|
125
|
+
this.activeServer = null;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Wait for server to be ready with timeout
|
|
129
|
+
const ready = await Promise.race([
|
|
130
|
+
this.waitForServerReady(port, timeoutMs),
|
|
131
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout waiting for server on port ${port}`)), timeoutMs + TIMEOUTS.PORT_CHECK_INTERVAL)),
|
|
132
|
+
errorPromise.then(() => false)
|
|
133
|
+
]);
|
|
134
|
+
if (!ready) {
|
|
135
|
+
// Kill the process if it didn't start in time
|
|
136
|
+
try {
|
|
137
|
+
child.kill();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Ignore kill errors
|
|
141
|
+
}
|
|
142
|
+
throw new Error(`Dev server did not start within ${timeoutMs}ms on port ${port}`);
|
|
143
|
+
}
|
|
144
|
+
const url = `http://localhost:${port}`;
|
|
145
|
+
this.activeServer = {
|
|
146
|
+
process: child,
|
|
147
|
+
port,
|
|
148
|
+
url,
|
|
149
|
+
startTime: Date.now(),
|
|
150
|
+
};
|
|
52
151
|
return {
|
|
53
|
-
url
|
|
152
|
+
url,
|
|
54
153
|
port,
|
|
55
|
-
pid: 0,
|
|
154
|
+
pid: child.pid || 0,
|
|
56
155
|
ready: true,
|
|
57
156
|
startedAt: new Date().toISOString(),
|
|
58
157
|
};
|
|
59
158
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
cwd: projectDir,
|
|
65
|
-
shell: true,
|
|
66
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
67
|
-
windowsHide: true,
|
|
68
|
-
});
|
|
69
|
-
child.stdout?.on('data', (data) => {
|
|
70
|
-
// Optionally log or filter output
|
|
71
|
-
const text = data.toString();
|
|
72
|
-
// Vite prints local URL on stdout
|
|
73
|
-
if (text.includes('Local:')) {
|
|
74
|
-
const urlMatch = text.match(/http:\/\/localhost:\d+/);
|
|
75
|
-
if (urlMatch) {
|
|
76
|
-
// URL is confirmed
|
|
77
|
-
}
|
|
159
|
+
async stopServer() {
|
|
160
|
+
// If shutdown already in progress, return that promise
|
|
161
|
+
if (this.shutdownLock) {
|
|
162
|
+
return this.shutdownLock;
|
|
78
163
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
child.on('exit', (code) => {
|
|
88
|
-
if (activeServer?.process === child) {
|
|
89
|
-
activeServer = null;
|
|
164
|
+
const shutdownPromise = this.doStopServer();
|
|
165
|
+
this.shutdownLock = shutdownPromise;
|
|
166
|
+
try {
|
|
167
|
+
return await shutdownPromise;
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
this.shutdownLock = null;
|
|
90
171
|
}
|
|
91
|
-
});
|
|
92
|
-
// Wait for port to be ready
|
|
93
|
-
const ready = await waitForPort(port, 30000);
|
|
94
|
-
if (!ready) {
|
|
95
|
-
// Kill the process if it didn't start in time
|
|
96
|
-
child.kill();
|
|
97
|
-
throw new Error(`Dev server did not start within 30 seconds on port ${port}`);
|
|
98
|
-
}
|
|
99
|
-
const url = `http://localhost:${port}`;
|
|
100
|
-
activeServer = {
|
|
101
|
-
process: child,
|
|
102
|
-
port,
|
|
103
|
-
url,
|
|
104
|
-
startTime: Date.now(),
|
|
105
|
-
};
|
|
106
|
-
return {
|
|
107
|
-
url,
|
|
108
|
-
port,
|
|
109
|
-
pid: child.pid || 0,
|
|
110
|
-
ready: true,
|
|
111
|
-
startedAt: new Date().toISOString(),
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
async function stopServer() {
|
|
115
|
-
if (!activeServer) {
|
|
116
|
-
return { success: true, message: 'No active dev server to stop.' };
|
|
117
172
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// Try graceful shutdown first
|
|
122
|
-
const isWin = process.platform === 'win32';
|
|
123
|
-
if (isWin) {
|
|
124
|
-
spawn('taskkill', ['/pid', String(child.pid), '/f', '/t']);
|
|
173
|
+
async doStopServer() {
|
|
174
|
+
if (!this.activeServer) {
|
|
175
|
+
return { success: true, message: 'No active dev server to stop.' };
|
|
125
176
|
}
|
|
126
|
-
|
|
127
|
-
|
|
177
|
+
const child = this.activeServer.process;
|
|
178
|
+
const port = this.activeServer.port;
|
|
179
|
+
try {
|
|
180
|
+
// Try graceful shutdown first
|
|
181
|
+
const isWin = process.platform === 'win32';
|
|
182
|
+
if (isWin) {
|
|
183
|
+
spawn('taskkill', ['/pid', String(child.pid), '/f', '/t']);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
child.kill('SIGTERM');
|
|
187
|
+
}
|
|
188
|
+
// Wait for process to exit with timeout
|
|
189
|
+
await Promise.race([
|
|
190
|
+
new Promise((resolve) => {
|
|
191
|
+
child.on('exit', () => resolve());
|
|
192
|
+
}),
|
|
193
|
+
new Promise((resolve) => {
|
|
194
|
+
setTimeout(() => {
|
|
195
|
+
try {
|
|
196
|
+
child.kill('SIGKILL');
|
|
197
|
+
}
|
|
198
|
+
catch { }
|
|
199
|
+
resolve();
|
|
200
|
+
}, TIMEOUTS.SERVER_STOP_TIMEOUT);
|
|
201
|
+
})
|
|
202
|
+
]);
|
|
203
|
+
this.activeServer = null;
|
|
204
|
+
return {
|
|
205
|
+
success: true,
|
|
206
|
+
message: `Dev server on port ${port} stopped.`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
211
|
+
this.activeServer = null;
|
|
212
|
+
return {
|
|
213
|
+
success: false,
|
|
214
|
+
message: `Failed to stop dev server: ${errorMessage}`,
|
|
215
|
+
};
|
|
128
216
|
}
|
|
129
|
-
// Wait for process to exit
|
|
130
|
-
await new Promise((resolve) => {
|
|
131
|
-
const timeout = setTimeout(() => {
|
|
132
|
-
child.kill('SIGKILL');
|
|
133
|
-
resolve();
|
|
134
|
-
}, 5000);
|
|
135
|
-
child.on('exit', () => {
|
|
136
|
-
clearTimeout(timeout);
|
|
137
|
-
resolve();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
activeServer = null;
|
|
141
|
-
return {
|
|
142
|
-
success: true,
|
|
143
|
-
message: `Dev server on port ${port} stopped.`,
|
|
144
|
-
};
|
|
145
217
|
}
|
|
146
|
-
|
|
147
|
-
|
|
218
|
+
getServerStatus() {
|
|
219
|
+
if (!this.activeServer)
|
|
220
|
+
return null;
|
|
148
221
|
return {
|
|
149
|
-
|
|
150
|
-
|
|
222
|
+
url: this.activeServer.url,
|
|
223
|
+
port: this.activeServer.port,
|
|
224
|
+
pid: this.activeServer.process.pid || 0,
|
|
225
|
+
ready: this.activeServer.process.exitCode === null,
|
|
226
|
+
startedAt: new Date(this.activeServer.startTime).toISOString(),
|
|
151
227
|
};
|
|
152
228
|
}
|
|
153
229
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
230
|
+
// Backward compatibility exports
|
|
231
|
+
const manager = ServerManager.getInstance();
|
|
232
|
+
export async function startServer(projectDir, devCommand, port) {
|
|
233
|
+
return manager.startServer(projectDir, devCommand, port);
|
|
234
|
+
}
|
|
235
|
+
export async function stopServer() {
|
|
236
|
+
return manager.stopServer();
|
|
237
|
+
}
|
|
238
|
+
export function getServerStatus() {
|
|
239
|
+
return manager.getServerStatus();
|
|
164
240
|
}
|
|
165
|
-
export { startServer, stopServer, getServerStatus };
|
|
166
241
|
//# sourceMappingURL=serverManager.js.map
|