claude-chrome-parallel 2.1.0
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/LICENSE +21 -0
- package/README.md +353 -0
- package/dist/cdp/client.d.ts +120 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +345 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/chrome/launcher.d.ts +42 -0
- package/dist/chrome/launcher.d.ts.map +1 -0
- package/dist/chrome/launcher.js +256 -0
- package/dist/chrome/launcher.js.map +1 -0
- package/dist/cli/claude-session.d.ts +11 -0
- package/dist/cli/claude-session.js +349 -0
- package/dist/cli/claude-session.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +562 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +16 -0
- package/dist/cli/install.js +185 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +7 -0
- package/dist/cli/uninstall.js +126 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/config/config-recovery.d.ts +69 -0
- package/dist/config/config-recovery.d.ts.map +1 -0
- package/dist/config/config-recovery.js +302 -0
- package/dist/config/config-recovery.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/session-isolator.d.ts +76 -0
- package/dist/config/session-isolator.d.ts.map +1 -0
- package/dist/config/session-isolator.js +268 -0
- package/dist/config/session-isolator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -0
- package/dist/master/index.d.ts +18 -0
- package/dist/master/index.d.ts.map +1 -0
- package/dist/master/index.js +75 -0
- package/dist/master/index.js.map +1 -0
- package/dist/master/ipc-server.d.ts +21 -0
- package/dist/master/ipc-server.d.ts.map +1 -0
- package/dist/master/ipc-server.js +175 -0
- package/dist/master/ipc-server.js.map +1 -0
- package/dist/master/request-handler.d.ts +17 -0
- package/dist/master/request-handler.d.ts.map +1 -0
- package/dist/master/request-handler.js +134 -0
- package/dist/master/request-handler.js.map +1 -0
- package/dist/master/session-registry.d.ts +120 -0
- package/dist/master/session-registry.d.ts.map +1 -0
- package/dist/master/session-registry.js +247 -0
- package/dist/master/session-registry.js.map +1 -0
- package/dist/mcp-server.d.ts +69 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +301 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/session-manager.d.ts +107 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +322 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/shared/ipc-constants.d.ts +16 -0
- package/dist/shared/ipc-constants.d.ts.map +1 -0
- package/dist/shared/ipc-constants.js +66 -0
- package/dist/shared/ipc-constants.js.map +1 -0
- package/dist/shared/ipc-protocol.d.ts +33 -0
- package/dist/shared/ipc-protocol.d.ts.map +1 -0
- package/dist/shared/ipc-protocol.js +20 -0
- package/dist/shared/ipc-protocol.js.map +1 -0
- package/dist/tools/computer.d.ts +6 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +426 -0
- package/dist/tools/computer.js.map +1 -0
- package/dist/tools/find.d.ts +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +242 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/form-input.d.ts +6 -0
- package/dist/tools/form-input.d.ts.map +1 -0
- package/dist/tools/form-input.js +181 -0
- package/dist/tools/form-input.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/javascript.d.ts +6 -0
- package/dist/tools/javascript.d.ts.map +1 -0
- package/dist/tools/javascript.js +134 -0
- package/dist/tools/javascript.js.map +1 -0
- package/dist/tools/navigate.d.ts +6 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +155 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/read-page.d.ts +6 -0
- package/dist/tools/read-page.d.ts.map +1 -0
- package/dist/tools/read-page.js +182 -0
- package/dist/tools/read-page.js.map +1 -0
- package/dist/tools/tabs-context.d.ts +6 -0
- package/dist/tools/tabs-context.d.ts.map +1 -0
- package/dist/tools/tabs-context.js +73 -0
- package/dist/tools/tabs-context.js.map +1 -0
- package/dist/tools/tabs-create.d.ts +6 -0
- package/dist/tools/tabs-create.d.ts.map +1 -0
- package/dist/tools/tabs-create.js +49 -0
- package/dist/tools/tabs-create.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +54 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +14 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/session.d.ts +28 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +6 -0
- package/dist/types/session.js.map +1 -0
- package/dist/utils/atomic-file.d.ts +50 -0
- package/dist/utils/atomic-file.d.ts.map +1 -0
- package/dist/utils/atomic-file.js +217 -0
- package/dist/utils/atomic-file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-validator.d.ts +40 -0
- package/dist/utils/json-validator.d.ts.map +1 -0
- package/dist/utils/json-validator.js +295 -0
- package/dist/utils/json-validator.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +26 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -0
- package/dist/utils/ref-id-manager.js +81 -0
- package/dist/utils/ref-id-manager.js.map +1 -0
- package/dist/utils/request-queue.d.ts +37 -0
- package/dist/utils/request-queue.d.ts.map +1 -0
- package/dist/utils/request-queue.js +110 -0
- package/dist/utils/request-queue.js.map +1 -0
- package/dist/worker/auto-master.d.ts +24 -0
- package/dist/worker/auto-master.d.ts.map +1 -0
- package/dist/worker/auto-master.js +135 -0
- package/dist/worker/auto-master.js.map +1 -0
- package/dist/worker/index.d.ts +25 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +93 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/ipc-client.d.ts +26 -0
- package/dist/worker/ipc-client.d.ts.map +1 -0
- package/dist/worker/ipc-client.js +211 -0
- package/dist/worker/ipc-client.js.map +1 -0
- package/dist/worker/remote-session-manager.d.ts +114 -0
- package/dist/worker/remote-session-manager.d.ts.map +1 -0
- package/dist/worker/remote-session-manager.js +151 -0
- package/dist/worker/remote-session-manager.js.map +1 -0
- package/dist/worker/tools.d.ts +7 -0
- package/dist/worker/tools.d.ts.map +1 -0
- package/dist/worker/tools.js +340 -0
- package/dist/worker/tools.js.map +1 -0
- package/dist/worker/worker-mcp-server.d.ts +70 -0
- package/dist/worker/worker-mcp-server.d.ts.map +1 -0
- package/dist/worker/worker-mcp-server.js +295 -0
- package/dist/worker/worker-mcp-server.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CDP Client - Wrapper around puppeteer-core for Chrome DevTools Protocol
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CDPClient = void 0;
|
|
10
|
+
exports.getCDPClient = getCDPClient;
|
|
11
|
+
const puppeteer_core_1 = __importDefault(require("puppeteer-core"));
|
|
12
|
+
const launcher_1 = require("../chrome/launcher");
|
|
13
|
+
// Helper to get target ID (internal puppeteer property)
|
|
14
|
+
function getTargetId(target) {
|
|
15
|
+
// Access the internal _targetId property
|
|
16
|
+
return target._targetId;
|
|
17
|
+
}
|
|
18
|
+
class CDPClient {
|
|
19
|
+
browser = null;
|
|
20
|
+
sessions = new Map();
|
|
21
|
+
port;
|
|
22
|
+
maxReconnectAttempts;
|
|
23
|
+
reconnectDelayMs;
|
|
24
|
+
heartbeatIntervalMs;
|
|
25
|
+
heartbeatTimer = null;
|
|
26
|
+
connectionState = 'disconnected';
|
|
27
|
+
eventListeners = [];
|
|
28
|
+
reconnectAttempts = 0;
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.port = options.port || 9222;
|
|
31
|
+
this.maxReconnectAttempts = options.maxReconnectAttempts || 3;
|
|
32
|
+
this.reconnectDelayMs = options.reconnectDelayMs || 1000;
|
|
33
|
+
this.heartbeatIntervalMs = options.heartbeatIntervalMs || 5000;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get current connection state
|
|
37
|
+
*/
|
|
38
|
+
getConnectionState() {
|
|
39
|
+
return this.connectionState;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Add connection event listener
|
|
43
|
+
*/
|
|
44
|
+
addConnectionListener(listener) {
|
|
45
|
+
this.eventListeners.push(listener);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Remove connection event listener
|
|
49
|
+
*/
|
|
50
|
+
removeConnectionListener(listener) {
|
|
51
|
+
const index = this.eventListeners.indexOf(listener);
|
|
52
|
+
if (index !== -1) {
|
|
53
|
+
this.eventListeners.splice(index, 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emit connection event
|
|
58
|
+
*/
|
|
59
|
+
emitConnectionEvent(event) {
|
|
60
|
+
for (const listener of this.eventListeners) {
|
|
61
|
+
try {
|
|
62
|
+
listener(event);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
console.error('[CDPClient] Event listener error:', e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start heartbeat monitoring
|
|
71
|
+
*/
|
|
72
|
+
startHeartbeat() {
|
|
73
|
+
this.stopHeartbeat();
|
|
74
|
+
this.heartbeatTimer = setInterval(() => {
|
|
75
|
+
this.checkConnection();
|
|
76
|
+
}, this.heartbeatIntervalMs);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Stop heartbeat monitoring
|
|
80
|
+
*/
|
|
81
|
+
stopHeartbeat() {
|
|
82
|
+
if (this.heartbeatTimer) {
|
|
83
|
+
clearInterval(this.heartbeatTimer);
|
|
84
|
+
this.heartbeatTimer = null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check connection health
|
|
89
|
+
*/
|
|
90
|
+
async checkConnection() {
|
|
91
|
+
if (!this.browser) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
// Simple check - try to get browser version
|
|
96
|
+
if (!this.browser.isConnected()) {
|
|
97
|
+
console.error('[CDPClient] Heartbeat: Connection lost, attempting reconnect...');
|
|
98
|
+
await this.handleDisconnect();
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('[CDPClient] Heartbeat check failed:', error);
|
|
105
|
+
await this.handleDisconnect();
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Handle disconnection with automatic reconnection
|
|
111
|
+
*/
|
|
112
|
+
async handleDisconnect() {
|
|
113
|
+
if (this.connectionState === 'reconnecting') {
|
|
114
|
+
return; // Already reconnecting
|
|
115
|
+
}
|
|
116
|
+
this.connectionState = 'reconnecting';
|
|
117
|
+
this.emitConnectionEvent({
|
|
118
|
+
type: 'disconnected',
|
|
119
|
+
timestamp: Date.now(),
|
|
120
|
+
});
|
|
121
|
+
// Clear existing sessions
|
|
122
|
+
this.sessions.clear();
|
|
123
|
+
this.browser = null;
|
|
124
|
+
// Attempt reconnection
|
|
125
|
+
while (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
126
|
+
this.reconnectAttempts++;
|
|
127
|
+
console.error(`[CDPClient] Reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`);
|
|
128
|
+
this.emitConnectionEvent({
|
|
129
|
+
type: 'reconnecting',
|
|
130
|
+
timestamp: Date.now(),
|
|
131
|
+
attempt: this.reconnectAttempts,
|
|
132
|
+
});
|
|
133
|
+
try {
|
|
134
|
+
await this.connectInternal();
|
|
135
|
+
console.error('[CDPClient] Reconnection successful');
|
|
136
|
+
this.reconnectAttempts = 0;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
console.error(`[CDPClient] Reconnect attempt ${this.reconnectAttempts} failed:`, error);
|
|
141
|
+
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
142
|
+
await new Promise(resolve => setTimeout(resolve, this.reconnectDelayMs));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// All attempts failed
|
|
147
|
+
this.connectionState = 'disconnected';
|
|
148
|
+
this.emitConnectionEvent({
|
|
149
|
+
type: 'reconnect_failed',
|
|
150
|
+
timestamp: Date.now(),
|
|
151
|
+
error: `Failed after ${this.maxReconnectAttempts} attempts`,
|
|
152
|
+
});
|
|
153
|
+
console.error('[CDPClient] All reconnection attempts failed');
|
|
154
|
+
this.reconnectAttempts = 0;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Internal connect logic
|
|
158
|
+
*/
|
|
159
|
+
async connectInternal() {
|
|
160
|
+
const launcher = (0, launcher_1.getChromeLauncher)(this.port);
|
|
161
|
+
const instance = await launcher.ensureChrome();
|
|
162
|
+
this.browser = await puppeteer_core_1.default.connect({
|
|
163
|
+
browserWSEndpoint: instance.wsEndpoint,
|
|
164
|
+
defaultViewport: null,
|
|
165
|
+
});
|
|
166
|
+
// Set up disconnect handler
|
|
167
|
+
this.browser.on('disconnected', () => {
|
|
168
|
+
console.error('[CDPClient] Browser disconnected');
|
|
169
|
+
this.handleDisconnect();
|
|
170
|
+
});
|
|
171
|
+
this.connectionState = 'connected';
|
|
172
|
+
this.emitConnectionEvent({
|
|
173
|
+
type: 'connected',
|
|
174
|
+
timestamp: Date.now(),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Connect to Chrome instance
|
|
179
|
+
*/
|
|
180
|
+
async connect() {
|
|
181
|
+
if (this.browser && this.browser.isConnected()) {
|
|
182
|
+
// Verify connection is actually working by checking Chrome endpoint
|
|
183
|
+
try {
|
|
184
|
+
const launcher = (0, launcher_1.getChromeLauncher)(this.port);
|
|
185
|
+
const instance = await launcher.ensureChrome();
|
|
186
|
+
const currentWsUrl = instance.wsEndpoint;
|
|
187
|
+
// Check if the browser's WebSocket URL matches current Chrome
|
|
188
|
+
const browserWsUrl = this.browser.wsEndpoint();
|
|
189
|
+
if (browserWsUrl !== currentWsUrl) {
|
|
190
|
+
console.error('[CDPClient] WebSocket URL mismatch, reconnecting...');
|
|
191
|
+
await this.forceReconnect();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
console.error('[CDPClient] Connection check failed, reconnecting...');
|
|
198
|
+
await this.forceReconnect();
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.connectionState = 'connecting';
|
|
203
|
+
await this.connectInternal();
|
|
204
|
+
this.startHeartbeat();
|
|
205
|
+
console.error('[CDPClient] Connected to Chrome');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Force reconnect by disconnecting and reconnecting
|
|
209
|
+
*/
|
|
210
|
+
async forceReconnect() {
|
|
211
|
+
this.stopHeartbeat();
|
|
212
|
+
if (this.browser) {
|
|
213
|
+
try {
|
|
214
|
+
this.browser.removeAllListeners('disconnected');
|
|
215
|
+
await this.browser.disconnect();
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Ignore disconnect errors
|
|
219
|
+
}
|
|
220
|
+
this.browser = null;
|
|
221
|
+
this.sessions.clear();
|
|
222
|
+
}
|
|
223
|
+
this.connectionState = 'connecting';
|
|
224
|
+
await this.connectInternal();
|
|
225
|
+
this.startHeartbeat();
|
|
226
|
+
console.error('[CDPClient] Reconnected to Chrome');
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Disconnect from Chrome
|
|
230
|
+
*/
|
|
231
|
+
async disconnect() {
|
|
232
|
+
this.stopHeartbeat();
|
|
233
|
+
if (this.browser) {
|
|
234
|
+
try {
|
|
235
|
+
await this.browser.disconnect();
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Browser might already be disconnected
|
|
239
|
+
}
|
|
240
|
+
this.browser = null;
|
|
241
|
+
this.sessions.clear();
|
|
242
|
+
this.connectionState = 'disconnected';
|
|
243
|
+
console.error('[CDPClient] Disconnected from Chrome');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get browser instance
|
|
248
|
+
*/
|
|
249
|
+
getBrowser() {
|
|
250
|
+
if (!this.browser) {
|
|
251
|
+
throw new Error('Not connected to Chrome. Call connect() first.');
|
|
252
|
+
}
|
|
253
|
+
return this.browser;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a new page
|
|
257
|
+
*/
|
|
258
|
+
async createPage(url) {
|
|
259
|
+
const browser = this.getBrowser();
|
|
260
|
+
const page = await browser.newPage();
|
|
261
|
+
if (url) {
|
|
262
|
+
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
263
|
+
}
|
|
264
|
+
return page;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get all page targets
|
|
268
|
+
*/
|
|
269
|
+
async getPages() {
|
|
270
|
+
const browser = this.getBrowser();
|
|
271
|
+
return browser.pages();
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get page by target ID
|
|
275
|
+
*/
|
|
276
|
+
async getPageByTargetId(targetId) {
|
|
277
|
+
const browser = this.getBrowser();
|
|
278
|
+
const targets = browser.targets();
|
|
279
|
+
for (const target of targets) {
|
|
280
|
+
if (getTargetId(target) === targetId && target.type() === 'page') {
|
|
281
|
+
const page = await target.page();
|
|
282
|
+
return page;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get CDP session for a page
|
|
289
|
+
*/
|
|
290
|
+
async getCDPSession(page) {
|
|
291
|
+
const target = page.target();
|
|
292
|
+
const targetId = getTargetId(target);
|
|
293
|
+
let session = this.sessions.get(targetId);
|
|
294
|
+
if (!session) {
|
|
295
|
+
session = await page.createCDPSession();
|
|
296
|
+
this.sessions.set(targetId, session);
|
|
297
|
+
}
|
|
298
|
+
return session;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Execute CDP command on a page
|
|
302
|
+
*/
|
|
303
|
+
async send(page, method, params) {
|
|
304
|
+
const session = await this.getCDPSession(page);
|
|
305
|
+
return session.send(method, params);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get all targets
|
|
309
|
+
*/
|
|
310
|
+
getTargets() {
|
|
311
|
+
return this.getBrowser().targets();
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Find target by ID
|
|
315
|
+
*/
|
|
316
|
+
findTarget(targetId) {
|
|
317
|
+
return this.getTargets().find((t) => getTargetId(t) === targetId);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Close a page by target ID
|
|
321
|
+
*/
|
|
322
|
+
async closePage(targetId) {
|
|
323
|
+
const page = await this.getPageByTargetId(targetId);
|
|
324
|
+
if (page) {
|
|
325
|
+
await page.close();
|
|
326
|
+
this.sessions.delete(targetId);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Check if connected
|
|
331
|
+
*/
|
|
332
|
+
isConnected() {
|
|
333
|
+
return this.browser !== null && this.browser.isConnected();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
exports.CDPClient = CDPClient;
|
|
337
|
+
// Singleton instance
|
|
338
|
+
let clientInstance = null;
|
|
339
|
+
function getCDPClient(options) {
|
|
340
|
+
if (!clientInstance) {
|
|
341
|
+
clientInstance = new CDPClient(options);
|
|
342
|
+
}
|
|
343
|
+
return clientInstance;
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome Launcher - Manages Chrome process with remote debugging
|
|
3
|
+
*/
|
|
4
|
+
import { ChildProcess } from 'child_process';
|
|
5
|
+
export interface ChromeInstance {
|
|
6
|
+
wsEndpoint: string;
|
|
7
|
+
httpEndpoint: string;
|
|
8
|
+
process?: ChildProcess;
|
|
9
|
+
userDataDir?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface LaunchOptions {
|
|
12
|
+
port?: number;
|
|
13
|
+
userDataDir?: string;
|
|
14
|
+
headless?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class ChromeLauncher {
|
|
17
|
+
private instance;
|
|
18
|
+
private port;
|
|
19
|
+
constructor(port?: number);
|
|
20
|
+
/**
|
|
21
|
+
* Ensure Chrome with remote debugging is available
|
|
22
|
+
*/
|
|
23
|
+
ensureChrome(options?: LaunchOptions): Promise<ChromeInstance>;
|
|
24
|
+
/**
|
|
25
|
+
* Get debug endpoint URL
|
|
26
|
+
*/
|
|
27
|
+
getDebugEndpoint(): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Get WebSocket endpoint
|
|
30
|
+
*/
|
|
31
|
+
getWsEndpoint(): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Close Chrome instance (only if we launched it)
|
|
34
|
+
*/
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if connected
|
|
38
|
+
*/
|
|
39
|
+
isConnected(): boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare function getChromeLauncher(port?: number): ChromeLauncher;
|
|
42
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/chrome/launcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAS,YAAY,EAAY,MAAM,eAAe,CAAC;AAM9D,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+FD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAqB;IAIvC;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IA+ExE;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOzC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAOtC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACH,WAAW,IAAI,OAAO;CAGvB;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAK/D"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chrome Launcher - Manages Chrome process with remote debugging
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ChromeLauncher = void 0;
|
|
40
|
+
exports.getChromeLauncher = getChromeLauncher;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const http = __importStar(require("http"));
|
|
46
|
+
const DEFAULT_PORT = 9222;
|
|
47
|
+
/**
|
|
48
|
+
* Find Chrome executable path based on platform
|
|
49
|
+
*/
|
|
50
|
+
function findChromePath() {
|
|
51
|
+
const platform = os.platform();
|
|
52
|
+
if (platform === 'win32') {
|
|
53
|
+
const paths = [
|
|
54
|
+
process.env['PROGRAMFILES(X86)'] + '\\Google\\Chrome\\Application\\chrome.exe',
|
|
55
|
+
process.env['PROGRAMFILES'] + '\\Google\\Chrome\\Application\\chrome.exe',
|
|
56
|
+
process.env['LOCALAPPDATA'] + '\\Google\\Chrome\\Application\\chrome.exe',
|
|
57
|
+
];
|
|
58
|
+
for (const p of paths) {
|
|
59
|
+
if (fs.existsSync(p))
|
|
60
|
+
return p;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (platform === 'darwin') {
|
|
64
|
+
const paths = [
|
|
65
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
66
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
67
|
+
];
|
|
68
|
+
for (const p of paths) {
|
|
69
|
+
if (fs.existsSync(p))
|
|
70
|
+
return p;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Linux
|
|
75
|
+
try {
|
|
76
|
+
return (0, child_process_1.execSync)('which google-chrome || which chromium-browser || which chromium', {
|
|
77
|
+
encoding: 'utf8',
|
|
78
|
+
}).trim();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if Chrome debug port is already available
|
|
88
|
+
*/
|
|
89
|
+
async function checkDebugPort(port) {
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
const req = http.request({
|
|
92
|
+
hostname: '127.0.0.1',
|
|
93
|
+
port,
|
|
94
|
+
path: '/json/version',
|
|
95
|
+
method: 'GET',
|
|
96
|
+
timeout: 2000,
|
|
97
|
+
}, (res) => {
|
|
98
|
+
let data = '';
|
|
99
|
+
res.on('data', (chunk) => (data += chunk));
|
|
100
|
+
res.on('end', () => {
|
|
101
|
+
try {
|
|
102
|
+
const json = JSON.parse(data);
|
|
103
|
+
resolve(json.webSocketDebuggerUrl || null);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
resolve(null);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
req.on('error', () => resolve(null));
|
|
111
|
+
req.on('timeout', () => {
|
|
112
|
+
req.destroy();
|
|
113
|
+
resolve(null);
|
|
114
|
+
});
|
|
115
|
+
req.end();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Wait for debug port to become available
|
|
120
|
+
*/
|
|
121
|
+
async function waitForDebugPort(port, timeout = 30000) {
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
while (Date.now() - startTime < timeout) {
|
|
124
|
+
const wsEndpoint = await checkDebugPort(port);
|
|
125
|
+
if (wsEndpoint) {
|
|
126
|
+
return wsEndpoint;
|
|
127
|
+
}
|
|
128
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`Chrome debug port ${port} not available after ${timeout}ms`);
|
|
131
|
+
}
|
|
132
|
+
class ChromeLauncher {
|
|
133
|
+
instance = null;
|
|
134
|
+
port;
|
|
135
|
+
constructor(port = DEFAULT_PORT) {
|
|
136
|
+
this.port = port;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Ensure Chrome with remote debugging is available
|
|
140
|
+
*/
|
|
141
|
+
async ensureChrome(options = {}) {
|
|
142
|
+
const port = options.port || this.port;
|
|
143
|
+
// Check if already connected and instance is still valid
|
|
144
|
+
if (this.instance) {
|
|
145
|
+
// Verify the cached instance is still valid by checking the debug port
|
|
146
|
+
const currentWs = await checkDebugPort(port);
|
|
147
|
+
if (currentWs && currentWs === this.instance.wsEndpoint) {
|
|
148
|
+
return this.instance;
|
|
149
|
+
}
|
|
150
|
+
// Instance is stale, clear it
|
|
151
|
+
console.error('[ChromeLauncher] Cached instance is stale, refreshing...');
|
|
152
|
+
this.instance = null;
|
|
153
|
+
}
|
|
154
|
+
// Check if Chrome is already running with debug port
|
|
155
|
+
const existingWs = await checkDebugPort(port);
|
|
156
|
+
if (existingWs) {
|
|
157
|
+
console.error(`[ChromeLauncher] Found existing Chrome on port ${port}`);
|
|
158
|
+
this.instance = {
|
|
159
|
+
wsEndpoint: existingWs,
|
|
160
|
+
httpEndpoint: `http://127.0.0.1:${port}`,
|
|
161
|
+
};
|
|
162
|
+
return this.instance;
|
|
163
|
+
}
|
|
164
|
+
// Launch new Chrome instance
|
|
165
|
+
console.error(`[ChromeLauncher] Launching Chrome with debug port ${port}...`);
|
|
166
|
+
const chromePath = findChromePath();
|
|
167
|
+
if (!chromePath) {
|
|
168
|
+
throw new Error('Chrome not found. Please install Google Chrome or set CHROME_PATH environment variable.');
|
|
169
|
+
}
|
|
170
|
+
// Create unique user data directory (Chrome 136+ requirement)
|
|
171
|
+
const userDataDir = options.userDataDir ||
|
|
172
|
+
path.join(os.tmpdir(), `claude-chrome-parallel-${Date.now()}`);
|
|
173
|
+
fs.mkdirSync(userDataDir, { recursive: true });
|
|
174
|
+
const args = [
|
|
175
|
+
`--remote-debugging-port=${port}`,
|
|
176
|
+
`--user-data-dir=${userDataDir}`,
|
|
177
|
+
'--no-first-run',
|
|
178
|
+
'--no-default-browser-check',
|
|
179
|
+
'--disable-background-networking',
|
|
180
|
+
'--disable-sync',
|
|
181
|
+
'--disable-translate',
|
|
182
|
+
'--metrics-recording-only',
|
|
183
|
+
];
|
|
184
|
+
if (options.headless) {
|
|
185
|
+
args.push('--headless=new');
|
|
186
|
+
}
|
|
187
|
+
const chromeProcess = (0, child_process_1.spawn)(chromePath, args, {
|
|
188
|
+
detached: true,
|
|
189
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
190
|
+
});
|
|
191
|
+
chromeProcess.unref();
|
|
192
|
+
// Wait for debug port
|
|
193
|
+
const wsEndpoint = await waitForDebugPort(port);
|
|
194
|
+
this.instance = {
|
|
195
|
+
wsEndpoint,
|
|
196
|
+
httpEndpoint: `http://127.0.0.1:${port}`,
|
|
197
|
+
process: chromeProcess,
|
|
198
|
+
userDataDir,
|
|
199
|
+
};
|
|
200
|
+
console.error(`[ChromeLauncher] Chrome ready at ${wsEndpoint}`);
|
|
201
|
+
return this.instance;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get debug endpoint URL
|
|
205
|
+
*/
|
|
206
|
+
async getDebugEndpoint() {
|
|
207
|
+
if (!this.instance) {
|
|
208
|
+
await this.ensureChrome();
|
|
209
|
+
}
|
|
210
|
+
return this.instance.httpEndpoint;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get WebSocket endpoint
|
|
214
|
+
*/
|
|
215
|
+
async getWsEndpoint() {
|
|
216
|
+
if (!this.instance) {
|
|
217
|
+
await this.ensureChrome();
|
|
218
|
+
}
|
|
219
|
+
return this.instance.wsEndpoint;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Close Chrome instance (only if we launched it)
|
|
223
|
+
*/
|
|
224
|
+
async close() {
|
|
225
|
+
if (this.instance?.process) {
|
|
226
|
+
console.error('[ChromeLauncher] Closing Chrome...');
|
|
227
|
+
this.instance.process.kill();
|
|
228
|
+
// Clean up user data dir
|
|
229
|
+
if (this.instance.userDataDir) {
|
|
230
|
+
try {
|
|
231
|
+
fs.rmSync(this.instance.userDataDir, { recursive: true, force: true });
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Ignore cleanup errors
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
this.instance = null;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if connected
|
|
242
|
+
*/
|
|
243
|
+
isConnected() {
|
|
244
|
+
return this.instance !== null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.ChromeLauncher = ChromeLauncher;
|
|
248
|
+
// Singleton instance
|
|
249
|
+
let launcherInstance = null;
|
|
250
|
+
function getChromeLauncher(port) {
|
|
251
|
+
if (!launcherInstance) {
|
|
252
|
+
launcherInstance = new ChromeLauncher(port);
|
|
253
|
+
}
|
|
254
|
+
return launcherInstance;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/chrome/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Session - Standalone wrapper for running Claude Code in isolated environments
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* claude-session [claude-args...] - Start Claude Code with isolated config
|
|
7
|
+
* claude-session --list - List active sessions
|
|
8
|
+
* claude-session --cleanup - Clean up stale sessions
|
|
9
|
+
* claude-session --recover - Recover corrupted .claude.json
|
|
10
|
+
*/
|
|
11
|
+
export {};
|