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,412 @@
1
+ "use strict";
2
+ /**
3
+ * Dashboard - Main controller for the terminal dashboard
4
+ *
5
+ * Provides real-time activity monitoring and control for the MCP server
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.getRenderer = exports.Renderer = exports.getKeyboardHandler = exports.KeyboardHandler = exports.setOperationController = exports.getOperationController = exports.OperationController = exports.setActivityTracker = exports.getActivityTracker = exports.ActivityTracker = exports.Dashboard = void 0;
23
+ exports.getDashboard = getDashboard;
24
+ exports.setDashboard = setDashboard;
25
+ const events_1 = require("events");
26
+ const renderer_js_1 = require("./renderer.js");
27
+ const keyboard_handler_js_1 = require("./keyboard-handler.js");
28
+ const activity_tracker_js_1 = require("./activity-tracker.js");
29
+ const operation_controller_js_1 = require("./operation-controller.js");
30
+ const main_view_js_1 = require("./views/main-view.js");
31
+ const sessions_view_js_1 = require("./views/sessions-view.js");
32
+ const tabs_view_js_1 = require("./views/tabs-view.js");
33
+ class Dashboard extends events_1.EventEmitter {
34
+ renderer;
35
+ keyboard;
36
+ activityTracker;
37
+ operationController;
38
+ mainView;
39
+ sessionsView;
40
+ tabsView;
41
+ sessionManager = null;
42
+ config;
43
+ version;
44
+ currentView = 'activity';
45
+ selectedIndex = 0;
46
+ refreshTimer = null;
47
+ spinnerFrame = 0;
48
+ startTime = Date.now();
49
+ isRunning = false;
50
+ constructor(options = {}) {
51
+ super();
52
+ this.config = {
53
+ enabled: options.enabled ?? true,
54
+ refreshInterval: options.refreshInterval ?? 100,
55
+ maxLogEntries: options.maxLogEntries ?? 50,
56
+ };
57
+ this.version = options.version ?? '3.0.4';
58
+ this.renderer = (0, renderer_js_1.getRenderer)();
59
+ this.keyboard = (0, keyboard_handler_js_1.getKeyboardHandler)();
60
+ this.activityTracker = (0, activity_tracker_js_1.getActivityTracker)();
61
+ this.operationController = (0, operation_controller_js_1.getOperationController)();
62
+ this.mainView = new main_view_js_1.MainView(this.renderer);
63
+ this.sessionsView = new sessions_view_js_1.SessionsView(this.renderer);
64
+ this.tabsView = new tabs_view_js_1.TabsView(this.renderer);
65
+ }
66
+ /**
67
+ * Set the session manager for data access
68
+ */
69
+ setSessionManager(sessionManager) {
70
+ this.sessionManager = sessionManager;
71
+ }
72
+ /**
73
+ * Get the activity tracker for tool call tracking
74
+ */
75
+ getActivityTracker() {
76
+ return this.activityTracker;
77
+ }
78
+ /**
79
+ * Get the operation controller for pause/resume/cancel
80
+ */
81
+ getOperationController() {
82
+ return this.operationController;
83
+ }
84
+ /**
85
+ * Start the dashboard
86
+ */
87
+ start() {
88
+ if (this.isRunning) {
89
+ return true;
90
+ }
91
+ // Only start if stderr is a TTY
92
+ if (!this.renderer.isTTY()) {
93
+ console.error('[Dashboard] Not a TTY, dashboard disabled');
94
+ return false;
95
+ }
96
+ // Check if keyboard is available
97
+ if (!keyboard_handler_js_1.KeyboardHandler.isAvailable()) {
98
+ console.error('[Dashboard] Keyboard input not available, dashboard disabled');
99
+ return false;
100
+ }
101
+ // Initialize screen
102
+ this.renderer.hideCursor();
103
+ this.renderer.clear();
104
+ // Start keyboard handler
105
+ const keyboardStarted = this.keyboard.start(this.handleKey.bind(this));
106
+ if (!keyboardStarted) {
107
+ console.error('[Dashboard] Failed to start keyboard handler');
108
+ this.renderer.showCursor();
109
+ return false;
110
+ }
111
+ // Subscribe to activity events for refresh
112
+ this.activityTracker.on('call:start', this.onActivityUpdate.bind(this));
113
+ this.activityTracker.on('call:end', this.onActivityUpdate.bind(this));
114
+ // Subscribe to operation controller events
115
+ this.operationController.on('paused', this.onActivityUpdate.bind(this));
116
+ this.operationController.on('resumed', this.onActivityUpdate.bind(this));
117
+ // Start refresh timer
118
+ this.refreshTimer = setInterval(() => {
119
+ this.refresh();
120
+ }, this.config.refreshInterval);
121
+ this.refreshTimer.unref();
122
+ this.startTime = Date.now();
123
+ this.isRunning = true;
124
+ this.emit('started');
125
+ // Initial render
126
+ this.refresh();
127
+ return true;
128
+ }
129
+ /**
130
+ * Stop the dashboard
131
+ */
132
+ stop() {
133
+ if (!this.isRunning) {
134
+ return;
135
+ }
136
+ // Stop refresh timer
137
+ if (this.refreshTimer) {
138
+ clearInterval(this.refreshTimer);
139
+ this.refreshTimer = null;
140
+ }
141
+ // Stop keyboard handler
142
+ this.keyboard.stop();
143
+ // Remove activity tracker listeners
144
+ this.activityTracker.removeAllListeners();
145
+ // Remove operation controller listeners
146
+ this.operationController.removeAllListeners();
147
+ // Restore screen
148
+ this.renderer.clear();
149
+ this.renderer.showCursor();
150
+ this.isRunning = false;
151
+ this.emit('stopped');
152
+ }
153
+ /**
154
+ * Handle keyboard input
155
+ */
156
+ handleKey(event) {
157
+ const key = event.key.toLowerCase();
158
+ // Global keys
159
+ if (key === 'q' || (event.ctrl && key === 'c')) {
160
+ this.emit('quit');
161
+ return;
162
+ }
163
+ // View-specific keys
164
+ if (this.currentView === 'activity') {
165
+ this.handleMainViewKey(key);
166
+ }
167
+ else if (this.currentView === 'sessions') {
168
+ this.handleSessionsViewKey(key, event);
169
+ }
170
+ else if (this.currentView === 'tabs') {
171
+ this.handleTabsViewKey(key, event);
172
+ }
173
+ // Refresh after key handling
174
+ this.refresh();
175
+ }
176
+ handleMainViewKey(key) {
177
+ switch (key) {
178
+ case 'p':
179
+ this.operationController.toggle();
180
+ break;
181
+ case 's':
182
+ this.currentView = 'sessions';
183
+ this.selectedIndex = 0;
184
+ break;
185
+ case 't':
186
+ this.currentView = 'tabs';
187
+ this.selectedIndex = 0;
188
+ break;
189
+ case 'c':
190
+ this.cancelCurrentOperation();
191
+ break;
192
+ }
193
+ }
194
+ handleSessionsViewKey(key, event) {
195
+ const sessions = this.getSessions();
196
+ switch (key) {
197
+ case 'escape':
198
+ this.currentView = 'activity';
199
+ break;
200
+ case 'up':
201
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
202
+ break;
203
+ case 'down':
204
+ this.selectedIndex = Math.min(sessions.length - 1, this.selectedIndex + 1);
205
+ break;
206
+ case 'd':
207
+ // Delete selected session
208
+ if (sessions[this.selectedIndex]) {
209
+ this.emit('delete-session', sessions[this.selectedIndex].id);
210
+ }
211
+ break;
212
+ }
213
+ }
214
+ handleTabsViewKey(key, event) {
215
+ const tabs = this.getTabs();
216
+ switch (key) {
217
+ case 'escape':
218
+ this.currentView = 'activity';
219
+ break;
220
+ case 'up':
221
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
222
+ break;
223
+ case 'down':
224
+ this.selectedIndex = Math.min(tabs.length - 1, this.selectedIndex + 1);
225
+ break;
226
+ case 'x':
227
+ // Close selected tab
228
+ if (tabs[this.selectedIndex]) {
229
+ this.emit('close-tab', tabs[this.selectedIndex].targetId, tabs[this.selectedIndex].sessionId);
230
+ }
231
+ break;
232
+ }
233
+ }
234
+ /**
235
+ * Cancel the current operation
236
+ */
237
+ cancelCurrentOperation() {
238
+ const activeCalls = this.activityTracker.getActiveCalls();
239
+ if (activeCalls.length > 0) {
240
+ // Cancel the most recent active call
241
+ const mostRecent = activeCalls[activeCalls.length - 1];
242
+ this.operationController.cancel(mostRecent.id);
243
+ this.activityTracker.endCall(mostRecent.id, 'error', 'Cancelled by user');
244
+ }
245
+ }
246
+ /**
247
+ * Refresh the display
248
+ */
249
+ refresh() {
250
+ if (!this.isRunning)
251
+ return;
252
+ this.spinnerFrame++;
253
+ const size = this.renderer.getSize();
254
+ let lines;
255
+ switch (this.currentView) {
256
+ case 'activity':
257
+ lines = this.mainView.render(this.getMainViewData(), size);
258
+ break;
259
+ case 'sessions':
260
+ lines = this.sessionsView.render(this.getSessionsViewData(), size);
261
+ break;
262
+ case 'tabs':
263
+ lines = this.tabsView.render(this.getTabsViewData(), size);
264
+ break;
265
+ }
266
+ this.renderer.render(lines);
267
+ }
268
+ /**
269
+ * Handle activity update event
270
+ */
271
+ onActivityUpdate() {
272
+ // Force refresh on activity change
273
+ this.refresh();
274
+ }
275
+ /**
276
+ * Get data for main view
277
+ */
278
+ getMainViewData() {
279
+ return {
280
+ stats: this.getStats(),
281
+ calls: this.activityTracker.getAllCalls(this.config.maxLogEntries || 50),
282
+ version: this.version,
283
+ spinnerFrame: this.spinnerFrame,
284
+ };
285
+ }
286
+ /**
287
+ * Get data for sessions view
288
+ */
289
+ getSessionsViewData() {
290
+ return {
291
+ sessions: this.getSessions(),
292
+ selectedIndex: this.selectedIndex,
293
+ version: this.version,
294
+ };
295
+ }
296
+ /**
297
+ * Get data for tabs view
298
+ */
299
+ getTabsViewData() {
300
+ return {
301
+ tabs: this.getTabs(),
302
+ selectedIndex: this.selectedIndex,
303
+ version: this.version,
304
+ };
305
+ }
306
+ /**
307
+ * Get dashboard stats
308
+ */
309
+ getStats() {
310
+ if (!this.sessionManager) {
311
+ return {
312
+ sessions: 0,
313
+ workers: 0,
314
+ tabs: 0,
315
+ queueSize: this.activityTracker.getActiveCalls().length,
316
+ memoryUsage: process.memoryUsage().heapUsed,
317
+ uptime: Date.now() - this.startTime,
318
+ status: this.operationController.isPaused ? 'paused' : 'running',
319
+ };
320
+ }
321
+ const managerStats = this.sessionManager.getStats();
322
+ return {
323
+ sessions: managerStats.activeSessions,
324
+ workers: managerStats.totalWorkers,
325
+ tabs: managerStats.totalTargets,
326
+ queueSize: this.activityTracker.getActiveCalls().length,
327
+ memoryUsage: managerStats.memoryUsage,
328
+ uptime: managerStats.uptime,
329
+ status: this.operationController.isPaused ? 'paused' : 'running',
330
+ };
331
+ }
332
+ /**
333
+ * Get session list
334
+ */
335
+ getSessions() {
336
+ if (!this.sessionManager) {
337
+ return [];
338
+ }
339
+ const sessionInfos = this.sessionManager.getAllSessionInfos();
340
+ return sessionInfos.map(info => ({
341
+ id: info.id,
342
+ workerCount: info.workerCount,
343
+ tabCount: info.targetCount,
344
+ createdAt: info.createdAt,
345
+ lastActivity: info.lastActivityAt,
346
+ }));
347
+ }
348
+ /**
349
+ * Get tab list
350
+ */
351
+ getTabs() {
352
+ if (!this.sessionManager) {
353
+ return [];
354
+ }
355
+ const tabs = [];
356
+ const sessionInfos = this.sessionManager.getAllSessionInfos();
357
+ for (const session of sessionInfos) {
358
+ for (const worker of session.workers) {
359
+ // Get targets for this worker
360
+ const workerData = this.sessionManager.getWorker(session.id, worker.id);
361
+ if (workerData) {
362
+ for (const targetId of workerData.targets) {
363
+ tabs.push({
364
+ targetId,
365
+ sessionId: session.id,
366
+ workerId: worker.id,
367
+ url: '', // Would need to fetch from page
368
+ title: '',
369
+ });
370
+ }
371
+ }
372
+ }
373
+ }
374
+ return tabs;
375
+ }
376
+ /**
377
+ * Check if dashboard is running
378
+ */
379
+ get running() {
380
+ return this.isRunning;
381
+ }
382
+ }
383
+ exports.Dashboard = Dashboard;
384
+ // Singleton instance
385
+ let instance = null;
386
+ function getDashboard(options) {
387
+ if (!instance) {
388
+ instance = new Dashboard(options);
389
+ }
390
+ return instance;
391
+ }
392
+ function setDashboard(dashboard) {
393
+ instance = dashboard;
394
+ }
395
+ // Re-export components
396
+ var activity_tracker_js_2 = require("./activity-tracker.js");
397
+ Object.defineProperty(exports, "ActivityTracker", { enumerable: true, get: function () { return activity_tracker_js_2.ActivityTracker; } });
398
+ Object.defineProperty(exports, "getActivityTracker", { enumerable: true, get: function () { return activity_tracker_js_2.getActivityTracker; } });
399
+ Object.defineProperty(exports, "setActivityTracker", { enumerable: true, get: function () { return activity_tracker_js_2.setActivityTracker; } });
400
+ var operation_controller_js_2 = require("./operation-controller.js");
401
+ Object.defineProperty(exports, "OperationController", { enumerable: true, get: function () { return operation_controller_js_2.OperationController; } });
402
+ Object.defineProperty(exports, "getOperationController", { enumerable: true, get: function () { return operation_controller_js_2.getOperationController; } });
403
+ Object.defineProperty(exports, "setOperationController", { enumerable: true, get: function () { return operation_controller_js_2.setOperationController; } });
404
+ var keyboard_handler_js_2 = require("./keyboard-handler.js");
405
+ Object.defineProperty(exports, "KeyboardHandler", { enumerable: true, get: function () { return keyboard_handler_js_2.KeyboardHandler; } });
406
+ Object.defineProperty(exports, "getKeyboardHandler", { enumerable: true, get: function () { return keyboard_handler_js_2.getKeyboardHandler; } });
407
+ var renderer_js_2 = require("./renderer.js");
408
+ Object.defineProperty(exports, "Renderer", { enumerable: true, get: function () { return renderer_js_2.Renderer; } });
409
+ Object.defineProperty(exports, "getRenderer", { enumerable: true, get: function () { return renderer_js_2.getRenderer; } });
410
+ __exportStar(require("./types.js"), exports);
411
+ __exportStar(require("./ansi.js"), exports);
412
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Keyboard Handler - TTY keyboard input handling
3
+ *
4
+ * Note: Since stdin is used for MCP JSON-RPC, we read directly from /dev/tty
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export type KeyCode = 'p' | 'P' | 's' | 'S' | 't' | 'T' | 'c' | 'C' | 'q' | 'Q' | 'escape' | 'up' | 'down' | 'left' | 'right' | 'enter' | 'space' | string;
8
+ export interface KeyEvent {
9
+ key: KeyCode;
10
+ ctrl: boolean;
11
+ meta: boolean;
12
+ shift: boolean;
13
+ raw: string;
14
+ }
15
+ export type KeyHandler = (event: KeyEvent) => void;
16
+ export declare class KeyboardHandler extends EventEmitter {
17
+ private ttyFd;
18
+ private ttyStream;
19
+ private rl;
20
+ private isRunning;
21
+ private keyHandler;
22
+ /**
23
+ * Check if TTY is available for keyboard input
24
+ */
25
+ static isAvailable(): boolean;
26
+ /**
27
+ * Start listening for keyboard input
28
+ */
29
+ start(handler: KeyHandler): boolean;
30
+ /**
31
+ * Stop listening for keyboard input
32
+ */
33
+ stop(): void;
34
+ private cleanup;
35
+ private handleKeypress;
36
+ private parseKey;
37
+ /**
38
+ * Check if keyboard handler is running
39
+ */
40
+ get running(): boolean;
41
+ }
42
+ export declare function getKeyboardHandler(): KeyboardHandler;
43
+ //# sourceMappingURL=keyboard-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-handler.d.ts","sourceRoot":"","sources":["../../src/dashboard/keyboard-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,OAAO,GACf,GAAG,GAAG,GAAG,GACT,GAAG,GAAG,GAAG,GACT,GAAG,GAAG,GAAG,GACT,GAAG,GAAG,GAAG,GACT,GAAG,GAAG,GAAG,GACT,QAAQ,GACR,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAChC,OAAO,GACP,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEnD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,UAAU,CAA2B;IAE7C;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,OAAO;IAU7B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAuCnC;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IA+Bf,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,QAAQ;IA8ChB;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;CACF;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * Keyboard Handler - TTY keyboard input handling
4
+ *
5
+ * Note: Since stdin is used for MCP JSON-RPC, we read directly from /dev/tty
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.KeyboardHandler = void 0;
42
+ exports.getKeyboardHandler = getKeyboardHandler;
43
+ const fs = __importStar(require("fs"));
44
+ const readline = __importStar(require("readline"));
45
+ const events_1 = require("events");
46
+ class KeyboardHandler extends events_1.EventEmitter {
47
+ ttyFd = null;
48
+ ttyStream = null;
49
+ rl = null;
50
+ isRunning = false;
51
+ keyHandler = null;
52
+ /**
53
+ * Check if TTY is available for keyboard input
54
+ */
55
+ static isAvailable() {
56
+ try {
57
+ // Check if /dev/tty exists and is accessible
58
+ fs.accessSync('/dev/tty', fs.constants.R_OK);
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Start listening for keyboard input
67
+ */
68
+ start(handler) {
69
+ if (this.isRunning) {
70
+ return true;
71
+ }
72
+ this.keyHandler = handler;
73
+ try {
74
+ // Open /dev/tty for reading (bypasses stdin which is used for MCP)
75
+ this.ttyFd = fs.openSync('/dev/tty', 'r');
76
+ this.ttyStream = fs.createReadStream('', { fd: this.ttyFd });
77
+ // Set raw mode if possible
78
+ if (typeof this.ttyStream.setRawMode === 'function') {
79
+ this.ttyStream.setRawMode(true);
80
+ }
81
+ this.rl = readline.createInterface({
82
+ input: this.ttyStream,
83
+ terminal: true,
84
+ });
85
+ // Enable keypress events
86
+ readline.emitKeypressEvents(this.ttyStream, this.rl);
87
+ this.ttyStream.on('keypress', (str, key) => {
88
+ this.handleKeypress(str, key);
89
+ });
90
+ this.isRunning = true;
91
+ this.emit('started');
92
+ return true;
93
+ }
94
+ catch (error) {
95
+ // TTY not available, running in non-interactive mode
96
+ this.cleanup();
97
+ return false;
98
+ }
99
+ }
100
+ /**
101
+ * Stop listening for keyboard input
102
+ */
103
+ stop() {
104
+ if (!this.isRunning) {
105
+ return;
106
+ }
107
+ this.cleanup();
108
+ this.isRunning = false;
109
+ this.emit('stopped');
110
+ }
111
+ cleanup() {
112
+ if (this.rl) {
113
+ this.rl.close();
114
+ this.rl = null;
115
+ }
116
+ if (this.ttyStream) {
117
+ // Restore raw mode if we set it
118
+ if (typeof this.ttyStream.setRawMode === 'function') {
119
+ try {
120
+ this.ttyStream.setRawMode(false);
121
+ }
122
+ catch {
123
+ // Ignore errors during cleanup
124
+ }
125
+ }
126
+ this.ttyStream.destroy();
127
+ this.ttyStream = null;
128
+ }
129
+ if (this.ttyFd !== null) {
130
+ try {
131
+ fs.closeSync(this.ttyFd);
132
+ }
133
+ catch {
134
+ // Ignore errors during cleanup
135
+ }
136
+ this.ttyFd = null;
137
+ }
138
+ this.keyHandler = null;
139
+ }
140
+ handleKeypress(str, key) {
141
+ if (!this.keyHandler)
142
+ return;
143
+ const event = this.parseKey(str, key);
144
+ if (event) {
145
+ this.keyHandler(event);
146
+ this.emit('key', event);
147
+ }
148
+ }
149
+ parseKey(str, key) {
150
+ const ctrl = key?.ctrl ?? false;
151
+ const meta = key?.meta ?? false;
152
+ const shift = key?.shift ?? false;
153
+ const name = key?.name;
154
+ const raw = str ?? '';
155
+ // Handle special keys
156
+ let keyCode;
157
+ if (name === 'escape') {
158
+ keyCode = 'escape';
159
+ }
160
+ else if (name === 'up') {
161
+ keyCode = 'up';
162
+ }
163
+ else if (name === 'down') {
164
+ keyCode = 'down';
165
+ }
166
+ else if (name === 'left') {
167
+ keyCode = 'left';
168
+ }
169
+ else if (name === 'right') {
170
+ keyCode = 'right';
171
+ }
172
+ else if (name === 'return') {
173
+ keyCode = 'enter';
174
+ }
175
+ else if (name === 'space') {
176
+ keyCode = 'space';
177
+ }
178
+ else if (raw) {
179
+ keyCode = raw;
180
+ }
181
+ else if (name) {
182
+ keyCode = name;
183
+ }
184
+ else {
185
+ return null;
186
+ }
187
+ // Handle Ctrl+C for quit
188
+ if (ctrl && keyCode === 'c') {
189
+ keyCode = 'q'; // Treat Ctrl+C as quit
190
+ }
191
+ return {
192
+ key: keyCode,
193
+ ctrl,
194
+ meta,
195
+ shift,
196
+ raw,
197
+ };
198
+ }
199
+ /**
200
+ * Check if keyboard handler is running
201
+ */
202
+ get running() {
203
+ return this.isRunning;
204
+ }
205
+ }
206
+ exports.KeyboardHandler = KeyboardHandler;
207
+ // Singleton instance
208
+ let instance = null;
209
+ function getKeyboardHandler() {
210
+ if (!instance) {
211
+ instance = new KeyboardHandler();
212
+ }
213
+ return instance;
214
+ }
215
+ //# sourceMappingURL=keyboard-handler.js.map