@helmisatria/mcp-chrome-bridge 1.0.30

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 (129) hide show
  1. package/README.md +183 -0
  2. package/dist/README.md +25 -0
  3. package/dist/agent/attachment-service.d.ts +83 -0
  4. package/dist/agent/attachment-service.js +370 -0
  5. package/dist/agent/attachment-service.js.map +1 -0
  6. package/dist/agent/ccr-detector.d.ts +59 -0
  7. package/dist/agent/ccr-detector.js +311 -0
  8. package/dist/agent/ccr-detector.js.map +1 -0
  9. package/dist/agent/chat-service.d.ts +50 -0
  10. package/dist/agent/chat-service.js +439 -0
  11. package/dist/agent/chat-service.js.map +1 -0
  12. package/dist/agent/db/client.d.ts +26 -0
  13. package/dist/agent/db/client.js +244 -0
  14. package/dist/agent/db/client.js.map +1 -0
  15. package/dist/agent/db/index.d.ts +5 -0
  16. package/dist/agent/db/index.js +22 -0
  17. package/dist/agent/db/index.js.map +1 -0
  18. package/dist/agent/db/schema.d.ts +711 -0
  19. package/dist/agent/db/schema.js +121 -0
  20. package/dist/agent/db/schema.js.map +1 -0
  21. package/dist/agent/directory-picker.d.ts +11 -0
  22. package/dist/agent/directory-picker.js +149 -0
  23. package/dist/agent/directory-picker.js.map +1 -0
  24. package/dist/agent/engines/claude.d.ts +79 -0
  25. package/dist/agent/engines/claude.js +1338 -0
  26. package/dist/agent/engines/claude.js.map +1 -0
  27. package/dist/agent/engines/codex.d.ts +48 -0
  28. package/dist/agent/engines/codex.js +822 -0
  29. package/dist/agent/engines/codex.js.map +1 -0
  30. package/dist/agent/engines/types.d.ts +133 -0
  31. package/dist/agent/engines/types.js +3 -0
  32. package/dist/agent/engines/types.js.map +1 -0
  33. package/dist/agent/message-service.d.ts +56 -0
  34. package/dist/agent/message-service.js +198 -0
  35. package/dist/agent/message-service.js.map +1 -0
  36. package/dist/agent/open-project.d.ts +25 -0
  37. package/dist/agent/open-project.js +469 -0
  38. package/dist/agent/open-project.js.map +1 -0
  39. package/dist/agent/project-service.d.ts +49 -0
  40. package/dist/agent/project-service.js +254 -0
  41. package/dist/agent/project-service.js.map +1 -0
  42. package/dist/agent/project-types.d.ts +27 -0
  43. package/dist/agent/project-types.js +3 -0
  44. package/dist/agent/project-types.js.map +1 -0
  45. package/dist/agent/session-service.d.ts +198 -0
  46. package/dist/agent/session-service.js +292 -0
  47. package/dist/agent/session-service.js.map +1 -0
  48. package/dist/agent/storage.d.ts +27 -0
  49. package/dist/agent/storage.js +73 -0
  50. package/dist/agent/storage.js.map +1 -0
  51. package/dist/agent/stream-manager.d.ts +42 -0
  52. package/dist/agent/stream-manager.js +243 -0
  53. package/dist/agent/stream-manager.js.map +1 -0
  54. package/dist/agent/tool-bridge.d.ts +44 -0
  55. package/dist/agent/tool-bridge.js +50 -0
  56. package/dist/agent/tool-bridge.js.map +1 -0
  57. package/dist/agent/types.d.ts +6 -0
  58. package/dist/agent/types.js +3 -0
  59. package/dist/agent/types.js.map +1 -0
  60. package/dist/cli.d.ts +2 -0
  61. package/dist/cli.js +224 -0
  62. package/dist/cli.js.map +1 -0
  63. package/dist/constant/index.d.ts +60 -0
  64. package/dist/constant/index.js +80 -0
  65. package/dist/constant/index.js.map +1 -0
  66. package/dist/file-handler.d.ts +41 -0
  67. package/dist/file-handler.js +295 -0
  68. package/dist/file-handler.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.js +35 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/mcp/mcp-server-stdio.d.ts +72 -0
  73. package/dist/mcp/mcp-server-stdio.js +143 -0
  74. package/dist/mcp/mcp-server-stdio.js.map +1 -0
  75. package/dist/mcp/mcp-server.d.ts +36 -0
  76. package/dist/mcp/mcp-server.js +26 -0
  77. package/dist/mcp/mcp-server.js.map +1 -0
  78. package/dist/mcp/register-tools.d.ts +2 -0
  79. package/dist/mcp/register-tools.js +148 -0
  80. package/dist/mcp/register-tools.js.map +1 -0
  81. package/dist/mcp/stdio-config.json +3 -0
  82. package/dist/native-messaging-host.d.ts +42 -0
  83. package/dist/native-messaging-host.js +312 -0
  84. package/dist/native-messaging-host.js.map +1 -0
  85. package/dist/run_host.bat +194 -0
  86. package/dist/run_host.sh +264 -0
  87. package/dist/scripts/browser-config.d.ts +28 -0
  88. package/dist/scripts/browser-config.js +229 -0
  89. package/dist/scripts/browser-config.js.map +1 -0
  90. package/dist/scripts/build.d.ts +1 -0
  91. package/dist/scripts/build.js +126 -0
  92. package/dist/scripts/build.js.map +1 -0
  93. package/dist/scripts/constant.d.ts +4 -0
  94. package/dist/scripts/constant.js +8 -0
  95. package/dist/scripts/constant.js.map +1 -0
  96. package/dist/scripts/doctor.d.ts +70 -0
  97. package/dist/scripts/doctor.js +930 -0
  98. package/dist/scripts/doctor.js.map +1 -0
  99. package/dist/scripts/postinstall.d.ts +2 -0
  100. package/dist/scripts/postinstall.js +246 -0
  101. package/dist/scripts/postinstall.js.map +1 -0
  102. package/dist/scripts/register-dev.d.ts +1 -0
  103. package/dist/scripts/register-dev.js +5 -0
  104. package/dist/scripts/register-dev.js.map +1 -0
  105. package/dist/scripts/register.d.ts +2 -0
  106. package/dist/scripts/register.js +28 -0
  107. package/dist/scripts/register.js.map +1 -0
  108. package/dist/scripts/report.d.ts +96 -0
  109. package/dist/scripts/report.js +686 -0
  110. package/dist/scripts/report.js.map +1 -0
  111. package/dist/scripts/utils.d.ts +64 -0
  112. package/dist/scripts/utils.js +443 -0
  113. package/dist/scripts/utils.js.map +1 -0
  114. package/dist/server/index.d.ts +35 -0
  115. package/dist/server/index.js +312 -0
  116. package/dist/server/index.js.map +1 -0
  117. package/dist/server/routes/agent.d.ts +21 -0
  118. package/dist/server/routes/agent.js +971 -0
  119. package/dist/server/routes/agent.js.map +1 -0
  120. package/dist/server/routes/index.d.ts +4 -0
  121. package/dist/server/routes/index.js +9 -0
  122. package/dist/server/routes/index.js.map +1 -0
  123. package/dist/trace-analyzer.d.ts +14 -0
  124. package/dist/trace-analyzer.js +113 -0
  125. package/dist/trace-analyzer.js.map +1 -0
  126. package/dist/util/logger.d.ts +1 -0
  127. package/dist/util/logger.js +43 -0
  128. package/dist/util/logger.js.map +1 -0
  129. package/package.json +91 -0
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NativeMessagingHost = void 0;
7
+ const process_1 = require("process");
8
+ const uuid_1 = require("uuid");
9
+ const chrome_mcp_shared_1 = require("chrome-mcp-shared");
10
+ const constant_1 = require("./constant");
11
+ const file_handler_1 = __importDefault(require("./file-handler"));
12
+ class NativeMessagingHost {
13
+ constructor() {
14
+ this.associatedServer = null;
15
+ this.pendingRequests = new Map();
16
+ }
17
+ setServer(serverInstance) {
18
+ this.associatedServer = serverInstance;
19
+ }
20
+ // add message handler to wait for start server
21
+ start() {
22
+ try {
23
+ this.setupMessageHandling();
24
+ }
25
+ catch (error) {
26
+ process.exit(1);
27
+ }
28
+ }
29
+ setupMessageHandling() {
30
+ let buffer = Buffer.alloc(0);
31
+ let expectedLength = -1;
32
+ const MAX_MESSAGES_PER_TICK = 100; // Safety guard to avoid long-running loops per readable tick
33
+ const MAX_MESSAGE_SIZE_BYTES = 16 * 1024 * 1024; // 16MB upper bound for a single message
34
+ const processAvailable = () => {
35
+ let processed = 0;
36
+ while (processed < MAX_MESSAGES_PER_TICK) {
37
+ // Read length header when needed
38
+ if (expectedLength === -1) {
39
+ if (buffer.length < 4)
40
+ break; // not enough for header
41
+ expectedLength = buffer.readUInt32LE(0);
42
+ buffer = buffer.slice(4);
43
+ // Validate length header
44
+ if (expectedLength <= 0 || expectedLength > MAX_MESSAGE_SIZE_BYTES) {
45
+ this.sendError(`Invalid message length: ${expectedLength}`);
46
+ // Reset state to resynchronize stream
47
+ expectedLength = -1;
48
+ buffer = Buffer.alloc(0);
49
+ break;
50
+ }
51
+ }
52
+ // Wait for complete body
53
+ if (buffer.length < expectedLength)
54
+ break;
55
+ const messageBuffer = buffer.slice(0, expectedLength);
56
+ buffer = buffer.slice(expectedLength);
57
+ expectedLength = -1;
58
+ processed++;
59
+ try {
60
+ const message = JSON.parse(messageBuffer.toString());
61
+ this.handleMessage(message);
62
+ }
63
+ catch (error) {
64
+ this.sendError(`Failed to parse message: ${error.message}`);
65
+ }
66
+ }
67
+ // If we hit the cap but still have at least one complete message pending, schedule to continue soon
68
+ if (processed === MAX_MESSAGES_PER_TICK) {
69
+ setImmediate(processAvailable);
70
+ }
71
+ };
72
+ process_1.stdin.on('readable', () => {
73
+ let chunk;
74
+ while ((chunk = process_1.stdin.read()) !== null) {
75
+ buffer = Buffer.concat([buffer, chunk]);
76
+ processAvailable();
77
+ }
78
+ });
79
+ process_1.stdin.on('end', () => {
80
+ this.cleanup();
81
+ });
82
+ process_1.stdin.on('error', () => {
83
+ this.cleanup();
84
+ });
85
+ }
86
+ async handleMessage(message) {
87
+ var _a;
88
+ if (!message || typeof message !== 'object') {
89
+ this.sendError('Invalid message format');
90
+ return;
91
+ }
92
+ if (message.responseToRequestId) {
93
+ const requestId = message.responseToRequestId;
94
+ const pending = this.pendingRequests.get(requestId);
95
+ if (pending) {
96
+ clearTimeout(pending.timeoutId);
97
+ if (message.error) {
98
+ pending.reject(new Error(message.error));
99
+ }
100
+ else {
101
+ pending.resolve(message.payload);
102
+ }
103
+ this.pendingRequests.delete(requestId);
104
+ }
105
+ else {
106
+ // just ignore
107
+ }
108
+ return;
109
+ }
110
+ // Handle directive messages from Chrome
111
+ try {
112
+ switch (message.type) {
113
+ case chrome_mcp_shared_1.NativeMessageType.START:
114
+ await this.startServer(((_a = message.payload) === null || _a === void 0 ? void 0 : _a.port) || 12306);
115
+ break;
116
+ case chrome_mcp_shared_1.NativeMessageType.STOP:
117
+ await this.stopServer();
118
+ break;
119
+ // Keep ping/pong for simple liveness detection, but this differs from request-response pattern
120
+ case 'ping_from_extension':
121
+ this.sendMessage({ type: 'pong_to_extension' });
122
+ break;
123
+ case 'file_operation':
124
+ await this.handleFileOperation(message);
125
+ break;
126
+ default:
127
+ // Double check when message type is not supported
128
+ if (!message.responseToRequestId) {
129
+ this.sendError(`Unknown message type or non-response message: ${message.type || 'no type'}`);
130
+ }
131
+ }
132
+ }
133
+ catch (error) {
134
+ this.sendError(`Failed to handle directive message: ${error.message}`);
135
+ }
136
+ }
137
+ /**
138
+ * Handle file operations from the extension
139
+ */
140
+ async handleFileOperation(message) {
141
+ try {
142
+ const result = await file_handler_1.default.handleFileRequest(message.payload);
143
+ if (message.requestId) {
144
+ // Send response back with the request ID
145
+ this.sendMessage({
146
+ type: 'file_operation_response',
147
+ responseToRequestId: message.requestId,
148
+ payload: result,
149
+ });
150
+ }
151
+ else {
152
+ // No request ID, just send result
153
+ this.sendMessage({
154
+ type: 'file_operation_result',
155
+ payload: result,
156
+ });
157
+ }
158
+ }
159
+ catch (error) {
160
+ const errorResponse = {
161
+ success: false,
162
+ error: error.message || 'Unknown error during file operation',
163
+ };
164
+ if (message.requestId) {
165
+ this.sendMessage({
166
+ type: 'file_operation_response',
167
+ responseToRequestId: message.requestId,
168
+ error: errorResponse.error,
169
+ });
170
+ }
171
+ else {
172
+ this.sendError(`File operation failed: ${errorResponse.error}`);
173
+ }
174
+ }
175
+ }
176
+ /**
177
+ * Send request to Chrome and wait for response
178
+ * @param messagePayload Data to send to Chrome
179
+ * @param timeoutMs Timeout for waiting response (milliseconds)
180
+ * @returns Promise, resolves to Chrome's returned payload on success, rejects on failure
181
+ */
182
+ sendRequestToExtensionAndWait(messagePayload, messageType = 'request_data', timeoutMs = constant_1.TIMEOUTS.DEFAULT_REQUEST_TIMEOUT) {
183
+ return new Promise((resolve, reject) => {
184
+ const requestId = (0, uuid_1.v4)(); // Generate unique request ID
185
+ const timeoutId = setTimeout(() => {
186
+ this.pendingRequests.delete(requestId); // Remove from Map after timeout
187
+ reject(new Error(`Request timed out after ${timeoutMs}ms`));
188
+ }, timeoutMs);
189
+ // Store request's resolve/reject functions and timeout ID
190
+ this.pendingRequests.set(requestId, { resolve, reject, timeoutId });
191
+ // Send message with requestId to Chrome
192
+ this.sendMessage({
193
+ type: messageType, // Define a request type, e.g. 'request_data'
194
+ payload: messagePayload,
195
+ requestId: requestId, // <--- Key: include request ID
196
+ });
197
+ });
198
+ }
199
+ /**
200
+ * Start Fastify server (now accepts Server instance)
201
+ */
202
+ async startServer(port) {
203
+ if (!this.associatedServer) {
204
+ this.sendError('Internal error: server instance not set');
205
+ return;
206
+ }
207
+ try {
208
+ if (this.associatedServer.isRunning) {
209
+ this.sendMessage({
210
+ type: chrome_mcp_shared_1.NativeMessageType.ERROR,
211
+ payload: { message: 'Server is already running' },
212
+ });
213
+ return;
214
+ }
215
+ await this.associatedServer.start(port, this);
216
+ this.sendMessage({
217
+ type: chrome_mcp_shared_1.NativeMessageType.SERVER_STARTED,
218
+ payload: { port },
219
+ });
220
+ }
221
+ catch (error) {
222
+ this.sendError(`Failed to start server: ${error.message}`);
223
+ }
224
+ }
225
+ /**
226
+ * Stop Fastify server
227
+ */
228
+ async stopServer() {
229
+ if (!this.associatedServer) {
230
+ this.sendError('Internal error: server instance not set');
231
+ return;
232
+ }
233
+ try {
234
+ // Check status through associatedServer
235
+ if (!this.associatedServer.isRunning) {
236
+ this.sendMessage({
237
+ type: chrome_mcp_shared_1.NativeMessageType.ERROR,
238
+ payload: { message: 'Server is not running' },
239
+ });
240
+ return;
241
+ }
242
+ await this.associatedServer.stop();
243
+ // this.serverStarted = false; // Server should update its own status after successful stop
244
+ this.sendMessage({ type: chrome_mcp_shared_1.NativeMessageType.SERVER_STOPPED }); // Distinguish from previous 'stopped'
245
+ }
246
+ catch (error) {
247
+ this.sendError(`Failed to stop server: ${error.message}`);
248
+ }
249
+ }
250
+ /**
251
+ * Send message to Chrome extension
252
+ */
253
+ sendMessage(message) {
254
+ try {
255
+ const messageString = JSON.stringify(message);
256
+ const messageBuffer = Buffer.from(messageString);
257
+ const headerBuffer = Buffer.alloc(4);
258
+ headerBuffer.writeUInt32LE(messageBuffer.length, 0);
259
+ // Ensure atomic write
260
+ process_1.stdout.write(Buffer.concat([headerBuffer, messageBuffer]), (err) => {
261
+ if (err) {
262
+ // Consider how to handle write failure, may affect request completion
263
+ }
264
+ else {
265
+ // Message sent successfully, no action needed
266
+ }
267
+ });
268
+ }
269
+ catch (error) {
270
+ // Catch JSON.stringify or Buffer operation errors
271
+ // If preparation stage fails, associated request may never be sent
272
+ // Need to consider whether to reject corresponding Promise (if called within sendRequestToExtensionAndWait)
273
+ }
274
+ }
275
+ /**
276
+ * Send error message to Chrome extension (mainly for sending non-request-response type errors)
277
+ */
278
+ sendError(errorMessage) {
279
+ this.sendMessage({
280
+ type: chrome_mcp_shared_1.NativeMessageType.ERROR_FROM_NATIVE_HOST, // Use more explicit type
281
+ payload: { message: errorMessage },
282
+ });
283
+ }
284
+ /**
285
+ * Clean up resources
286
+ */
287
+ cleanup() {
288
+ // Reject all pending requests
289
+ this.pendingRequests.forEach((pending) => {
290
+ clearTimeout(pending.timeoutId);
291
+ pending.reject(new Error('Native host is shutting down or Chrome disconnected.'));
292
+ });
293
+ this.pendingRequests.clear();
294
+ if (this.associatedServer && this.associatedServer.isRunning) {
295
+ this.associatedServer
296
+ .stop()
297
+ .then(() => {
298
+ process.exit(0);
299
+ })
300
+ .catch(() => {
301
+ process.exit(1);
302
+ });
303
+ }
304
+ else {
305
+ process.exit(0);
306
+ }
307
+ }
308
+ }
309
+ exports.NativeMessagingHost = NativeMessagingHost;
310
+ const nativeMessagingHostInstance = new NativeMessagingHost();
311
+ exports.default = nativeMessagingHostInstance;
312
+ //# sourceMappingURL=native-messaging-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-messaging-host.js","sourceRoot":"","sources":["../src/native-messaging-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+
4
+ REM Setup paths
5
+ set "SCRIPT_DIR=%~dp0"
6
+ if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
7
+ set "NODE_SCRIPT=%SCRIPT_DIR%\index.js"
8
+
9
+ REM Setup log directory - prefer user-writable locations
10
+ REM Windows: %LOCALAPPDATA%\mcp-chrome-bridge\logs
11
+ set "LOG_DIR=%LOCALAPPDATA%\mcp-chrome-bridge\logs"
12
+ if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" 2>nul
13
+ if not exist "%LOG_DIR%" (
14
+ REM Fallback to package directory if user directory not writable
15
+ set "LOG_DIR=%SCRIPT_DIR%\logs"
16
+ if not exist "!LOG_DIR!" mkdir "!LOG_DIR!" 2>nul
17
+ )
18
+
19
+ REM Generate timestamp
20
+ for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set "TIMESTAMP=%%i"
21
+ set "WRAPPER_LOG=%LOG_DIR%\native_host_wrapper_windows_%TIMESTAMP%.log"
22
+ set "STDERR_LOG=%LOG_DIR%\native_host_stderr_windows_%TIMESTAMP%.log"
23
+
24
+ REM Initial logging
25
+ echo Wrapper script called at %DATE% %TIME% > "%WRAPPER_LOG%"
26
+ echo SCRIPT_DIR: %SCRIPT_DIR% >> "%WRAPPER_LOG%"
27
+ echo LOG_DIR: %LOG_DIR% >> "%WRAPPER_LOG%"
28
+ echo NODE_SCRIPT: %NODE_SCRIPT% >> "%WRAPPER_LOG%"
29
+ echo Initial PATH: %PATH% >> "%WRAPPER_LOG%"
30
+ echo CHROME_MCP_NODE_PATH: %CHROME_MCP_NODE_PATH% >> "%WRAPPER_LOG%"
31
+ echo VOLTA_HOME: %VOLTA_HOME% >> "%WRAPPER_LOG%"
32
+ echo ASDF_DATA_DIR: %ASDF_DATA_DIR% >> "%WRAPPER_LOG%"
33
+ echo FNM_DIR: %FNM_DIR% >> "%WRAPPER_LOG%"
34
+ echo User: %USERNAME% >> "%WRAPPER_LOG%"
35
+ echo Current PWD: %CD% >> "%WRAPPER_LOG%"
36
+
37
+ REM Node.js discovery
38
+ set "NODE_EXEC="
39
+ set "NODE_EXEC_SOURCE="
40
+
41
+ REM Priority 0: CHROME_MCP_NODE_PATH environment variable override
42
+ echo [Priority 0] Checking CHROME_MCP_NODE_PATH override >> "%WRAPPER_LOG%"
43
+ if defined CHROME_MCP_NODE_PATH (
44
+ set "CANDIDATE_NODE=%CHROME_MCP_NODE_PATH%"
45
+ REM Check if it's a directory, then append node.exe
46
+ if exist "!CANDIDATE_NODE!\*" (
47
+ set "CANDIDATE_NODE=!CANDIDATE_NODE!\node.exe"
48
+ )
49
+ if exist "!CANDIDATE_NODE!" (
50
+ set "NODE_EXEC=!CANDIDATE_NODE!"
51
+ set "NODE_EXEC_SOURCE=CHROME_MCP_NODE_PATH"
52
+ echo Found node via CHROME_MCP_NODE_PATH: !NODE_EXEC! >> "%WRAPPER_LOG%"
53
+ ) else (
54
+ echo CHROME_MCP_NODE_PATH is set but not found: !CANDIDATE_NODE! >> "%WRAPPER_LOG%"
55
+ )
56
+ )
57
+
58
+ REM Priority 1: Installation-time node path
59
+ set "NODE_PATH_FILE=%SCRIPT_DIR%\node_path.txt"
60
+ echo [Priority 1] Checking installation-time node path >> "%WRAPPER_LOG%"
61
+ if not defined NODE_EXEC (
62
+ if exist "%NODE_PATH_FILE%" (
63
+ set /p EXPECTED_NODE=<"%NODE_PATH_FILE%"
64
+ if exist "!EXPECTED_NODE!" (
65
+ set "NODE_EXEC=!EXPECTED_NODE!"
66
+ set "NODE_EXEC_SOURCE=node_path.txt"
67
+ echo Found installation-time node at !NODE_EXEC! >> "%WRAPPER_LOG%"
68
+ ) else (
69
+ echo node_path.txt exists but path invalid: !EXPECTED_NODE! >> "%WRAPPER_LOG%"
70
+ )
71
+ )
72
+ )
73
+
74
+ REM Priority 1.5: Fallback to relative path
75
+ if not defined NODE_EXEC (
76
+ set "EXPECTED_NODE=%SCRIPT_DIR%\..\..\..\node.exe"
77
+ echo [Priority 1.5] Checking relative path >> "%WRAPPER_LOG%"
78
+ if exist "%EXPECTED_NODE%" (
79
+ set "NODE_EXEC=%EXPECTED_NODE%"
80
+ set "NODE_EXEC_SOURCE=relative"
81
+ echo Found node at relative path: !NODE_EXEC! >> "%WRAPPER_LOG%"
82
+ )
83
+ )
84
+
85
+ REM Priority 2: Volta
86
+ if not defined NODE_EXEC (
87
+ echo [Priority 2] Checking Volta >> "%WRAPPER_LOG%"
88
+ if defined VOLTA_HOME (
89
+ if exist "%VOLTA_HOME%\bin\node.exe" (
90
+ set "NODE_EXEC=%VOLTA_HOME%\bin\node.exe"
91
+ set "NODE_EXEC_SOURCE=volta"
92
+ echo Found Volta node: !NODE_EXEC! >> "%WRAPPER_LOG%"
93
+ )
94
+ ) else (
95
+ if exist "%USERPROFILE%\.volta\bin\node.exe" (
96
+ set "NODE_EXEC=%USERPROFILE%\.volta\bin\node.exe"
97
+ set "NODE_EXEC_SOURCE=volta"
98
+ echo Found Volta node: !NODE_EXEC! >> "%WRAPPER_LOG%"
99
+ )
100
+ )
101
+ )
102
+
103
+ REM Priority 3: asdf (use PowerShell to find latest version)
104
+ if not defined NODE_EXEC (
105
+ echo [Priority 3] Checking asdf >> "%WRAPPER_LOG%"
106
+ set "ASDF_NODE="
107
+ for /f "delims=" %%i in ('powershell -NoProfile -Command "$base=$env:ASDF_DATA_DIR; if(-not $base){$base=Join-Path $env:USERPROFILE '.asdf'}; $root=Join-Path $base 'installs\nodejs'; $best=$null; if(Test-Path $root){ foreach($d in (Get-ChildItem -Directory -Path $root -ErrorAction SilentlyContinue)){ if($d.Name -match '^v?\d+(\.\d+){1,3}$'){ $v=[version]($d.Name -replace '^v',''); if(-not $best -or $v -gt $best.Ver){ $best=[pscustomobject]@{Ver=$v;Dir=$d.FullName} } } } }; if($best){ $p=Join-Path $best.Dir 'bin\node.exe'; if(Test-Path $p){ Write-Output $p } }" 2^>nul') do set "ASDF_NODE=%%i"
108
+ if defined ASDF_NODE (
109
+ set "NODE_EXEC=!ASDF_NODE!"
110
+ set "NODE_EXEC_SOURCE=asdf"
111
+ echo Found asdf node: !NODE_EXEC! >> "%WRAPPER_LOG%"
112
+ )
113
+ )
114
+
115
+ REM Priority 4: fnm (use PowerShell to find latest version)
116
+ if not defined NODE_EXEC (
117
+ echo [Priority 4] Checking fnm >> "%WRAPPER_LOG%"
118
+ set "FNM_NODE="
119
+ for /f "delims=" %%i in ('powershell -NoProfile -Command "$base=$env:FNM_DIR; if(-not $base){$base=Join-Path $env:USERPROFILE '.fnm'}; $root=Join-Path $base 'node-versions'; $best=$null; if(Test-Path $root){ foreach($d in (Get-ChildItem -Directory -Path $root -ErrorAction SilentlyContinue)){ if($d.Name -match '^v?\d+(\.\d+){1,3}$'){ $v=[version]($d.Name -replace '^v',''); if(-not $best -or $v -gt $best.Ver){ $best=[pscustomobject]@{Ver=$v;Dir=$d.FullName} } } } }; if($best){ $p=Join-Path $best.Dir 'installation\node.exe'; if(Test-Path $p){ Write-Output $p } }" 2^>nul') do set "FNM_NODE=%%i"
120
+ if defined FNM_NODE (
121
+ set "NODE_EXEC=!FNM_NODE!"
122
+ set "NODE_EXEC_SOURCE=fnm"
123
+ echo Found fnm node: !NODE_EXEC! >> "%WRAPPER_LOG%"
124
+ )
125
+ )
126
+
127
+ REM Priority 5: where command
128
+ if not defined NODE_EXEC (
129
+ echo [Priority 5] Trying 'where node.exe' >> "%WRAPPER_LOG%"
130
+ for /f "delims=" %%i in ('where node.exe 2^>nul') do (
131
+ if not defined NODE_EXEC (
132
+ set "NODE_EXEC=%%i"
133
+ set "NODE_EXEC_SOURCE=where"
134
+ echo Found node using 'where': !NODE_EXEC! >> "%WRAPPER_LOG%"
135
+ )
136
+ )
137
+ )
138
+
139
+ REM Priority 6: Common paths
140
+ if not defined NODE_EXEC (
141
+ echo [Priority 6] Checking common paths >> "%WRAPPER_LOG%"
142
+ if exist "%ProgramFiles%\nodejs\node.exe" (
143
+ set "NODE_EXEC=%ProgramFiles%\nodejs\node.exe"
144
+ set "NODE_EXEC_SOURCE=common"
145
+ echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
146
+ ) else if exist "%ProgramFiles(x86)%\nodejs\node.exe" (
147
+ set "NODE_EXEC=%ProgramFiles(x86)%\nodejs\node.exe"
148
+ set "NODE_EXEC_SOURCE=common"
149
+ echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
150
+ ) else if exist "%LOCALAPPDATA%\Programs\nodejs\node.exe" (
151
+ set "NODE_EXEC=%LOCALAPPDATA%\Programs\nodejs\node.exe"
152
+ set "NODE_EXEC_SOURCE=common"
153
+ echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
154
+ )
155
+ )
156
+
157
+ REM Validation
158
+ if not defined NODE_EXEC (
159
+ echo ERROR: Node.js executable not found! >> "%WRAPPER_LOG%"
160
+ echo Searched: CHROME_MCP_NODE_PATH, node_path.txt, relative, Volta, asdf, fnm, where, common paths >> "%WRAPPER_LOG%"
161
+ echo To fix: Set CHROME_MCP_NODE_PATH environment variable or run 'mcp-chrome-bridge doctor --fix' >> "%WRAPPER_LOG%"
162
+ exit /B 1
163
+ )
164
+
165
+ echo Using Node executable: %NODE_EXEC% >> "%WRAPPER_LOG%"
166
+ echo Node discovery source: %NODE_EXEC_SOURCE% >> "%WRAPPER_LOG%"
167
+ call "%NODE_EXEC%" -v >> "%WRAPPER_LOG%" 2>>&1
168
+
169
+ if not exist "%NODE_SCRIPT%" (
170
+ echo ERROR: Node.js script not found at %NODE_SCRIPT% >> "%WRAPPER_LOG%"
171
+ exit /B 1
172
+ )
173
+
174
+ REM Add Node.js bin directory to PATH for child processes
175
+ for %%I in ("%NODE_EXEC%") do set "NODE_BIN_DIR=%%~dpI"
176
+ if defined PATH (set "PATH=%NODE_BIN_DIR%;%PATH%") else (set "PATH=%NODE_BIN_DIR%")
177
+ echo Added %NODE_BIN_DIR% to PATH >> "%WRAPPER_LOG%"
178
+
179
+ REM Log Claude Code Router (CCR) related env vars for debugging
180
+ REM These are set via System Properties or PowerShell profile
181
+ if defined ANTHROPIC_BASE_URL (
182
+ echo ANTHROPIC_BASE_URL is set: %ANTHROPIC_BASE_URL% >> "%WRAPPER_LOG%"
183
+ )
184
+ if defined ANTHROPIC_AUTH_TOKEN (
185
+ echo ANTHROPIC_AUTH_TOKEN is set (value hidden) >> "%WRAPPER_LOG%"
186
+ )
187
+
188
+ echo Executing: "%NODE_EXEC%" "%NODE_SCRIPT%" >> "%WRAPPER_LOG%"
189
+ call "%NODE_EXEC%" "%NODE_SCRIPT%" 2>> "%STDERR_LOG%"
190
+ set "EXIT_CODE=%ERRORLEVEL%"
191
+
192
+ echo Exit code: %EXIT_CODE% >> "%WRAPPER_LOG%"
193
+ endlocal
194
+ exit /B %EXIT_CODE%