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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/dist/cdp/client.d.ts +120 -0
  4. package/dist/cdp/client.d.ts.map +1 -0
  5. package/dist/cdp/client.js +345 -0
  6. package/dist/cdp/client.js.map +1 -0
  7. package/dist/chrome/launcher.d.ts +42 -0
  8. package/dist/chrome/launcher.d.ts.map +1 -0
  9. package/dist/chrome/launcher.js +256 -0
  10. package/dist/chrome/launcher.js.map +1 -0
  11. package/dist/cli/claude-session.d.ts +11 -0
  12. package/dist/cli/claude-session.js +349 -0
  13. package/dist/cli/claude-session.js.map +1 -0
  14. package/dist/cli/index.d.ts +14 -0
  15. package/dist/cli/index.js +562 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/install.d.ts +16 -0
  18. package/dist/cli/install.js +185 -0
  19. package/dist/cli/install.js.map +1 -0
  20. package/dist/cli/uninstall.d.ts +7 -0
  21. package/dist/cli/uninstall.js +126 -0
  22. package/dist/cli/uninstall.js.map +1 -0
  23. package/dist/config/config-recovery.d.ts +69 -0
  24. package/dist/config/config-recovery.d.ts.map +1 -0
  25. package/dist/config/config-recovery.js +302 -0
  26. package/dist/config/config-recovery.js.map +1 -0
  27. package/dist/config/index.d.ts +6 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +22 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/session-isolator.d.ts +76 -0
  32. package/dist/config/session-isolator.d.ts.map +1 -0
  33. package/dist/config/session-isolator.js +268 -0
  34. package/dist/config/session-isolator.js.map +1 -0
  35. package/dist/index.d.ts +10 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +118 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/master/index.d.ts +18 -0
  40. package/dist/master/index.d.ts.map +1 -0
  41. package/dist/master/index.js +75 -0
  42. package/dist/master/index.js.map +1 -0
  43. package/dist/master/ipc-server.d.ts +21 -0
  44. package/dist/master/ipc-server.d.ts.map +1 -0
  45. package/dist/master/ipc-server.js +175 -0
  46. package/dist/master/ipc-server.js.map +1 -0
  47. package/dist/master/request-handler.d.ts +17 -0
  48. package/dist/master/request-handler.d.ts.map +1 -0
  49. package/dist/master/request-handler.js +134 -0
  50. package/dist/master/request-handler.js.map +1 -0
  51. package/dist/master/session-registry.d.ts +120 -0
  52. package/dist/master/session-registry.d.ts.map +1 -0
  53. package/dist/master/session-registry.js +247 -0
  54. package/dist/master/session-registry.js.map +1 -0
  55. package/dist/mcp-server.d.ts +69 -0
  56. package/dist/mcp-server.d.ts.map +1 -0
  57. package/dist/mcp-server.js +301 -0
  58. package/dist/mcp-server.js.map +1 -0
  59. package/dist/session-manager.d.ts +107 -0
  60. package/dist/session-manager.d.ts.map +1 -0
  61. package/dist/session-manager.js +322 -0
  62. package/dist/session-manager.js.map +1 -0
  63. package/dist/shared/ipc-constants.d.ts +16 -0
  64. package/dist/shared/ipc-constants.d.ts.map +1 -0
  65. package/dist/shared/ipc-constants.js +66 -0
  66. package/dist/shared/ipc-constants.js.map +1 -0
  67. package/dist/shared/ipc-protocol.d.ts +33 -0
  68. package/dist/shared/ipc-protocol.d.ts.map +1 -0
  69. package/dist/shared/ipc-protocol.js +20 -0
  70. package/dist/shared/ipc-protocol.js.map +1 -0
  71. package/dist/tools/computer.d.ts +6 -0
  72. package/dist/tools/computer.d.ts.map +1 -0
  73. package/dist/tools/computer.js +426 -0
  74. package/dist/tools/computer.js.map +1 -0
  75. package/dist/tools/find.d.ts +6 -0
  76. package/dist/tools/find.d.ts.map +1 -0
  77. package/dist/tools/find.js +242 -0
  78. package/dist/tools/find.js.map +1 -0
  79. package/dist/tools/form-input.d.ts +6 -0
  80. package/dist/tools/form-input.d.ts.map +1 -0
  81. package/dist/tools/form-input.js +181 -0
  82. package/dist/tools/form-input.js.map +1 -0
  83. package/dist/tools/index.d.ts +6 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +26 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/javascript.d.ts +6 -0
  88. package/dist/tools/javascript.d.ts.map +1 -0
  89. package/dist/tools/javascript.js +134 -0
  90. package/dist/tools/javascript.js.map +1 -0
  91. package/dist/tools/navigate.d.ts +6 -0
  92. package/dist/tools/navigate.d.ts.map +1 -0
  93. package/dist/tools/navigate.js +155 -0
  94. package/dist/tools/navigate.js.map +1 -0
  95. package/dist/tools/read-page.d.ts +6 -0
  96. package/dist/tools/read-page.d.ts.map +1 -0
  97. package/dist/tools/read-page.js +182 -0
  98. package/dist/tools/read-page.js.map +1 -0
  99. package/dist/tools/tabs-context.d.ts +6 -0
  100. package/dist/tools/tabs-context.d.ts.map +1 -0
  101. package/dist/tools/tabs-context.js +73 -0
  102. package/dist/tools/tabs-context.js.map +1 -0
  103. package/dist/tools/tabs-create.d.ts +6 -0
  104. package/dist/tools/tabs-create.d.ts.map +1 -0
  105. package/dist/tools/tabs-create.js +49 -0
  106. package/dist/tools/tabs-create.js.map +1 -0
  107. package/dist/types/index.d.ts +3 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +19 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/mcp.d.ts +54 -0
  112. package/dist/types/mcp.d.ts.map +1 -0
  113. package/dist/types/mcp.js +14 -0
  114. package/dist/types/mcp.js.map +1 -0
  115. package/dist/types/session.d.ts +28 -0
  116. package/dist/types/session.d.ts.map +1 -0
  117. package/dist/types/session.js +6 -0
  118. package/dist/types/session.js.map +1 -0
  119. package/dist/utils/atomic-file.d.ts +50 -0
  120. package/dist/utils/atomic-file.d.ts.map +1 -0
  121. package/dist/utils/atomic-file.js +217 -0
  122. package/dist/utils/atomic-file.js.map +1 -0
  123. package/dist/utils/index.d.ts +6 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +22 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/json-validator.d.ts +40 -0
  128. package/dist/utils/json-validator.d.ts.map +1 -0
  129. package/dist/utils/json-validator.js +295 -0
  130. package/dist/utils/json-validator.js.map +1 -0
  131. package/dist/utils/ref-id-manager.d.ts +26 -0
  132. package/dist/utils/ref-id-manager.d.ts.map +1 -0
  133. package/dist/utils/ref-id-manager.js +81 -0
  134. package/dist/utils/ref-id-manager.js.map +1 -0
  135. package/dist/utils/request-queue.d.ts +37 -0
  136. package/dist/utils/request-queue.d.ts.map +1 -0
  137. package/dist/utils/request-queue.js +110 -0
  138. package/dist/utils/request-queue.js.map +1 -0
  139. package/dist/worker/auto-master.d.ts +24 -0
  140. package/dist/worker/auto-master.d.ts.map +1 -0
  141. package/dist/worker/auto-master.js +135 -0
  142. package/dist/worker/auto-master.js.map +1 -0
  143. package/dist/worker/index.d.ts +25 -0
  144. package/dist/worker/index.d.ts.map +1 -0
  145. package/dist/worker/index.js +93 -0
  146. package/dist/worker/index.js.map +1 -0
  147. package/dist/worker/ipc-client.d.ts +26 -0
  148. package/dist/worker/ipc-client.d.ts.map +1 -0
  149. package/dist/worker/ipc-client.js +211 -0
  150. package/dist/worker/ipc-client.js.map +1 -0
  151. package/dist/worker/remote-session-manager.d.ts +114 -0
  152. package/dist/worker/remote-session-manager.d.ts.map +1 -0
  153. package/dist/worker/remote-session-manager.js +151 -0
  154. package/dist/worker/remote-session-manager.js.map +1 -0
  155. package/dist/worker/tools.d.ts +7 -0
  156. package/dist/worker/tools.d.ts.map +1 -0
  157. package/dist/worker/tools.js +340 -0
  158. package/dist/worker/tools.js.map +1 -0
  159. package/dist/worker/worker-mcp-server.d.ts +70 -0
  160. package/dist/worker/worker-mcp-server.d.ts.map +1 -0
  161. package/dist/worker/worker-mcp-server.js +295 -0
  162. package/dist/worker/worker-mcp-server.js.map +1 -0
  163. 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 {};