claude-chrome-parallel 1.0.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 (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +501 -0
  3. package/assets/demo.svg +278 -0
  4. package/dist/cdp/client.d.ts +218 -0
  5. package/dist/cdp/client.d.ts.map +1 -0
  6. package/dist/cdp/client.js +797 -0
  7. package/dist/cdp/client.js.map +1 -0
  8. package/dist/cdp/connection-pool.d.ts +125 -0
  9. package/dist/cdp/connection-pool.d.ts.map +1 -0
  10. package/dist/cdp/connection-pool.js +443 -0
  11. package/dist/cdp/connection-pool.js.map +1 -0
  12. package/dist/cdp/screenshot-scheduler.d.ts +54 -0
  13. package/dist/cdp/screenshot-scheduler.d.ts.map +1 -0
  14. package/dist/cdp/screenshot-scheduler.js +87 -0
  15. package/dist/cdp/screenshot-scheduler.js.map +1 -0
  16. package/dist/chrome/launcher.d.ts +55 -0
  17. package/dist/chrome/launcher.d.ts.map +1 -0
  18. package/dist/chrome/launcher.js +383 -0
  19. package/dist/chrome/launcher.js.map +1 -0
  20. package/dist/chrome/pool.d.ts +54 -0
  21. package/dist/chrome/pool.d.ts.map +1 -0
  22. package/dist/chrome/pool.js +301 -0
  23. package/dist/chrome/pool.js.map +1 -0
  24. package/dist/chrome/profile-detector.d.ts +52 -0
  25. package/dist/chrome/profile-detector.d.ts.map +1 -0
  26. package/dist/chrome/profile-detector.js +246 -0
  27. package/dist/chrome/profile-detector.js.map +1 -0
  28. package/dist/cli/claude-session.d.ts +11 -0
  29. package/dist/cli/claude-session.js +349 -0
  30. package/dist/cli/claude-session.js.map +1 -0
  31. package/dist/cli/index.d.ts +14 -0
  32. package/dist/cli/index.js +858 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/cli/install.d.ts +16 -0
  35. package/dist/cli/install.js +185 -0
  36. package/dist/cli/install.js.map +1 -0
  37. package/dist/cli/uninstall.d.ts +7 -0
  38. package/dist/cli/uninstall.js +126 -0
  39. package/dist/cli/uninstall.js.map +1 -0
  40. package/dist/cli/update-check.d.ts +9 -0
  41. package/dist/cli/update-check.js +141 -0
  42. package/dist/cli/update-check.js.map +1 -0
  43. package/dist/config/config-recovery.d.ts +69 -0
  44. package/dist/config/config-recovery.d.ts.map +1 -0
  45. package/dist/config/config-recovery.js +302 -0
  46. package/dist/config/config-recovery.js.map +1 -0
  47. package/dist/config/global.d.ts +49 -0
  48. package/dist/config/global.d.ts.map +1 -0
  49. package/dist/config/global.js +24 -0
  50. package/dist/config/global.js.map +1 -0
  51. package/dist/config/index.d.ts +7 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +23 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/config/session-isolator.d.ts +76 -0
  56. package/dist/config/session-isolator.d.ts.map +1 -0
  57. package/dist/config/session-isolator.js +268 -0
  58. package/dist/config/session-isolator.js.map +1 -0
  59. package/dist/dashboard/activity-tracker.d.ts +76 -0
  60. package/dist/dashboard/activity-tracker.d.ts.map +1 -0
  61. package/dist/dashboard/activity-tracker.js +219 -0
  62. package/dist/dashboard/activity-tracker.js.map +1 -0
  63. package/dist/dashboard/ansi.d.ts +117 -0
  64. package/dist/dashboard/ansi.d.ts.map +1 -0
  65. package/dist/dashboard/ansi.js +199 -0
  66. package/dist/dashboard/ansi.js.map +1 -0
  67. package/dist/dashboard/index.d.ts +110 -0
  68. package/dist/dashboard/index.d.ts.map +1 -0
  69. package/dist/dashboard/index.js +412 -0
  70. package/dist/dashboard/index.js.map +1 -0
  71. package/dist/dashboard/keyboard-handler.d.ts +43 -0
  72. package/dist/dashboard/keyboard-handler.d.ts.map +1 -0
  73. package/dist/dashboard/keyboard-handler.js +215 -0
  74. package/dist/dashboard/keyboard-handler.js.map +1 -0
  75. package/dist/dashboard/operation-controller.d.ts +76 -0
  76. package/dist/dashboard/operation-controller.d.ts.map +1 -0
  77. package/dist/dashboard/operation-controller.js +167 -0
  78. package/dist/dashboard/operation-controller.js.map +1 -0
  79. package/dist/dashboard/renderer.d.ts +76 -0
  80. package/dist/dashboard/renderer.d.ts.map +1 -0
  81. package/dist/dashboard/renderer.js +193 -0
  82. package/dist/dashboard/renderer.js.map +1 -0
  83. package/dist/dashboard/types.d.ts +56 -0
  84. package/dist/dashboard/types.d.ts.map +1 -0
  85. package/dist/dashboard/types.js +12 -0
  86. package/dist/dashboard/types.js.map +1 -0
  87. package/dist/dashboard/views/main-view.d.ts +23 -0
  88. package/dist/dashboard/views/main-view.d.ts.map +1 -0
  89. package/dist/dashboard/views/main-view.js +143 -0
  90. package/dist/dashboard/views/main-view.js.map +1 -0
  91. package/dist/dashboard/views/sessions-view.d.ts +22 -0
  92. package/dist/dashboard/views/sessions-view.d.ts.map +1 -0
  93. package/dist/dashboard/views/sessions-view.js +104 -0
  94. package/dist/dashboard/views/sessions-view.js.map +1 -0
  95. package/dist/dashboard/views/tabs-view.d.ts +21 -0
  96. package/dist/dashboard/views/tabs-view.d.ts.map +1 -0
  97. package/dist/dashboard/views/tabs-view.js +92 -0
  98. package/dist/dashboard/views/tabs-view.js.map +1 -0
  99. package/dist/hints/hint-engine.d.ts +77 -0
  100. package/dist/hints/hint-engine.d.ts.map +1 -0
  101. package/dist/hints/hint-engine.js +191 -0
  102. package/dist/hints/hint-engine.js.map +1 -0
  103. package/dist/hints/index.d.ts +8 -0
  104. package/dist/hints/index.d.ts.map +1 -0
  105. package/dist/hints/index.js +11 -0
  106. package/dist/hints/index.js.map +1 -0
  107. package/dist/hints/pattern-learner.d.ts +76 -0
  108. package/dist/hints/pattern-learner.d.ts.map +1 -0
  109. package/dist/hints/pattern-learner.js +254 -0
  110. package/dist/hints/pattern-learner.js.map +1 -0
  111. package/dist/hints/rules/composite-suggestions.d.ts +6 -0
  112. package/dist/hints/rules/composite-suggestions.d.ts.map +1 -0
  113. package/dist/hints/rules/composite-suggestions.js +66 -0
  114. package/dist/hints/rules/composite-suggestions.js.map +1 -0
  115. package/dist/hints/rules/error-recovery.d.ts +7 -0
  116. package/dist/hints/rules/error-recovery.d.ts.map +1 -0
  117. package/dist/hints/rules/error-recovery.js +55 -0
  118. package/dist/hints/rules/error-recovery.js.map +1 -0
  119. package/dist/hints/rules/learned-rules.d.ts +13 -0
  120. package/dist/hints/rules/learned-rules.d.ts.map +1 -0
  121. package/dist/hints/rules/learned-rules.js +27 -0
  122. package/dist/hints/rules/learned-rules.js.map +1 -0
  123. package/dist/hints/rules/repetition-detection.d.ts +7 -0
  124. package/dist/hints/rules/repetition-detection.d.ts.map +1 -0
  125. package/dist/hints/rules/repetition-detection.js +82 -0
  126. package/dist/hints/rules/repetition-detection.js.map +1 -0
  127. package/dist/hints/rules/sequence-detection.d.ts +6 -0
  128. package/dist/hints/rules/sequence-detection.d.ts.map +1 -0
  129. package/dist/hints/rules/sequence-detection.js +89 -0
  130. package/dist/hints/rules/sequence-detection.js.map +1 -0
  131. package/dist/hints/rules/success-hints.d.ts +6 -0
  132. package/dist/hints/rules/success-hints.d.ts.map +1 -0
  133. package/dist/hints/rules/success-hints.js +62 -0
  134. package/dist/hints/rules/success-hints.js.map +1 -0
  135. package/dist/index.d.ts +10 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +272 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/lightpanda/launcher.d.ts +58 -0
  140. package/dist/lightpanda/launcher.d.ts.map +1 -0
  141. package/dist/lightpanda/launcher.js +199 -0
  142. package/dist/lightpanda/launcher.js.map +1 -0
  143. package/dist/mcp-server.d.ts +129 -0
  144. package/dist/mcp-server.d.ts.map +1 -0
  145. package/dist/mcp-server.js +641 -0
  146. package/dist/mcp-server.js.map +1 -0
  147. package/dist/memory/domain-memory.d.ts +68 -0
  148. package/dist/memory/domain-memory.d.ts.map +1 -0
  149. package/dist/memory/domain-memory.js +227 -0
  150. package/dist/memory/domain-memory.js.map +1 -0
  151. package/dist/orchestration/plan-executor.d.ts +19 -0
  152. package/dist/orchestration/plan-executor.d.ts.map +1 -0
  153. package/dist/orchestration/plan-executor.js +284 -0
  154. package/dist/orchestration/plan-executor.js.map +1 -0
  155. package/dist/orchestration/plan-registry.d.ts +55 -0
  156. package/dist/orchestration/plan-registry.d.ts.map +1 -0
  157. package/dist/orchestration/plan-registry.js +255 -0
  158. package/dist/orchestration/plan-registry.js.map +1 -0
  159. package/dist/orchestration/state-manager.d.ts +127 -0
  160. package/dist/orchestration/state-manager.d.ts.map +1 -0
  161. package/dist/orchestration/state-manager.js +438 -0
  162. package/dist/orchestration/state-manager.js.map +1 -0
  163. package/dist/orchestration/workflow-engine.d.ts +162 -0
  164. package/dist/orchestration/workflow-engine.d.ts.map +1 -0
  165. package/dist/orchestration/workflow-engine.js +731 -0
  166. package/dist/orchestration/workflow-engine.js.map +1 -0
  167. package/dist/resources/usage-guide.d.ts +13 -0
  168. package/dist/resources/usage-guide.d.ts.map +1 -0
  169. package/dist/resources/usage-guide.js +101 -0
  170. package/dist/resources/usage-guide.js.map +1 -0
  171. package/dist/router/browser-router.d.ts +51 -0
  172. package/dist/router/browser-router.d.ts.map +1 -0
  173. package/dist/router/browser-router.js +178 -0
  174. package/dist/router/browser-router.js.map +1 -0
  175. package/dist/router/cookie-sync.d.ts +48 -0
  176. package/dist/router/cookie-sync.d.ts.map +1 -0
  177. package/dist/router/cookie-sync.js +106 -0
  178. package/dist/router/cookie-sync.js.map +1 -0
  179. package/dist/router/index.d.ts +5 -0
  180. package/dist/router/index.d.ts.map +1 -0
  181. package/dist/router/index.js +10 -0
  182. package/dist/router/index.js.map +1 -0
  183. package/dist/router/tool-routing-registry.d.ts +21 -0
  184. package/dist/router/tool-routing-registry.d.ts.map +1 -0
  185. package/dist/router/tool-routing-registry.js +90 -0
  186. package/dist/router/tool-routing-registry.js.map +1 -0
  187. package/dist/session-manager.d.ts +251 -0
  188. package/dist/session-manager.d.ts.map +1 -0
  189. package/dist/session-manager.js +912 -0
  190. package/dist/session-manager.js.map +1 -0
  191. package/dist/tools/batch-execute.d.ts +11 -0
  192. package/dist/tools/batch-execute.d.ts.map +1 -0
  193. package/dist/tools/batch-execute.js +226 -0
  194. package/dist/tools/batch-execute.js.map +1 -0
  195. package/dist/tools/click-element.d.ts +8 -0
  196. package/dist/tools/click-element.d.ts.map +1 -0
  197. package/dist/tools/click-element.js +455 -0
  198. package/dist/tools/click-element.js.map +1 -0
  199. package/dist/tools/computer.d.ts +6 -0
  200. package/dist/tools/computer.d.ts.map +1 -0
  201. package/dist/tools/computer.js +638 -0
  202. package/dist/tools/computer.js.map +1 -0
  203. package/dist/tools/console-capture.d.ts +6 -0
  204. package/dist/tools/console-capture.d.ts.map +1 -0
  205. package/dist/tools/console-capture.js +320 -0
  206. package/dist/tools/console-capture.js.map +1 -0
  207. package/dist/tools/cookies.d.ts +6 -0
  208. package/dist/tools/cookies.d.ts.map +1 -0
  209. package/dist/tools/cookies.js +263 -0
  210. package/dist/tools/cookies.js.map +1 -0
  211. package/dist/tools/drag-drop.d.ts +6 -0
  212. package/dist/tools/drag-drop.d.ts.map +1 -0
  213. package/dist/tools/drag-drop.js +252 -0
  214. package/dist/tools/drag-drop.js.map +1 -0
  215. package/dist/tools/emulate-device.d.ts +6 -0
  216. package/dist/tools/emulate-device.d.ts.map +1 -0
  217. package/dist/tools/emulate-device.js +221 -0
  218. package/dist/tools/emulate-device.js.map +1 -0
  219. package/dist/tools/file-upload.d.ts +6 -0
  220. package/dist/tools/file-upload.d.ts.map +1 -0
  221. package/dist/tools/file-upload.js +208 -0
  222. package/dist/tools/file-upload.js.map +1 -0
  223. package/dist/tools/fill-form.d.ts +8 -0
  224. package/dist/tools/fill-form.d.ts.map +1 -0
  225. package/dist/tools/fill-form.js +342 -0
  226. package/dist/tools/fill-form.js.map +1 -0
  227. package/dist/tools/find.d.ts +6 -0
  228. package/dist/tools/find.d.ts.map +1 -0
  229. package/dist/tools/find.js +330 -0
  230. package/dist/tools/find.js.map +1 -0
  231. package/dist/tools/form-input.d.ts +6 -0
  232. package/dist/tools/form-input.d.ts.map +1 -0
  233. package/dist/tools/form-input.js +181 -0
  234. package/dist/tools/form-input.js.map +1 -0
  235. package/dist/tools/geolocation.d.ts +6 -0
  236. package/dist/tools/geolocation.d.ts.map +1 -0
  237. package/dist/tools/geolocation.js +172 -0
  238. package/dist/tools/geolocation.js.map +1 -0
  239. package/dist/tools/http-auth.d.ts +6 -0
  240. package/dist/tools/http-auth.d.ts.map +1 -0
  241. package/dist/tools/http-auth.js +136 -0
  242. package/dist/tools/http-auth.js.map +1 -0
  243. package/dist/tools/index.d.ts +6 -0
  244. package/dist/tools/index.d.ts.map +1 -0
  245. package/dist/tools/index.js +104 -0
  246. package/dist/tools/index.js.map +1 -0
  247. package/dist/tools/javascript.d.ts +6 -0
  248. package/dist/tools/javascript.d.ts.map +1 -0
  249. package/dist/tools/javascript.js +138 -0
  250. package/dist/tools/javascript.js.map +1 -0
  251. package/dist/tools/lightweight-scroll.d.ts +11 -0
  252. package/dist/tools/lightweight-scroll.d.ts.map +1 -0
  253. package/dist/tools/lightweight-scroll.js +266 -0
  254. package/dist/tools/lightweight-scroll.js.map +1 -0
  255. package/dist/tools/memory.d.ts +10 -0
  256. package/dist/tools/memory.d.ts.map +1 -0
  257. package/dist/tools/memory.js +141 -0
  258. package/dist/tools/memory.js.map +1 -0
  259. package/dist/tools/navigate.d.ts +6 -0
  260. package/dist/tools/navigate.d.ts.map +1 -0
  261. package/dist/tools/navigate.js +241 -0
  262. package/dist/tools/navigate.js.map +1 -0
  263. package/dist/tools/network.d.ts +6 -0
  264. package/dist/tools/network.d.ts.map +1 -0
  265. package/dist/tools/network.js +215 -0
  266. package/dist/tools/network.js.map +1 -0
  267. package/dist/tools/orchestration.d.ts +6 -0
  268. package/dist/tools/orchestration.d.ts.map +1 -0
  269. package/dist/tools/orchestration.js +746 -0
  270. package/dist/tools/orchestration.js.map +1 -0
  271. package/dist/tools/page-content.d.ts +6 -0
  272. package/dist/tools/page-content.d.ts.map +1 -0
  273. package/dist/tools/page-content.js +120 -0
  274. package/dist/tools/page-content.js.map +1 -0
  275. package/dist/tools/page-pdf.d.ts +6 -0
  276. package/dist/tools/page-pdf.d.ts.map +1 -0
  277. package/dist/tools/page-pdf.js +245 -0
  278. package/dist/tools/page-pdf.js.map +1 -0
  279. package/dist/tools/page-reload.d.ts +6 -0
  280. package/dist/tools/page-reload.d.ts.map +1 -0
  281. package/dist/tools/page-reload.js +89 -0
  282. package/dist/tools/page-reload.js.map +1 -0
  283. package/dist/tools/performance-metrics.d.ts +6 -0
  284. package/dist/tools/performance-metrics.d.ts.map +1 -0
  285. package/dist/tools/performance-metrics.js +158 -0
  286. package/dist/tools/performance-metrics.js.map +1 -0
  287. package/dist/tools/read-page.d.ts +6 -0
  288. package/dist/tools/read-page.d.ts.map +1 -0
  289. package/dist/tools/read-page.js +287 -0
  290. package/dist/tools/read-page.js.map +1 -0
  291. package/dist/tools/request-intercept.d.ts +6 -0
  292. package/dist/tools/request-intercept.d.ts.map +1 -0
  293. package/dist/tools/request-intercept.js +439 -0
  294. package/dist/tools/request-intercept.js.map +1 -0
  295. package/dist/tools/selector-query.d.ts +6 -0
  296. package/dist/tools/selector-query.d.ts.map +1 -0
  297. package/dist/tools/selector-query.js +206 -0
  298. package/dist/tools/selector-query.js.map +1 -0
  299. package/dist/tools/shutdown.d.ts +12 -0
  300. package/dist/tools/shutdown.d.ts.map +1 -0
  301. package/dist/tools/shutdown.js +120 -0
  302. package/dist/tools/shutdown.js.map +1 -0
  303. package/dist/tools/storage.d.ts +6 -0
  304. package/dist/tools/storage.d.ts.map +1 -0
  305. package/dist/tools/storage.js +264 -0
  306. package/dist/tools/storage.js.map +1 -0
  307. package/dist/tools/tabs-close.d.ts +6 -0
  308. package/dist/tools/tabs-close.d.ts.map +1 -0
  309. package/dist/tools/tabs-close.js +124 -0
  310. package/dist/tools/tabs-close.js.map +1 -0
  311. package/dist/tools/tabs-context.d.ts +6 -0
  312. package/dist/tools/tabs-context.d.ts.map +1 -0
  313. package/dist/tools/tabs-context.js +92 -0
  314. package/dist/tools/tabs-context.js.map +1 -0
  315. package/dist/tools/tabs-create.d.ts +6 -0
  316. package/dist/tools/tabs-create.d.ts.map +1 -0
  317. package/dist/tools/tabs-create.js +73 -0
  318. package/dist/tools/tabs-create.js.map +1 -0
  319. package/dist/tools/user-agent.d.ts +6 -0
  320. package/dist/tools/user-agent.d.ts.map +1 -0
  321. package/dist/tools/user-agent.js +128 -0
  322. package/dist/tools/user-agent.js.map +1 -0
  323. package/dist/tools/wait-and-click.d.ts +8 -0
  324. package/dist/tools/wait-and-click.d.ts.map +1 -0
  325. package/dist/tools/wait-and-click.js +290 -0
  326. package/dist/tools/wait-and-click.js.map +1 -0
  327. package/dist/tools/wait-for.d.ts +6 -0
  328. package/dist/tools/wait-for.d.ts.map +1 -0
  329. package/dist/tools/wait-for.js +248 -0
  330. package/dist/tools/wait-for.js.map +1 -0
  331. package/dist/tools/worker-create.d.ts +7 -0
  332. package/dist/tools/worker-create.d.ts.map +1 -0
  333. package/dist/tools/worker-create.js +62 -0
  334. package/dist/tools/worker-create.js.map +1 -0
  335. package/dist/tools/worker-delete.d.ts +6 -0
  336. package/dist/tools/worker-delete.d.ts.map +1 -0
  337. package/dist/tools/worker-delete.js +80 -0
  338. package/dist/tools/worker-delete.js.map +1 -0
  339. package/dist/tools/worker-list.d.ts +6 -0
  340. package/dist/tools/worker-list.d.ts.map +1 -0
  341. package/dist/tools/worker-list.js +67 -0
  342. package/dist/tools/worker-list.js.map +1 -0
  343. package/dist/tools/xpath-query.d.ts +6 -0
  344. package/dist/tools/xpath-query.d.ts.map +1 -0
  345. package/dist/tools/xpath-query.js +230 -0
  346. package/dist/tools/xpath-query.js.map +1 -0
  347. package/dist/types/browser-backend.d.ts +30 -0
  348. package/dist/types/browser-backend.d.ts.map +1 -0
  349. package/dist/types/browser-backend.js +9 -0
  350. package/dist/types/browser-backend.js.map +1 -0
  351. package/dist/types/index.d.ts +3 -0
  352. package/dist/types/index.d.ts.map +1 -0
  353. package/dist/types/index.js +19 -0
  354. package/dist/types/index.js.map +1 -0
  355. package/dist/types/mcp.d.ts +54 -0
  356. package/dist/types/mcp.d.ts.map +1 -0
  357. package/dist/types/mcp.js +14 -0
  358. package/dist/types/mcp.js.map +1 -0
  359. package/dist/types/plan-cache.d.ts +121 -0
  360. package/dist/types/plan-cache.d.ts.map +1 -0
  361. package/dist/types/plan-cache.js +9 -0
  362. package/dist/types/plan-cache.js.map +1 -0
  363. package/dist/types/profile.d.ts +76 -0
  364. package/dist/types/profile.d.ts.map +1 -0
  365. package/dist/types/profile.js +35 -0
  366. package/dist/types/profile.js.map +1 -0
  367. package/dist/types/session.d.ts +65 -0
  368. package/dist/types/session.d.ts.map +1 -0
  369. package/dist/types/session.js +6 -0
  370. package/dist/types/session.js.map +1 -0
  371. package/dist/types/tool-manifest.d.ts +52 -0
  372. package/dist/types/tool-manifest.d.ts.map +1 -0
  373. package/dist/types/tool-manifest.js +37 -0
  374. package/dist/types/tool-manifest.js.map +1 -0
  375. package/dist/utils/atomic-file.d.ts +50 -0
  376. package/dist/utils/atomic-file.d.ts.map +1 -0
  377. package/dist/utils/atomic-file.js +217 -0
  378. package/dist/utils/atomic-file.js.map +1 -0
  379. package/dist/utils/index.d.ts +6 -0
  380. package/dist/utils/index.d.ts.map +1 -0
  381. package/dist/utils/index.js +22 -0
  382. package/dist/utils/index.js.map +1 -0
  383. package/dist/utils/json-validator.d.ts +40 -0
  384. package/dist/utils/json-validator.d.ts.map +1 -0
  385. package/dist/utils/json-validator.js +295 -0
  386. package/dist/utils/json-validator.js.map +1 -0
  387. package/dist/utils/ref-id-manager.d.ts +26 -0
  388. package/dist/utils/ref-id-manager.d.ts.map +1 -0
  389. package/dist/utils/ref-id-manager.js +81 -0
  390. package/dist/utils/ref-id-manager.js.map +1 -0
  391. package/dist/utils/request-queue.d.ts +37 -0
  392. package/dist/utils/request-queue.d.ts.map +1 -0
  393. package/dist/utils/request-queue.js +110 -0
  394. package/dist/utils/request-queue.js.map +1 -0
  395. package/package.json +78 -0
@@ -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