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,637 @@
1
+ /**
2
+ * Inspection Tools
3
+ */
4
+ import { z } from 'zod';
5
+ import { EvaluateExpressionExceptionError, EvaluateExpressionTimeoutError, EvaluateExpressionPendingPromiseError } from '../cdp-manager.js';
6
+ import { createTool } from '../validation-helpers.js';
7
+ import { createSuccessResponse, createErrorResponse } from '../messages.js';
8
+ import { isAbortError, raceAbort, throwIfAborted } from '../utils/abort.js';
9
+ /**
10
+ * Reverse CDPManager.formatValue()'s display shaping so a machine-readable
11
+ * value can be published on _meta (and captured by a sequence's saveAs).
12
+ *
13
+ * formatValue() renders primitives as display text - a string comes back
14
+ * wrapped in quotes, a number/boolean comes back as its String() form,
15
+ * undefined/null as the words. Objects and arrays come back as real
16
+ * objects/arrays whose leaves are those display strings.
17
+ *
18
+ * Best effort by design: values formatValue() collapsed to a description
19
+ * (a DOM node -> "[HTMLDivElement]", a depth-limited object -> its class
20
+ * name) cannot be recovered and are left as the string they arrived as.
21
+ */
22
+ export function deformatEvaluatedValue(formatted) {
23
+ if (Array.isArray(formatted)) {
24
+ return formatted.map(deformatEvaluatedValue);
25
+ }
26
+ if (formatted !== null && typeof formatted === 'object') {
27
+ const out = {};
28
+ for (const [key, val] of Object.entries(formatted)) {
29
+ out[key] = deformatEvaluatedValue(val);
30
+ }
31
+ return out;
32
+ }
33
+ if (typeof formatted !== 'string') {
34
+ return formatted;
35
+ }
36
+ if (formatted === 'undefined')
37
+ return undefined;
38
+ if (formatted === 'null')
39
+ return null;
40
+ if (formatted === 'true')
41
+ return true;
42
+ if (formatted === 'false')
43
+ return false;
44
+ // A quoted string is unambiguous: formatValue only quotes real strings, so
45
+ // '"42"' was the string "42" while '42' was the number 42.
46
+ const quoted = formatted.match(/^"([\s\S]*)"$/);
47
+ if (quoted)
48
+ return quoted[1];
49
+ if (/^-?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/.test(formatted)) {
50
+ const asNumber = Number(formatted);
51
+ if (!Number.isNaN(asNumber))
52
+ return asNumber;
53
+ }
54
+ return formatted;
55
+ }
56
+ /**
57
+ * Format variables data as TOON (Token-Oriented Object Notation)
58
+ * Each variable on its own line for readability
59
+ */
60
+ function formatVariablesAsToon(data, responseType) {
61
+ const lines = [];
62
+ if (responseType === 'counts_only') {
63
+ // Format: scope:count
64
+ for (const [scope, count] of Object.entries(data)) {
65
+ lines.push(`${scope}:${count}`);
66
+ }
67
+ }
68
+ else if (responseType === 'names_only') {
69
+ // Format each name on its own line grouped by scope
70
+ for (const [scope, names] of Object.entries(data)) {
71
+ lines.push(`[${scope}]`);
72
+ for (const name of names) {
73
+ lines.push(` ${name}`);
74
+ }
75
+ }
76
+ }
77
+ else {
78
+ // full or depth_reduced - format each variable
79
+ for (const [scope, vars] of Object.entries(data)) {
80
+ lines.push(`[${scope}]`);
81
+ for (const v of vars) {
82
+ const valueStr = formatToonValue(v.value);
83
+ lines.push(` ${v.name}:${valueStr};type:${v.type}`);
84
+ }
85
+ }
86
+ }
87
+ return lines.join('\n');
88
+ }
89
+ /**
90
+ * Format call stack as TOON
91
+ */
92
+ function formatCallStackAsToon(stack) {
93
+ const lines = [];
94
+ for (let i = 0; i < stack.length; i++) {
95
+ const frame = stack[i];
96
+ const loc = frame.location;
97
+ lines.push(`${i}:${frame.functionName || '(anonymous)'};${loc.source}:${loc.line}:${loc.column};id:${frame.callFrameId}`);
98
+ }
99
+ return lines.join('\n');
100
+ }
101
+ /**
102
+ * Format search results as TOON
103
+ */
104
+ function formatSearchResultsAsToon(results) {
105
+ const lines = [];
106
+ for (const r of results) {
107
+ lines.push(`${r.url}:${r.lineNumber}`);
108
+ lines.push(` ${r.lineContent}`);
109
+ }
110
+ return lines.join('\n');
111
+ }
112
+ /**
113
+ * Format a value for TOON output
114
+ */
115
+ function formatToonValue(value) {
116
+ if (value === null || value === undefined)
117
+ return 'null';
118
+ if (typeof value === 'string') {
119
+ // Check if it's already a formatted string like "[Function: ...]"
120
+ if (value.startsWith('[') || value.startsWith('"'))
121
+ return value;
122
+ return value;
123
+ }
124
+ if (typeof value === 'number' || typeof value === 'boolean')
125
+ return String(value);
126
+ if (Array.isArray(value)) {
127
+ if (value.length === 0)
128
+ return '[]';
129
+ const items = value.map(v => formatToonValue(v)).join('|');
130
+ return `[${items}]`;
131
+ }
132
+ if (typeof value === 'object') {
133
+ const entries = Object.entries(value).map(([k, v]) => `${k}:${formatToonValue(v)}`);
134
+ return `{${entries.join(';')}}`;
135
+ }
136
+ return String(value);
137
+ }
138
+ /**
139
+ * Check if line content appears to be a webpack eval wrapper (truncated or not)
140
+ */
141
+ function isWebpackEvalLine(lineContent) {
142
+ return lineContent.startsWith('eval(__webpack_require__.');
143
+ }
144
+ /**
145
+ * Extract the actual source line from a full webpack eval wrapper.
146
+ * Webpack bundles code like: eval(__webpack_require__.ts("actual\\nsource\\ncode"))
147
+ * This function extracts the inner content and finds the matching line.
148
+ */
149
+ function extractSourceFromFullEvalLine(fullLineContent, pattern, caseSensitive) {
150
+ // Extract content between the first (" and last ")
151
+ // Pattern: eval(__webpack_require__.XX("CONTENT"))
152
+ const startMatch = fullLineContent.match(/^eval\(__webpack_require__\.\w+\(["'`]/);
153
+ if (!startMatch) {
154
+ return null;
155
+ }
156
+ const startIdx = startMatch[0].length;
157
+ // Find the closing quote and parentheses - handle escaped quotes
158
+ let endIdx = fullLineContent.length - 3; // Assume "))" at end, quote before that
159
+ // Extract the inner content
160
+ let innerContent = fullLineContent.substring(startIdx, endIdx);
161
+ try {
162
+ // Unescape the string (handles \\n, \\t, etc.)
163
+ innerContent = innerContent
164
+ .replace(/\\n/g, '\n')
165
+ .replace(/\\t/g, '\t')
166
+ .replace(/\\r/g, '\r')
167
+ .replace(/\\\\/g, '\\')
168
+ .replace(/\\"/g, '"')
169
+ .replace(/\\'/g, "'");
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ // Split into lines and find the one containing the pattern
175
+ const lines = innerContent.split('\n');
176
+ const flags = caseSensitive ? 'g' : 'gi';
177
+ try {
178
+ const regex = new RegExp(pattern, flags);
179
+ for (let i = 0; i < lines.length; i++) {
180
+ if (regex.test(lines[i])) {
181
+ regex.lastIndex = 0; // Reset for next test
182
+ return {
183
+ lineContent: lines[i].trim(),
184
+ innerLineNumber: i + 1, // 1-based line number within the eval content
185
+ };
186
+ }
187
+ regex.lastIndex = 0; // Reset for next test
188
+ }
189
+ }
190
+ catch {
191
+ // If regex fails, try simple string match
192
+ const searchPattern = caseSensitive ? pattern : pattern.toLowerCase();
193
+ for (let i = 0; i < lines.length; i++) {
194
+ const line = caseSensitive ? lines[i] : lines[i].toLowerCase();
195
+ if (line.includes(searchPattern)) {
196
+ return {
197
+ lineContent: lines[i].trim(),
198
+ innerLineNumber: i + 1,
199
+ };
200
+ }
201
+ }
202
+ }
203
+ return null; // Pattern not found in inner content
204
+ }
205
+ // Consolidated inspection tool schema
206
+ const inspectionToolSchema = z.object({
207
+ action: z.enum(['getCallStack', 'getVariables', 'evaluateExpression', 'searchCode', 'searchFunctions'])
208
+ .describe('Inspection action: getCallStack (get call stack when paused), getVariables (get variables in call frame), evaluateExpression (evaluate JavaScript), searchCode (search code by pattern), searchFunctions (find function definitions)'),
209
+ connectionReason: z.string().optional().describe('Connection reference (use the reference from launchChrome output, e.g., "unnamed-connection-default" or your renamed tab)'),
210
+ // getVariables and evaluateExpression parameters
211
+ callFrameId: z.string().optional().describe('Call frame ID (required for getVariables, optional for evaluateExpression)'),
212
+ includeGlobal: z.boolean().optional().describe('Include global scope (for getVariables action, default: false)'),
213
+ filter: z.string().optional().describe('Regex filter for variable names (for getVariables action) - applies to ALL scopes. Required when too many variables exist'),
214
+ expandObjects: z.boolean().optional().describe('Expand objects/arrays (for getVariables and evaluateExpression actions, default: true)'),
215
+ maxDepth: z.number().optional().describe('Max expansion depth (for getVariables and evaluateExpression actions, default: 2). Auto-reduced if response too large'),
216
+ maxTokens: z.number().optional().describe('Max tokens for getVariables response (default: 1000). Depth auto-reduced to fit, filter required if still exceeded'),
217
+ // evaluateExpression parameters
218
+ expression: z.string().optional().describe('JavaScript expression (required for evaluateExpression action). A returned Promise is awaited by default, so async IIFEs like (async () => await fetch(...))() resolve to their settled value'),
219
+ awaitPromise: z.boolean().optional().describe('Await a Promise returned by the expression and use its settled value (for evaluateExpression action, default: true). Pass false to inspect the Promise object itself. While paused at a breakpoint, only already-settled promises can be resolved (the event loop is stopped); a pending one fails fast'),
220
+ saveAs: z.string().optional().describe('Sequence step only (evaluateExpression): captures the evaluated value into the run\'s variable store under this name, for later {{var:name}} / {{var:name.path}} use'),
221
+ // searchCode parameters
222
+ pattern: z.string().optional().describe('Regex pattern (required for searchCode action)'),
223
+ caseSensitive: z.boolean().optional().describe('Case sensitive (for searchCode and searchFunctions actions, default: false)'),
224
+ isRegex: z.boolean().optional().describe('Treat as regex (for searchCode action, default: true)'),
225
+ urlFilter: z.string().optional().describe('URL filter regex (for searchCode and searchFunctions actions)'),
226
+ limit: z.number().optional().describe('Max results (for searchCode action default: 100, for searchFunctions default: 50)'),
227
+ // searchFunctions parameters
228
+ functionName: z.string().optional().describe('Function name (required for searchFunctions action)'),
229
+ }).strict();
230
+ export function createInspectionTools(cdpManager, sourceMapHandler, resolveConnectionFromReason) {
231
+ return {
232
+ inspect: createTool('Inspect and debug code. Actions: getCallStack (get call stack when paused), getVariables (get variables in call frame), evaluateExpression (evaluate JavaScript), searchCode (search code by pattern), searchFunctions (find function definitions)', inspectionToolSchema,
233
+ // abortSignal (#110): INTERRUPTIBLE AT A CHECKPOINT, not genuinely
234
+ // cancellable. `evaluateExpression` is the only action with a real wait
235
+ // (the bounded round-trip to the execution context, up to its own
236
+ // timeout), and CDP gives us no way to recall a Runtime.evaluate - so a
237
+ // cancel stops WAITING for it while the expression keeps running in the
238
+ // target. The other actions read already-captured state and only get the
239
+ // entry checkpoint.
240
+ async (args, abortSignal) => {
241
+ const { action, connectionReason } = args;
242
+ throwIfAborted(abortSignal);
243
+ // Resolve connection if connectionReason is provided
244
+ let targetCdpManager = cdpManager;
245
+ if (connectionReason && resolveConnectionFromReason) {
246
+ const resolved = await resolveConnectionFromReason(connectionReason);
247
+ if (!resolved) {
248
+ return createErrorResponse('CONNECTION_NOT_FOUND');
249
+ }
250
+ targetCdpManager = resolved.cdpManager;
251
+ }
252
+ switch (action) {
253
+ case 'getCallStack': {
254
+ const callStack = targetCdpManager.getCallStack();
255
+ if (!callStack) {
256
+ return createErrorResponse('NOT_PAUSED');
257
+ }
258
+ // Try to map stack frames back to original sources
259
+ const mappedStack = await Promise.all(callStack.map(async (frame) => {
260
+ const original = await sourceMapHandler.mapToOriginal(frame.url, frame.location.lineNumber, frame.location.columnNumber);
261
+ return {
262
+ functionName: frame.functionName,
263
+ location: original || {
264
+ source: frame.url,
265
+ line: frame.location.lineNumber,
266
+ column: frame.location.columnNumber,
267
+ },
268
+ callFrameId: frame.callFrameId,
269
+ };
270
+ }));
271
+ // Format paused location from first frame
272
+ const pausedLocation = mappedStack.length > 0
273
+ ? `${mappedStack[0].location.source}:${mappedStack[0].location.line}`
274
+ : undefined;
275
+ // Format as TOON
276
+ const toonData = '```\n' + formatCallStackAsToon(mappedStack) + '\n```';
277
+ return createSuccessResponse('CALL_STACK_SUCCESS', {
278
+ pausedLocation,
279
+ frameCount: mappedStack.length,
280
+ }, toonData);
281
+ }
282
+ case 'getVariables': {
283
+ const { callFrameId, includeGlobal = false, filter, expandObjects = true, maxDepth = 2, maxTokens = 1000 } = args;
284
+ if (!callFrameId) {
285
+ return createErrorResponse('MISSING_PARAMETER', {
286
+ action: 'getVariables',
287
+ missing: 'callFrameId',
288
+ message: 'Provide a valid call frame ID from the call stack'
289
+ });
290
+ }
291
+ try {
292
+ const result = await targetCdpManager.getVariables(callFrameId, includeGlobal, filter, expandObjects, maxDepth, maxTokens);
293
+ const { data, totalCount, usedDepth, requestedDepth, responseType, filterInsufficient } = result;
294
+ // Format data as TOON (Token-Oriented Object Notation)
295
+ const toonData = '```\n' + formatVariablesAsToon(data, responseType) + '\n```';
296
+ // Select message based on responseType and filterInsufficient
297
+ switch (responseType) {
298
+ case 'full':
299
+ return createSuccessResponse('VARIABLES_SUCCESS', {
300
+ callFrameId,
301
+ returnedCount: totalCount,
302
+ totalCount,
303
+ usedDepth,
304
+ filter: filter || undefined,
305
+ includeGlobal: includeGlobal || undefined,
306
+ }, toonData);
307
+ case 'depth_reduced':
308
+ return createSuccessResponse('VARIABLES_DEPTH_REDUCED', {
309
+ callFrameId,
310
+ totalCount,
311
+ requestedDepth,
312
+ usedDepth,
313
+ filter: filter || undefined,
314
+ includeGlobal: includeGlobal || undefined,
315
+ }, toonData);
316
+ case 'names_only':
317
+ if (filterInsufficient) {
318
+ return createSuccessResponse('VARIABLES_FILTER_INSUFFICIENT', {
319
+ callFrameId,
320
+ totalCount,
321
+ filter,
322
+ }, toonData);
323
+ }
324
+ return createSuccessResponse('VARIABLES_NAMES_ONLY', {
325
+ callFrameId,
326
+ totalCount,
327
+ }, toonData);
328
+ case 'counts_only':
329
+ if (filterInsufficient) {
330
+ return createSuccessResponse('VARIABLES_FILTER_INSUFFICIENT', {
331
+ callFrameId,
332
+ totalCount,
333
+ filter,
334
+ }, toonData);
335
+ }
336
+ return createSuccessResponse('VARIABLES_COUNTS_ONLY', {
337
+ callFrameId,
338
+ totalCount,
339
+ }, toonData);
340
+ }
341
+ }
342
+ catch (error) {
343
+ const errorMsg = String(error);
344
+ if (errorMsg.includes('Invalid filter regex')) {
345
+ return createErrorResponse('INVALID_FILTER', {
346
+ filter,
347
+ error: errorMsg,
348
+ });
349
+ }
350
+ return createErrorResponse('CALL_FRAME_NOT_FOUND', {
351
+ callFrameId,
352
+ });
353
+ }
354
+ }
355
+ case 'evaluateExpression': {
356
+ const { expression, callFrameId, expandObjects = true, maxDepth = 2, awaitPromise = true } = args;
357
+ if (!expression) {
358
+ return createErrorResponse('MISSING_PARAMETER', {
359
+ action: 'evaluateExpression',
360
+ missing: 'expression',
361
+ message: 'Provide a JavaScript expression to evaluate'
362
+ });
363
+ }
364
+ try {
365
+ throwIfAborted(abortSignal);
366
+ // raceAbort = stop waiting on cancel; the evaluation itself
367
+ // continues in the target (no way to recall it).
368
+ const detailed = await raceAbort(targetCdpManager.evaluateExpressionDetailed(expression, callFrameId, expandObjects, maxDepth, { awaitPromise, captureRaw: true }), abortSignal);
369
+ const result = detailed.formatted;
370
+ // Format result as TOON
371
+ let formattedResult;
372
+ if (result === undefined || result === 'undefined') {
373
+ formattedResult = '```\nundefined\n```';
374
+ }
375
+ else if (result === null || result === 'null') {
376
+ formattedResult = '```\nnull\n```';
377
+ }
378
+ else if (typeof result === 'string') {
379
+ formattedResult = `\`\`\`\n${result}\n\`\`\``;
380
+ }
381
+ else {
382
+ // For objects/arrays, use TOON formatting
383
+ formattedResult = `\`\`\`\n${formatToonValue(result)}\n\`\`\``;
384
+ }
385
+ // Machine-readable twin of the text above: this is what a
386
+ // sequence step's saveAs captures into the variable store
387
+ // (replay-executor's capture table reads _meta.inspect.value).
388
+ // Prefer the exact by-value capture (bug-015); fall back to
389
+ // reconstructing from the display formatting only when the
390
+ // value is not serializable by value.
391
+ const capturedValue = detailed.rawCaptured
392
+ ? detailed.rawValue
393
+ : deformatEvaluatedValue(result);
394
+ const inspectMeta = {
395
+ tool: 'inspect',
396
+ action: 'evaluateExpression',
397
+ timestamp: Date.now(),
398
+ inspect: {
399
+ expression,
400
+ value: capturedValue,
401
+ valueType: capturedValue === null ? 'null' : typeof capturedValue,
402
+ valueSource: detailed.rawCaptured ? 'exact' : 'display',
403
+ ...(callFrameId ? { callFrameId } : {}),
404
+ },
405
+ };
406
+ return {
407
+ ...createSuccessResponse('EVALUATE_EXPRESSION_SUCCESS', {
408
+ expression,
409
+ context: callFrameId ? `Call frame ${callFrameId}` : 'Global context',
410
+ result: formattedResult
411
+ }),
412
+ _meta: inspectMeta,
413
+ };
414
+ }
415
+ catch (error) {
416
+ // The universal trap: this broad catch ends in a catch-all
417
+ // EVALUATE_EXPRESSION_FAILED, which would turn the user's cancel
418
+ // into a bogus evaluation failure. Rethrow aborts first.
419
+ if (isAbortError(error))
420
+ throw error;
421
+ // The evaluated expression itself threw (CDP exceptionDetails,
422
+ // e.g. a stack-exhaustion RangeError) - report it as an
423
+ // ordinary outcome, not a tool malfunction.
424
+ if (error instanceof EvaluateExpressionExceptionError) {
425
+ return createErrorResponse('EVALUATE_EXPRESSION_EXCEPTION', {
426
+ expression: error.expression,
427
+ errorType: error.exceptionType,
428
+ errorMessage: error.exceptionMessage,
429
+ stack: error.exceptionStack || '(no stack available)',
430
+ });
431
+ }
432
+ // The expression returned a Promise that cannot settle while
433
+ // the debugger is paused (event loop stopped) - fail fast with
434
+ // an explanation instead of burning the full timeout.
435
+ if (error instanceof EvaluateExpressionPendingPromiseError) {
436
+ return createErrorResponse('EVALUATE_PROMISE_PENDING_WHILE_PAUSED', {
437
+ expression: error.expression,
438
+ });
439
+ }
440
+ // The execution context never responded within the bounded
441
+ // timeout - report explicitly instead of hanging forever.
442
+ if (error instanceof EvaluateExpressionTimeoutError) {
443
+ return createErrorResponse('EVALUATE_CONTEXT_UNRESPONSIVE', {
444
+ connectionReason: args.connectionReason || 'unknown',
445
+ expression: error.expression,
446
+ timeoutMs: error.timeoutMs,
447
+ });
448
+ }
449
+ return createErrorResponse('EVALUATE_EXPRESSION_FAILED', {
450
+ expression,
451
+ error: String(error),
452
+ });
453
+ }
454
+ }
455
+ case 'searchCode': {
456
+ const { pattern, caseSensitive = false, isRegex = true, urlFilter, limit = 100 } = args;
457
+ if (!pattern) {
458
+ return createErrorResponse('MISSING_PARAMETER', {
459
+ action: 'searchCode',
460
+ missing: 'pattern',
461
+ message: 'Provide a regex pattern to search for in the code'
462
+ });
463
+ }
464
+ if (!targetCdpManager.isConnected()) {
465
+ return createErrorResponse('DEBUGGER_NOT_CONNECTED');
466
+ }
467
+ try {
468
+ const allScripts = targetCdpManager.getAllScripts();
469
+ let scriptsToSearch = allScripts;
470
+ // Filter by URL if provided
471
+ if (urlFilter) {
472
+ try {
473
+ const urlRegex = new RegExp(urlFilter);
474
+ scriptsToSearch = allScripts.filter(s => urlRegex.test(s.url));
475
+ }
476
+ catch (error) {
477
+ return createErrorResponse('SOURCE_CODE_FAILED', { error: `Invalid URL filter regex: ${error}` });
478
+ }
479
+ }
480
+ const allResults = [];
481
+ for (const script of scriptsToSearch) {
482
+ if (allResults.length >= limit)
483
+ break;
484
+ const matches = await targetCdpManager.searchInScript(script.scriptId, pattern, caseSensitive, isRegex);
485
+ for (const match of matches) {
486
+ let lineContent;
487
+ let displayLineNumber = match.lineNumber + 1; // Convert to 1-based
488
+ // Check if this is a webpack eval line (truncated content starts with eval)
489
+ if (isWebpackEvalLine(match.lineContent)) {
490
+ // Fetch the full line content from the script
491
+ const fullLine = await targetCdpManager.getScriptLine(script.scriptId, match.lineNumber);
492
+ if (fullLine) {
493
+ const extracted = extractSourceFromFullEvalLine(fullLine, pattern, caseSensitive);
494
+ if (extracted) {
495
+ lineContent = extracted.lineContent;
496
+ }
497
+ else {
498
+ // Couldn't extract, use truncated original
499
+ lineContent = match.lineContent;
500
+ }
501
+ }
502
+ else {
503
+ lineContent = match.lineContent;
504
+ }
505
+ }
506
+ else {
507
+ // Regular code, use as-is
508
+ lineContent = match.lineContent;
509
+ }
510
+ // Truncate line content to avoid huge responses from minified code
511
+ const MAX_LINE_LENGTH = 200;
512
+ if (lineContent.length > MAX_LINE_LENGTH) {
513
+ lineContent = lineContent.substring(0, MAX_LINE_LENGTH) + '...';
514
+ }
515
+ allResults.push({
516
+ url: script.url,
517
+ scriptId: script.scriptId,
518
+ lineNumber: displayLineNumber,
519
+ lineContent,
520
+ });
521
+ if (allResults.length >= limit)
522
+ break;
523
+ }
524
+ }
525
+ // Format as TOON
526
+ const toonData = allResults.length > 0
527
+ ? '```\n' + formatSearchResultsAsToon(allResults) + '\n```'
528
+ : 'No matches found';
529
+ return createSuccessResponse('CODE_SEARCH_RESULTS', {
530
+ count: allResults.length.toString(),
531
+ scriptsSearched: scriptsToSearch.length.toString(),
532
+ }, toonData);
533
+ }
534
+ catch (error) {
535
+ return createErrorResponse('SOURCE_CODE_FAILED', { error: `${error}` });
536
+ }
537
+ }
538
+ case 'searchFunctions': {
539
+ const { functionName, caseSensitive = false, urlFilter, limit = 50 } = args;
540
+ if (!functionName) {
541
+ return createErrorResponse('MISSING_PARAMETER', {
542
+ action: 'searchFunctions',
543
+ missing: 'functionName',
544
+ message: 'Provide a function name to search for'
545
+ });
546
+ }
547
+ if (!targetCdpManager.isConnected()) {
548
+ return createErrorResponse('DEBUGGER_NOT_CONNECTED');
549
+ }
550
+ try {
551
+ const allScripts = targetCdpManager.getAllScripts();
552
+ let scriptsToSearch = allScripts;
553
+ // Filter by URL if provided
554
+ if (urlFilter) {
555
+ try {
556
+ const urlRegex = new RegExp(urlFilter);
557
+ scriptsToSearch = allScripts.filter(s => urlRegex.test(s.url));
558
+ }
559
+ catch (error) {
560
+ return createErrorResponse('SOURCE_CODE_FAILED', { error: `Invalid URL filter regex: ${error}` });
561
+ }
562
+ }
563
+ // Build pattern to match: function name( or const name = or let name =
564
+ const escapedName = functionName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
565
+ const pattern = caseSensitive
566
+ ? `(function\\s+${escapedName}\\s*\\(|const\\s+${escapedName}\\s*=|let\\s+${escapedName}\\s*=|${escapedName}\\s*:\\s*function|${escapedName}\\s*:\\s*\\(|${escapedName}\\s*=\\s*\\()`
567
+ : `(function\\s+${escapedName}\\s*\\(|const\\s+${escapedName}\\s*=|let\\s+${escapedName}\\s*=|${escapedName}\\s*:\\s*function|${escapedName}\\s*:\\s*\\(|${escapedName}\\s*=\\s*\\()`;
568
+ const allResults = [];
569
+ for (const script of scriptsToSearch) {
570
+ if (allResults.length >= limit)
571
+ break;
572
+ const matches = await targetCdpManager.searchInScript(script.scriptId, pattern, caseSensitive, true // always use regex
573
+ );
574
+ for (const match of matches) {
575
+ let lineContent;
576
+ let displayLineNumber = match.lineNumber + 1; // Convert to 1-based
577
+ // Check if this is a webpack eval line (truncated content starts with eval)
578
+ if (isWebpackEvalLine(match.lineContent)) {
579
+ // Fetch the full line content from the script
580
+ const fullLine = await targetCdpManager.getScriptLine(script.scriptId, match.lineNumber);
581
+ if (fullLine) {
582
+ const extracted = extractSourceFromFullEvalLine(fullLine, pattern, caseSensitive);
583
+ if (extracted) {
584
+ lineContent = extracted.lineContent;
585
+ }
586
+ else {
587
+ // Couldn't extract, use truncated original
588
+ lineContent = match.lineContent.trim();
589
+ }
590
+ }
591
+ else {
592
+ lineContent = match.lineContent.trim();
593
+ }
594
+ }
595
+ else {
596
+ // Regular code, use as-is
597
+ lineContent = match.lineContent.trim();
598
+ }
599
+ // Truncate line content to avoid huge responses from minified code
600
+ const MAX_LINE_LENGTH = 200;
601
+ if (lineContent.length > MAX_LINE_LENGTH) {
602
+ lineContent = lineContent.substring(0, MAX_LINE_LENGTH) + '...';
603
+ }
604
+ allResults.push({
605
+ url: script.url,
606
+ scriptId: script.scriptId,
607
+ lineNumber: displayLineNumber,
608
+ lineContent,
609
+ });
610
+ if (allResults.length >= limit)
611
+ break;
612
+ }
613
+ }
614
+ // Format as TOON
615
+ const toonData = allResults.length > 0
616
+ ? '```\n' + formatSearchResultsAsToon(allResults) + '\n```'
617
+ : 'No matches found';
618
+ return createSuccessResponse('FUNCTION_SEARCH_RESULTS', {
619
+ count: allResults.length.toString(),
620
+ functionName,
621
+ scriptsSearched: scriptsToSearch.length.toString(),
622
+ }, toonData);
623
+ }
624
+ catch (error) {
625
+ return createErrorResponse('SOURCE_CODE_FAILED', { error: `${error}` });
626
+ }
627
+ }
628
+ default:
629
+ return createErrorResponse('INVALID_ACTION', {
630
+ action,
631
+ validActions: 'getCallStack, getVariables, evaluateExpression, searchCode, searchFunctions',
632
+ });
633
+ }
634
+ }),
635
+ };
636
+ }
637
+ //# sourceMappingURL=inspection-tools.js.map