@sudu-cli/fronted-preview-mcp 1.0.0-beta.3 → 1.0.0-beta.4
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 +31 -0
- package/dist/handlers/autoFixLoop.js +120 -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.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/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
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Client } from 'chrome-remote-interface';
|
|
2
|
+
export interface CDPConnectionConfig {
|
|
3
|
+
maxRetries: number;
|
|
4
|
+
retryDelayMs: number;
|
|
5
|
+
connectionTimeoutMs: number;
|
|
6
|
+
enableConnectionPooling: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_CDP_CONFIG: CDPConnectionConfig;
|
|
9
|
+
export declare class CDPConnectionManager {
|
|
10
|
+
private static instance;
|
|
11
|
+
private pool;
|
|
12
|
+
private config;
|
|
13
|
+
private connecting;
|
|
14
|
+
private constructor();
|
|
15
|
+
static getInstance(config?: CDPConnectionConfig): CDPConnectionManager;
|
|
16
|
+
static resetInstance(): void;
|
|
17
|
+
getConnection(port: number): Promise<Client>;
|
|
18
|
+
private createConnectionWithRetry;
|
|
19
|
+
private createConnection;
|
|
20
|
+
private isConnectionHealthy;
|
|
21
|
+
releaseConnection(port: number): void;
|
|
22
|
+
closeConnection(port: number): Promise<void>;
|
|
23
|
+
closeAll(): Promise<void>;
|
|
24
|
+
private sleep;
|
|
25
|
+
getPoolStats(): Record<number, {
|
|
26
|
+
total: number;
|
|
27
|
+
inUse: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export interface CDPEventHandlers {
|
|
31
|
+
onLogEntryAdded?: (params: {
|
|
32
|
+
entry: LogEntry;
|
|
33
|
+
}) => void;
|
|
34
|
+
onNetworkResponseReceived?: (params: {
|
|
35
|
+
response: NetworkResponse;
|
|
36
|
+
}) => void;
|
|
37
|
+
onNetworkLoadingFailed?: (params: {
|
|
38
|
+
requestId: string;
|
|
39
|
+
errorText: string;
|
|
40
|
+
}) => void;
|
|
41
|
+
onPageLoadEventFired?: (params: {
|
|
42
|
+
timestamp: number;
|
|
43
|
+
}) => void;
|
|
44
|
+
}
|
|
45
|
+
export interface LogEntry {
|
|
46
|
+
level: 'log' | 'error' | 'warning' | 'info' | 'debug';
|
|
47
|
+
text: string;
|
|
48
|
+
url?: string;
|
|
49
|
+
lineNumber?: number;
|
|
50
|
+
columnNumber?: number;
|
|
51
|
+
stackTrace?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface NetworkResponse {
|
|
54
|
+
url: string;
|
|
55
|
+
status: number;
|
|
56
|
+
requestMethod?: string;
|
|
57
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import CDP from 'chrome-remote-interface';
|
|
2
|
+
export const DEFAULT_CDP_CONFIG = {
|
|
3
|
+
maxRetries: 3,
|
|
4
|
+
retryDelayMs: 1000,
|
|
5
|
+
connectionTimeoutMs: 10000,
|
|
6
|
+
enableConnectionPooling: true,
|
|
7
|
+
};
|
|
8
|
+
export class CDPConnectionManager {
|
|
9
|
+
static instance = null;
|
|
10
|
+
pool = new Map();
|
|
11
|
+
config;
|
|
12
|
+
connecting = new Map();
|
|
13
|
+
constructor(config = DEFAULT_CDP_CONFIG) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
static getInstance(config) {
|
|
17
|
+
if (!CDPConnectionManager.instance) {
|
|
18
|
+
CDPConnectionManager.instance = new CDPConnectionManager(config);
|
|
19
|
+
}
|
|
20
|
+
return CDPConnectionManager.instance;
|
|
21
|
+
}
|
|
22
|
+
static resetInstance() {
|
|
23
|
+
CDPConnectionManager.instance = null;
|
|
24
|
+
}
|
|
25
|
+
async getConnection(port) {
|
|
26
|
+
// If pooling disabled, create new connection each time
|
|
27
|
+
if (!this.config.enableConnectionPooling) {
|
|
28
|
+
return this.createConnectionWithRetry(port);
|
|
29
|
+
}
|
|
30
|
+
// Check for available pooled connection
|
|
31
|
+
const pool = this.pool.get(port) || [];
|
|
32
|
+
const available = pool.find(c => !c.inUse && this.isConnectionHealthy(c.client));
|
|
33
|
+
if (available) {
|
|
34
|
+
available.inUse = true;
|
|
35
|
+
return available.client;
|
|
36
|
+
}
|
|
37
|
+
// Check if connection is already being created
|
|
38
|
+
const existing = this.connecting.get(port);
|
|
39
|
+
if (existing) {
|
|
40
|
+
return existing;
|
|
41
|
+
}
|
|
42
|
+
// Create new connection with retry
|
|
43
|
+
const connectionPromise = this.createConnectionWithRetry(port);
|
|
44
|
+
this.connecting.set(port, connectionPromise);
|
|
45
|
+
try {
|
|
46
|
+
const client = await connectionPromise;
|
|
47
|
+
return client;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
this.connecting.delete(port);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async createConnectionWithRetry(port) {
|
|
54
|
+
let lastError = null;
|
|
55
|
+
for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
|
|
56
|
+
try {
|
|
57
|
+
const client = await this.createConnection(port);
|
|
58
|
+
return client;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
62
|
+
if (attempt < this.config.maxRetries) {
|
|
63
|
+
const delay = this.config.retryDelayMs * Math.pow(2, attempt);
|
|
64
|
+
await this.sleep(delay);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`Failed to connect to Chrome DevTools Protocol on port ${port} after ${this.config.maxRetries + 1} attempts. ` +
|
|
69
|
+
`Last error: ${lastError?.message}. Ensure Chrome is running with --remote-debugging-port=${port}`);
|
|
70
|
+
}
|
|
71
|
+
async createConnection(port) {
|
|
72
|
+
const options = { port };
|
|
73
|
+
// Create connection with timeout
|
|
74
|
+
const connectionPromise = CDP(options);
|
|
75
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
76
|
+
setTimeout(() => reject(new Error(`CDP connection timeout after ${this.config.connectionTimeoutMs}ms`)), this.config.connectionTimeoutMs);
|
|
77
|
+
});
|
|
78
|
+
const client = await Promise.race([connectionPromise, timeoutPromise]);
|
|
79
|
+
// Verify connection is working
|
|
80
|
+
await client.send('Browser.getVersion');
|
|
81
|
+
return client;
|
|
82
|
+
}
|
|
83
|
+
isConnectionHealthy(client) {
|
|
84
|
+
try {
|
|
85
|
+
// Check if client is still connected
|
|
86
|
+
return client !== null && typeof client.close === 'function';
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
releaseConnection(port) {
|
|
93
|
+
const pool = this.pool.get(port);
|
|
94
|
+
if (!pool)
|
|
95
|
+
return;
|
|
96
|
+
const connection = pool.find(c => c.inUse);
|
|
97
|
+
if (connection) {
|
|
98
|
+
connection.inUse = false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async closeConnection(port) {
|
|
102
|
+
const pool = this.pool.get(port);
|
|
103
|
+
if (!pool)
|
|
104
|
+
return;
|
|
105
|
+
for (const conn of pool) {
|
|
106
|
+
if (!conn.inUse) {
|
|
107
|
+
try {
|
|
108
|
+
await conn.client.close();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Ignore cleanup errors
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Remove only non-in-use connections
|
|
116
|
+
const remaining = pool.filter(c => c.inUse);
|
|
117
|
+
if (remaining.length === 0) {
|
|
118
|
+
this.pool.delete(port);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.pool.set(port, remaining);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async closeAll() {
|
|
125
|
+
for (const [port, pool] of this.pool.entries()) {
|
|
126
|
+
for (const conn of pool) {
|
|
127
|
+
try {
|
|
128
|
+
await conn.client.close();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Ignore cleanup errors
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
this.pool.clear();
|
|
136
|
+
this.connecting.clear();
|
|
137
|
+
}
|
|
138
|
+
sleep(ms) {
|
|
139
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
140
|
+
}
|
|
141
|
+
// For testing/debugging
|
|
142
|
+
getPoolStats() {
|
|
143
|
+
const stats = {};
|
|
144
|
+
for (const [port, pool] of this.pool.entries()) {
|
|
145
|
+
stats[port] = {
|
|
146
|
+
total: pool.length,
|
|
147
|
+
inUse: pool.filter(c => c.inUse).length,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return stats;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=connectionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionManager.js","sourceRoot":"","sources":["../../src/cdp/connectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,GAAkC,MAAM,yBAAyB,CAAC;AASzE,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,KAAK;IAC1B,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AASF,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAC,QAAQ,GAAgC,IAAI,CAAC;IACpD,IAAI,GAAoC,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,CAAsB;IAC5B,UAAU,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE7D,YAAoB,SAA8B,kBAAkB;QAClE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAA4B;QAC7C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACnC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,oBAAoB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,uDAAuD;QACvD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,wCAAwC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;YACvB,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,CAAC;QAED,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,mCAAmC;QACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACvC,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,IAAY;QAClD,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACjD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEhE,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC9D,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CACb,yDAAyD,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,aAAa;YAC9G,eAAe,SAAS,EAAE,OAAO,2DAA2D,IAAI,EAAE,CACnG,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACzC,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,CAAC;QAElC,iCAAiC;QACjC,MAAM,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC5I,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;QAEvE,+BAA+B;QAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAExC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,mBAAmB,CAAC,MAAc;QACxC,IAAI,CAAC;YACH,qCAAqC;YACrC,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,YAAY;QACV,MAAM,KAAK,GAAqD,EAAE,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,GAAG;gBACZ,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM;aACxC,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { main as runMcpServer } from './index.js';
|
|
3
|
+
import { VERSION } from './version.js';
|
|
3
4
|
async function showHelp() {
|
|
4
5
|
console.log(`
|
|
5
|
-
@sudu-cli/fronted-preview-mcp
|
|
6
|
+
@sudu-cli/fronted-preview-mcp v${VERSION} — Frontend preview MCP server
|
|
6
7
|
|
|
7
8
|
USAGE:
|
|
8
9
|
fronted-preview-mcp Start MCP server (stdio — used by opencode)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC;iCACmB,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuBvC,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,2BAA2B;QAC3B,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const TIMEOUTS: {
|
|
2
|
+
readonly DEV_SERVER_START: 30000;
|
|
3
|
+
readonly DEV_SERVER_STOP: 5000;
|
|
4
|
+
readonly CDP_CONNECTION: 10000;
|
|
5
|
+
readonly CDP_CONNECTION_RETRY_DELAY: 1000;
|
|
6
|
+
readonly CDP_MAX_RETRIES: 3;
|
|
7
|
+
readonly PAGE_LOAD_DEFAULT: 3000;
|
|
8
|
+
readonly PAGE_LOAD_EXTRA: 1000;
|
|
9
|
+
readonly AUTO_FIX_ITERATION: 30000;
|
|
10
|
+
readonly AUTO_FIX_INITIAL_WAIT: 2000;
|
|
11
|
+
readonly AUTO_FIX_MAX_ITERATIONS: 3;
|
|
12
|
+
readonly AUTO_FIX_MAX_ITERATION_LIMIT: 10;
|
|
13
|
+
readonly AUTO_FIX_ITERATION_TIMEOUT_MIN: 1000;
|
|
14
|
+
readonly AUTO_FIX_ITERATION_TIMEOUT_MAX: 120000;
|
|
15
|
+
readonly SERVER_START_TIMEOUT: 30000;
|
|
16
|
+
readonly SERVER_STOP_TIMEOUT: 5000;
|
|
17
|
+
readonly PORT_CHECK_INTERVAL: 500;
|
|
18
|
+
};
|
|
19
|
+
export type TimeoutKey = keyof typeof TIMEOUTS;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Centralized timeout constants
|
|
2
|
+
export const TIMEOUTS = {
|
|
3
|
+
// Dev server timeouts
|
|
4
|
+
DEV_SERVER_START: 30000,
|
|
5
|
+
DEV_SERVER_STOP: 5000,
|
|
6
|
+
// CDP connection timeouts
|
|
7
|
+
CDP_CONNECTION: 10000,
|
|
8
|
+
CDP_CONNECTION_RETRY_DELAY: 1000,
|
|
9
|
+
CDP_MAX_RETRIES: 3,
|
|
10
|
+
// Page load timeouts
|
|
11
|
+
PAGE_LOAD_DEFAULT: 3000,
|
|
12
|
+
PAGE_LOAD_EXTRA: 1000,
|
|
13
|
+
// Auto-fix loop timeouts
|
|
14
|
+
AUTO_FIX_ITERATION: 30000,
|
|
15
|
+
AUTO_FIX_INITIAL_WAIT: 2000,
|
|
16
|
+
AUTO_FIX_MAX_ITERATIONS: 3,
|
|
17
|
+
AUTO_FIX_MAX_ITERATION_LIMIT: 10,
|
|
18
|
+
AUTO_FIX_ITERATION_TIMEOUT_MIN: 1000,
|
|
19
|
+
AUTO_FIX_ITERATION_TIMEOUT_MAX: 120000,
|
|
20
|
+
// Server manager timeouts
|
|
21
|
+
SERVER_START_TIMEOUT: 30000,
|
|
22
|
+
SERVER_STOP_TIMEOUT: 5000,
|
|
23
|
+
// Port check interval
|
|
24
|
+
PORT_CHECK_INTERVAL: 500,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,sBAAsB;IACtB,gBAAgB,EAAE,KAAK;IACvB,eAAe,EAAE,IAAI;IAErB,0BAA0B;IAC1B,cAAc,EAAE,KAAK;IACrB,0BAA0B,EAAE,IAAI;IAChC,eAAe,EAAE,CAAC;IAElB,qBAAqB;IACrB,iBAAiB,EAAE,IAAI;IACvB,eAAe,EAAE,IAAI;IAErB,yBAAyB;IACzB,kBAAkB,EAAE,KAAK;IACzB,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,CAAC;IAC1B,4BAA4B,EAAE,EAAE;IAChC,8BAA8B,EAAE,IAAI;IACpC,8BAA8B,EAAE,MAAM;IAEtC,0BAA0B;IAC1B,oBAAoB,EAAE,KAAK;IAC3B,mBAAmB,EAAE,IAAI;IAEzB,sBAAsB;IACtB,mBAAmB,EAAE,GAAG;CAChB,CAAC"}
|
|
@@ -74,18 +74,13 @@ async function detectFramework(projectDir) {
|
|
|
74
74
|
const scripts = pkg.scripts || {};
|
|
75
75
|
const projectName = pkg.name || path.basename(projectDir);
|
|
76
76
|
const hasNodeModules = await fileExists(path.join(projectDir, 'node_modules'));
|
|
77
|
-
// Check
|
|
77
|
+
// Priority 1: Check dependencies (most reliable - what actually runs)
|
|
78
78
|
for (const cfg of FRAMEWORK_CONFIGS) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const configPath = path.join(projectDir, configFile);
|
|
82
|
-
if (await fileExists(configPath)) {
|
|
83
|
-
// Read config to extract custom port
|
|
84
|
-
const content = await fs.readFile(configPath, 'utf-8');
|
|
85
|
-
const customPort = extractPortFromConfig(content);
|
|
79
|
+
for (const key of cfg.depKeys) {
|
|
80
|
+
if (allDeps[key]) {
|
|
86
81
|
return {
|
|
87
82
|
framework: cfg.framework,
|
|
88
|
-
port:
|
|
83
|
+
port: cfg.port,
|
|
89
84
|
devCommand: findDevCommand(scripts, cfg.framework),
|
|
90
85
|
devScript: findDevScriptName(scripts),
|
|
91
86
|
projectName,
|
|
@@ -94,12 +89,21 @@ async function detectFramework(projectDir) {
|
|
|
94
89
|
};
|
|
95
90
|
}
|
|
96
91
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
92
|
+
}
|
|
93
|
+
// Priority 2: Check config files as confirmation (but only if dependency also exists)
|
|
94
|
+
for (const cfg of FRAMEWORK_CONFIGS) {
|
|
95
|
+
const hasDep = cfg.depKeys.some(key => allDeps[key]);
|
|
96
|
+
if (!hasDep)
|
|
97
|
+
continue; // Skip config check if no matching dependency
|
|
98
|
+
for (const configFile of cfg.configFiles) {
|
|
99
|
+
const configPath = path.join(projectDir, configFile);
|
|
100
|
+
if (await fileExists(configPath)) {
|
|
101
|
+
// Read config to extract custom port
|
|
102
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
103
|
+
const customPort = extractPortFromConfig(content);
|
|
100
104
|
return {
|
|
101
105
|
framework: cfg.framework,
|
|
102
|
-
port: cfg.port,
|
|
106
|
+
port: customPort ?? cfg.port,
|
|
103
107
|
devCommand: findDevCommand(scripts, cfg.framework),
|
|
104
108
|
devScript: findDevScriptName(scripts),
|
|
105
109
|
projectName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frameworkDetector.js","sourceRoot":"","sources":["../../src/detectors/frameworkDetector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"frameworkDetector.js","sourceRoot":"","sources":["../../src/detectors/frameworkDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { ToolContext } from '../types.js';
|
|
2
|
+
export interface FixStrategy {
|
|
3
|
+
errorType: 'typescript' | 'console' | 'network';
|
|
4
|
+
pattern: RegExp;
|
|
5
|
+
fix: (context: ToolContext, error: ConsoleError | TSDiagnostic) => Promise<FixResult>;
|
|
6
|
+
}
|
|
7
|
+
export interface FixResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
message: string;
|
|
10
|
+
changes?: Array<{
|
|
11
|
+
file: string;
|
|
12
|
+
description: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
2
15
|
export interface AutoFixOptions {
|
|
3
16
|
maxIterations?: number;
|
|
4
17
|
timeoutPerIteration?: number;
|
|
5
18
|
stopOnSuccess?: boolean;
|
|
6
19
|
targetErrors?: string[];
|
|
20
|
+
fixAction?: 'auto' | 'suggest' | 'none';
|
|
21
|
+
fixStrategies?: FixStrategy[];
|
|
7
22
|
}
|
|
8
23
|
export interface AutoFixResult {
|
|
9
24
|
success: boolean;
|
|
@@ -12,6 +27,22 @@ export interface AutoFixResult {
|
|
|
12
27
|
errorsRemaining: number;
|
|
13
28
|
messages: string[];
|
|
14
29
|
errors: string[];
|
|
30
|
+
fixesApplied: FixResult[];
|
|
31
|
+
}
|
|
32
|
+
interface ConsoleError {
|
|
33
|
+
type: string;
|
|
34
|
+
message: string;
|
|
35
|
+
url?: string;
|
|
36
|
+
lineNumber?: number;
|
|
37
|
+
stackTrace?: string;
|
|
38
|
+
}
|
|
39
|
+
interface TSDiagnostic {
|
|
40
|
+
message: string;
|
|
41
|
+
severity: string;
|
|
42
|
+
file?: string;
|
|
43
|
+
line?: number;
|
|
44
|
+
column?: number;
|
|
15
45
|
}
|
|
16
46
|
export declare function autoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
|
|
17
47
|
export declare function handleAutoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
|
|
48
|
+
export {};
|
|
@@ -1,14 +1,120 @@
|
|
|
1
1
|
import { handleCheckPageErrors } from './checkPageErrors.js';
|
|
2
2
|
import { handleGetTypeScriptDiagnostics } from './typescriptDiagnostics.js';
|
|
3
|
+
import { TIMEOUTS } from '../constants.js';
|
|
4
|
+
function parseCheckPageErrorsResponse(response) {
|
|
5
|
+
try {
|
|
6
|
+
const text = response.content[0]?.text || '{}';
|
|
7
|
+
const data = JSON.parse(text);
|
|
8
|
+
return {
|
|
9
|
+
errors: data.consoleMessages?.filter((m) => m.type === 'error') || [],
|
|
10
|
+
diagnostics: []
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return { errors: [], diagnostics: [] };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function parseTSDiagnosticsResponse(response) {
|
|
18
|
+
try {
|
|
19
|
+
const text = response.content[0]?.text || '{}';
|
|
20
|
+
const data = JSON.parse(text);
|
|
21
|
+
return {
|
|
22
|
+
errors: [],
|
|
23
|
+
diagnostics: data.diagnostics || []
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { errors: [], diagnostics: [] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
3
30
|
export async function autoFixLoop(context, options = {}) {
|
|
4
|
-
const { maxIterations =
|
|
31
|
+
const { maxIterations = TIMEOUTS.AUTO_FIX_MAX_ITERATIONS, timeoutPerIteration = TIMEOUTS.AUTO_FIX_ITERATION, stopOnSuccess = true, targetErrors = [], fixAction = 'suggest', fixStrategies = [] } = options;
|
|
5
32
|
const result = {
|
|
6
33
|
success: false,
|
|
7
34
|
iterations: 0,
|
|
8
35
|
errorsFixed: 0,
|
|
9
36
|
errorsRemaining: 0,
|
|
10
37
|
messages: [],
|
|
11
|
-
errors: []
|
|
38
|
+
errors: [],
|
|
39
|
+
fixesApplied: []
|
|
40
|
+
};
|
|
41
|
+
// Default fix strategies for common errors
|
|
42
|
+
const defaultStrategies = [
|
|
43
|
+
{
|
|
44
|
+
errorType: 'typescript',
|
|
45
|
+
pattern: /Unused variable|unused import/i,
|
|
46
|
+
fix: async (ctx, error) => {
|
|
47
|
+
// Remove unused imports/variables via ts-morph
|
|
48
|
+
return { success: false, message: 'Unused import removal requires ts-morph integration' };
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
errorType: 'typescript',
|
|
53
|
+
pattern: /Property '(.+)' does not exist on type/i,
|
|
54
|
+
fix: async (ctx, error) => {
|
|
55
|
+
// Suggest adding missing property or type assertion
|
|
56
|
+
return { success: false, message: 'Missing property fix requires AST manipulation' };
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
errorType: 'typescript',
|
|
61
|
+
pattern: /Type '(.+)' is not assignable to type/i,
|
|
62
|
+
fix: async (ctx, error) => {
|
|
63
|
+
return { success: false, message: 'Type assignment fix requires type inference' };
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
errorType: 'console',
|
|
68
|
+
pattern: /Cannot read propert(?:y|ies) of (?:null|undefined)/i,
|
|
69
|
+
fix: async (ctx, error) => {
|
|
70
|
+
return { success: false, message: 'Null check insertion requires AST analysis' };
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
errorType: 'console',
|
|
75
|
+
pattern: /is not defined/i,
|
|
76
|
+
fix: async (ctx, error) => {
|
|
77
|
+
return { success: false, message: 'Missing import/definition fix requires module analysis' };
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
errorType: 'network',
|
|
82
|
+
pattern: /Failed to fetch|Network Error|ECONNREFUSED/i,
|
|
83
|
+
fix: async (ctx, error) => {
|
|
84
|
+
return { success: false, message: 'Network errors typically require backend/server fixes' };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
const strategies = [...defaultStrategies, ...fixStrategies];
|
|
89
|
+
// Helper to find matching strategy
|
|
90
|
+
const findStrategy = (error) => {
|
|
91
|
+
const errorMsg = error.message || String(error);
|
|
92
|
+
return strategies.find(s => s.pattern.test(errorMsg));
|
|
93
|
+
};
|
|
94
|
+
// Helper to apply fix strategies
|
|
95
|
+
const applyFixes = async (errors) => {
|
|
96
|
+
const fixes = [];
|
|
97
|
+
for (const error of errors) {
|
|
98
|
+
const strategy = findStrategy(error);
|
|
99
|
+
if (strategy && fixAction !== 'none') {
|
|
100
|
+
try {
|
|
101
|
+
const fixResult = await strategy.fix(context, error);
|
|
102
|
+
fixes.push(fixResult);
|
|
103
|
+
if (fixResult.success) {
|
|
104
|
+
result.messages.push(`✅ Fixed: ${fixResult.message}`);
|
|
105
|
+
result.errorsFixed++;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
result.messages.push(`💡 Suggestion: ${fixResult.message}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
113
|
+
result.errors.push(`Fix failed for "${error.message}": ${msg}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return fixes;
|
|
12
118
|
};
|
|
13
119
|
// Check initial state
|
|
14
120
|
const initialConsoleErrors = await handleCheckPageErrors(context);
|
|
@@ -27,7 +133,7 @@ export async function autoFixLoop(context, options = {}) {
|
|
|
27
133
|
result.messages.push(`=== Iteration ${iteration + 1} ===`);
|
|
28
134
|
try {
|
|
29
135
|
// Wait for any pending operations
|
|
30
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
136
|
+
await new Promise(resolve => setTimeout(resolve, TIMEOUTS.AUTO_FIX_INITIAL_WAIT));
|
|
31
137
|
// Check current state
|
|
32
138
|
const currentErrors = await handleCheckPageErrors(context);
|
|
33
139
|
const currentDiagnostics = await handleGetTypeScriptDiagnostics(context);
|
|
@@ -48,6 +154,16 @@ export async function autoFixLoop(context, options = {}) {
|
|
|
48
154
|
result.messages.push(`✅ All errors fixed after ${iteration + 1} iterations`);
|
|
49
155
|
break;
|
|
50
156
|
}
|
|
157
|
+
// Apply fix strategies if we have errors and fixAction is not 'none'
|
|
158
|
+
if (currentErrorCount > 0 && fixAction !== 'none') {
|
|
159
|
+
result.messages.push(`Attempting fixes for ${currentErrorCount} errors...`);
|
|
160
|
+
const allErrors = [
|
|
161
|
+
...currentConsoleErrors.map(e => ({ ...e, _type: 'console' })),
|
|
162
|
+
...currentTsDiagnostics.map(d => ({ ...d, _type: 'typescript' }))
|
|
163
|
+
];
|
|
164
|
+
const fixes = await applyFixes(allErrors);
|
|
165
|
+
result.fixesApplied.push(...fixes);
|
|
166
|
+
}
|
|
51
167
|
// Log current state
|
|
52
168
|
result.messages.push(`Current errors: ${currentErrorCount} (fixed: ${errorsFixed})`);
|
|
53
169
|
if (currentConsoleErrors.length > 0) {
|
|
@@ -67,7 +183,7 @@ export async function autoFixLoop(context, options = {}) {
|
|
|
67
183
|
result.messages.push('No errors found, but continuing to next iteration');
|
|
68
184
|
}
|
|
69
185
|
// Wait before next iteration
|
|
70
|
-
await new Promise(resolve => setTimeout(resolve, timeoutPerIteration));
|
|
186
|
+
await new Promise(resolve => setTimeout(resolve, timeoutPerIteration ?? TIMEOUTS.AUTO_FIX_ITERATION));
|
|
71
187
|
}
|
|
72
188
|
catch (error) {
|
|
73
189
|
const errorMessage = `Error in iteration ${iteration + 1}: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoFixLoop.js","sourceRoot":"","sources":["../../src/handlers/autoFixLoop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"autoFixLoop.js","sourceRoot":"","sources":["../../src/handlers/autoFixLoop.ts"],"names":[],"mappings":"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"}
|