@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.
- package/README.md +183 -0
- package/dist/README.md +25 -0
- package/dist/agent/attachment-service.d.ts +83 -0
- package/dist/agent/attachment-service.js +370 -0
- package/dist/agent/attachment-service.js.map +1 -0
- package/dist/agent/ccr-detector.d.ts +59 -0
- package/dist/agent/ccr-detector.js +311 -0
- package/dist/agent/ccr-detector.js.map +1 -0
- package/dist/agent/chat-service.d.ts +50 -0
- package/dist/agent/chat-service.js +439 -0
- package/dist/agent/chat-service.js.map +1 -0
- package/dist/agent/db/client.d.ts +26 -0
- package/dist/agent/db/client.js +244 -0
- package/dist/agent/db/client.js.map +1 -0
- package/dist/agent/db/index.d.ts +5 -0
- package/dist/agent/db/index.js +22 -0
- package/dist/agent/db/index.js.map +1 -0
- package/dist/agent/db/schema.d.ts +711 -0
- package/dist/agent/db/schema.js +121 -0
- package/dist/agent/db/schema.js.map +1 -0
- package/dist/agent/directory-picker.d.ts +11 -0
- package/dist/agent/directory-picker.js +149 -0
- package/dist/agent/directory-picker.js.map +1 -0
- package/dist/agent/engines/claude.d.ts +79 -0
- package/dist/agent/engines/claude.js +1338 -0
- package/dist/agent/engines/claude.js.map +1 -0
- package/dist/agent/engines/codex.d.ts +48 -0
- package/dist/agent/engines/codex.js +822 -0
- package/dist/agent/engines/codex.js.map +1 -0
- package/dist/agent/engines/types.d.ts +133 -0
- package/dist/agent/engines/types.js +3 -0
- package/dist/agent/engines/types.js.map +1 -0
- package/dist/agent/message-service.d.ts +56 -0
- package/dist/agent/message-service.js +198 -0
- package/dist/agent/message-service.js.map +1 -0
- package/dist/agent/open-project.d.ts +25 -0
- package/dist/agent/open-project.js +469 -0
- package/dist/agent/open-project.js.map +1 -0
- package/dist/agent/project-service.d.ts +49 -0
- package/dist/agent/project-service.js +254 -0
- package/dist/agent/project-service.js.map +1 -0
- package/dist/agent/project-types.d.ts +27 -0
- package/dist/agent/project-types.js +3 -0
- package/dist/agent/project-types.js.map +1 -0
- package/dist/agent/session-service.d.ts +198 -0
- package/dist/agent/session-service.js +292 -0
- package/dist/agent/session-service.js.map +1 -0
- package/dist/agent/storage.d.ts +27 -0
- package/dist/agent/storage.js +73 -0
- package/dist/agent/storage.js.map +1 -0
- package/dist/agent/stream-manager.d.ts +42 -0
- package/dist/agent/stream-manager.js +243 -0
- package/dist/agent/stream-manager.js.map +1 -0
- package/dist/agent/tool-bridge.d.ts +44 -0
- package/dist/agent/tool-bridge.js +50 -0
- package/dist/agent/tool-bridge.js.map +1 -0
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +60 -0
- package/dist/constant/index.js +80 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/file-handler.d.ts +41 -0
- package/dist/file-handler.js +295 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mcp-server-stdio.d.ts +72 -0
- package/dist/mcp/mcp-server-stdio.js +143 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +36 -0
- package/dist/mcp/mcp-server.js +26 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/mcp/register-tools.d.ts +2 -0
- package/dist/mcp/register-tools.js +148 -0
- package/dist/mcp/register-tools.js.map +1 -0
- package/dist/mcp/stdio-config.json +3 -0
- package/dist/native-messaging-host.d.ts +42 -0
- package/dist/native-messaging-host.js +312 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +194 -0
- package/dist/run_host.sh +264 -0
- package/dist/scripts/browser-config.d.ts +28 -0
- package/dist/scripts/browser-config.js +229 -0
- package/dist/scripts/browser-config.js.map +1 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +126 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +4 -0
- package/dist/scripts/constant.js +8 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/doctor.d.ts +70 -0
- package/dist/scripts/doctor.js +930 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +246 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/register-dev.d.ts +1 -0
- package/dist/scripts/register-dev.js +5 -0
- package/dist/scripts/register-dev.js.map +1 -0
- package/dist/scripts/register.d.ts +2 -0
- package/dist/scripts/register.js +28 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/report.d.ts +96 -0
- package/dist/scripts/report.js +686 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/utils.d.ts +64 -0
- package/dist/scripts/utils.js +443 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +312 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/agent.d.ts +21 -0
- package/dist/server/routes/agent.js +971 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +9 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/trace-analyzer.d.ts +14 -0
- package/dist/trace-analyzer.js +113 -0
- package/dist/trace-analyzer.js.map +1 -0
- package/dist/util/logger.d.ts +1 -0
- package/dist/util/logger.js +43 -0
- package/dist/util/logger.js.map +1 -0
- 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%
|