claude-chrome-parallel 3.0.3 → 3.4.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 (315) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +398 -464
  3. package/assets/demo.svg +278 -173
  4. package/dist/cdp/client.d.ts +60 -2
  5. package/dist/cdp/client.d.ts.map +1 -1
  6. package/dist/cdp/client.js +344 -5
  7. package/dist/cdp/client.js.map +1 -1
  8. package/dist/cdp/connection-pool.d.ts.map +1 -1
  9. package/dist/cdp/connection-pool.js +20 -4
  10. package/dist/cdp/connection-pool.js.map +1 -1
  11. package/dist/chrome/launcher.d.ts +11 -0
  12. package/dist/chrome/launcher.d.ts.map +1 -1
  13. package/dist/chrome/launcher.js +124 -10
  14. package/dist/chrome/launcher.js.map +1 -1
  15. package/dist/chrome/pool.d.ts +54 -0
  16. package/dist/chrome/pool.d.ts.map +1 -0
  17. package/dist/chrome/pool.js +301 -0
  18. package/dist/chrome/pool.js.map +1 -0
  19. package/dist/chrome/profile-detector.d.ts +52 -0
  20. package/dist/chrome/profile-detector.d.ts.map +1 -0
  21. package/dist/chrome/profile-detector.js +246 -0
  22. package/dist/chrome/profile-detector.js.map +1 -0
  23. package/dist/cli/claude-session.js +15 -15
  24. package/dist/cli/index.js +162 -37
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/update-check.d.ts +9 -0
  27. package/dist/cli/update-check.js +141 -0
  28. package/dist/cli/update-check.js.map +1 -0
  29. package/dist/config/global.d.ts +31 -0
  30. package/dist/config/global.d.ts.map +1 -1
  31. package/dist/config/global.js.map +1 -1
  32. package/dist/dashboard/activity-tracker.d.ts +60 -0
  33. package/dist/dashboard/activity-tracker.d.ts.map +1 -0
  34. package/dist/dashboard/activity-tracker.js +178 -0
  35. package/dist/dashboard/activity-tracker.js.map +1 -0
  36. package/dist/dashboard/ansi.d.ts +117 -0
  37. package/dist/dashboard/ansi.d.ts.map +1 -0
  38. package/dist/dashboard/ansi.js +199 -0
  39. package/dist/dashboard/ansi.js.map +1 -0
  40. package/dist/dashboard/index.d.ts +110 -0
  41. package/dist/dashboard/index.d.ts.map +1 -0
  42. package/dist/dashboard/index.js +412 -0
  43. package/dist/dashboard/index.js.map +1 -0
  44. package/dist/dashboard/keyboard-handler.d.ts +43 -0
  45. package/dist/dashboard/keyboard-handler.d.ts.map +1 -0
  46. package/dist/dashboard/keyboard-handler.js +215 -0
  47. package/dist/dashboard/keyboard-handler.js.map +1 -0
  48. package/dist/dashboard/operation-controller.d.ts +76 -0
  49. package/dist/dashboard/operation-controller.d.ts.map +1 -0
  50. package/dist/dashboard/operation-controller.js +167 -0
  51. package/dist/dashboard/operation-controller.js.map +1 -0
  52. package/dist/dashboard/renderer.d.ts +76 -0
  53. package/dist/dashboard/renderer.d.ts.map +1 -0
  54. package/dist/dashboard/renderer.js +193 -0
  55. package/dist/dashboard/renderer.js.map +1 -0
  56. package/dist/dashboard/types.d.ts +56 -0
  57. package/dist/dashboard/types.d.ts.map +1 -0
  58. package/dist/dashboard/types.js +12 -0
  59. package/dist/dashboard/types.js.map +1 -0
  60. package/dist/dashboard/views/main-view.d.ts +23 -0
  61. package/dist/dashboard/views/main-view.d.ts.map +1 -0
  62. package/dist/dashboard/views/main-view.js +143 -0
  63. package/dist/dashboard/views/main-view.js.map +1 -0
  64. package/dist/dashboard/views/sessions-view.d.ts +22 -0
  65. package/dist/dashboard/views/sessions-view.d.ts.map +1 -0
  66. package/dist/dashboard/views/sessions-view.js +104 -0
  67. package/dist/dashboard/views/sessions-view.js.map +1 -0
  68. package/dist/dashboard/views/tabs-view.d.ts +21 -0
  69. package/dist/dashboard/views/tabs-view.d.ts.map +1 -0
  70. package/dist/dashboard/views/tabs-view.js +92 -0
  71. package/dist/dashboard/views/tabs-view.js.map +1 -0
  72. package/dist/hints/hint-engine.d.ts +65 -0
  73. package/dist/hints/hint-engine.d.ts.map +1 -0
  74. package/dist/hints/hint-engine.js +156 -0
  75. package/dist/hints/hint-engine.js.map +1 -0
  76. package/dist/hints/index.d.ts +8 -0
  77. package/dist/hints/index.d.ts.map +1 -0
  78. package/dist/hints/index.js +11 -0
  79. package/dist/hints/index.js.map +1 -0
  80. package/dist/hints/pattern-learner.d.ts +76 -0
  81. package/dist/hints/pattern-learner.d.ts.map +1 -0
  82. package/dist/hints/pattern-learner.js +254 -0
  83. package/dist/hints/pattern-learner.js.map +1 -0
  84. package/dist/hints/rules/composite-suggestions.d.ts +6 -0
  85. package/dist/hints/rules/composite-suggestions.d.ts.map +1 -0
  86. package/dist/hints/rules/composite-suggestions.js +66 -0
  87. package/dist/hints/rules/composite-suggestions.js.map +1 -0
  88. package/dist/hints/rules/error-recovery.d.ts +7 -0
  89. package/dist/hints/rules/error-recovery.d.ts.map +1 -0
  90. package/dist/hints/rules/error-recovery.js +47 -0
  91. package/dist/hints/rules/error-recovery.js.map +1 -0
  92. package/dist/hints/rules/learned-rules.d.ts +13 -0
  93. package/dist/hints/rules/learned-rules.d.ts.map +1 -0
  94. package/dist/hints/rules/learned-rules.js +27 -0
  95. package/dist/hints/rules/learned-rules.js.map +1 -0
  96. package/dist/hints/rules/repetition-detection.d.ts +7 -0
  97. package/dist/hints/rules/repetition-detection.d.ts.map +1 -0
  98. package/dist/hints/rules/repetition-detection.js +82 -0
  99. package/dist/hints/rules/repetition-detection.js.map +1 -0
  100. package/dist/hints/rules/sequence-detection.d.ts +6 -0
  101. package/dist/hints/rules/sequence-detection.d.ts.map +1 -0
  102. package/dist/hints/rules/sequence-detection.js +61 -0
  103. package/dist/hints/rules/sequence-detection.js.map +1 -0
  104. package/dist/hints/rules/success-hints.d.ts +6 -0
  105. package/dist/hints/rules/success-hints.d.ts.map +1 -0
  106. package/dist/hints/rules/success-hints.js +62 -0
  107. package/dist/hints/rules/success-hints.js.map +1 -0
  108. package/dist/index.js +190 -55
  109. package/dist/index.js.map +1 -1
  110. package/dist/lightpanda/launcher.d.ts +58 -0
  111. package/dist/lightpanda/launcher.d.ts.map +1 -0
  112. package/dist/lightpanda/launcher.js +199 -0
  113. package/dist/lightpanda/launcher.js.map +1 -0
  114. package/dist/mcp-server.d.ts +38 -1
  115. package/dist/mcp-server.d.ts.map +1 -1
  116. package/dist/mcp-server.js +220 -6
  117. package/dist/mcp-server.js.map +1 -1
  118. package/dist/orchestration/state-manager.js +46 -46
  119. package/dist/orchestration/workflow-engine.d.ts +1 -0
  120. package/dist/orchestration/workflow-engine.d.ts.map +1 -1
  121. package/dist/orchestration/workflow-engine.js +112 -114
  122. package/dist/orchestration/workflow-engine.js.map +1 -1
  123. package/dist/resources/usage-guide.d.ts +13 -0
  124. package/dist/resources/usage-guide.d.ts.map +1 -0
  125. package/dist/resources/usage-guide.js +101 -0
  126. package/dist/resources/usage-guide.js.map +1 -0
  127. package/dist/router/browser-router.d.ts +51 -0
  128. package/dist/router/browser-router.d.ts.map +1 -0
  129. package/dist/router/browser-router.js +178 -0
  130. package/dist/router/browser-router.js.map +1 -0
  131. package/dist/router/cookie-sync.d.ts +48 -0
  132. package/dist/router/cookie-sync.d.ts.map +1 -0
  133. package/dist/router/cookie-sync.js +106 -0
  134. package/dist/router/cookie-sync.js.map +1 -0
  135. package/dist/router/index.d.ts +5 -0
  136. package/dist/router/index.d.ts.map +1 -0
  137. package/dist/router/index.js +10 -0
  138. package/dist/router/index.js.map +1 -0
  139. package/dist/router/tool-routing-registry.d.ts +21 -0
  140. package/dist/router/tool-routing-registry.d.ts.map +1 -0
  141. package/dist/router/tool-routing-registry.js +90 -0
  142. package/dist/router/tool-routing-registry.js.map +1 -0
  143. package/dist/session-manager.d.ts +41 -1
  144. package/dist/session-manager.d.ts.map +1 -1
  145. package/dist/session-manager.js +216 -21
  146. package/dist/session-manager.js.map +1 -1
  147. package/dist/tools/click-element.d.ts +8 -0
  148. package/dist/tools/click-element.d.ts.map +1 -0
  149. package/dist/tools/click-element.js +383 -0
  150. package/dist/tools/click-element.js.map +1 -0
  151. package/dist/tools/computer.d.ts.map +1 -1
  152. package/dist/tools/computer.js +198 -34
  153. package/dist/tools/computer.js.map +1 -1
  154. package/dist/tools/console-capture.d.ts +6 -0
  155. package/dist/tools/console-capture.d.ts.map +1 -0
  156. package/dist/tools/console-capture.js +320 -0
  157. package/dist/tools/console-capture.js.map +1 -0
  158. package/dist/tools/cookies.d.ts +6 -0
  159. package/dist/tools/cookies.d.ts.map +1 -0
  160. package/dist/tools/cookies.js +263 -0
  161. package/dist/tools/cookies.js.map +1 -0
  162. package/dist/tools/drag-drop.d.ts +6 -0
  163. package/dist/tools/drag-drop.d.ts.map +1 -0
  164. package/dist/tools/drag-drop.js +252 -0
  165. package/dist/tools/drag-drop.js.map +1 -0
  166. package/dist/tools/emulate-device.d.ts +6 -0
  167. package/dist/tools/emulate-device.d.ts.map +1 -0
  168. package/dist/tools/emulate-device.js +221 -0
  169. package/dist/tools/emulate-device.js.map +1 -0
  170. package/dist/tools/file-upload.d.ts +6 -0
  171. package/dist/tools/file-upload.d.ts.map +1 -0
  172. package/dist/tools/file-upload.js +208 -0
  173. package/dist/tools/file-upload.js.map +1 -0
  174. package/dist/tools/fill-form.d.ts +8 -0
  175. package/dist/tools/fill-form.d.ts.map +1 -0
  176. package/dist/tools/fill-form.js +342 -0
  177. package/dist/tools/fill-form.js.map +1 -0
  178. package/dist/tools/find.d.ts.map +1 -1
  179. package/dist/tools/find.js +153 -65
  180. package/dist/tools/find.js.map +1 -1
  181. package/dist/tools/form-input.js +52 -52
  182. package/dist/tools/form-input.js.map +1 -1
  183. package/dist/tools/geolocation.d.ts +6 -0
  184. package/dist/tools/geolocation.d.ts.map +1 -0
  185. package/dist/tools/geolocation.js +172 -0
  186. package/dist/tools/geolocation.js.map +1 -0
  187. package/dist/tools/http-auth.d.ts +6 -0
  188. package/dist/tools/http-auth.d.ts.map +1 -0
  189. package/dist/tools/http-auth.js +136 -0
  190. package/dist/tools/http-auth.js.map +1 -0
  191. package/dist/tools/index.d.ts.map +1 -1
  192. package/dist/tools/index.js +50 -0
  193. package/dist/tools/index.js.map +1 -1
  194. package/dist/tools/javascript.js +1 -1
  195. package/dist/tools/javascript.js.map +1 -1
  196. package/dist/tools/navigate.d.ts.map +1 -1
  197. package/dist/tools/navigate.js +5 -2
  198. package/dist/tools/navigate.js.map +1 -1
  199. package/dist/tools/network.js +4 -4
  200. package/dist/tools/network.js.map +1 -1
  201. package/dist/tools/orchestration.d.ts.map +1 -1
  202. package/dist/tools/orchestration.js +13 -8
  203. package/dist/tools/orchestration.js.map +1 -1
  204. package/dist/tools/page-content.d.ts +6 -0
  205. package/dist/tools/page-content.d.ts.map +1 -0
  206. package/dist/tools/page-content.js +120 -0
  207. package/dist/tools/page-content.js.map +1 -0
  208. package/dist/tools/page-pdf.d.ts +6 -0
  209. package/dist/tools/page-pdf.d.ts.map +1 -0
  210. package/dist/tools/page-pdf.js +245 -0
  211. package/dist/tools/page-pdf.js.map +1 -0
  212. package/dist/tools/page-reload.d.ts +6 -0
  213. package/dist/tools/page-reload.d.ts.map +1 -0
  214. package/dist/tools/page-reload.js +89 -0
  215. package/dist/tools/page-reload.js.map +1 -0
  216. package/dist/tools/performance-metrics.d.ts +6 -0
  217. package/dist/tools/performance-metrics.d.ts.map +1 -0
  218. package/dist/tools/performance-metrics.js +158 -0
  219. package/dist/tools/performance-metrics.js.map +1 -0
  220. package/dist/tools/read-page.d.ts.map +1 -1
  221. package/dist/tools/read-page.js +4 -2
  222. package/dist/tools/read-page.js.map +1 -1
  223. package/dist/tools/request-intercept.d.ts +6 -0
  224. package/dist/tools/request-intercept.d.ts.map +1 -0
  225. package/dist/tools/request-intercept.js +439 -0
  226. package/dist/tools/request-intercept.js.map +1 -0
  227. package/dist/tools/selector-query.d.ts +6 -0
  228. package/dist/tools/selector-query.d.ts.map +1 -0
  229. package/dist/tools/selector-query.js +206 -0
  230. package/dist/tools/selector-query.js.map +1 -0
  231. package/dist/tools/storage.d.ts +6 -0
  232. package/dist/tools/storage.d.ts.map +1 -0
  233. package/dist/tools/storage.js +264 -0
  234. package/dist/tools/storage.js.map +1 -0
  235. package/dist/tools/tabs-close.d.ts +6 -0
  236. package/dist/tools/tabs-close.d.ts.map +1 -0
  237. package/dist/tools/tabs-close.js +124 -0
  238. package/dist/tools/tabs-close.js.map +1 -0
  239. package/dist/tools/tabs-context.js +1 -1
  240. package/dist/tools/tabs-context.js.map +1 -1
  241. package/dist/tools/user-agent.d.ts +6 -0
  242. package/dist/tools/user-agent.d.ts.map +1 -0
  243. package/dist/tools/user-agent.js +128 -0
  244. package/dist/tools/user-agent.js.map +1 -0
  245. package/dist/tools/wait-and-click.d.ts +8 -0
  246. package/dist/tools/wait-and-click.d.ts.map +1 -0
  247. package/dist/tools/wait-and-click.js +290 -0
  248. package/dist/tools/wait-and-click.js.map +1 -0
  249. package/dist/tools/wait-for.d.ts +6 -0
  250. package/dist/tools/wait-for.d.ts.map +1 -0
  251. package/dist/tools/wait-for.js +248 -0
  252. package/dist/tools/wait-for.js.map +1 -0
  253. package/dist/tools/xpath-query.d.ts +6 -0
  254. package/dist/tools/xpath-query.d.ts.map +1 -0
  255. package/dist/tools/xpath-query.js +230 -0
  256. package/dist/tools/xpath-query.js.map +1 -0
  257. package/dist/types/browser-backend.d.ts +30 -0
  258. package/dist/types/browser-backend.d.ts.map +1 -0
  259. package/dist/types/browser-backend.js +9 -0
  260. package/dist/types/browser-backend.js.map +1 -0
  261. package/dist/types/profile.d.ts +76 -0
  262. package/dist/types/profile.d.ts.map +1 -0
  263. package/dist/types/profile.js +35 -0
  264. package/dist/types/profile.js.map +1 -0
  265. package/dist/types/session.d.ts +7 -3
  266. package/dist/types/session.d.ts.map +1 -1
  267. package/package.json +78 -75
  268. package/dist/master/index.d.ts +0 -18
  269. package/dist/master/index.d.ts.map +0 -1
  270. package/dist/master/index.js +0 -75
  271. package/dist/master/index.js.map +0 -1
  272. package/dist/master/ipc-server.d.ts +0 -21
  273. package/dist/master/ipc-server.d.ts.map +0 -1
  274. package/dist/master/ipc-server.js +0 -175
  275. package/dist/master/ipc-server.js.map +0 -1
  276. package/dist/master/request-handler.d.ts +0 -17
  277. package/dist/master/request-handler.d.ts.map +0 -1
  278. package/dist/master/request-handler.js +0 -134
  279. package/dist/master/request-handler.js.map +0 -1
  280. package/dist/master/session-registry.d.ts +0 -120
  281. package/dist/master/session-registry.d.ts.map +0 -1
  282. package/dist/master/session-registry.js +0 -247
  283. package/dist/master/session-registry.js.map +0 -1
  284. package/dist/shared/ipc-constants.d.ts +0 -16
  285. package/dist/shared/ipc-constants.d.ts.map +0 -1
  286. package/dist/shared/ipc-constants.js +0 -66
  287. package/dist/shared/ipc-constants.js.map +0 -1
  288. package/dist/shared/ipc-protocol.d.ts +0 -33
  289. package/dist/shared/ipc-protocol.d.ts.map +0 -1
  290. package/dist/shared/ipc-protocol.js +0 -20
  291. package/dist/shared/ipc-protocol.js.map +0 -1
  292. package/dist/worker/auto-master.d.ts +0 -24
  293. package/dist/worker/auto-master.d.ts.map +0 -1
  294. package/dist/worker/auto-master.js +0 -135
  295. package/dist/worker/auto-master.js.map +0 -1
  296. package/dist/worker/index.d.ts +0 -25
  297. package/dist/worker/index.d.ts.map +0 -1
  298. package/dist/worker/index.js +0 -93
  299. package/dist/worker/index.js.map +0 -1
  300. package/dist/worker/ipc-client.d.ts +0 -26
  301. package/dist/worker/ipc-client.d.ts.map +0 -1
  302. package/dist/worker/ipc-client.js +0 -211
  303. package/dist/worker/ipc-client.js.map +0 -1
  304. package/dist/worker/remote-session-manager.d.ts +0 -114
  305. package/dist/worker/remote-session-manager.d.ts.map +0 -1
  306. package/dist/worker/remote-session-manager.js +0 -151
  307. package/dist/worker/remote-session-manager.js.map +0 -1
  308. package/dist/worker/tools.d.ts +0 -7
  309. package/dist/worker/tools.d.ts.map +0 -1
  310. package/dist/worker/tools.js +0 -340
  311. package/dist/worker/tools.js.map +0 -1
  312. package/dist/worker/worker-mcp-server.d.ts +0 -70
  313. package/dist/worker/worker-mcp-server.d.ts.map +0 -1
  314. package/dist/worker/worker-mcp-server.js +0 -295
  315. package/dist/worker/worker-mcp-server.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * Chrome Profile Detector - Detects and manages Chrome profiles
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.getChromeUserDataDir = getChromeUserDataDir;
40
+ exports.isProfileInUse = isProfileInUse;
41
+ exports.parseLocalState = parseLocalState;
42
+ exports.getProfileMetadata = getProfileMetadata;
43
+ exports.detectProfiles = detectProfiles;
44
+ exports.getProfile = getProfile;
45
+ exports.getProfileDetector = getProfileDetector;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ /**
50
+ * Get Chrome user data directory path for the current platform
51
+ */
52
+ function getChromeUserDataDir(platform) {
53
+ const p = platform || os.platform();
54
+ switch (p) {
55
+ case 'darwin':
56
+ return path.join(os.homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
57
+ case 'win32':
58
+ return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'Google', 'Chrome', 'User Data');
59
+ case 'linux':
60
+ default:
61
+ return path.join(os.homedir(), '.config', 'google-chrome');
62
+ }
63
+ }
64
+ /**
65
+ * Check if a profile is currently in use by checking lock files
66
+ *
67
+ * Chrome uses different lock mechanisms on different platforms:
68
+ * - Linux: SingletonLock (symlink)
69
+ * - macOS/Windows: lockfile
70
+ */
71
+ async function isProfileInUse(profilePath) {
72
+ const platform = os.platform();
73
+ // Check for SingletonLock (Linux)
74
+ const singletonLock = path.join(profilePath, 'SingletonLock');
75
+ if (fs.existsSync(singletonLock)) {
76
+ return true;
77
+ }
78
+ // Check for lockfile (macOS/Windows)
79
+ const lockfile = path.join(profilePath, 'lockfile');
80
+ if (fs.existsSync(lockfile)) {
81
+ return true;
82
+ }
83
+ // Check parent directory for singleton lock (user data dir level)
84
+ const userDataDir = path.dirname(profilePath);
85
+ const userDataLock = path.join(userDataDir, 'SingletonLock');
86
+ if (fs.existsSync(userDataLock)) {
87
+ // This means Chrome is running with this user data dir
88
+ // but we can't know which specific profile is active
89
+ // For safety, we'll check if there's activity in the profile
90
+ // Check for running lock in the profile
91
+ const runningLock = path.join(profilePath, 'LOCK');
92
+ if (fs.existsSync(runningLock)) {
93
+ return true;
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ /**
99
+ * Parse Chrome's Local State file
100
+ */
101
+ async function parseLocalState(userDataDir) {
102
+ const localStatePath = path.join(userDataDir, 'Local State');
103
+ if (!fs.existsSync(localStatePath)) {
104
+ return null;
105
+ }
106
+ try {
107
+ const content = fs.readFileSync(localStatePath, 'utf8');
108
+ return JSON.parse(content);
109
+ }
110
+ catch (error) {
111
+ console.error('[ProfileDetector] Failed to parse Local State:', error);
112
+ return null;
113
+ }
114
+ }
115
+ /**
116
+ * Get metadata for a specific profile
117
+ */
118
+ async function getProfileMetadata(profilePath, localState) {
119
+ const profileId = path.basename(profilePath);
120
+ const result = {
121
+ id: profileId,
122
+ name: profileId,
123
+ path: profilePath,
124
+ };
125
+ // Get info from Local State if available
126
+ if (localState?.profile?.info_cache) {
127
+ const info = localState.profile.info_cache[profileId];
128
+ if (info) {
129
+ result.name = info.name || info.shortcut_name || profileId;
130
+ result.email = info.user_name || info.gaia_name;
131
+ }
132
+ }
133
+ // Try to read Preferences file for additional info
134
+ const prefsPath = path.join(profilePath, 'Preferences');
135
+ if (fs.existsSync(prefsPath)) {
136
+ try {
137
+ const prefs = JSON.parse(fs.readFileSync(prefsPath, 'utf8'));
138
+ // Get account info if available
139
+ if (prefs.account_info && Array.isArray(prefs.account_info) && prefs.account_info.length > 0) {
140
+ const account = prefs.account_info[0];
141
+ if (account.email && !result.email) {
142
+ result.email = account.email;
143
+ }
144
+ }
145
+ // Get profile name from preferences
146
+ if (prefs.profile?.name && result.name === profileId) {
147
+ result.name = prefs.profile.name;
148
+ }
149
+ }
150
+ catch {
151
+ // Ignore parse errors
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ /**
157
+ * Detect all Chrome profiles
158
+ */
159
+ async function detectProfiles(options) {
160
+ const userDataDir = options?.userDataDir || getChromeUserDataDir();
161
+ const profiles = [];
162
+ if (!fs.existsSync(userDataDir)) {
163
+ console.error(`[ProfileDetector] Chrome user data directory not found: ${userDataDir}`);
164
+ return { userDataDir, profiles };
165
+ }
166
+ // Parse Local State for profile metadata
167
+ const localState = await parseLocalState(userDataDir);
168
+ // Find profile directories
169
+ const entries = fs.readdirSync(userDataDir, { withFileTypes: true });
170
+ for (const entry of entries) {
171
+ if (!entry.isDirectory())
172
+ continue;
173
+ // Profile directories are "Default" or "Profile N"
174
+ const name = entry.name;
175
+ if (name !== 'Default' && !name.startsWith('Profile '))
176
+ continue;
177
+ const profilePath = path.join(userDataDir, name);
178
+ // Verify it's actually a profile directory (has Preferences file)
179
+ const prefsPath = path.join(profilePath, 'Preferences');
180
+ if (!fs.existsSync(prefsPath))
181
+ continue;
182
+ // Get profile metadata
183
+ const metadata = await getProfileMetadata(profilePath, localState);
184
+ // Check if profile is in use
185
+ const inUse = await isProfileInUse(profilePath);
186
+ profiles.push({
187
+ id: name,
188
+ name: metadata.name || name,
189
+ path: profilePath,
190
+ email: metadata.email,
191
+ isInUse: inUse,
192
+ });
193
+ }
194
+ // Sort profiles: Default first, then by name
195
+ profiles.sort((a, b) => {
196
+ if (a.id === 'Default')
197
+ return -1;
198
+ if (b.id === 'Default')
199
+ return 1;
200
+ return a.id.localeCompare(b.id);
201
+ });
202
+ return { userDataDir, profiles };
203
+ }
204
+ /**
205
+ * Get a specific profile by ID
206
+ */
207
+ async function getProfile(profileId, options) {
208
+ const result = await detectProfiles(options);
209
+ return result.profiles.find(p => p.id === profileId) || null;
210
+ }
211
+ /**
212
+ * Profile detector singleton
213
+ */
214
+ class ProfileDetector {
215
+ cache = null;
216
+ cacheTime = 0;
217
+ cacheTTL = 5000; // 5 seconds
218
+ async getProfiles(options) {
219
+ const now = Date.now();
220
+ if (!options?.refresh &&
221
+ this.cache &&
222
+ !options?.userDataDir &&
223
+ now - this.cacheTime < this.cacheTTL) {
224
+ return this.cache;
225
+ }
226
+ const result = await detectProfiles(options);
227
+ if (!options?.userDataDir) {
228
+ this.cache = result;
229
+ this.cacheTime = now;
230
+ }
231
+ return result;
232
+ }
233
+ clearCache() {
234
+ this.cache = null;
235
+ this.cacheTime = 0;
236
+ }
237
+ }
238
+ // Singleton instance
239
+ let detectorInstance = null;
240
+ function getProfileDetector() {
241
+ if (!detectorInstance) {
242
+ detectorInstance = new ProfileDetector();
243
+ }
244
+ return detectorInstance;
245
+ }
246
+ //# sourceMappingURL=profile-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-detector.js","sourceRoot":"","sources":["../../src/chrome/profile-detector.ts"],"names":[],"mappings":"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"}
@@ -296,21 +296,21 @@ function startIsolatedSession(claudeArgs) {
296
296
  // Main
297
297
  const args = process.argv.slice(2);
298
298
  if (args.includes('--help') || args.includes('-h')) {
299
- console.log(`
300
- Claude Session - Run Claude Code with isolated config
301
-
302
- Usage:
303
- claude-session [claude-args...] Start Claude Code with isolated config
304
- claude-session --list List active sessions
305
- claude-session --cleanup [hours] Clean up sessions older than N hours (default: 24)
306
- claude-session --recover Recover corrupted .claude.json
307
- claude-session --help Show this help
308
-
309
- Examples:
310
- claude-session Start interactive session
311
- claude-session "Fix the bug" Start with prompt
312
- claude-session --list Show active sessions
313
- claude-session --cleanup 12 Clean up sessions older than 12 hours
299
+ console.log(`
300
+ Claude Session - Run Claude Code with isolated config
301
+
302
+ Usage:
303
+ claude-session [claude-args...] Start Claude Code with isolated config
304
+ claude-session --list List active sessions
305
+ claude-session --cleanup [hours] Clean up sessions older than N hours (default: 24)
306
+ claude-session --recover Recover corrupted .claude.json
307
+ claude-session --help Show this help
308
+
309
+ Examples:
310
+ claude-session Start interactive session
311
+ claude-session "Fix the bug" Start with prompt
312
+ claude-session --list Show active sessions
313
+ claude-session --cleanup 12 Clean up sessions older than 12 hours
314
314
  `);
315
315
  process.exit(0);
316
316
  }
package/dist/cli/index.js CHANGED
@@ -47,12 +47,14 @@ var __importStar = (this && this.__importStar) || (function () {
47
47
  })();
48
48
  Object.defineProperty(exports, "__esModule", { value: true });
49
49
  const commander_1 = require("commander");
50
- const install_1 = require("./install");
51
- const uninstall_1 = require("./uninstall");
50
+ // Legacy imports - kept for backward compatibility but deprecated
51
+ // import { install, installNativeHost } from './install';
52
+ // import { uninstall } from './uninstall';
52
53
  const path = __importStar(require("path"));
53
54
  const fs = __importStar(require("fs"));
54
55
  const os = __importStar(require("os"));
55
56
  const child_process_1 = require("child_process");
57
+ const update_check_1 = require("./update-check");
56
58
  const program = new commander_1.Command();
57
59
  // Package info - from dist/cli/ go up two levels to root
58
60
  const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
@@ -66,43 +68,103 @@ catch {
66
68
  }
67
69
  program
68
70
  .name('claude-chrome-parallel')
69
- .description('Chrome extension for parallel Claude Code sessions')
71
+ .description('MCP server for parallel Claude Code browser sessions via CDP')
70
72
  .version(version);
71
73
  program
72
74
  .command('install')
73
- .description('Install extension and native messaging host')
75
+ .description('[DEPRECATED] Extension install is no longer needed. Use CDP mode instead.')
74
76
  .option('-f, --force', 'Force reinstall even if already installed')
75
77
  .option('--extension-id <id>', 'Chrome extension ID (for native host configuration)')
78
+ .action(async () => {
79
+ console.log('⚠️ DEPRECATED: Extension installation is no longer needed.\n');
80
+ console.log('Claude Chrome Parallel now uses CDP (Chrome DevTools Protocol) mode,');
81
+ console.log('which does not require a Chrome extension.\n');
82
+ console.log('Quick Start:');
83
+ console.log(' 1. Start Chrome with debugging port:');
84
+ console.log(' chrome --remote-debugging-port=9222\n');
85
+ console.log(' 2. Add to ~/.claude.json:');
86
+ console.log(' {');
87
+ console.log(' "mcpServers": {');
88
+ console.log(' "chrome-parallel": {');
89
+ console.log(' "command": "ccp",');
90
+ console.log(' "args": ["serve"]');
91
+ console.log(' }');
92
+ console.log(' }');
93
+ console.log(' }\n');
94
+ console.log(' 3. Restart Claude Code\n');
95
+ console.log('Run "ccp doctor" to verify your setup.');
96
+ });
97
+ program
98
+ .command('uninstall')
99
+ .description('[DEPRECATED] No longer needed - CDP mode has no extension to uninstall')
100
+ .action(async () => {
101
+ console.log('⚠️ DEPRECATED: Uninstall is no longer needed.\n');
102
+ console.log('Claude Chrome Parallel now uses CDP mode, which has no extension to uninstall.');
103
+ console.log('Simply remove the MCP server config from ~/.claude.json if you want to disable it.');
104
+ });
105
+ program
106
+ .command('setup')
107
+ .description('Automatically configure MCP server for Claude Code')
108
+ .option('--dashboard', 'Enable terminal dashboard')
109
+ .option('--auto-launch', 'Auto-launch Chrome if not running (default: true)')
110
+ .option('-s, --scope <scope>', 'Installation scope: "user" (global, default) or "project" (current project only)', 'user')
76
111
  .action(async (options) => {
77
- console.log('Installing Claude Chrome Parallel...\n');
112
+ const { execSync, spawnSync } = require('child_process');
113
+ console.log('Setting up Claude Chrome Parallel for Claude Code...\n');
114
+ // Check if claude CLI is available
78
115
  try {
79
- await (0, install_1.install)(options);
80
- console.log('\n✅ Installation complete!\n');
81
- console.log('Next steps:');
82
- console.log('1. Open chrome://extensions/ in Chrome');
83
- console.log('2. Enable "Developer mode" (top right)');
84
- console.log('3. Click "Load unpacked"');
85
- console.log(`4. Select: ${getExtensionPath()}`);
86
- console.log('\n5. Note the Extension ID and run:');
87
- console.log(' claude-chrome-parallel install --extension-id <YOUR_ID>');
116
+ execSync('claude --version', { stdio: 'pipe' });
88
117
  }
89
- catch (error) {
90
- console.error('❌ Installation failed:', error);
118
+ catch {
119
+ console.error('❌ Claude Code CLI not found.');
120
+ console.error(' Please install Claude Code first: https://claude.ai/code');
91
121
  process.exit(1);
92
122
  }
93
- });
94
- program
95
- .command('uninstall')
96
- .description('Remove extension and native messaging host')
97
- .action(async () => {
98
- console.log('Uninstalling Claude Chrome Parallel...\n');
123
+ // Validate scope
124
+ const scope = options.scope || 'user';
125
+ if (scope !== 'user' && scope !== 'project') {
126
+ console.error(' Invalid scope. Use "user" (global) or "project" (current project only).');
127
+ process.exit(1);
128
+ }
129
+ // Build the serve arguments
130
+ const serveArgs = ['serve', '--auto-launch'];
131
+ if (options.dashboard) {
132
+ serveArgs.push('--dashboard');
133
+ }
134
+ // Remove existing configuration first (if any)
99
135
  try {
100
- await (0, uninstall_1.uninstall)();
101
- console.log('\n✅ Uninstallation complete!');
102
- console.log('Note: You still need to manually remove the extension from chrome://extensions/');
136
+ execSync('claude mcp remove claude-chrome-parallel 2>/dev/null', { stdio: 'pipe' });
137
+ }
138
+ catch {
139
+ // Ignore if not exists
140
+ }
141
+ // Use npx for auto-updates: every server start fetches the latest version
142
+ const fullCommand = `claude mcp add claude-chrome-parallel -s ${scope} -- npx -y claude-chrome-parallel ${serveArgs.join(' ')}`;
143
+ console.log(`Running: claude mcp add claude-chrome-parallel (scope: ${scope})...`);
144
+ try {
145
+ execSync(fullCommand, { stdio: 'inherit' });
146
+ console.log('\n✅ MCP server configured successfully!\n');
147
+ console.log(`Scope: ${scope === 'user' ? 'Global (all projects)' : 'Project (this directory only)'}\n`);
148
+ console.log('Auto-updates: enabled (via npx)\n');
149
+ console.log('Next steps:');
150
+ console.log(' 1. Restart Claude Code');
151
+ console.log(' 2. Just say "ccp" — that\'s it.\n');
152
+ console.log('Examples:');
153
+ console.log(' "ccp screenshot my Gmail"');
154
+ console.log(' "use ccp to check AWS billing"');
155
+ console.log(' "ccp search on naver.com"\n');
103
156
  }
104
157
  catch (error) {
105
- console.error('❌ Uninstallation failed:', error);
158
+ console.error('\nFailed to configure MCP server.');
159
+ console.error(' You can manually add to ~/.claude.json:');
160
+ console.error(' {');
161
+ console.error(' "mcpServers": {');
162
+ console.error(' "claude-chrome-parallel": {');
163
+ console.error(' "command": "npx",');
164
+ console.error(` "args": ["-y", "claude-chrome-parallel", ${serveArgs.map(a => `"${a}"`).join(', ')}]`);
165
+ console.error(' }');
166
+ console.error(' }');
167
+ console.error(' }');
106
168
  process.exit(1);
107
169
  }
108
170
  });
@@ -111,23 +173,56 @@ program
111
173
  .description('Start MCP server for Claude Code')
112
174
  .option('-p, --port <port>', 'Chrome remote debugging port', '9222')
113
175
  .option('--auto-launch', 'Auto-launch Chrome if not running (default: false)')
176
+ .option('--dashboard', 'Enable terminal dashboard for real-time monitoring')
177
+ .option('--hybrid', 'Enable hybrid mode (Lightpanda + Chrome routing)')
178
+ .option('--lp-port <port>', 'Lightpanda debugging port (default: 9223)', '9223')
114
179
  .action(async (options) => {
115
180
  const port = parseInt(options.port, 10);
116
181
  const autoLaunch = options.autoLaunch || false;
182
+ const dashboard = options.dashboard || false;
183
+ // Non-blocking update check (fires in background)
184
+ (0, update_check_1.checkForUpdates)(version).catch(() => { });
117
185
  console.error(`[claude-chrome-parallel] Starting MCP server`);
118
186
  console.error(`[claude-chrome-parallel] Chrome debugging port: ${port}`);
119
187
  console.error(`[claude-chrome-parallel] Auto-launch Chrome: ${autoLaunch}`);
188
+ console.error(`[claude-chrome-parallel] Dashboard: ${dashboard}`);
120
189
  // Import from built dist/ files (relative to dist/cli/)
121
190
  // eslint-disable-next-line @typescript-eslint/no-var-requires
122
191
  const { setGlobalConfig } = require('../config/global');
123
192
  // eslint-disable-next-line @typescript-eslint/no-var-requires
124
- const { getMCPServer } = require('../mcp-server');
193
+ const { getMCPServer, setMCPServerOptions } = require('../mcp-server');
125
194
  // eslint-disable-next-line @typescript-eslint/no-var-requires
126
195
  const { registerAllTools } = require('../tools');
127
196
  // Set global config before initializing anything
128
197
  setGlobalConfig({ port, autoLaunch });
198
+ // Configure hybrid mode if enabled
199
+ const hybrid = options.hybrid || false;
200
+ const lpPort = parseInt(options.lpPort || '9223', 10);
201
+ if (hybrid) {
202
+ setGlobalConfig({
203
+ hybrid: {
204
+ enabled: true,
205
+ lightpandaPort: lpPort,
206
+ },
207
+ });
208
+ console.error(`[claude-chrome-parallel] Hybrid mode: enabled`);
209
+ console.error(`[claude-chrome-parallel] Lightpanda port: ${lpPort}`);
210
+ }
211
+ // Set MCP server options (including dashboard)
212
+ setMCPServerOptions({ dashboard });
129
213
  const server = getMCPServer();
130
214
  registerAllTools(server);
215
+ // Initialize hybrid routing if enabled
216
+ if (hybrid) {
217
+ const { getSessionManager } = require('../session-manager');
218
+ const sm = getSessionManager();
219
+ await sm.initHybrid({
220
+ enabled: true,
221
+ lightpandaPort: lpPort,
222
+ circuitBreaker: { maxFailures: 3, cooldownMs: 60000 },
223
+ cookieSync: { intervalMs: 5000 },
224
+ });
225
+ }
131
226
  server.start();
132
227
  });
133
228
  program
@@ -148,24 +243,33 @@ program
148
243
  .description('Check installation status')
149
244
  .action(async () => {
150
245
  console.log('Checking installation status...\n');
151
- const checks = {
152
- 'Extension files': fs.existsSync(getExtensionPath()),
153
- 'Native host manifest': checkNativeHostManifest(),
154
- 'Node.js version': checkNodeVersion(),
246
+ // Core checks (required for CDP mode)
247
+ const coreChecks = {
248
+ 'Node.js version (>=18)': checkNodeVersion(),
155
249
  '.claude.json health': await checkClaudeConfigHealth(),
250
+ 'Chrome debugging port': await checkChromeDebugPort(),
156
251
  };
157
- for (const [name, passed] of Object.entries(checks)) {
252
+ console.log('Core Requirements:');
253
+ for (const [name, passed] of Object.entries(coreChecks)) {
158
254
  const status = passed ? '✅' : '❌';
159
- console.log(`${status} ${name}`);
255
+ console.log(` ${status} ${name}`);
160
256
  }
161
- const allPassed = Object.values(checks).every(Boolean);
257
+ const allPassed = Object.values(coreChecks).every(Boolean);
162
258
  console.log();
163
259
  if (allPassed) {
164
- console.log('All checks passed! Extension should be ready to use.');
260
+ console.log('All checks passed! Ready to use with Claude Code.');
261
+ console.log('\nUsage:');
262
+ console.log(' 1. Start Chrome with: chrome --remote-debugging-port=9222');
263
+ console.log(' 2. Add to ~/.claude.json:');
264
+ console.log(' "mcpServers": { "chrome-parallel": { "command": "ccp", "args": ["serve"] } }');
265
+ console.log(' 3. Restart Claude Code');
165
266
  }
166
267
  else {
167
- console.log('Some checks failed. Run "claude-chrome-parallel install" to fix.');
168
- if (!checks['.claude.json health']) {
268
+ if (!coreChecks['Chrome debugging port']) {
269
+ console.log('Chrome is not running with debugging port.');
270
+ console.log('Start Chrome with: chrome --remote-debugging-port=9222');
271
+ }
272
+ if (!coreChecks['.claude.json health']) {
169
273
  console.log('Run "claude-chrome-parallel recover" to fix .claude.json');
170
274
  }
171
275
  }
@@ -578,6 +682,27 @@ function checkNodeVersion() {
578
682
  const major = parseInt(version.slice(1).split('.')[0], 10);
579
683
  return major >= 18;
580
684
  }
685
+ /**
686
+ * Check if Chrome is running with debugging port
687
+ */
688
+ async function checkChromeDebugPort(port = 9222) {
689
+ try {
690
+ const http = await Promise.resolve().then(() => __importStar(require('http')));
691
+ return new Promise((resolve) => {
692
+ const req = http.get(`http://localhost:${port}/json/version`, (res) => {
693
+ resolve(res.statusCode === 200);
694
+ });
695
+ req.on('error', () => resolve(false));
696
+ req.setTimeout(2000, () => {
697
+ req.destroy();
698
+ resolve(false);
699
+ });
700
+ });
701
+ }
702
+ catch {
703
+ return false;
704
+ }
705
+ }
581
706
  /**
582
707
  * Check .claude.json health
583
708
  */