@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.
Files changed (62) hide show
  1. package/dist/cdp/connectionManager.d.ts +57 -0
  2. package/dist/cdp/connectionManager.js +153 -0
  3. package/dist/cdp/connectionManager.js.map +1 -0
  4. package/dist/cli.js +2 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/constants.d.ts +19 -0
  7. package/dist/constants.js +26 -0
  8. package/dist/constants.js.map +1 -0
  9. package/dist/detectors/frameworkDetector.js +17 -13
  10. package/dist/detectors/frameworkDetector.js.map +1 -1
  11. package/dist/handlers/autoFixLoop.d.ts +24 -0
  12. package/dist/handlers/autoFixLoop.js +81 -4
  13. package/dist/handlers/autoFixLoop.js.map +1 -1
  14. package/dist/handlers/checkPageErrors.js +11 -50
  15. package/dist/handlers/checkPageErrors.js.map +1 -1
  16. package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
  17. package/dist/handlers/typescriptDiagnostics.js +4 -25
  18. package/dist/handlers/typescriptDiagnostics.js.map +1 -1
  19. package/dist/index.js +15 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/serverManager.d.ts +22 -4
  22. package/dist/serverManager.js +215 -140
  23. package/dist/serverManager.js.map +1 -1
  24. package/dist/strategies/baseStrategy.d.ts +27 -0
  25. package/dist/strategies/baseStrategy.js +23 -0
  26. package/dist/strategies/baseStrategy.js.map +1 -0
  27. package/dist/strategies/index.d.ts +9 -0
  28. package/dist/strategies/index.js +22 -0
  29. package/dist/strategies/index.js.map +1 -0
  30. package/dist/strategies/missingImport.d.ts +16 -0
  31. package/dist/strategies/missingImport.js +156 -0
  32. package/dist/strategies/missingImport.js.map +1 -0
  33. package/dist/strategies/missingProperty.d.ts +13 -0
  34. package/dist/strategies/missingProperty.js +134 -0
  35. package/dist/strategies/missingProperty.js.map +1 -0
  36. package/dist/strategies/networkError.d.ts +10 -0
  37. package/dist/strategies/networkError.js +56 -0
  38. package/dist/strategies/networkError.js.map +1 -0
  39. package/dist/strategies/nullCheckInsertion.d.ts +14 -0
  40. package/dist/strategies/nullCheckInsertion.js +138 -0
  41. package/dist/strategies/nullCheckInsertion.js.map +1 -0
  42. package/dist/strategies/typeAssignment.d.ts +13 -0
  43. package/dist/strategies/typeAssignment.js +121 -0
  44. package/dist/strategies/typeAssignment.js.map +1 -0
  45. package/dist/strategies/unusedImportRemoval.d.ts +11 -0
  46. package/dist/strategies/unusedImportRemoval.js +138 -0
  47. package/dist/strategies/unusedImportRemoval.js.map +1 -0
  48. package/dist/types.d.ts +9 -0
  49. package/dist/types.js +21 -1
  50. package/dist/types.js.map +1 -1
  51. package/dist/version.d.ts +7 -0
  52. package/dist/version.js +10 -0
  53. package/dist/version.js.map +1 -0
  54. package/package.json +1 -1
  55. package/templates/init/instructions.md +1 -11
  56. package/templates/init/opencode.json +1 -1
  57. package/dist/handlers/pickElement.d.ts +0 -10
  58. package/dist/handlers/pickElement.js +0 -413
  59. package/dist/handlers/pickElement.js.map +0 -1
  60. package/dist/handlers/takeScreenshot.d.ts +0 -17
  61. package/dist/handlers/takeScreenshot.js +0 -83
  62. 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 v1.0.0 — Frontend preview MCP server
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;AAElD,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBb,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"}
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 each framework in priority order
77
+ // Priority 1: Check dependencies (most reliable - what actually runs)
78
78
  for (const cfg of FRAMEWORK_CONFIGS) {
79
- // Check config files
80
- for (const configFile of cfg.configFiles) {
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: customPort ?? cfg.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
- // Check dependencies
98
- for (const key of cfg.depKeys) {
99
- if (allDeps[key]) {
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,25 @@
1
1
  import { ToolContext } from '../types.js';
2
+ export interface FixStrategy {
3
+ errorType: 'typescript' | 'console' | 'network';
4
+ pattern: RegExp;
5
+ canFix(error: any): boolean;
6
+ fix(context: any, error: any): Promise<FixResult>;
7
+ }
8
+ export interface FixResult {
9
+ success: boolean;
10
+ message: string;
11
+ changes?: Array<{
12
+ file: string;
13
+ description: string;
14
+ }>;
15
+ }
2
16
  export interface AutoFixOptions {
3
17
  maxIterations?: number;
4
18
  timeoutPerIteration?: number;
5
19
  stopOnSuccess?: boolean;
6
20
  targetErrors?: string[];
21
+ fixAction?: 'auto' | 'suggest' | 'none';
22
+ fixStrategies?: FixStrategy[];
7
23
  }
8
24
  export interface AutoFixResult {
9
25
  success: boolean;
@@ -12,6 +28,14 @@ export interface AutoFixResult {
12
28
  errorsRemaining: number;
13
29
  messages: string[];
14
30
  errors: string[];
31
+ fixesApplied: FixResult[];
32
+ }
33
+ export interface ConsoleError {
34
+ type: string;
35
+ message: string;
36
+ url?: string;
37
+ lineNumber?: number;
38
+ stackTrace?: string;
15
39
  }
16
40
  export declare function autoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
17
41
  export declare function handleAutoFixLoop(context: ToolContext, options?: AutoFixOptions): Promise<AutoFixResult>;
@@ -1,14 +1,81 @@
1
1
  import { handleCheckPageErrors } from './checkPageErrors.js';
2
2
  import { handleGetTypeScriptDiagnostics } from './typescriptDiagnostics.js';
3
+ import { TIMEOUTS } from '../constants.js';
4
+ import { createFixContext, defaultFixStrategies } from '../strategies/index.js';
5
+ import * as path from 'node:path';
6
+ function parseCheckPageErrorsResponse(response) {
7
+ try {
8
+ const text = response.content[0]?.text || '{}';
9
+ const data = JSON.parse(text);
10
+ return {
11
+ errors: data.consoleMessages?.filter((m) => m.type === 'error') || [],
12
+ diagnostics: []
13
+ };
14
+ }
15
+ catch {
16
+ return { errors: [], diagnostics: [] };
17
+ }
18
+ }
19
+ function parseTSDiagnosticsResponse(response) {
20
+ try {
21
+ const text = response.content[0]?.text || '{}';
22
+ const data = JSON.parse(text);
23
+ return {
24
+ errors: [],
25
+ diagnostics: data.diagnostics || []
26
+ };
27
+ }
28
+ catch {
29
+ return { errors: [], diagnostics: [] };
30
+ }
31
+ }
3
32
  export async function autoFixLoop(context, options = {}) {
4
- const { maxIterations = 3, timeoutPerIteration = 30000, stopOnSuccess = true, targetErrors = [] } = options;
33
+ const { maxIterations = TIMEOUTS.AUTO_FIX_MAX_ITERATIONS, timeoutPerIteration = TIMEOUTS.AUTO_FIX_ITERATION, stopOnSuccess = true, targetErrors = [], fixAction = 'suggest', fixStrategies = [] } = options;
5
34
  const result = {
6
35
  success: false,
7
36
  iterations: 0,
8
37
  errorsFixed: 0,
9
38
  errorsRemaining: 0,
10
39
  messages: [],
11
- errors: []
40
+ errors: [],
41
+ fixesApplied: []
42
+ };
43
+ // Use real fix strategies instead of stubs
44
+ const defaultStrategies = defaultFixStrategies;
45
+ const strategies = [...defaultStrategies, ...fixStrategies];
46
+ // Helper to find matching strategy
47
+ const findStrategy = (error) => {
48
+ const errorMsg = error.message || String(error);
49
+ return strategies.find(s => s.pattern.test(errorMsg) && s.canFix(error));
50
+ };
51
+ // Helper to apply fix strategies
52
+ const applyFixes = async (errors) => {
53
+ const fixes = [];
54
+ for (const error of errors) {
55
+ const strategy = findStrategy(error);
56
+ if (strategy && fixAction !== 'none') {
57
+ try {
58
+ // Create fix context for ts-morph strategies
59
+ const projectDir = context.projectDir || process.cwd();
60
+ const tsConfigPath = path.resolve(projectDir, 'tsconfig.json');
61
+ const fixContext = createFixContext(projectDir, tsConfigPath);
62
+ const fixResult = await strategy.fix(fixContext, error);
63
+ fixes.push(fixResult);
64
+ if (fixResult.success) {
65
+ result.messages.push(`✅ Fixed: ${fixResult.message}`);
66
+ result.errorsFixed++;
67
+ }
68
+ else {
69
+ result.messages.push(`💡 Suggestion: ${fixResult.message}`);
70
+ }
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ result.errors.push(`Fix failed for "${error.message}": ${msg}`);
75
+ }
76
+ }
77
+ }
78
+ return fixes;
12
79
  };
13
80
  // Check initial state
14
81
  const initialConsoleErrors = await handleCheckPageErrors(context);
@@ -27,7 +94,7 @@ export async function autoFixLoop(context, options = {}) {
27
94
  result.messages.push(`=== Iteration ${iteration + 1} ===`);
28
95
  try {
29
96
  // Wait for any pending operations
30
- await new Promise(resolve => setTimeout(resolve, 2000));
97
+ await new Promise(resolve => setTimeout(resolve, TIMEOUTS.AUTO_FIX_INITIAL_WAIT));
31
98
  // Check current state
32
99
  const currentErrors = await handleCheckPageErrors(context);
33
100
  const currentDiagnostics = await handleGetTypeScriptDiagnostics(context);
@@ -48,6 +115,16 @@ export async function autoFixLoop(context, options = {}) {
48
115
  result.messages.push(`✅ All errors fixed after ${iteration + 1} iterations`);
49
116
  break;
50
117
  }
118
+ // Apply fix strategies if we have errors and fixAction is not 'none'
119
+ if (currentErrorCount > 0 && fixAction !== 'none') {
120
+ result.messages.push(`Attempting fixes for ${currentErrorCount} errors...`);
121
+ const allErrors = [
122
+ ...currentConsoleErrors.map(e => ({ ...e, _type: 'console' })),
123
+ ...currentTsDiagnostics.map(d => ({ ...d, _type: 'typescript' }))
124
+ ];
125
+ const fixes = await applyFixes(allErrors);
126
+ result.fixesApplied.push(...fixes);
127
+ }
51
128
  // Log current state
52
129
  result.messages.push(`Current errors: ${currentErrorCount} (fixed: ${errorsFixed})`);
53
130
  if (currentConsoleErrors.length > 0) {
@@ -67,7 +144,7 @@ export async function autoFixLoop(context, options = {}) {
67
144
  result.messages.push('No errors found, but continuing to next iteration');
68
145
  }
69
146
  // Wait before next iteration
70
- await new Promise(resolve => setTimeout(resolve, timeoutPerIteration));
147
+ await new Promise(resolve => setTimeout(resolve, timeoutPerIteration ?? TIMEOUTS.AUTO_FIX_ITERATION));
71
148
  }
72
149
  catch (error) {
73
150
  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":"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"}
1
+ {"version":3,"file":"autoFixLoop.js","sourceRoot":"","sources":["../../src/handlers/autoFixLoop.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { detectFramework } from '../detectors/frameworkDetector.js';
2
2
  import { startServer } from '../serverManager.js';
3
- import CDP from 'chrome-remote-interface';
3
+ import { createMCPError, createMCPSuccess } from '../types.js';
4
+ import { CDPConnectionManager } from '../cdp/connectionManager.js';
4
5
  async function handleCheckPageErrors(args) {
5
6
  const projectDir = args.projectDir || process.cwd();
6
7
  const cdpPort = args.cdpPort || 9222;
@@ -10,59 +11,20 @@ async function handleCheckPageErrors(args) {
10
11
  // Step 1: Detect framework and start/get dev server
11
12
  const info = await detectFramework(projectDir);
12
13
  if (!info.devScript) {
13
- return {
14
- content: [
15
- {
16
- type: 'text',
17
- text: JSON.stringify({
18
- error: 'No dev script found',
19
- availableScripts: Object.keys(info.npmScripts),
20
- projectDir,
21
- }, null, 2),
22
- },
23
- ],
24
- isError: true,
25
- };
14
+ return createMCPError('FRAMEWORK_NOT_DETECTED', 'No dev script found', { availableScripts: Object.keys(info.npmScripts), projectDir }, 'Add a dev script to package.json (e.g., "dev": "vite")');
26
15
  }
27
16
  // Step 2: Start dev server (or reuse existing)
28
17
  const port = args.customPort || info.port;
29
18
  const command = `npm run ${info.devScript}`;
30
19
  const status = await startServer(projectDir, command, port);
31
20
  const pageUrl = status.url;
32
- // Step 3: Connect to Chrome via CDP
33
- const cdpOptions = { port: cdpPort };
21
+ // Step 3: Connect to Chrome via CDP with retry and pooling
22
+ let client = null;
34
23
  try {
35
- client = await CDP(cdpOptions);
24
+ client = await CDPConnectionManager.getInstance().getConnection(cdpPort);
36
25
  }
37
26
  catch (cdpErr) {
38
- return {
39
- content: [
40
- {
41
- type: 'text',
42
- text: JSON.stringify({
43
- error: `Failed to connect to Chrome DevTools Protocol on port ${cdpPort}. Ensure Chrome is running with --remote-debugging-port=${cdpPort}`,
44
- details: cdpErr instanceof Error ? cdpErr.message : String(cdpErr),
45
- pageUrl,
46
- suggestion: 'Start Chrome with: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug',
47
- }, null, 2),
48
- },
49
- ],
50
- isError: true,
51
- };
52
- }
53
- if (!client) {
54
- return {
55
- content: [
56
- {
57
- type: 'text',
58
- text: JSON.stringify({
59
- error: 'Failed to create CDP client',
60
- pageUrl,
61
- }, null, 2),
62
- },
63
- ],
64
- isError: true,
65
- };
27
+ return createMCPError('CDP_CONNECTION_FAILED', `Failed to connect to Chrome DevTools Protocol on port ${cdpPort}`, { details: cdpErr instanceof Error ? cdpErr.message : String(cdpErr) }, 'Start Chrome with: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug');
66
28
  }
67
29
  // Enable domains
68
30
  const { Page, Runtime, Network, Log } = client;
@@ -145,18 +107,17 @@ async function handleCheckPageErrors(args) {
145
107
  },
146
108
  ],
147
109
  };
110
+ return createMCPSuccess(report);
148
111
  }
149
112
  catch (err) {
150
113
  const errorMessage = err instanceof Error ? err.message : String(err);
151
- return {
152
- content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
153
- isError: true,
154
- };
114
+ return createMCPError('UNKNOWN_ERROR', errorMessage);
155
115
  }
156
116
  finally {
157
117
  if (client) {
158
118
  try {
159
- await client.close();
119
+ // Release connection back to pool instead of closing
120
+ CDPConnectionManager.getInstance().releaseConnection(cdpPort);
160
121
  }
161
122
  catch {
162
123
  // Ignore cleanup errors