devharness 0.8.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 (627) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/build/atomic-write.d.ts +28 -0
  4. package/build/atomic-write.d.ts.map +1 -0
  5. package/build/atomic-write.js +126 -0
  6. package/build/atomic-write.js.map +1 -0
  7. package/build/cdp-manager.d.ts +524 -0
  8. package/build/cdp-manager.d.ts.map +1 -0
  9. package/build/cdp-manager.js +1828 -0
  10. package/build/cdp-manager.js.map +1 -0
  11. package/build/cdp-manager.test.d.ts +6 -0
  12. package/build/cdp-manager.test.d.ts.map +1 -0
  13. package/build/cdp-manager.test.js +546 -0
  14. package/build/cdp-manager.test.js.map +1 -0
  15. package/build/chrome-launcher.d.ts +400 -0
  16. package/build/chrome-launcher.d.ts.map +1 -0
  17. package/build/chrome-launcher.js +1071 -0
  18. package/build/chrome-launcher.js.map +1 -0
  19. package/build/chrome-launcher.test.d.ts +11 -0
  20. package/build/chrome-launcher.test.d.ts.map +1 -0
  21. package/build/chrome-launcher.test.js +204 -0
  22. package/build/chrome-launcher.test.js.map +1 -0
  23. package/build/clickable-cache.d.ts +73 -0
  24. package/build/clickable-cache.d.ts.map +1 -0
  25. package/build/clickable-cache.js +90 -0
  26. package/build/clickable-cache.js.map +1 -0
  27. package/build/command-recorder.d.ts +401 -0
  28. package/build/command-recorder.d.ts.map +1 -0
  29. package/build/command-recorder.js +701 -0
  30. package/build/command-recorder.js.map +1 -0
  31. package/build/config.d.ts +390 -0
  32. package/build/config.d.ts.map +1 -0
  33. package/build/config.js +826 -0
  34. package/build/config.js.map +1 -0
  35. package/build/config.test.d.ts +2 -0
  36. package/build/config.test.d.ts.map +1 -0
  37. package/build/config.test.js +112 -0
  38. package/build/config.test.js.map +1 -0
  39. package/build/connection-manager.d.ts +159 -0
  40. package/build/connection-manager.d.ts.map +1 -0
  41. package/build/connection-manager.js +432 -0
  42. package/build/connection-manager.js.map +1 -0
  43. package/build/connection-manager.test.d.ts +11 -0
  44. package/build/connection-manager.test.d.ts.map +1 -0
  45. package/build/connection-manager.test.js +114 -0
  46. package/build/connection-manager.test.js.map +1 -0
  47. package/build/console-monitor.d.ts +150 -0
  48. package/build/console-monitor.d.ts.map +1 -0
  49. package/build/console-monitor.js +454 -0
  50. package/build/console-monitor.js.map +1 -0
  51. package/build/dashboard/bundle.js +1 -0
  52. package/build/dashboard/dashboard-client.d.ts +42 -0
  53. package/build/dashboard/dashboard-client.d.ts.map +1 -0
  54. package/build/dashboard/dashboard-client.js +184 -0
  55. package/build/dashboard/dashboard-client.js.map +1 -0
  56. package/build/dashboard/dashboard-hub.d.ts +50 -0
  57. package/build/dashboard/dashboard-hub.d.ts.map +1 -0
  58. package/build/dashboard/dashboard-hub.js +654 -0
  59. package/build/dashboard/dashboard-hub.js.map +1 -0
  60. package/build/dashboard/hub-lock.d.ts +16 -0
  61. package/build/dashboard/hub-lock.d.ts.map +1 -0
  62. package/build/dashboard/hub-lock.js +77 -0
  63. package/build/dashboard/hub-lock.js.map +1 -0
  64. package/build/dashboard/index.d.ts +25 -0
  65. package/build/dashboard/index.d.ts.map +1 -0
  66. package/build/dashboard/index.js +77 -0
  67. package/build/dashboard/index.js.map +1 -0
  68. package/build/dashboard/types.d.ts +83 -0
  69. package/build/dashboard/types.d.ts.map +1 -0
  70. package/build/dashboard/types.js +6 -0
  71. package/build/dashboard/types.js.map +1 -0
  72. package/build/debug-logger.d.ts +85 -0
  73. package/build/debug-logger.d.ts.map +1 -0
  74. package/build/debug-logger.js +195 -0
  75. package/build/debug-logger.js.map +1 -0
  76. package/build/debugger-aware-wrapper.d.ts +37 -0
  77. package/build/debugger-aware-wrapper.d.ts.map +1 -0
  78. package/build/debugger-aware-wrapper.js +128 -0
  79. package/build/debugger-aware-wrapper.js.map +1 -0
  80. package/build/dom-change-monitor.d.ts +92 -0
  81. package/build/dom-change-monitor.d.ts.map +1 -0
  82. package/build/dom-change-monitor.js +437 -0
  83. package/build/dom-change-monitor.js.map +1 -0
  84. package/build/element-collector.d.ts +16 -0
  85. package/build/element-collector.d.ts.map +1 -0
  86. package/build/element-collector.js +207 -0
  87. package/build/element-collector.js.map +1 -0
  88. package/build/error-helpers.d.ts +43 -0
  89. package/build/error-helpers.d.ts.map +1 -0
  90. package/build/error-helpers.js +143 -0
  91. package/build/error-helpers.js.map +1 -0
  92. package/build/formatters/console-formatter.d.ts +160 -0
  93. package/build/formatters/console-formatter.d.ts.map +1 -0
  94. package/build/formatters/console-formatter.js +338 -0
  95. package/build/formatters/console-formatter.js.map +1 -0
  96. package/build/helpers/parser-plugins.d.ts +44 -0
  97. package/build/helpers/parser-plugins.d.ts.map +1 -0
  98. package/build/helpers/parser-plugins.js +102 -0
  99. package/build/helpers/parser-plugins.js.map +1 -0
  100. package/build/helpers/paths.d.ts +79 -0
  101. package/build/helpers/paths.d.ts.map +1 -0
  102. package/build/helpers/paths.js +168 -0
  103. package/build/helpers/paths.js.map +1 -0
  104. package/build/helpers/process-liveness.d.ts +24 -0
  105. package/build/helpers/process-liveness.d.ts.map +1 -0
  106. package/build/helpers/process-liveness.js +36 -0
  107. package/build/helpers/process-liveness.js.map +1 -0
  108. package/build/helpers/process-liveness.test.d.ts +2 -0
  109. package/build/helpers/process-liveness.test.d.ts.map +1 -0
  110. package/build/helpers/process-liveness.test.js +40 -0
  111. package/build/helpers/process-liveness.test.js.map +1 -0
  112. package/build/helpers/sequence-tree.d.ts +27 -0
  113. package/build/helpers/sequence-tree.d.ts.map +1 -0
  114. package/build/helpers/sequence-tree.js +80 -0
  115. package/build/helpers/sequence-tree.js.map +1 -0
  116. package/build/helpers/sequence-tree.test.d.ts +2 -0
  117. package/build/helpers/sequence-tree.test.d.ts.map +1 -0
  118. package/build/helpers/sequence-tree.test.js +122 -0
  119. package/build/helpers/sequence-tree.test.js.map +1 -0
  120. package/build/index.d.ts +3 -0
  121. package/build/index.d.ts.map +1 -0
  122. package/build/index.js +2007 -0
  123. package/build/index.js.map +1 -0
  124. package/build/interaction-recorder.d.ts +214 -0
  125. package/build/interaction-recorder.d.ts.map +1 -0
  126. package/build/interaction-recorder.js +2007 -0
  127. package/build/interaction-recorder.js.map +1 -0
  128. package/build/issue-tracker.d.ts +107 -0
  129. package/build/issue-tracker.d.ts.map +1 -0
  130. package/build/issue-tracker.js +582 -0
  131. package/build/issue-tracker.js.map +1 -0
  132. package/build/issue-tracker.test.d.ts +2 -0
  133. package/build/issue-tracker.test.d.ts.map +1 -0
  134. package/build/issue-tracker.test.js +88 -0
  135. package/build/issue-tracker.test.js.map +1 -0
  136. package/build/launch-chrome-port.test.d.ts +14 -0
  137. package/build/launch-chrome-port.test.d.ts.map +1 -0
  138. package/build/launch-chrome-port.test.js +97 -0
  139. package/build/launch-chrome-port.test.js.map +1 -0
  140. package/build/log-processor/orchestrator.d.ts +32 -0
  141. package/build/log-processor/orchestrator.d.ts.map +1 -0
  142. package/build/log-processor/orchestrator.js +27 -0
  143. package/build/log-processor/orchestrator.js.map +1 -0
  144. package/build/logpoint-execution-tracker.d.ts +57 -0
  145. package/build/logpoint-execution-tracker.d.ts.map +1 -0
  146. package/build/logpoint-execution-tracker.js +112 -0
  147. package/build/logpoint-execution-tracker.js.map +1 -0
  148. package/build/mcp-supervisor.d.ts +3 -0
  149. package/build/mcp-supervisor.d.ts.map +1 -0
  150. package/build/mcp-supervisor.js +211 -0
  151. package/build/mcp-supervisor.js.map +1 -0
  152. package/build/messages.d.ts +165 -0
  153. package/build/messages.d.ts.map +1 -0
  154. package/build/messages.js +574 -0
  155. package/build/messages.js.map +1 -0
  156. package/build/network-monitor.d.ts +172 -0
  157. package/build/network-monitor.d.ts.map +1 -0
  158. package/build/network-monitor.js +350 -0
  159. package/build/network-monitor.js.map +1 -0
  160. package/build/overlays.d.ts +49 -0
  161. package/build/overlays.d.ts.map +1 -0
  162. package/build/overlays.js +409 -0
  163. package/build/overlays.js.map +1 -0
  164. package/build/persistent-profiles.test.d.ts +15 -0
  165. package/build/persistent-profiles.test.d.ts.map +1 -0
  166. package/build/persistent-profiles.test.js +470 -0
  167. package/build/persistent-profiles.test.js.map +1 -0
  168. package/build/port-reserver.d.ts +32 -0
  169. package/build/port-reserver.d.ts.map +1 -0
  170. package/build/port-reserver.js +118 -0
  171. package/build/port-reserver.js.map +1 -0
  172. package/build/puppeteer-manager.d.ts +47 -0
  173. package/build/puppeteer-manager.d.ts.map +1 -0
  174. package/build/puppeteer-manager.js +116 -0
  175. package/build/puppeteer-manager.js.map +1 -0
  176. package/build/recording-coverage.test.d.ts +12 -0
  177. package/build/recording-coverage.test.d.ts.map +1 -0
  178. package/build/recording-coverage.test.js +72 -0
  179. package/build/recording-coverage.test.js.map +1 -0
  180. package/build/reference-validator.d.ts +47 -0
  181. package/build/reference-validator.d.ts.map +1 -0
  182. package/build/reference-validator.js +86 -0
  183. package/build/reference-validator.js.map +1 -0
  184. package/build/reference-validator.test.d.ts +5 -0
  185. package/build/reference-validator.test.d.ts.map +1 -0
  186. package/build/reference-validator.test.js +243 -0
  187. package/build/reference-validator.test.js.map +1 -0
  188. package/build/replay-cursor.d.ts +27 -0
  189. package/build/replay-cursor.d.ts.map +1 -0
  190. package/build/replay-cursor.js +240 -0
  191. package/build/replay-cursor.js.map +1 -0
  192. package/build/runners/docker-compose-runner.d.ts +69 -0
  193. package/build/runners/docker-compose-runner.d.ts.map +1 -0
  194. package/build/runners/docker-compose-runner.js +438 -0
  195. package/build/runners/docker-compose-runner.js.map +1 -0
  196. package/build/runners/docker-runner.d.ts +65 -0
  197. package/build/runners/docker-runner.d.ts.map +1 -0
  198. package/build/runners/docker-runner.js +414 -0
  199. package/build/runners/docker-runner.js.map +1 -0
  200. package/build/runners/index.d.ts +19 -0
  201. package/build/runners/index.d.ts.map +1 -0
  202. package/build/runners/index.js +35 -0
  203. package/build/runners/index.js.map +1 -0
  204. package/build/runners/native-runner.d.ts +95 -0
  205. package/build/runners/native-runner.d.ts.map +1 -0
  206. package/build/runners/native-runner.js +370 -0
  207. package/build/runners/native-runner.js.map +1 -0
  208. package/build/runners/types.d.ts +147 -0
  209. package/build/runners/types.d.ts.map +1 -0
  210. package/build/runners/types.js +25 -0
  211. package/build/runners/types.js.map +1 -0
  212. package/build/self-restart.d.ts +12 -0
  213. package/build/self-restart.d.ts.map +1 -0
  214. package/build/self-restart.js +41 -0
  215. package/build/self-restart.js.map +1 -0
  216. package/build/self-restart.test.d.ts +2 -0
  217. package/build/self-restart.test.d.ts.map +1 -0
  218. package/build/self-restart.test.js +34 -0
  219. package/build/self-restart.test.js.map +1 -0
  220. package/build/server-claims.d.ts +161 -0
  221. package/build/server-claims.d.ts.map +1 -0
  222. package/build/server-claims.js +382 -0
  223. package/build/server-claims.js.map +1 -0
  224. package/build/server-claims.test.d.ts +2 -0
  225. package/build/server-claims.test.d.ts.map +1 -0
  226. package/build/server-claims.test.js +197 -0
  227. package/build/server-claims.test.js.map +1 -0
  228. package/build/server-manager.d.ts +438 -0
  229. package/build/server-manager.d.ts.map +1 -0
  230. package/build/server-manager.js +1674 -0
  231. package/build/server-manager.js.map +1 -0
  232. package/build/server-manager.test.d.ts +17 -0
  233. package/build/server-manager.test.d.ts.map +1 -0
  234. package/build/server-manager.test.js +122 -0
  235. package/build/server-manager.test.js.map +1 -0
  236. package/build/server-ownership.test.d.ts +2 -0
  237. package/build/server-ownership.test.d.ts.map +1 -0
  238. package/build/server-ownership.test.js +238 -0
  239. package/build/server-ownership.test.js.map +1 -0
  240. package/build/server-watcher.d.ts +21 -0
  241. package/build/server-watcher.d.ts.map +1 -0
  242. package/build/server-watcher.js +105 -0
  243. package/build/server-watcher.js.map +1 -0
  244. package/build/session-detector.d.ts +47 -0
  245. package/build/session-detector.d.ts.map +1 -0
  246. package/build/session-detector.js +229 -0
  247. package/build/session-detector.js.map +1 -0
  248. package/build/session-detector.test.d.ts +9 -0
  249. package/build/session-detector.test.d.ts.map +1 -0
  250. package/build/session-detector.test.js +45 -0
  251. package/build/session-detector.test.js.map +1 -0
  252. package/build/sourcemap-handler.d.ts +114 -0
  253. package/build/sourcemap-handler.d.ts.map +1 -0
  254. package/build/sourcemap-handler.js +479 -0
  255. package/build/sourcemap-handler.js.map +1 -0
  256. package/build/supervisor/child-manager.d.ts +43 -0
  257. package/build/supervisor/child-manager.d.ts.map +1 -0
  258. package/build/supervisor/child-manager.js +148 -0
  259. package/build/supervisor/child-manager.js.map +1 -0
  260. package/build/supervisor/child-manager.test.d.ts +2 -0
  261. package/build/supervisor/child-manager.test.d.ts.map +1 -0
  262. package/build/supervisor/child-manager.test.js +107 -0
  263. package/build/supervisor/child-manager.test.js.map +1 -0
  264. package/build/supervisor/client-watcher.d.ts +48 -0
  265. package/build/supervisor/client-watcher.d.ts.map +1 -0
  266. package/build/supervisor/client-watcher.js +186 -0
  267. package/build/supervisor/client-watcher.js.map +1 -0
  268. package/build/supervisor/client-watcher.test.d.ts +2 -0
  269. package/build/supervisor/client-watcher.test.d.ts.map +1 -0
  270. package/build/supervisor/client-watcher.test.js +121 -0
  271. package/build/supervisor/client-watcher.test.js.map +1 -0
  272. package/build/supervisor/idle-config.d.ts +30 -0
  273. package/build/supervisor/idle-config.d.ts.map +1 -0
  274. package/build/supervisor/idle-config.js +76 -0
  275. package/build/supervisor/idle-config.js.map +1 -0
  276. package/build/supervisor/idle-config.test.d.ts +2 -0
  277. package/build/supervisor/idle-config.test.d.ts.map +1 -0
  278. package/build/supervisor/idle-config.test.js +119 -0
  279. package/build/supervisor/idle-config.test.js.map +1 -0
  280. package/build/supervisor/ndjson-reader.d.ts +47 -0
  281. package/build/supervisor/ndjson-reader.d.ts.map +1 -0
  282. package/build/supervisor/ndjson-reader.js +75 -0
  283. package/build/supervisor/ndjson-reader.js.map +1 -0
  284. package/build/supervisor/ndjson-reader.test.d.ts +2 -0
  285. package/build/supervisor/ndjson-reader.test.d.ts.map +1 -0
  286. package/build/supervisor/ndjson-reader.test.js +92 -0
  287. package/build/supervisor/ndjson-reader.test.js.map +1 -0
  288. package/build/supervisor/pidfile.d.ts +11 -0
  289. package/build/supervisor/pidfile.d.ts.map +1 -0
  290. package/build/supervisor/pidfile.js +29 -0
  291. package/build/supervisor/pidfile.js.map +1 -0
  292. package/build/supervisor/pidfile.test.d.ts +8 -0
  293. package/build/supervisor/pidfile.test.d.ts.map +1 -0
  294. package/build/supervisor/pidfile.test.js +46 -0
  295. package/build/supervisor/pidfile.test.js.map +1 -0
  296. package/build/supervisor/restart-coordinator.d.ts +73 -0
  297. package/build/supervisor/restart-coordinator.d.ts.map +1 -0
  298. package/build/supervisor/restart-coordinator.js +300 -0
  299. package/build/supervisor/restart-coordinator.js.map +1 -0
  300. package/build/supervisor/restart-coordinator.test.d.ts +2 -0
  301. package/build/supervisor/restart-coordinator.test.d.ts.map +1 -0
  302. package/build/supervisor/restart-coordinator.test.js +434 -0
  303. package/build/supervisor/restart-coordinator.test.js.map +1 -0
  304. package/build/test-support/fake-execute-tool-call.d.ts +11 -0
  305. package/build/test-support/fake-execute-tool-call.d.ts.map +1 -0
  306. package/build/test-support/fake-execute-tool-call.js +19 -0
  307. package/build/test-support/fake-execute-tool-call.js.map +1 -0
  308. package/build/tool-error.d.ts +14 -0
  309. package/build/tool-error.d.ts.map +1 -0
  310. package/build/tool-error.js +18 -0
  311. package/build/tool-error.js.map +1 -0
  312. package/build/tool-response.d.ts +293 -0
  313. package/build/tool-response.d.ts.map +1 -0
  314. package/build/tool-response.js +365 -0
  315. package/build/tool-response.js.map +1 -0
  316. package/build/tools/assert-tools.d.ts +62 -0
  317. package/build/tools/assert-tools.d.ts.map +1 -0
  318. package/build/tools/assert-tools.js +330 -0
  319. package/build/tools/assert-tools.js.map +1 -0
  320. package/build/tools/breakpoint-await-abort.test.d.ts +2 -0
  321. package/build/tools/breakpoint-await-abort.test.d.ts.map +1 -0
  322. package/build/tools/breakpoint-await-abort.test.js +124 -0
  323. package/build/tools/breakpoint-await-abort.test.js.map +1 -0
  324. package/build/tools/breakpoint-tools.d.ts +99 -0
  325. package/build/tools/breakpoint-tools.d.ts.map +1 -0
  326. package/build/tools/breakpoint-tools.js +1197 -0
  327. package/build/tools/breakpoint-tools.js.map +1 -0
  328. package/build/tools/config-tools.d.ts +58 -0
  329. package/build/tools/config-tools.d.ts.map +1 -0
  330. package/build/tools/config-tools.js +180 -0
  331. package/build/tools/config-tools.js.map +1 -0
  332. package/build/tools/connection-routing.test.d.ts +12 -0
  333. package/build/tools/connection-routing.test.d.ts.map +1 -0
  334. package/build/tools/connection-routing.test.js +206 -0
  335. package/build/tools/connection-routing.test.js.map +1 -0
  336. package/build/tools/console-tools.d.ts +84 -0
  337. package/build/tools/console-tools.d.ts.map +1 -0
  338. package/build/tools/console-tools.js +241 -0
  339. package/build/tools/console-tools.js.map +1 -0
  340. package/build/tools/content-tools.d.ts +74 -0
  341. package/build/tools/content-tools.d.ts.map +1 -0
  342. package/build/tools/content-tools.js +582 -0
  343. package/build/tools/content-tools.js.map +1 -0
  344. package/build/tools/dashboard-tools.d.ts +38 -0
  345. package/build/tools/dashboard-tools.d.ts.map +1 -0
  346. package/build/tools/dashboard-tools.js +123 -0
  347. package/build/tools/dashboard-tools.js.map +1 -0
  348. package/build/tools/dom-tools.d.ts +41 -0
  349. package/build/tools/dom-tools.d.ts.map +1 -0
  350. package/build/tools/dom-tools.js +277 -0
  351. package/build/tools/dom-tools.js.map +1 -0
  352. package/build/tools/download-tools.d.ts +55 -0
  353. package/build/tools/download-tools.d.ts.map +1 -0
  354. package/build/tools/download-tools.js +280 -0
  355. package/build/tools/download-tools.js.map +1 -0
  356. package/build/tools/execution-tools.d.ts +40 -0
  357. package/build/tools/execution-tools.d.ts.map +1 -0
  358. package/build/tools/execution-tools.js +121 -0
  359. package/build/tools/execution-tools.js.map +1 -0
  360. package/build/tools/input-abort.test.d.ts +2 -0
  361. package/build/tools/input-abort.test.d.ts.map +1 -0
  362. package/build/tools/input-abort.test.js +227 -0
  363. package/build/tools/input-abort.test.js.map +1 -0
  364. package/build/tools/input-ambiguous-selector.test.d.ts +2 -0
  365. package/build/tools/input-ambiguous-selector.test.d.ts.map +1 -0
  366. package/build/tools/input-ambiguous-selector.test.js +34 -0
  367. package/build/tools/input-ambiguous-selector.test.js.map +1 -0
  368. package/build/tools/input-tools.d.ts +168 -0
  369. package/build/tools/input-tools.d.ts.map +1 -0
  370. package/build/tools/input-tools.js +1397 -0
  371. package/build/tools/input-tools.js.map +1 -0
  372. package/build/tools/inspection-tools.d.ts +112 -0
  373. package/build/tools/inspection-tools.d.ts.map +1 -0
  374. package/build/tools/inspection-tools.js +637 -0
  375. package/build/tools/inspection-tools.js.map +1 -0
  376. package/build/tools/interpolation.d.ts +30 -0
  377. package/build/tools/interpolation.d.ts.map +1 -0
  378. package/build/tools/interpolation.js +143 -0
  379. package/build/tools/interpolation.js.map +1 -0
  380. package/build/tools/issues-abort-hygiene.test.d.ts +2 -0
  381. package/build/tools/issues-abort-hygiene.test.d.ts.map +1 -0
  382. package/build/tools/issues-abort-hygiene.test.js +79 -0
  383. package/build/tools/issues-abort-hygiene.test.js.map +1 -0
  384. package/build/tools/issues-tools.d.ts +98 -0
  385. package/build/tools/issues-tools.d.ts.map +1 -0
  386. package/build/tools/issues-tools.js +821 -0
  387. package/build/tools/issues-tools.js.map +1 -0
  388. package/build/tools/issues-tools.test.d.ts +8 -0
  389. package/build/tools/issues-tools.test.d.ts.map +1 -0
  390. package/build/tools/issues-tools.test.js +184 -0
  391. package/build/tools/issues-tools.test.js.map +1 -0
  392. package/build/tools/modal-tools.d.ts +73 -0
  393. package/build/tools/modal-tools.d.ts.map +1 -0
  394. package/build/tools/modal-tools.js +161 -0
  395. package/build/tools/modal-tools.js.map +1 -0
  396. package/build/tools/network-tools.d.ts +72 -0
  397. package/build/tools/network-tools.d.ts.map +1 -0
  398. package/build/tools/network-tools.js +432 -0
  399. package/build/tools/network-tools.js.map +1 -0
  400. package/build/tools/page-tools.d.ts +78 -0
  401. package/build/tools/page-tools.d.ts.map +1 -0
  402. package/build/tools/page-tools.js +255 -0
  403. package/build/tools/page-tools.js.map +1 -0
  404. package/build/tools/plugin-tools.d.ts +16 -0
  405. package/build/tools/plugin-tools.d.ts.map +1 -0
  406. package/build/tools/plugin-tools.js +17 -0
  407. package/build/tools/plugin-tools.js.map +1 -0
  408. package/build/tools/replay-abort.test.d.ts +2 -0
  409. package/build/tools/replay-abort.test.d.ts.map +1 -0
  410. package/build/tools/replay-abort.test.js +259 -0
  411. package/build/tools/replay-abort.test.js.map +1 -0
  412. package/build/tools/replay-add-conditional.test.d.ts +2 -0
  413. package/build/tools/replay-add-conditional.test.d.ts.map +1 -0
  414. package/build/tools/replay-add-conditional.test.js +205 -0
  415. package/build/tools/replay-add-conditional.test.js.map +1 -0
  416. package/build/tools/replay-background-run.test.d.ts +2 -0
  417. package/build/tools/replay-background-run.test.d.ts.map +1 -0
  418. package/build/tools/replay-background-run.test.js +176 -0
  419. package/build/tools/replay-background-run.test.js.map +1 -0
  420. package/build/tools/replay-capture-variables.test.d.ts +2 -0
  421. package/build/tools/replay-capture-variables.test.d.ts.map +1 -0
  422. package/build/tools/replay-capture-variables.test.js +331 -0
  423. package/build/tools/replay-capture-variables.test.js.map +1 -0
  424. package/build/tools/replay-conditional-idb-and-launch.test.d.ts +11 -0
  425. package/build/tools/replay-conditional-idb-and-launch.test.d.ts.map +1 -0
  426. package/build/tools/replay-conditional-idb-and-launch.test.js +429 -0
  427. package/build/tools/replay-conditional-idb-and-launch.test.js.map +1 -0
  428. package/build/tools/replay-conditional-timeout.test.d.ts +14 -0
  429. package/build/tools/replay-conditional-timeout.test.d.ts.map +1 -0
  430. package/build/tools/replay-conditional-timeout.test.js +126 -0
  431. package/build/tools/replay-conditional-timeout.test.js.map +1 -0
  432. package/build/tools/replay-declare.test.d.ts +2 -0
  433. package/build/tools/replay-declare.test.d.ts.map +1 -0
  434. package/build/tools/replay-declare.test.js +106 -0
  435. package/build/tools/replay-declare.test.js.map +1 -0
  436. package/build/tools/replay-declared-browser-cleanup.test.d.ts +2 -0
  437. package/build/tools/replay-declared-browser-cleanup.test.d.ts.map +1 -0
  438. package/build/tools/replay-declared-browser-cleanup.test.js +103 -0
  439. package/build/tools/replay-declared-browser-cleanup.test.js.map +1 -0
  440. package/build/tools/replay-declared-profile.test.d.ts +2 -0
  441. package/build/tools/replay-declared-profile.test.d.ts.map +1 -0
  442. package/build/tools/replay-declared-profile.test.js +116 -0
  443. package/build/tools/replay-declared-profile.test.js.map +1 -0
  444. package/build/tools/replay-executor.d.ts +556 -0
  445. package/build/tools/replay-executor.d.ts.map +1 -0
  446. package/build/tools/replay-executor.js +2347 -0
  447. package/build/tools/replay-executor.js.map +1 -0
  448. package/build/tools/replay-folder-save.test.d.ts +2 -0
  449. package/build/tools/replay-folder-save.test.d.ts.map +1 -0
  450. package/build/tools/replay-folder-save.test.js +63 -0
  451. package/build/tools/replay-folder-save.test.js.map +1 -0
  452. package/build/tools/replay-formatters.d.ts +148 -0
  453. package/build/tools/replay-formatters.d.ts.map +1 -0
  454. package/build/tools/replay-formatters.js +856 -0
  455. package/build/tools/replay-formatters.js.map +1 -0
  456. package/build/tools/replay-kill-chrome-on-finish.test.d.ts +2 -0
  457. package/build/tools/replay-kill-chrome-on-finish.test.d.ts.map +1 -0
  458. package/build/tools/replay-kill-chrome-on-finish.test.js +175 -0
  459. package/build/tools/replay-kill-chrome-on-finish.test.js.map +1 -0
  460. package/build/tools/replay-multi-connection.test.d.ts +2 -0
  461. package/build/tools/replay-multi-connection.test.d.ts.map +1 -0
  462. package/build/tools/replay-multi-connection.test.js +547 -0
  463. package/build/tools/replay-multi-connection.test.js.map +1 -0
  464. package/build/tools/replay-output-and-record-options.test.d.ts +2 -0
  465. package/build/tools/replay-output-and-record-options.test.d.ts.map +1 -0
  466. package/build/tools/replay-output-and-record-options.test.js +240 -0
  467. package/build/tools/replay-output-and-record-options.test.js.map +1 -0
  468. package/build/tools/replay-production-error-shape.test.d.ts +7 -0
  469. package/build/tools/replay-production-error-shape.test.d.ts.map +1 -0
  470. package/build/tools/replay-production-error-shape.test.js +93 -0
  471. package/build/tools/replay-production-error-shape.test.js.map +1 -0
  472. package/build/tools/replay-rebase.test.d.ts +2 -0
  473. package/build/tools/replay-rebase.test.d.ts.map +1 -0
  474. package/build/tools/replay-rebase.test.js +58 -0
  475. package/build/tools/replay-rebase.test.js.map +1 -0
  476. package/build/tools/replay-retry-classification.test.d.ts +9 -0
  477. package/build/tools/replay-retry-classification.test.d.ts.map +1 -0
  478. package/build/tools/replay-retry-classification.test.js +57 -0
  479. package/build/tools/replay-retry-classification.test.js.map +1 -0
  480. package/build/tools/replay-run-registry.d.ts +55 -0
  481. package/build/tools/replay-run-registry.d.ts.map +1 -0
  482. package/build/tools/replay-run-registry.js +65 -0
  483. package/build/tools/replay-run-registry.js.map +1 -0
  484. package/build/tools/replay-sequence-reload.test.d.ts +2 -0
  485. package/build/tools/replay-sequence-reload.test.d.ts.map +1 -0
  486. package/build/tools/replay-sequence-reload.test.js +82 -0
  487. package/build/tools/replay-sequence-reload.test.js.map +1 -0
  488. package/build/tools/replay-socket-scope.test.d.ts +2 -0
  489. package/build/tools/replay-socket-scope.test.d.ts.map +1 -0
  490. package/build/tools/replay-socket-scope.test.js +75 -0
  491. package/build/tools/replay-socket-scope.test.js.map +1 -0
  492. package/build/tools/replay-step-connection.test.d.ts +2 -0
  493. package/build/tools/replay-step-connection.test.d.ts.map +1 -0
  494. package/build/tools/replay-step-connection.test.js +292 -0
  495. package/build/tools/replay-step-connection.test.js.map +1 -0
  496. package/build/tools/replay-step-timeout.test.d.ts +2 -0
  497. package/build/tools/replay-step-timeout.test.d.ts.map +1 -0
  498. package/build/tools/replay-step-timeout.test.js +204 -0
  499. package/build/tools/replay-step-timeout.test.js.map +1 -0
  500. package/build/tools/replay-tags.test.d.ts +2 -0
  501. package/build/tools/replay-tags.test.d.ts.map +1 -0
  502. package/build/tools/replay-tags.test.js +99 -0
  503. package/build/tools/replay-tags.test.js.map +1 -0
  504. package/build/tools/replay-teardown-and-foreach.test.d.ts +13 -0
  505. package/build/tools/replay-teardown-and-foreach.test.d.ts.map +1 -0
  506. package/build/tools/replay-teardown-and-foreach.test.js +318 -0
  507. package/build/tools/replay-teardown-and-foreach.test.js.map +1 -0
  508. package/build/tools/replay-tool-name-validation.test.d.ts +2 -0
  509. package/build/tools/replay-tool-name-validation.test.d.ts.map +1 -0
  510. package/build/tools/replay-tool-name-validation.test.js +280 -0
  511. package/build/tools/replay-tool-name-validation.test.js.map +1 -0
  512. package/build/tools/replay-tools.d.ts +288 -0
  513. package/build/tools/replay-tools.d.ts.map +1 -0
  514. package/build/tools/replay-tools.js +2994 -0
  515. package/build/tools/replay-tools.js.map +1 -0
  516. package/build/tools/request-abort.test.d.ts +2 -0
  517. package/build/tools/request-abort.test.d.ts.map +1 -0
  518. package/build/tools/request-abort.test.js +130 -0
  519. package/build/tools/request-abort.test.js.map +1 -0
  520. package/build/tools/request-tools.d.ts +56 -0
  521. package/build/tools/request-tools.d.ts.map +1 -0
  522. package/build/tools/request-tools.js +174 -0
  523. package/build/tools/request-tools.js.map +1 -0
  524. package/build/tools/screenshot-tools.d.ts +135 -0
  525. package/build/tools/screenshot-tools.d.ts.map +1 -0
  526. package/build/tools/screenshot-tools.js +636 -0
  527. package/build/tools/screenshot-tools.js.map +1 -0
  528. package/build/tools/server-tools.d.ts +88 -0
  529. package/build/tools/server-tools.d.ts.map +1 -0
  530. package/build/tools/server-tools.js +485 -0
  531. package/build/tools/server-tools.js.map +1 -0
  532. package/build/tools/source-tools.d.ts +46 -0
  533. package/build/tools/source-tools.d.ts.map +1 -0
  534. package/build/tools/source-tools.js +47 -0
  535. package/build/tools/source-tools.js.map +1 -0
  536. package/build/tools/storage-tools.d.ts +141 -0
  537. package/build/tools/storage-tools.d.ts.map +1 -0
  538. package/build/tools/storage-tools.js +894 -0
  539. package/build/tools/storage-tools.js.map +1 -0
  540. package/build/tools/storage-tools.test.d.ts +13 -0
  541. package/build/tools/storage-tools.test.d.ts.map +1 -0
  542. package/build/tools/storage-tools.test.js +707 -0
  543. package/build/tools/storage-tools.test.js.map +1 -0
  544. package/build/tools/tab-tools.d.ts +42 -0
  545. package/build/tools/tab-tools.d.ts.map +1 -0
  546. package/build/tools/tab-tools.js +296 -0
  547. package/build/tools/tab-tools.js.map +1 -0
  548. package/build/tools/wait-tools.d.ts +85 -0
  549. package/build/tools/wait-tools.d.ts.map +1 -0
  550. package/build/tools/wait-tools.js +236 -0
  551. package/build/tools/wait-tools.js.map +1 -0
  552. package/build/tools/wait-tools.test.d.ts +9 -0
  553. package/build/tools/wait-tools.test.d.ts.map +1 -0
  554. package/build/tools/wait-tools.test.js +193 -0
  555. package/build/tools/wait-tools.test.js.map +1 -0
  556. package/build/types.d.ts +133 -0
  557. package/build/types.d.ts.map +1 -0
  558. package/build/types.js +5 -0
  559. package/build/types.js.map +1 -0
  560. package/build/ui-verifier.d.ts +88 -0
  561. package/build/ui-verifier.d.ts.map +1 -0
  562. package/build/ui-verifier.js +540 -0
  563. package/build/ui-verifier.js.map +1 -0
  564. package/build/utils/abort.d.ts +68 -0
  565. package/build/utils/abort.d.ts.map +1 -0
  566. package/build/utils/abort.js +159 -0
  567. package/build/utils/abort.js.map +1 -0
  568. package/build/utils/abort.test.d.ts +2 -0
  569. package/build/utils/abort.test.d.ts.map +1 -0
  570. package/build/utils/abort.test.js +174 -0
  571. package/build/utils/abort.test.js.map +1 -0
  572. package/build/utils/modal-detection-core.d.ts +150 -0
  573. package/build/utils/modal-detection-core.d.ts.map +1 -0
  574. package/build/utils/modal-detection-core.js +332 -0
  575. package/build/utils/modal-detection-core.js.map +1 -0
  576. package/build/utils/modal-detection-core.test.d.ts +5 -0
  577. package/build/utils/modal-detection-core.test.d.ts.map +1 -0
  578. package/build/utils/modal-detection-core.test.js +492 -0
  579. package/build/utils/modal-detection-core.test.js.map +1 -0
  580. package/build/utils/modal-detector.d.ts +29 -0
  581. package/build/utils/modal-detector.d.ts.map +1 -0
  582. package/build/utils/modal-detector.js +281 -0
  583. package/build/utils/modal-detector.js.map +1 -0
  584. package/build/utils/modal-dismissal.d.ts +32 -0
  585. package/build/utils/modal-dismissal.d.ts.map +1 -0
  586. package/build/utils/modal-dismissal.js +190 -0
  587. package/build/utils/modal-dismissal.js.map +1 -0
  588. package/build/utils/port-check.d.ts +31 -0
  589. package/build/utils/port-check.d.ts.map +1 -0
  590. package/build/utils/port-check.js +87 -0
  591. package/build/utils/port-check.js.map +1 -0
  592. package/build/utils/port-check.test.d.ts +2 -0
  593. package/build/utils/port-check.test.d.ts.map +1 -0
  594. package/build/utils/port-check.test.js +66 -0
  595. package/build/utils/port-check.test.js.map +1 -0
  596. package/build/utils/selector-resolver.d.ts +66 -0
  597. package/build/utils/selector-resolver.d.ts.map +1 -0
  598. package/build/utils/selector-resolver.js +200 -0
  599. package/build/utils/selector-resolver.js.map +1 -0
  600. package/build/validation-helpers.d.ts +41 -0
  601. package/build/validation-helpers.d.ts.map +1 -0
  602. package/build/validation-helpers.js +236 -0
  603. package/build/validation-helpers.js.map +1 -0
  604. package/build/window-sizing.d.ts +26 -0
  605. package/build/window-sizing.d.ts.map +1 -0
  606. package/build/window-sizing.js +87 -0
  607. package/build/window-sizing.js.map +1 -0
  608. package/build/window-sizing.test.d.ts +8 -0
  609. package/build/window-sizing.test.d.ts.map +1 -0
  610. package/build/window-sizing.test.js +113 -0
  611. package/build/window-sizing.test.js.map +1 -0
  612. package/docs/README.md +74 -0
  613. package/docs/automation.md +562 -0
  614. package/docs/debugging.md +229 -0
  615. package/docs/installation.md +133 -0
  616. package/docs/instructions.md +227 -0
  617. package/docs/mcp-instructions.md +15 -0
  618. package/docs/message-system.md +327 -0
  619. package/docs/messages.md +3480 -0
  620. package/docs/parser-plugins.md +132 -0
  621. package/docs/replay.md +1411 -0
  622. package/docs/troubleshooting.md +272 -0
  623. package/docs/working_with_llm_notes.md +5 -0
  624. package/package.json +87 -0
  625. package/skills/devharness/SKILL.md +195 -0
  626. package/skills/devharness/references/sequences.md +613 -0
  627. package/skills/devharness/references/tool-categories.md +99 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Tool Response Helpers
3
+ * Functions for modifying tool responses with pre/post content
4
+ */
5
+ import type { PortFailureInfo, PendingStartupFailureInfo, PendingRestartInfo } from './server-manager.js';
6
+ import type { Connection } from './connection-manager.js';
7
+ /**
8
+ * Tool response content item
9
+ */
10
+ export interface ContentItem {
11
+ type: string;
12
+ text?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Click action metadata
17
+ */
18
+ export interface ClickActionMeta {
19
+ selector: string;
20
+ preClickUrl: string;
21
+ postClickUrl: string;
22
+ navigationOccurred: boolean;
23
+ hasClickHandler: boolean;
24
+ domChanges: {
25
+ mutationCount: number;
26
+ added: number;
27
+ removed: number;
28
+ shown: number;
29
+ hidden: number;
30
+ } | null;
31
+ }
32
+ /**
33
+ * Type action metadata
34
+ */
35
+ export interface TypeActionMeta {
36
+ selector: string;
37
+ text: string;
38
+ actualValue: string;
39
+ }
40
+ /**
41
+ * Navigate action metadata
42
+ */
43
+ export interface NavigateActionMeta {
44
+ url: string;
45
+ title: string;
46
+ action: string;
47
+ }
48
+ /**
49
+ * Console tool metadata
50
+ */
51
+ export interface ConsoleToolMeta {
52
+ totalCount: number;
53
+ matchCount?: number;
54
+ errorCount?: number;
55
+ warnCount?: number;
56
+ /** Number of messages that were truncated */
57
+ truncatedCount?: number;
58
+ /** Total estimated tokens for all full messages */
59
+ totalTokens?: number;
60
+ }
61
+ /**
62
+ * Network tool metadata
63
+ */
64
+ export interface NetworkToolMeta {
65
+ totalCount: number;
66
+ matchCount?: number;
67
+ }
68
+ /**
69
+ * Content tool metadata (findInteractive)
70
+ */
71
+ export interface ContentToolMeta {
72
+ /** interactive elements on the page */
73
+ totalCount: number;
74
+ /** of those, not currently visible */
75
+ hiddenCount?: number;
76
+ }
77
+ /**
78
+ * Request tool metadata (HTTP request/response, capturable via saveAs)
79
+ */
80
+ export interface RequestToolMeta {
81
+ ok: boolean;
82
+ status: number;
83
+ statusText: string;
84
+ headers: Record<string, string>;
85
+ body: string;
86
+ durationMs: number;
87
+ }
88
+ /**
89
+ * Inspect tool metadata (evaluateExpression result, capturable via saveAs).
90
+ *
91
+ * `value` is a best-effort de-formatted view of the evaluated result: the
92
+ * CDP layer returns values already shaped for display (strings arrive quoted,
93
+ * numbers/booleans arrive as strings), so this reverses that so a captured
94
+ * variable holds the real type rather than its display text.
95
+ */
96
+ export interface InspectToolMeta {
97
+ expression: string;
98
+ value: unknown;
99
+ /** typeof `value` ('undefined' when the expression evaluated to undefined) */
100
+ valueType: string;
101
+ /**
102
+ * How `value` was obtained: 'exact' = by-value CDP capture (faithful
103
+ * machine-readable value); 'display' = reconstructed from the rendered
104
+ * display text (best effort - non-serializable values only).
105
+ */
106
+ valueSource?: 'exact' | 'display';
107
+ /** Set when the expression was evaluated against a paused call frame */
108
+ callFrameId?: string;
109
+ }
110
+ /**
111
+ * Storage tool metadata (IndexedDB reads).
112
+ *
113
+ * Exists so a caller can ask "is this record there?" without grepping the
114
+ * rendered markdown: a stored value that happens to contain the tool's own
115
+ * "No record found for this key." text made a present record read as absent.
116
+ */
117
+ export interface StorageToolMeta {
118
+ /** IndexedDB only */
119
+ database?: string;
120
+ /** IndexedDB only */
121
+ store?: string;
122
+ /** idbGet / getLocalStorage / getSessionStorage: whether the key resolved */
123
+ found?: boolean;
124
+ /** the key that was probed, where the call named one */
125
+ key?: string;
126
+ /** getCookies: the names present, so a caller can test for one without reading the rendered text */
127
+ cookieNames?: string[];
128
+ /** idbGetAll: records returned (bounded by `limit`). getCookies / whole-store reads: entries present */
129
+ count?: number;
130
+ /** idbGetAll: records in the store, ignoring `limit` */
131
+ total?: number;
132
+ }
133
+ /**
134
+ * Assert tool metadata
135
+ */
136
+ export interface AssertToolMeta {
137
+ left: unknown;
138
+ operator: string;
139
+ right?: unknown;
140
+ passed: boolean;
141
+ }
142
+ /**
143
+ * Wait tool metadata
144
+ */
145
+ export interface WaitToolMeta {
146
+ /** Which form ran */
147
+ form: 'selector' | 'selectorGone' | 'expression' | 'ms';
148
+ /** The selector/expression waited on (or "Nms" for the sleep form) */
149
+ condition: string;
150
+ /** True when the condition was met (always true for the sleep form) */
151
+ satisfied: boolean;
152
+ elapsedMs: number;
153
+ /** Number of MCP-side evaluations performed (0 for the sleep form) */
154
+ polls: number;
155
+ }
156
+ /**
157
+ * Replay run metadata - structured completion signal, since a "run" can
158
+ * finish with failed steps or pause (stepTo/breakpoint/click-validation)
159
+ * while still returning a non-isError response (a caller has to read this
160
+ * to tell those apart from a clean run instead of text-scraping the reply).
161
+ */
162
+ export interface ReplayRunMeta {
163
+ /** Not set on a background-start response (runId + background instead). */
164
+ success?: boolean;
165
+ totalSteps: number;
166
+ failedSteps?: number;
167
+ paused?: boolean;
168
+ /** Id of the registered background run (background start / status replies). */
169
+ runId?: string;
170
+ /** True on the immediate response of a background `run` start. */
171
+ background?: boolean;
172
+ /** Registry status of the run (status action replies). */
173
+ runStatus?: string;
174
+ /** 1-based step currently executing (status action replies). */
175
+ currentStep?: number;
176
+ /** recordInteraction: the person closed the recorder without saving. */
177
+ cancelled?: boolean;
178
+ }
179
+ /**
180
+ * Root metadata structure for tool responses
181
+ * This provides structured data for programmatic use (validation, replay)
182
+ * while keeping text content free to evolve for human/LLM display
183
+ */
184
+ export interface ToolResponseMeta {
185
+ tool: string;
186
+ action?: string;
187
+ timestamp: number;
188
+ click?: ClickActionMeta;
189
+ type?: TypeActionMeta;
190
+ navigate?: NavigateActionMeta;
191
+ console?: ConsoleToolMeta;
192
+ network?: NetworkToolMeta;
193
+ content?: ContentToolMeta;
194
+ request?: RequestToolMeta;
195
+ inspect?: InspectToolMeta;
196
+ assert?: AssertToolMeta;
197
+ wait?: WaitToolMeta;
198
+ storage?: StorageToolMeta;
199
+ replay?: ReplayRunMeta;
200
+ }
201
+ /**
202
+ * Tool response structure
203
+ */
204
+ export interface ToolResponse {
205
+ content: ContentItem[];
206
+ isError?: boolean;
207
+ /** Structured metadata for programmatic use (validation, replay). Decoupled from text output. */
208
+ _meta?: ToolResponseMeta;
209
+ }
210
+ /**
211
+ * Blocking response - prevents tool execution
212
+ */
213
+ export interface BlockingResponse {
214
+ blocked: true;
215
+ response: ToolResponse;
216
+ }
217
+ /**
218
+ * Non-blocking response - allows tool execution with optional modifications
219
+ */
220
+ export interface NonBlockingResponse {
221
+ blocked: false;
222
+ prefix: string;
223
+ markAsError: boolean;
224
+ }
225
+ export type PreExecutionResult = BlockingResponse | NonBlockingResponse;
226
+ /**
227
+ * Check for port failures and determine pre-execution behavior
228
+ */
229
+ export declare function checkPortFailures(failedPorts: PortFailureInfo[], toolName: string): PreExecutionResult;
230
+ /**
231
+ * Check for blocking bugs from recordings
232
+ * Only allows the 'acknowledge' action in the issues tool
233
+ */
234
+ export declare function checkBugBlocking(toolName: string, toolArgs?: Record<string, unknown>): Promise<PreExecutionResult>;
235
+ /**
236
+ * Information about a paused breakpoint
237
+ */
238
+ export interface BreakpointPauseInfo {
239
+ reference: string;
240
+ location?: {
241
+ url: string;
242
+ lineNumber: number;
243
+ };
244
+ callFrameId?: string;
245
+ /** Set when a watch-mode restart is queued behind this pause - see server-manager's WatchRestartState. */
246
+ pendingRestart?: PendingRestartInfo;
247
+ }
248
+ /**
249
+ * Check for breakpoint pauses and determine pre-execution behavior
250
+ * Similar to checkPortFailures, but for breakpoint blocking
251
+ */
252
+ export declare function checkBreakpointPause(connections: Connection[], toolName: string, getPendingRestart?: (port: number) => PendingRestartInfo | null, action?: string): PreExecutionResult;
253
+ /**
254
+ * Check for pending startup failures and determine pre-execution behavior
255
+ * Blocks tools when servers have failed to start (timeout or died) and not acknowledged
256
+ */
257
+ export declare function checkPendingStartups(failures: PendingStartupFailureInfo[], toolName: string): PreExecutionResult;
258
+ /**
259
+ * Duplicate session info for blocking check
260
+ */
261
+ export interface DuplicateSessionInfo {
262
+ sessionId: string;
263
+ shortId: string;
264
+ allPids: number[];
265
+ allPpids: number[];
266
+ currentPid: number;
267
+ currentPpid: number;
268
+ }
269
+ /**
270
+ * Check for duplicate session (multiple MCPs sharing same Claude session)
271
+ * Both original and duplicate sessions are blocked with appropriate messages
272
+ */
273
+ export declare function checkDuplicateSession(info: DuplicateSessionInfo | null, toolName: string): PreExecutionResult;
274
+ /**
275
+ * Prepend text to the first text content item in a response
276
+ */
277
+ export declare function prependToResponse(response: ToolResponse, prefix: string): void;
278
+ /**
279
+ * Append text to the last text content item in a response
280
+ */
281
+ export declare function appendToResponse(response: ToolResponse, suffix: string): void;
282
+ /**
283
+ * Status line item for post-response status
284
+ */
285
+ export interface StatusLineItem {
286
+ label: string;
287
+ value: string;
288
+ }
289
+ /**
290
+ * Build status lines suffix from items
291
+ */
292
+ export declare function buildStatusSuffix(items: StatusLineItem[]): string;
293
+ //# sourceMappingURL=tool-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../src/tool-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Tool Response Helpers
3
+ * Functions for modifying tool responses with pre/post content
4
+ */
5
+ import { hasPendingBugs, getPendingBugs } from './issue-tracker.js';
6
+ import { createErrorResponse } from './messages.js';
7
+ import { readFileSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ // Get MCP version from package.json
13
+ let MCP_VERSION = 'unknown';
14
+ try {
15
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
16
+ MCP_VERSION = pkg.version;
17
+ }
18
+ catch {
19
+ // Ignore errors
20
+ }
21
+ /**
22
+ * Check for port failures and determine pre-execution behavior
23
+ */
24
+ export function checkPortFailures(failedPorts, toolName) {
25
+ // Check for blocking failures (block level ports that haven't been acknowledged)
26
+ const blockingPorts = failedPorts.filter(p => p.level === 'block');
27
+ // Tools that should not be blocked by port failures
28
+ // - server: needed to acknowledge/manage ports
29
+ // - execution: needed to resume from breakpoints (otherwise deadlock with breakpoint blocking)
30
+ // - breakpoint: needed to manage breakpoints while debugging
31
+ // - issues: logging/tracking bugs shouldn't be gated on unrelated server health
32
+ const portFailureExemptTools = new Set(['server', 'execution', 'breakpoint', 'issues']);
33
+ if (blockingPorts.length > 0 && !portFailureExemptTools.has(toolName)) {
34
+ // Block all tools except exempt tools
35
+ const portList = blockingPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''} - down since ${p.failedAt.toISOString()}`).join('\n');
36
+ return {
37
+ blocked: true,
38
+ response: {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `**BLOCKED: Monitored port(s) failed**\n\nThe following monitored port(s) have failed and require acknowledgment before tools can be used:\n\n${portList}\n\nUse \`server({ action: 'acknowledgePort', port: <port> })\` to acknowledge each failure and continue.`,
43
+ },
44
+ ],
45
+ isError: true
46
+ }
47
+ };
48
+ }
49
+ // Build prefix for error/inform level failures
50
+ let prefix = '';
51
+ const errorPorts = failedPorts.filter(p => p.level === 'error');
52
+ const informPorts = failedPorts.filter(p => p.level === 'inform');
53
+ if (errorPorts.length > 0) {
54
+ const portList = errorPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''}`).join(', ');
55
+ prefix += `**ERROR: Monitored port(s) failed:** ${portList}\n\n`;
56
+ }
57
+ if (informPorts.length > 0) {
58
+ const portList = informPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''}`).join(', ');
59
+ prefix += `**INFO: Monitored port(s) down:** ${portList}\n\n`;
60
+ }
61
+ return {
62
+ blocked: false,
63
+ prefix,
64
+ markAsError: errorPorts.length > 0
65
+ };
66
+ }
67
+ /**
68
+ * Check for blocking bugs from recordings
69
+ * Only allows the 'acknowledge' action in the issues tool
70
+ */
71
+ export async function checkBugBlocking(toolName, toolArgs) {
72
+ const hasBugs = await hasPendingBugs();
73
+ if (!hasBugs) {
74
+ return { blocked: false, prefix: '', markAsError: false };
75
+ }
76
+ // Only allow issues tool with acknowledge action
77
+ if (toolName === 'issues' && toolArgs?.action === 'acknowledge') {
78
+ return { blocked: false, prefix: '', markAsError: false };
79
+ }
80
+ // Also allow issues tool with list action (to see what's blocking)
81
+ if (toolName === 'issues' && toolArgs?.action === 'list') {
82
+ return { blocked: false, prefix: '', markAsError: false };
83
+ }
84
+ const pendingBugs = await getPendingBugs();
85
+ const bugList = pendingBugs.map(b => `- [#${b.id}] "${b.title}" (from ${b.recordingName})`).join('\n');
86
+ return {
87
+ blocked: true,
88
+ response: createErrorResponse('BUGS_BLOCKING', { bugList })
89
+ };
90
+ }
91
+ /**
92
+ * Tools that are allowed to execute when blocked due to breakpoint pause
93
+ * These are tools needed to inspect the paused state or resume execution
94
+ */
95
+ const BREAKPOINT_ALLOWED_TOOLS = new Set([
96
+ 'execution', // Resume, step, pause operations
97
+ 'inspect', // Get call stack, variables, evaluate expression
98
+ 'breakpoint', // Manage breakpoints
99
+ 'console', // View console logs
100
+ ]);
101
+ /**
102
+ * Specific tool+action combos allowed even when otherwise blocked - narrower
103
+ * than BREAKPOINT_ALLOWED_TOOLS, for actions that need to run precisely
104
+ * because a pause is blocking things (e.g. discarding a restart that's
105
+ * queued behind this very pause - blocking it would make it uncancellable).
106
+ */
107
+ const BREAKPOINT_ALLOWED_TOOL_ACTIONS = {
108
+ server: new Set(['cancelPendingRestart']),
109
+ };
110
+ /**
111
+ * Check for breakpoint pauses and determine pre-execution behavior
112
+ * Similar to checkPortFailures, but for breakpoint blocking
113
+ */
114
+ export function checkBreakpointPause(connections, toolName, getPendingRestart, action) {
115
+ // Find connections that are paused and not acknowledged
116
+ const pausedConnections = [];
117
+ for (const conn of connections) {
118
+ if (conn.cdpManager.isPaused() && !conn.breakpointPauseAcknowledged) {
119
+ const pauseInfo = conn.cdpManager.getPausedInfo();
120
+ const topFrame = pauseInfo.callStack?.[0];
121
+ pausedConnections.push({
122
+ reference: conn.reference || conn.id,
123
+ location: pauseInfo.location,
124
+ callFrameId: topFrame?.callFrameId,
125
+ pendingRestart: getPendingRestart?.(conn.port) ?? undefined,
126
+ });
127
+ }
128
+ }
129
+ // No paused connections, allow execution
130
+ if (pausedConnections.length === 0) {
131
+ return {
132
+ blocked: false,
133
+ prefix: '',
134
+ markAsError: false
135
+ };
136
+ }
137
+ // Check if tool is allowed when paused
138
+ if (BREAKPOINT_ALLOWED_TOOLS.has(toolName) || (action !== undefined && BREAKPOINT_ALLOWED_TOOL_ACTIONS[toolName]?.has(action))) {
139
+ // Allow but prepend info about paused state
140
+ const pauseList = pausedConnections.map(p => {
141
+ const loc = p.location
142
+ ? ` at ${p.location.url}:${p.location.lineNumber}`
143
+ : '';
144
+ return `"${p.reference}"${loc}`;
145
+ }).join(', ');
146
+ const restartNotes = pausedConnections
147
+ .filter(p => p.pendingRestart)
148
+ .map(p => `⚠️ A file change was detected for "${p.reference}" - its watch-mode restart is queued and will run as soon as you resume. Use \`server({ action: 'cancelPendingRestart', serverId: '${p.pendingRestart.serverId}' })\` to discard it and keep debugging.`)
149
+ .join('\n');
150
+ return {
151
+ blocked: false,
152
+ prefix: `**Paused at breakpoint:** ${pauseList}\n\n${restartNotes ? restartNotes + '\n\n' : ''}`,
153
+ markAsError: false
154
+ };
155
+ }
156
+ // Block other tools
157
+ const pauseDetails = pausedConnections.map(p => {
158
+ const loc = p.location
159
+ ? `\n Location: ${p.location.url}:${p.location.lineNumber}`
160
+ : '';
161
+ const frameId = p.callFrameId
162
+ ? `\n callFrameId: "${p.callFrameId}"`
163
+ : '';
164
+ const restart = p.pendingRestart
165
+ ? `\n ⚠️ Watch-mode restart queued (server "${p.pendingRestart.serverId}") - will run once resumed`
166
+ : '';
167
+ return `- "${p.reference}"${loc}${frameId}${restart}`;
168
+ }).join('\n');
169
+ // Build getVariables hint with callFrameId if available
170
+ const firstCallFrameId = pausedConnections[0]?.callFrameId;
171
+ const getVariablesHint = firstCallFrameId
172
+ ? `\`inspect({ action: 'getVariables', callFrameId: '${firstCallFrameId}' })\``
173
+ : `\`inspect({ action: 'getVariables' })\``;
174
+ const firstPendingRestart = pausedConnections.find(p => p.pendingRestart)?.pendingRestart;
175
+ const cancelRestartHint = firstPendingRestart
176
+ ? `\n- A watch-mode restart is queued for server "${firstPendingRestart.serverId}" - use \`server({ action: 'cancelPendingRestart', serverId: '${firstPendingRestart.serverId}' })\` to discard it and keep debugging, instead of resuming into a restart`
177
+ : '';
178
+ return {
179
+ blocked: true,
180
+ response: {
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: `**BLOCKED: Execution paused at breakpoint**
185
+
186
+ The following connection(s) are paused at a breakpoint:
187
+ ${pauseDetails}
188
+
189
+ **To continue:**
190
+ - Use \`execution({ action: 'resume' })\` to resume execution
191
+ - Use \`execution({ action: 'acknowledge' })\` to acknowledge and continue using other tools while paused
192
+ - Use \`inspect({ action: 'getCallStack' })\` or ${getVariablesHint} to examine state${cancelRestartHint}
193
+
194
+ Other tools are blocked until execution is resumed or acknowledged.`,
195
+ },
196
+ ],
197
+ isError: true
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Check for pending startup failures and determine pre-execution behavior
203
+ * Blocks tools when servers have failed to start (timeout or died) and not acknowledged
204
+ */
205
+ export function checkPendingStartups(failures, toolName) {
206
+ // No failures, allow execution
207
+ if (failures.length === 0) {
208
+ return {
209
+ blocked: false,
210
+ prefix: '',
211
+ markAsError: false
212
+ };
213
+ }
214
+ // Server tool is always allowed (needed to acknowledge/manage servers)
215
+ // Issues tool is always allowed (logging/tracking bugs shouldn't be gated on unrelated server health)
216
+ if (toolName === 'server' || toolName === 'issues') {
217
+ return {
218
+ blocked: false,
219
+ prefix: '',
220
+ markAsError: false
221
+ };
222
+ }
223
+ // Build blocking message based on failure reasons
224
+ const timeoutFailures = failures.filter(f => f.reason === 'timeout');
225
+ const diedFailures = failures.filter(f => f.reason === 'died');
226
+ let message = 'BLOCKED: Server startup issue(s)\n\n';
227
+ if (timeoutFailures.length > 0) {
228
+ message += `Startup timeout - The following server(s) started but no port was detected within 30 seconds:\n`;
229
+ for (const f of timeoutFailures) {
230
+ const elapsed = Math.round((Date.now() - f.startedAt.getTime()) / 1000);
231
+ message += `- "${f.serverId}" (started ${elapsed}s ago)\n`;
232
+ }
233
+ message += '\n';
234
+ }
235
+ if (diedFailures.length > 0) {
236
+ message += `Server died - The following server(s) died before port was detected:\n`;
237
+ for (const f of diedFailures) {
238
+ message += `- "${f.serverId}"\n`;
239
+ }
240
+ message += '\n';
241
+ }
242
+ message += `Options:\n`;
243
+ message += `- Check logs: server({ action: 'logs', serverId: '<id>' })\n`;
244
+ message += `- Acknowledge and continue: server({ action: 'acknowledgeStartup', serverId: '<id>' })\n`;
245
+ if (timeoutFailures.length > 0) {
246
+ message += `- Extend timeout 30s: server({ action: 'extendStartup', serverId: '<id>' })\n`;
247
+ }
248
+ if (diedFailures.length > 0) {
249
+ message += `- Restart server: server({ action: 'restart', serverId: '<id>' })\n`;
250
+ }
251
+ message += `- Stop server: server({ action: 'stop', serverId: '<id>' })`;
252
+ return {
253
+ blocked: true,
254
+ response: {
255
+ content: [
256
+ {
257
+ type: 'text',
258
+ text: message,
259
+ },
260
+ ],
261
+ isError: true
262
+ }
263
+ };
264
+ }
265
+ /**
266
+ * Check for duplicate session (multiple MCPs sharing same Claude session)
267
+ * Both original and duplicate sessions are blocked with appropriate messages
268
+ */
269
+ export function checkDuplicateSession(info, toolName) {
270
+ // No session info or not a duplicate - allow
271
+ if (!info || info.allPids.length <= 1) {
272
+ return { blocked: false, prefix: '', markAsError: false };
273
+ }
274
+ const firstPid = info.allPids[0];
275
+ const isOriginal = info.currentPid === firstPid;
276
+ const duplicatePids = info.allPids.filter(p => p !== firstPid);
277
+ const duplicatePpids = info.allPpids.filter(p => p !== info.allPpids[0]);
278
+ if (isOriginal) {
279
+ // Original session - tell them about the duplicate and how to kill it
280
+ return {
281
+ blocked: true,
282
+ response: {
283
+ content: [
284
+ {
285
+ type: 'text',
286
+ text: `**BLOCKED: Duplicate MCP session detected**
287
+
288
+ **To fix:** Kill the duplicate Claude session:
289
+ \`\`\`
290
+ kill ${duplicatePpids.length > 0 ? duplicatePpids.join(' ') : duplicatePids.join(' ')}
291
+ \`\`\`
292
+
293
+ Another Claude session has connected with the same session ID:
294
+
295
+ - Session ID: ${info.shortId} (${info.sessionId})
296
+ - This Claude PID: ${info.currentPpid} (original)
297
+ - Duplicate Claude PID(s): ${duplicatePpids.join(', ') || duplicatePids.join(', ')}
298
+ - MCP Version: ${MCP_VERSION}`,
299
+ },
300
+ ],
301
+ isError: true
302
+ }
303
+ };
304
+ }
305
+ else {
306
+ // Duplicate session - tell them to fork
307
+ const firstPpid = info.allPpids[0] || firstPid;
308
+ return {
309
+ blocked: true,
310
+ response: {
311
+ content: [
312
+ {
313
+ type: 'text',
314
+ text: `**BLOCKED: Duplicate MCP session detected**
315
+
316
+ **To fix:** Exit this session and run:
317
+ \`\`\`
318
+ claude --resume ${info.sessionId} --fork-session
319
+ \`\`\`
320
+
321
+ Another Claude session is already running with this session ID:
322
+
323
+ - Session ID: ${info.shortId} (${info.sessionId})
324
+ - Original Claude PID: ${firstPpid}
325
+ - This Claude PID: ${info.currentPpid} (duplicate)
326
+ - MCP Version: ${MCP_VERSION}`,
327
+ },
328
+ ],
329
+ isError: true
330
+ }
331
+ };
332
+ }
333
+ }
334
+ /**
335
+ * Prepend text to the first text content item in a response
336
+ */
337
+ export function prependToResponse(response, prefix) {
338
+ if (!prefix || !response.content || response.content.length === 0)
339
+ return;
340
+ const firstContent = response.content[0];
341
+ if (firstContent && firstContent.type === 'text' && firstContent.text) {
342
+ firstContent.text = prefix + firstContent.text;
343
+ }
344
+ }
345
+ /**
346
+ * Append text to the last text content item in a response
347
+ */
348
+ export function appendToResponse(response, suffix) {
349
+ if (!suffix || !response.content || response.content.length === 0)
350
+ return;
351
+ const lastContent = response.content[response.content.length - 1];
352
+ if (lastContent && lastContent.type === 'text' && lastContent.text) {
353
+ lastContent.text += suffix;
354
+ }
355
+ }
356
+ /**
357
+ * Build status lines suffix from items
358
+ */
359
+ export function buildStatusSuffix(items) {
360
+ if (items.length === 0)
361
+ return '';
362
+ const lines = items.map(item => `**${item.label}:** ${item.value}`);
363
+ return `\n\n---\n${lines.join('\n')}`;
364
+ }
365
+ //# sourceMappingURL=tool-response.js.map