@agentrhq/webcmd 0.1.1 → 0.1.2

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 (415) hide show
  1. package/README.md +317 -24
  2. package/dist/src/adapter-shadow.d.ts +11 -0
  3. package/dist/src/adapter-shadow.js +72 -0
  4. package/dist/src/adapter-shadow.test.d.ts +1 -0
  5. package/dist/src/adapter-shadow.test.js +49 -0
  6. package/dist/src/adapter-source.d.ts +11 -0
  7. package/dist/src/adapter-source.js +24 -0
  8. package/dist/src/adapter-source.test.d.ts +1 -0
  9. package/dist/src/adapter-source.test.js +29 -0
  10. package/dist/src/brand.d.ts +9 -0
  11. package/dist/src/brand.js +9 -0
  12. package/dist/src/brand.test.d.ts +1 -0
  13. package/dist/src/brand.test.js +15 -0
  14. package/dist/src/browser/analyze.d.ts +118 -0
  15. package/dist/src/browser/analyze.js +405 -0
  16. package/dist/src/browser/analyze.test.d.ts +1 -0
  17. package/dist/src/browser/analyze.test.js +209 -0
  18. package/dist/src/browser/article-extract.d.ts +57 -0
  19. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  20. package/dist/src/browser/article-extract.e2e.test.js +105 -0
  21. package/dist/src/browser/article-extract.js +169 -0
  22. package/dist/src/browser/article-extract.test.d.ts +1 -0
  23. package/dist/src/browser/article-extract.test.js +94 -0
  24. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  25. package/dist/src/browser/ax-snapshot.js +217 -0
  26. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  27. package/dist/src/browser/ax-snapshot.test.js +91 -0
  28. package/dist/src/browser/base-page.d.ts +151 -0
  29. package/dist/src/browser/base-page.js +1060 -0
  30. package/dist/src/browser/base-page.test.d.ts +1 -0
  31. package/dist/src/browser/base-page.test.js +803 -0
  32. package/dist/src/browser/bridge-readiness.d.ts +14 -0
  33. package/dist/src/browser/bridge-readiness.js +24 -0
  34. package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
  35. package/dist/src/browser/bridge-readiness.test.js +58 -0
  36. package/dist/src/browser/bridge.d.ts +26 -0
  37. package/dist/src/browser/bridge.js +58 -0
  38. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  39. package/dist/src/browser/cdp-click-fixture.test.js +87 -0
  40. package/dist/src/browser/cdp.d.ts +46 -0
  41. package/dist/src/browser/cdp.js +536 -0
  42. package/dist/src/browser/cdp.test.d.ts +1 -0
  43. package/dist/src/browser/cdp.test.js +79 -0
  44. package/dist/src/browser/compound.d.ts +59 -0
  45. package/dist/src/browser/compound.js +112 -0
  46. package/dist/src/browser/compound.test.d.ts +1 -0
  47. package/dist/src/browser/compound.test.js +175 -0
  48. package/dist/src/browser/config.d.ts +2 -0
  49. package/dist/src/browser/config.js +14 -0
  50. package/dist/src/browser/daemon-client.d.ts +32 -0
  51. package/dist/src/browser/daemon-client.js +135 -0
  52. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  53. package/dist/src/browser/daemon-client.test.js +326 -0
  54. package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
  55. package/dist/src/browser/daemon-lifecycle.js +147 -0
  56. package/dist/src/browser/daemon-transport.d.ts +54 -0
  57. package/dist/src/browser/daemon-transport.js +68 -0
  58. package/dist/src/browser/daemon-version.d.ts +4 -0
  59. package/dist/src/browser/daemon-version.js +12 -0
  60. package/dist/src/browser/dom-helpers.d.ts +41 -0
  61. package/dist/src/browser/dom-helpers.js +239 -0
  62. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  63. package/dist/src/browser/dom-helpers.test.js +106 -0
  64. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  65. package/dist/src/browser/dom-snapshot.js +894 -0
  66. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  67. package/dist/src/browser/dom-snapshot.test.js +313 -0
  68. package/dist/src/browser/errors.d.ts +38 -0
  69. package/dist/src/browser/errors.js +79 -0
  70. package/dist/src/browser/errors.test.d.ts +1 -0
  71. package/dist/src/browser/errors.test.js +60 -0
  72. package/dist/src/browser/extract.d.ts +69 -0
  73. package/dist/src/browser/extract.js +132 -0
  74. package/dist/src/browser/extract.test.d.ts +1 -0
  75. package/dist/src/browser/extract.test.js +129 -0
  76. package/dist/src/browser/find.d.ts +84 -0
  77. package/dist/src/browser/find.js +398 -0
  78. package/dist/src/browser/find.test.d.ts +1 -0
  79. package/dist/src/browser/find.test.js +180 -0
  80. package/dist/src/browser/html-tree.d.ts +75 -0
  81. package/dist/src/browser/html-tree.js +112 -0
  82. package/dist/src/browser/html-tree.test.d.ts +1 -0
  83. package/dist/src/browser/html-tree.test.js +181 -0
  84. package/dist/src/browser/index.d.ts +14 -0
  85. package/dist/src/browser/index.js +12 -0
  86. package/dist/src/browser/network-cache.d.ts +49 -0
  87. package/dist/src/browser/network-cache.js +78 -0
  88. package/dist/src/browser/network-cache.test.d.ts +1 -0
  89. package/dist/src/browser/network-cache.test.js +75 -0
  90. package/dist/src/browser/network-interceptor.d.ts +11 -0
  91. package/dist/src/browser/network-interceptor.js +11 -0
  92. package/dist/src/browser/network-key.d.ts +22 -0
  93. package/dist/src/browser/network-key.js +66 -0
  94. package/dist/src/browser/network-key.test.d.ts +1 -0
  95. package/dist/src/browser/network-key.test.js +49 -0
  96. package/dist/src/browser/page.d.ts +83 -0
  97. package/dist/src/browser/page.js +453 -0
  98. package/dist/src/browser/page.test.d.ts +1 -0
  99. package/dist/src/browser/page.test.js +406 -0
  100. package/dist/src/browser/profile.d.ts +14 -0
  101. package/dist/src/browser/profile.js +86 -0
  102. package/dist/src/browser/protocol.d.ts +63 -0
  103. package/dist/src/browser/protocol.js +1 -0
  104. package/dist/src/browser/runtime/local-cloak/actions.d.ts +3 -0
  105. package/dist/src/browser/runtime/local-cloak/actions.js +240 -0
  106. package/dist/src/browser/runtime/local-cloak/downloads.d.ts +3 -0
  107. package/dist/src/browser/runtime/local-cloak/downloads.js +28 -0
  108. package/dist/src/browser/runtime/local-cloak/network.d.ts +28 -0
  109. package/dist/src/browser/runtime/local-cloak/network.js +120 -0
  110. package/dist/src/browser/runtime/local-cloak/network.test.d.ts +1 -0
  111. package/dist/src/browser/runtime/local-cloak/network.test.js +124 -0
  112. package/dist/src/browser/runtime/local-cloak/profiles.d.ts +6 -0
  113. package/dist/src/browser/runtime/local-cloak/profiles.js +17 -0
  114. package/dist/src/browser/runtime/local-cloak/profiles.test.d.ts +1 -0
  115. package/dist/src/browser/runtime/local-cloak/profiles.test.js +19 -0
  116. package/dist/src/browser/runtime/local-cloak/provider.d.ts +15 -0
  117. package/dist/src/browser/runtime/local-cloak/provider.js +27 -0
  118. package/dist/src/browser/runtime/local-cloak/provider.test.d.ts +1 -0
  119. package/dist/src/browser/runtime/local-cloak/provider.test.js +244 -0
  120. package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +77 -0
  121. package/dist/src/browser/runtime/local-cloak/session-manager.js +280 -0
  122. package/dist/src/browser/runtime/local-cloak/session-manager.test.d.ts +1 -0
  123. package/dist/src/browser/runtime/local-cloak/session-manager.test.js +92 -0
  124. package/dist/src/browser/runtime/provider.d.ts +9 -0
  125. package/dist/src/browser/runtime/provider.js +1 -0
  126. package/dist/src/browser/runtime/provider.test.d.ts +2 -0
  127. package/dist/src/browser/runtime/provider.test.js +49 -0
  128. package/dist/src/browser/shape-filter.d.ts +52 -0
  129. package/dist/src/browser/shape-filter.js +101 -0
  130. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  131. package/dist/src/browser/shape-filter.test.js +101 -0
  132. package/dist/src/browser/shape.d.ts +23 -0
  133. package/dist/src/browser/shape.js +95 -0
  134. package/dist/src/browser/shape.test.d.ts +1 -0
  135. package/dist/src/browser/shape.test.js +82 -0
  136. package/dist/src/browser/stealth.d.ts +11 -0
  137. package/dist/src/browser/stealth.js +359 -0
  138. package/dist/src/browser/stealth.test.d.ts +1 -0
  139. package/dist/src/browser/stealth.test.js +134 -0
  140. package/dist/src/browser/tabs.d.ts +13 -0
  141. package/dist/src/browser/tabs.js +70 -0
  142. package/dist/src/browser/target-errors.d.ts +39 -0
  143. package/dist/src/browser/target-errors.js +45 -0
  144. package/dist/src/browser/target-errors.test.d.ts +1 -0
  145. package/dist/src/browser/target-errors.test.js +94 -0
  146. package/dist/src/browser/target-resolver.d.ts +158 -0
  147. package/dist/src/browser/target-resolver.js +570 -0
  148. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  149. package/dist/src/browser/target-resolver.test.js +118 -0
  150. package/dist/src/browser/utils.d.ts +20 -0
  151. package/dist/src/browser/utils.js +64 -0
  152. package/dist/src/browser/utils.test.d.ts +1 -0
  153. package/dist/src/browser/utils.test.js +29 -0
  154. package/dist/src/browser/verify-fixture.d.ts +65 -0
  155. package/dist/src/browser/verify-fixture.js +318 -0
  156. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  157. package/dist/src/browser/verify-fixture.test.js +219 -0
  158. package/dist/src/browser/visual-refs.d.ts +11 -0
  159. package/dist/src/browser/visual-refs.js +108 -0
  160. package/dist/src/browser.test.d.ts +1 -0
  161. package/dist/src/browser.test.js +297 -0
  162. package/dist/src/build-manifest.d.ts +103 -0
  163. package/dist/src/build-manifest.js +363 -0
  164. package/dist/src/build-manifest.test.d.ts +1 -0
  165. package/dist/src/build-manifest.test.js +341 -0
  166. package/dist/src/capabilityRouting.d.ts +19 -0
  167. package/dist/src/capabilityRouting.js +56 -0
  168. package/dist/src/capabilityRouting.test.d.ts +1 -0
  169. package/dist/src/capabilityRouting.test.js +63 -0
  170. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  171. package/dist/src/cli-argv-preprocess.js +303 -0
  172. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  173. package/dist/src/cli-argv-preprocess.test.js +304 -0
  174. package/dist/src/cli.d.ts +79 -0
  175. package/dist/src/cli.js +3350 -0
  176. package/dist/src/cli.test.d.ts +1 -0
  177. package/dist/src/cli.test.js +3041 -0
  178. package/dist/src/commanderAdapter.d.ts +21 -0
  179. package/dist/src/commanderAdapter.js +208 -0
  180. package/dist/src/commanderAdapter.test.d.ts +1 -0
  181. package/dist/src/commanderAdapter.test.js +352 -0
  182. package/dist/src/commands/auth.d.ts +40 -0
  183. package/dist/src/commands/auth.js +434 -0
  184. package/dist/src/commands/auth.test.d.ts +1 -0
  185. package/dist/src/commands/auth.test.js +252 -0
  186. package/dist/src/commands/daemon.d.ts +9 -0
  187. package/dist/src/commands/daemon.js +91 -0
  188. package/dist/src/commands/daemon.test.d.ts +1 -0
  189. package/dist/src/commands/daemon.test.js +293 -0
  190. package/dist/src/completion-fast.d.ts +22 -0
  191. package/dist/src/completion-fast.js +88 -0
  192. package/dist/src/completion-shared.d.ts +13 -0
  193. package/dist/src/completion-shared.js +61 -0
  194. package/dist/src/completion.d.ts +21 -0
  195. package/dist/src/completion.js +68 -0
  196. package/dist/src/completion.test.d.ts +1 -0
  197. package/dist/src/completion.test.js +24 -0
  198. package/dist/src/constants.d.ts +18 -0
  199. package/dist/src/constants.js +41 -0
  200. package/dist/src/convention-audit.d.ts +50 -0
  201. package/dist/src/convention-audit.js +553 -0
  202. package/dist/src/convention-audit.test.d.ts +1 -0
  203. package/dist/src/convention-audit.test.js +255 -0
  204. package/dist/src/daemon/server.d.ts +13 -0
  205. package/dist/src/daemon/server.js +185 -0
  206. package/dist/src/daemon/server.test.d.ts +1 -0
  207. package/dist/src/daemon/server.test.js +132 -0
  208. package/dist/src/daemon-utils.d.ts +18 -0
  209. package/dist/src/daemon-utils.js +37 -0
  210. package/dist/src/daemon.d.ts +1 -0
  211. package/dist/src/daemon.js +27 -0
  212. package/dist/src/daemon.test.d.ts +1 -0
  213. package/dist/src/daemon.test.js +60 -0
  214. package/dist/src/discovery.d.ts +46 -0
  215. package/dist/src/discovery.js +341 -0
  216. package/dist/src/doctor.d.ts +39 -0
  217. package/dist/src/doctor.js +168 -0
  218. package/dist/src/doctor.test.d.ts +1 -0
  219. package/dist/src/doctor.test.js +302 -0
  220. package/dist/src/download/article-download.d.ts +72 -0
  221. package/dist/src/download/article-download.js +305 -0
  222. package/dist/src/download/article-download.test.d.ts +1 -0
  223. package/dist/src/download/article-download.test.js +235 -0
  224. package/dist/src/download/index.d.ts +71 -0
  225. package/dist/src/download/index.js +363 -0
  226. package/dist/src/download/index.test.d.ts +1 -0
  227. package/dist/src/download/index.test.js +174 -0
  228. package/dist/src/download/media-download.d.ts +49 -0
  229. package/dist/src/download/media-download.js +127 -0
  230. package/dist/src/download/media-download.test.d.ts +1 -0
  231. package/dist/src/download/media-download.test.js +112 -0
  232. package/dist/src/download/progress.d.ts +36 -0
  233. package/dist/src/download/progress.js +120 -0
  234. package/dist/src/download/progress.test.d.ts +1 -0
  235. package/dist/src/download/progress.test.js +36 -0
  236. package/dist/src/electron-apps.d.ts +31 -0
  237. package/dist/src/electron-apps.js +91 -0
  238. package/dist/src/electron-apps.test.d.ts +1 -0
  239. package/dist/src/electron-apps.test.js +76 -0
  240. package/dist/src/engine.test.d.ts +1 -0
  241. package/dist/src/engine.test.js +312 -0
  242. package/dist/src/errors.d.ts +114 -0
  243. package/dist/src/errors.js +174 -0
  244. package/dist/src/errors.test.d.ts +1 -0
  245. package/dist/src/errors.test.js +109 -0
  246. package/dist/src/execution.d.ts +24 -0
  247. package/dist/src/execution.js +509 -0
  248. package/dist/src/execution.test.d.ts +1 -0
  249. package/dist/src/execution.test.js +645 -0
  250. package/dist/src/external.d.ts +49 -0
  251. package/dist/src/external.js +211 -0
  252. package/dist/src/external.test.d.ts +1 -0
  253. package/dist/src/external.test.js +110 -0
  254. package/dist/src/help.d.ts +88 -0
  255. package/dist/src/help.js +556 -0
  256. package/dist/src/help.test.d.ts +1 -0
  257. package/dist/src/help.test.js +58 -0
  258. package/dist/src/hooks.d.ts +46 -0
  259. package/dist/src/hooks.js +58 -0
  260. package/dist/src/hooks.test.d.ts +4 -0
  261. package/dist/src/hooks.test.js +92 -0
  262. package/dist/src/interceptor.d.ts +44 -0
  263. package/dist/src/interceptor.js +183 -0
  264. package/dist/src/interceptor.test.d.ts +4 -0
  265. package/dist/src/interceptor.test.js +81 -0
  266. package/dist/src/launcher.d.ts +41 -0
  267. package/dist/src/launcher.js +226 -0
  268. package/dist/src/launcher.test.d.ts +1 -0
  269. package/dist/src/launcher.test.js +153 -0
  270. package/dist/src/logger.d.ts +26 -0
  271. package/dist/src/logger.js +49 -0
  272. package/dist/src/main.d.ts +5 -0
  273. package/dist/src/main.js +177 -0
  274. package/dist/src/manifest-types.d.ts +43 -0
  275. package/dist/src/manifest-types.js +9 -0
  276. package/dist/src/node-network.d.ts +10 -0
  277. package/dist/src/node-network.js +174 -0
  278. package/dist/src/node-network.test.d.ts +1 -0
  279. package/dist/src/node-network.test.js +55 -0
  280. package/dist/src/observation/artifact.d.ts +16 -0
  281. package/dist/src/observation/artifact.js +260 -0
  282. package/dist/src/observation/artifact.test.d.ts +1 -0
  283. package/dist/src/observation/artifact.test.js +121 -0
  284. package/dist/src/observation/events.d.ts +89 -0
  285. package/dist/src/observation/events.js +1 -0
  286. package/dist/src/observation/index.d.ts +7 -0
  287. package/dist/src/observation/index.js +7 -0
  288. package/dist/src/observation/manager.d.ts +9 -0
  289. package/dist/src/observation/manager.js +27 -0
  290. package/dist/src/observation/manager.test.d.ts +1 -0
  291. package/dist/src/observation/manager.test.js +13 -0
  292. package/dist/src/observation/redaction.d.ts +11 -0
  293. package/dist/src/observation/redaction.js +81 -0
  294. package/dist/src/observation/redaction.test.d.ts +1 -0
  295. package/dist/src/observation/redaction.test.js +32 -0
  296. package/dist/src/observation/retention.d.ts +32 -0
  297. package/dist/src/observation/retention.js +160 -0
  298. package/dist/src/observation/retention.test.d.ts +1 -0
  299. package/dist/src/observation/retention.test.js +118 -0
  300. package/dist/src/observation/ring-buffer.d.ts +22 -0
  301. package/dist/src/observation/ring-buffer.js +45 -0
  302. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  303. package/dist/src/observation/ring-buffer.test.js +22 -0
  304. package/dist/src/observation/session.d.ts +25 -0
  305. package/dist/src/observation/session.js +50 -0
  306. package/dist/src/output.d.ts +14 -0
  307. package/dist/src/output.js +152 -0
  308. package/dist/src/output.test.d.ts +1 -0
  309. package/dist/src/output.test.js +53 -0
  310. package/dist/src/package-exports.test.d.ts +1 -0
  311. package/dist/src/package-exports.test.js +112 -0
  312. package/dist/src/package-paths.d.ts +8 -0
  313. package/dist/src/package-paths.js +41 -0
  314. package/dist/src/pipeline/executor.d.ts +11 -0
  315. package/dist/src/pipeline/executor.js +93 -0
  316. package/dist/src/pipeline/executor.test.d.ts +4 -0
  317. package/dist/src/pipeline/executor.test.js +182 -0
  318. package/dist/src/pipeline/index.d.ts +5 -0
  319. package/dist/src/pipeline/index.js +5 -0
  320. package/dist/src/pipeline/registry.d.ts +28 -0
  321. package/dist/src/pipeline/registry.js +55 -0
  322. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  323. package/dist/src/pipeline/steps/browser.js +86 -0
  324. package/dist/src/pipeline/steps/download.d.ts +18 -0
  325. package/dist/src/pipeline/steps/download.js +252 -0
  326. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  327. package/dist/src/pipeline/steps/download.test.js +102 -0
  328. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  329. package/dist/src/pipeline/steps/fetch.js +122 -0
  330. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  331. package/dist/src/pipeline/steps/fetch.test.js +117 -0
  332. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  333. package/dist/src/pipeline/steps/intercept.js +50 -0
  334. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  335. package/dist/src/pipeline/steps/tap.js +93 -0
  336. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  337. package/dist/src/pipeline/steps/transform.js +70 -0
  338. package/dist/src/pipeline/template.d.ts +17 -0
  339. package/dist/src/pipeline/template.js +344 -0
  340. package/dist/src/pipeline/template.test.d.ts +4 -0
  341. package/dist/src/pipeline/template.test.js +197 -0
  342. package/dist/src/pipeline/transform.test.d.ts +4 -0
  343. package/dist/src/pipeline/transform.test.js +133 -0
  344. package/dist/src/plugin-manifest.d.ts +70 -0
  345. package/dist/src/plugin-manifest.js +160 -0
  346. package/dist/src/plugin-manifest.test.d.ts +4 -0
  347. package/dist/src/plugin-manifest.test.js +179 -0
  348. package/dist/src/plugin-scaffold.d.ts +28 -0
  349. package/dist/src/plugin-scaffold.js +143 -0
  350. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  351. package/dist/src/plugin-scaffold.test.js +83 -0
  352. package/dist/src/plugin.d.ts +146 -0
  353. package/dist/src/plugin.js +1303 -0
  354. package/dist/src/plugin.test.d.ts +4 -0
  355. package/dist/src/plugin.test.js +1363 -0
  356. package/dist/src/registry-api.d.ts +13 -0
  357. package/dist/src/registry-api.js +10 -0
  358. package/dist/src/registry.d.ts +123 -0
  359. package/dist/src/registry.js +125 -0
  360. package/dist/src/registry.test.d.ts +4 -0
  361. package/dist/src/registry.test.js +209 -0
  362. package/dist/src/runtime-copy.test.d.ts +1 -0
  363. package/dist/src/runtime-copy.test.js +29 -0
  364. package/dist/src/runtime-detect.d.ts +31 -0
  365. package/dist/src/runtime-detect.js +47 -0
  366. package/dist/src/runtime-detect.test.d.ts +1 -0
  367. package/dist/src/runtime-detect.test.js +39 -0
  368. package/dist/src/runtime-identity.test.d.ts +1 -0
  369. package/dist/src/runtime-identity.test.js +18 -0
  370. package/dist/src/runtime.d.ts +47 -0
  371. package/dist/src/runtime.js +54 -0
  372. package/dist/src/scripts/framework.d.ts +7 -0
  373. package/dist/src/scripts/framework.js +25 -0
  374. package/dist/src/scripts/interact.d.ts +4 -0
  375. package/dist/src/scripts/interact.js +20 -0
  376. package/dist/src/scripts/store.d.ts +13 -0
  377. package/dist/src/scripts/store.js +48 -0
  378. package/dist/src/serialization.d.ts +42 -0
  379. package/dist/src/serialization.js +103 -0
  380. package/dist/src/serialization.test.d.ts +1 -0
  381. package/dist/src/serialization.test.js +78 -0
  382. package/dist/src/skills.d.ts +14 -0
  383. package/dist/src/skills.js +127 -0
  384. package/dist/src/skills.test.d.ts +1 -0
  385. package/dist/src/skills.test.js +71 -0
  386. package/dist/src/snapshotFormatter.d.ts +11 -0
  387. package/dist/src/snapshotFormatter.js +338 -0
  388. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  389. package/dist/src/snapshotFormatter.test.js +521 -0
  390. package/dist/src/tui.d.ts +28 -0
  391. package/dist/src/tui.js +179 -0
  392. package/dist/src/tui.test.d.ts +1 -0
  393. package/dist/src/tui.test.js +19 -0
  394. package/dist/src/types.d.ts +236 -0
  395. package/dist/src/types.js +7 -0
  396. package/dist/src/update-check.d.ts +66 -0
  397. package/dist/src/update-check.js +206 -0
  398. package/dist/src/update-check.test.d.ts +1 -0
  399. package/dist/src/update-check.test.js +117 -0
  400. package/dist/src/utils.d.ts +57 -0
  401. package/dist/src/utils.js +152 -0
  402. package/dist/src/utils.test.d.ts +1 -0
  403. package/dist/src/utils.test.js +155 -0
  404. package/dist/src/validate.d.ts +21 -0
  405. package/dist/src/validate.js +130 -0
  406. package/dist/src/validate.test.d.ts +9 -0
  407. package/dist/src/validate.test.js +90 -0
  408. package/dist/src/verify.d.ts +26 -0
  409. package/dist/src/verify.js +67 -0
  410. package/dist/src/version.d.ts +4 -0
  411. package/dist/src/version.js +22 -0
  412. package/dist/src/weixin-download.test.d.ts +1 -0
  413. package/dist/src/weixin-download.test.js +45 -0
  414. package/package.json +4 -3
  415. package/scripts/check-package-bin.mjs +95 -0
@@ -0,0 +1,49 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { assignKeys, deriveKey } from './network-key.js';
3
+ describe('deriveKey', () => {
4
+ it('extracts operationName from Twitter-style graphql URLs', () => {
5
+ expect(deriveKey({
6
+ method: 'GET',
7
+ url: 'https://x.com/i/api/graphql/6fWQaBPK51aGyC_VC7t9GQ/UserTweets?variables=...',
8
+ })).toBe('UserTweets');
9
+ });
10
+ it('handles graphql URLs without a query id', () => {
11
+ expect(deriveKey({
12
+ method: 'POST',
13
+ url: 'https://example.com/graphql/MyOp?vars=1',
14
+ })).toBe('MyOp');
15
+ });
16
+ it('uses METHOD host+pathname for REST calls', () => {
17
+ expect(deriveKey({
18
+ method: 'get',
19
+ url: 'https://api.example.com/v1/users?page=1',
20
+ })).toBe('GET api.example.com/v1/users');
21
+ });
22
+ it('falls back to truncated raw url when URL parsing fails', () => {
23
+ const key = deriveKey({ method: 'GET', url: 'not-a-valid-url' });
24
+ expect(key.startsWith('GET ')).toBe(true);
25
+ expect(key).toContain('not-a-valid-url');
26
+ });
27
+ });
28
+ describe('assignKeys', () => {
29
+ it('disambiguates collisions with #N suffixes', () => {
30
+ const out = assignKeys([
31
+ { url: 'https://x.com/i/api/graphql/a/UserTweets', method: 'GET' },
32
+ { url: 'https://x.com/i/api/graphql/b/UserTweets', method: 'GET' },
33
+ { url: 'https://api.example.com/v1/u', method: 'GET' },
34
+ { url: 'https://api.example.com/v1/u', method: 'GET' },
35
+ { url: 'https://api.example.com/v1/u', method: 'GET' },
36
+ ]);
37
+ expect(out.map(o => o.key)).toEqual([
38
+ 'UserTweets',
39
+ 'UserTweets#2',
40
+ 'GET api.example.com/v1/u',
41
+ 'GET api.example.com/v1/u#2',
42
+ 'GET api.example.com/v1/u#3',
43
+ ]);
44
+ });
45
+ it('preserves extra fields on each request', () => {
46
+ const out = assignKeys([{ url: 'https://a.com/x', method: 'GET', status: 200 }]);
47
+ expect(out[0]).toMatchObject({ status: 200, key: 'GET a.com/x' });
48
+ });
49
+ });
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Page abstraction — implements IPage by sending commands to the daemon.
3
+ *
4
+ * All browser operations are ultimately 'exec' (JS evaluation via CDP)
5
+ * plus a few native Chrome Extension APIs (tabs, cookies, navigate).
6
+ *
7
+ * IMPORTANT: After goto(), we remember the page identity (targetId) returned
8
+ * by the navigate action and pass it to all subsequent commands. This ensures
9
+ * page-scoped operations target the correct page without guessing.
10
+ */
11
+ import type { BrowserCookie, BrowserDownloadWaitResult, BrowserEvaluateFunction, ScreenshotOptions } from '../types.js';
12
+ import { BasePage } from './base-page.js';
13
+ /**
14
+ * Page — implements IPage by talking to the daemon via HTTP.
15
+ */
16
+ export declare class Page extends BasePage {
17
+ private readonly session;
18
+ readonly contextId?: string | undefined;
19
+ private readonly windowMode?;
20
+ private readonly surface;
21
+ private readonly siteSession?;
22
+ private readonly _idleTimeout;
23
+ constructor(session: string, idleTimeout?: number, contextId?: string | undefined, windowMode?: "foreground" | "background" | undefined, surface?: 'browser' | 'adapter', siteSession?: "ephemeral" | "persistent" | undefined);
24
+ /** Active page identity (targetId), set after navigate and used in all subsequent commands */
25
+ private _page;
26
+ private _networkCaptureUnsupported;
27
+ private _networkCaptureWarned;
28
+ /** Helper: spread session into command params */
29
+ private _sessionOpts;
30
+ /** Helper: spread session + page identity into command params */
31
+ private _cmdOpts;
32
+ goto(url: string, options?: {
33
+ waitUntil?: 'load' | 'none';
34
+ settleMs?: number;
35
+ }): Promise<void>;
36
+ /** Get the active page identity (targetId) */
37
+ getActivePage(): string | undefined;
38
+ /** Bind this Page instance to a specific page identity (targetId). */
39
+ setActivePage(page?: string): void;
40
+ private _markUnsupportedNetworkCapture;
41
+ evaluate<T = unknown>(js: string): Promise<T>;
42
+ evaluate<Args extends unknown[], T>(fn: BrowserEvaluateFunction<Args, T>, ...args: Args): Promise<Awaited<T>>;
43
+ getCookies(opts?: {
44
+ domain?: string;
45
+ url?: string;
46
+ }): Promise<BrowserCookie[]>;
47
+ /** Release the current browser session lease in the extension */
48
+ closeWindow(): Promise<void>;
49
+ tabs(): Promise<unknown[]>;
50
+ newTab(url?: string): Promise<string | undefined>;
51
+ closeTab(target?: number | string): Promise<void>;
52
+ selectTab(target: number | string): Promise<void>;
53
+ /**
54
+ * Capture a screenshot via CDP Page.captureScreenshot.
55
+ */
56
+ screenshot(options?: ScreenshotOptions): Promise<string>;
57
+ startNetworkCapture(pattern?: string): Promise<boolean>;
58
+ readNetworkCapture(): Promise<unknown[]>;
59
+ waitForDownload(pattern?: string, timeoutMs?: number): Promise<BrowserDownloadWaitResult>;
60
+ /**
61
+ * Set local file paths on a file input element via CDP DOM.setFileInputFiles.
62
+ * Chrome reads the files directly from the local filesystem, avoiding the
63
+ * payload size limits of base64-in-evaluate.
64
+ */
65
+ setFileInput(files: string[], selector?: string): Promise<void>;
66
+ insertText(text: string): Promise<void>;
67
+ frames(): Promise<Array<{
68
+ index: number;
69
+ frameId: string;
70
+ url: string;
71
+ name: string;
72
+ }>>;
73
+ evaluateInFrame(js: string, frameIndex: number): Promise<unknown>;
74
+ cdp(method: string, params?: Record<string, unknown>): Promise<unknown>;
75
+ handleJavaScriptDialog(accept: boolean, promptText?: string): Promise<void>;
76
+ /** CDP native click fallback — called when JS el.click() fails */
77
+ protected tryNativeClick(x: number, y: number): Promise<boolean>;
78
+ /** Precise click using DOM.getContentQuads/getBoxModel for inline elements */
79
+ clickWithQuads(ref: string): Promise<void>;
80
+ nativeClick(x: number, y: number): Promise<void>;
81
+ nativeType(text: string): Promise<void>;
82
+ nativeKeyPress(key: string, modifiers?: string[]): Promise<void>;
83
+ }
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Page abstraction — implements IPage by sending commands to the daemon.
3
+ *
4
+ * All browser operations are ultimately 'exec' (JS evaluation via CDP)
5
+ * plus a few native Chrome Extension APIs (tabs, cookies, navigate).
6
+ *
7
+ * IMPORTANT: After goto(), we remember the page identity (targetId) returned
8
+ * by the navigate action and pass it to all subsequent commands. This ensures
9
+ * page-scoped operations target the correct page without guessing.
10
+ */
11
+ import { sendCommand, sendCommandFull } from './daemon-client.js';
12
+ import { buildEvaluateExpression } from './utils.js';
13
+ import { saveBase64ToFile } from '../utils.js';
14
+ import { generateStealthJs } from './stealth.js';
15
+ import { waitForDomStableJs } from './dom-helpers.js';
16
+ import { BasePage } from './base-page.js';
17
+ import { classifyBrowserError } from './errors.js';
18
+ import { log } from '../logger.js';
19
+ function isUnsupportedNetworkCaptureError(err) {
20
+ const message = err instanceof Error ? err.message : String(err);
21
+ const normalized = message.toLowerCase();
22
+ return (normalized.includes('unknown action') && normalized.includes('network-capture'))
23
+ || (normalized.includes('network capture') && normalized.includes('not supported'));
24
+ }
25
+ // The extension throws "Page not found: <id> — stale page identity" when our cached
26
+ // `_page` targetId no longer maps to a live tab — e.g. the user closed the automation
27
+ // window, or a long-running script left the cache pointing at an evicted target.
28
+ // Detect that signature so goto() can drop the stale id and let resolveTab fall back
29
+ // to the session lease (or create a fresh tab).
30
+ function isStalePageIdentityError(err) {
31
+ const message = err instanceof Error ? err.message : String(err);
32
+ return message.includes('stale page identity') || /^Page not found:\s*\S+\s*$/.test(message);
33
+ }
34
+ /**
35
+ * Page — implements IPage by talking to the daemon via HTTP.
36
+ */
37
+ export class Page extends BasePage {
38
+ session;
39
+ contextId;
40
+ windowMode;
41
+ surface;
42
+ siteSession;
43
+ _idleTimeout;
44
+ constructor(session, idleTimeout, contextId, windowMode, surface = 'browser', siteSession) {
45
+ super();
46
+ this.session = session;
47
+ this.contextId = contextId;
48
+ this.windowMode = windowMode;
49
+ this.surface = surface;
50
+ this.siteSession = siteSession;
51
+ this._idleTimeout = idleTimeout;
52
+ }
53
+ /** Active page identity (targetId), set after navigate and used in all subsequent commands */
54
+ _page;
55
+ _networkCaptureUnsupported = false;
56
+ _networkCaptureWarned = false;
57
+ /** Helper: spread session into command params */
58
+ _sessionOpts() {
59
+ return {
60
+ session: this.session,
61
+ surface: this.surface,
62
+ ...(this.contextId && { contextId: this.contextId }),
63
+ ...(this._idleTimeout != null && { idleTimeout: this._idleTimeout }),
64
+ ...(this.windowMode && { windowMode: this.windowMode }),
65
+ ...(this.siteSession && { siteSession: this.siteSession }),
66
+ };
67
+ }
68
+ /** Helper: spread session + page identity into command params */
69
+ _cmdOpts() {
70
+ return {
71
+ session: this.session,
72
+ surface: this.surface,
73
+ ...(this.contextId && { contextId: this.contextId }),
74
+ ...(this._page !== undefined && { page: this._page }),
75
+ ...(this._idleTimeout != null && { idleTimeout: this._idleTimeout }),
76
+ ...(this.windowMode && { windowMode: this.windowMode }),
77
+ ...(this.siteSession && { siteSession: this.siteSession }),
78
+ };
79
+ }
80
+ async goto(url, options) {
81
+ let result;
82
+ try {
83
+ result = await sendCommandFull('navigate', {
84
+ url,
85
+ ...this._cmdOpts(),
86
+ });
87
+ }
88
+ catch (err) {
89
+ // If our cached targetId went stale (tab closed externally, identity evicted),
90
+ // drop the dead id and retry without it — the extension will resolve through the
91
+ // session lease or open a fresh automation tab. Without this, every subsequent
92
+ // adapter call in the same process keeps re-sending the same dead targetId and
93
+ // cascades into "Page not found:" failures across concurrent calls.
94
+ if (!isStalePageIdentityError(err) || this._page === undefined)
95
+ throw err;
96
+ this._page = undefined;
97
+ result = await sendCommandFull('navigate', {
98
+ url,
99
+ ...this._cmdOpts(),
100
+ });
101
+ }
102
+ // Remember the page identity (targetId) for subsequent calls
103
+ if (result.page) {
104
+ this._page = result.page;
105
+ }
106
+ this._lastUrl = url;
107
+ // Inject stealth + settle in a single round-trip instead of two sequential exec calls.
108
+ // The stealth guard flag prevents double-injection; settle uses DOM stability detection.
109
+ if (options?.waitUntil !== 'none') {
110
+ const maxMs = options?.settleMs ?? 1000;
111
+ const combinedCode = `${generateStealthJs()};\n${waitForDomStableJs(maxMs, Math.min(500, maxMs))}`;
112
+ const combinedOpts = {
113
+ code: combinedCode,
114
+ ...this._cmdOpts(),
115
+ };
116
+ try {
117
+ await sendCommand('exec', combinedOpts);
118
+ }
119
+ catch (err) {
120
+ const advice = classifyBrowserError(err);
121
+ // Only settle-retry on target navigation (SPA client-side redirects).
122
+ // Extension/daemon errors are already retried by sendCommandRaw —
123
+ // retrying them here would silently swallow real failures.
124
+ if (advice.kind !== 'target-navigation')
125
+ throw err;
126
+ try {
127
+ await new Promise((r) => setTimeout(r, advice.delayMs));
128
+ await sendCommand('exec', combinedOpts);
129
+ }
130
+ catch (retryErr) {
131
+ if (classifyBrowserError(retryErr).kind !== 'target-navigation')
132
+ throw retryErr;
133
+ }
134
+ }
135
+ }
136
+ else {
137
+ // Even with waitUntil='none', still inject stealth (best-effort)
138
+ try {
139
+ await sendCommand('exec', {
140
+ code: generateStealthJs(),
141
+ ...this._cmdOpts(),
142
+ });
143
+ }
144
+ catch {
145
+ // Non-fatal: stealth is best-effort
146
+ }
147
+ }
148
+ }
149
+ /** Get the active page identity (targetId) */
150
+ getActivePage() {
151
+ return this._page;
152
+ }
153
+ /** Bind this Page instance to a specific page identity (targetId). */
154
+ setActivePage(page) {
155
+ this._page = page;
156
+ this._lastUrl = null;
157
+ }
158
+ _markUnsupportedNetworkCapture() {
159
+ this._networkCaptureUnsupported = true;
160
+ if (this._networkCaptureWarned)
161
+ return;
162
+ this._networkCaptureWarned = true;
163
+ log.warn('Browser runtime does not support network capture; continuing without it. ' +
164
+ 'Explore output may miss API endpoints until the runtime is updated.');
165
+ }
166
+ async evaluate(input, ...args) {
167
+ const code = buildEvaluateExpression(input, args);
168
+ try {
169
+ return await sendCommand('exec', { code, ...this._cmdOpts() });
170
+ }
171
+ catch (err) {
172
+ const advice = classifyBrowserError(err);
173
+ if (advice.kind !== 'target-navigation')
174
+ throw err;
175
+ await new Promise((resolve) => setTimeout(resolve, advice.delayMs));
176
+ return sendCommand('exec', { code, ...this._cmdOpts() });
177
+ }
178
+ }
179
+ async getCookies(opts = {}) {
180
+ const result = await sendCommand('cookies', { ...this._sessionOpts(), ...opts });
181
+ return Array.isArray(result) ? result : [];
182
+ }
183
+ /** Release the current browser session lease in the extension */
184
+ async closeWindow() {
185
+ try {
186
+ await sendCommand('close-window', { ...this._sessionOpts() });
187
+ }
188
+ catch {
189
+ // Window may already be closed or daemon may be down
190
+ }
191
+ finally {
192
+ this._page = undefined;
193
+ this._lastUrl = null;
194
+ this._networkCaptureUnsupported = false;
195
+ this._networkCaptureWarned = false;
196
+ }
197
+ }
198
+ async tabs() {
199
+ const result = await sendCommand('tabs', { op: 'list', ...this._sessionOpts() });
200
+ return Array.isArray(result) ? result : [];
201
+ }
202
+ async newTab(url) {
203
+ const result = await sendCommandFull('tabs', {
204
+ op: 'new',
205
+ ...(url !== undefined && { url }),
206
+ ...this._sessionOpts(),
207
+ });
208
+ this._lastUrl = null;
209
+ return result.page;
210
+ }
211
+ async closeTab(target) {
212
+ const params = { op: 'close', ...this._sessionOpts() };
213
+ if (typeof target === 'number')
214
+ params.index = target;
215
+ else if (typeof target === 'string')
216
+ params.page = target;
217
+ else if (this._page !== undefined)
218
+ params.page = this._page;
219
+ const result = await sendCommand('tabs', params);
220
+ const closedPage = typeof result?.closed === 'string' ? result.closed : undefined;
221
+ if ((closedPage && closedPage === this._page) || (!closedPage && (target === undefined || target === this._page))) {
222
+ this._page = undefined;
223
+ this._lastUrl = null;
224
+ }
225
+ }
226
+ async selectTab(target) {
227
+ const result = await sendCommandFull('tabs', {
228
+ op: 'select',
229
+ ...(typeof target === 'number' ? { index: target } : { page: target }),
230
+ ...this._sessionOpts(),
231
+ });
232
+ if (result.page)
233
+ this._page = result.page;
234
+ this._lastUrl = null;
235
+ }
236
+ /**
237
+ * Capture a screenshot via CDP Page.captureScreenshot.
238
+ */
239
+ async screenshot(options = {}) {
240
+ const base64 = await sendCommand('screenshot', {
241
+ ...this._cmdOpts(),
242
+ format: options.format,
243
+ quality: options.quality,
244
+ fullPage: options.fullPage,
245
+ width: options.width,
246
+ height: options.height,
247
+ });
248
+ if (options.path) {
249
+ await saveBase64ToFile(base64, options.path);
250
+ }
251
+ return base64;
252
+ }
253
+ async startNetworkCapture(pattern = '') {
254
+ if (this._networkCaptureUnsupported)
255
+ return false;
256
+ try {
257
+ await sendCommand('network-capture-start', {
258
+ pattern,
259
+ ...this._cmdOpts(),
260
+ });
261
+ return true;
262
+ }
263
+ catch (err) {
264
+ if (!isUnsupportedNetworkCaptureError(err))
265
+ throw err;
266
+ this._markUnsupportedNetworkCapture();
267
+ return false;
268
+ }
269
+ }
270
+ async readNetworkCapture() {
271
+ if (this._networkCaptureUnsupported)
272
+ return [];
273
+ try {
274
+ const result = await sendCommand('network-capture-read', {
275
+ ...this._cmdOpts(),
276
+ });
277
+ return Array.isArray(result) ? result : [];
278
+ }
279
+ catch (err) {
280
+ if (!isUnsupportedNetworkCaptureError(err))
281
+ throw err;
282
+ this._markUnsupportedNetworkCapture();
283
+ return [];
284
+ }
285
+ }
286
+ async waitForDownload(pattern = '', timeoutMs = 30_000) {
287
+ const result = await sendCommand('wait-download', {
288
+ pattern,
289
+ timeoutMs,
290
+ ...this._cmdOpts(),
291
+ });
292
+ return result;
293
+ }
294
+ /**
295
+ * Set local file paths on a file input element via CDP DOM.setFileInputFiles.
296
+ * Chrome reads the files directly from the local filesystem, avoiding the
297
+ * payload size limits of base64-in-evaluate.
298
+ */
299
+ async setFileInput(files, selector) {
300
+ const result = await sendCommand('set-file-input', {
301
+ files,
302
+ selector,
303
+ ...this._cmdOpts(),
304
+ });
305
+ if (!result?.count) {
306
+ throw new Error('setFileInput returned no count — command may not be supported by the extension');
307
+ }
308
+ }
309
+ async insertText(text) {
310
+ const result = await sendCommand('insert-text', {
311
+ text,
312
+ ...this._cmdOpts(),
313
+ });
314
+ if (!result?.inserted) {
315
+ throw new Error('insertText returned no inserted flag — command may not be supported by the extension');
316
+ }
317
+ }
318
+ async frames() {
319
+ const result = await sendCommand('frames', { ...this._cmdOpts() });
320
+ return Array.isArray(result) ? result : [];
321
+ }
322
+ async evaluateInFrame(js, frameIndex) {
323
+ const code = buildEvaluateExpression(js);
324
+ return sendCommand('exec', { code, frameIndex, ...this._cmdOpts() });
325
+ }
326
+ async cdp(method, params = {}) {
327
+ return sendCommand('cdp', {
328
+ cdpMethod: method,
329
+ cdpParams: params,
330
+ ...this._cmdOpts(),
331
+ });
332
+ }
333
+ async handleJavaScriptDialog(accept, promptText) {
334
+ await this.cdp('Page.handleJavaScriptDialog', {
335
+ accept,
336
+ ...(promptText !== undefined && { promptText }),
337
+ });
338
+ }
339
+ /** CDP native click fallback — called when JS el.click() fails */
340
+ async tryNativeClick(x, y) {
341
+ try {
342
+ await this.nativeClick(x, y);
343
+ return true;
344
+ }
345
+ catch {
346
+ return false;
347
+ }
348
+ }
349
+ /** Precise click using DOM.getContentQuads/getBoxModel for inline elements */
350
+ async clickWithQuads(ref) {
351
+ const safeRef = JSON.stringify(ref);
352
+ const cssSelector = `[data-webcmd-ref="${ref.replace(/"/g, '\\"')}"]`;
353
+ // Scroll element into view first
354
+ await this.evaluate(`
355
+ (() => {
356
+ const el = document.querySelector('[data-webcmd-ref="' + ${safeRef} + '"]');
357
+ if (el) el.scrollIntoView({ behavior: 'instant', block: 'center' });
358
+ return !!el;
359
+ })()
360
+ `);
361
+ try {
362
+ // Find DOM node via CDP
363
+ const doc = await this.cdp('DOM.getDocument', {});
364
+ const result = await this.cdp('DOM.querySelectorAll', {
365
+ nodeId: doc.root.nodeId,
366
+ selector: cssSelector,
367
+ });
368
+ if (!result.nodeIds?.length)
369
+ throw new Error('DOM node not found');
370
+ const nodeId = result.nodeIds[0];
371
+ // Try getContentQuads first (precise for inline elements)
372
+ try {
373
+ const quads = await this.cdp('DOM.getContentQuads', { nodeId });
374
+ if (quads.quads?.length) {
375
+ const q = quads.quads[0];
376
+ const cx = (q[0] + q[2] + q[4] + q[6]) / 4;
377
+ const cy = (q[1] + q[3] + q[5] + q[7]) / 4;
378
+ await this.nativeClick(Math.round(cx), Math.round(cy));
379
+ return;
380
+ }
381
+ }
382
+ catch { /* fallthrough */ }
383
+ // Try getBoxModel
384
+ try {
385
+ const box = await this.cdp('DOM.getBoxModel', { nodeId });
386
+ if (box.model?.content) {
387
+ const c = box.model.content;
388
+ const cx = (c[0] + c[2] + c[4] + c[6]) / 4;
389
+ const cy = (c[1] + c[3] + c[5] + c[7]) / 4;
390
+ await this.nativeClick(Math.round(cx), Math.round(cy));
391
+ return;
392
+ }
393
+ }
394
+ catch { /* fallthrough */ }
395
+ }
396
+ catch { /* fallthrough */ }
397
+ // Final fallback: regular click
398
+ await this.evaluate(`
399
+ (() => {
400
+ const el = document.querySelector('[data-webcmd-ref="' + ${safeRef} + '"]');
401
+ if (!el) throw new Error('Element not found: ' + ${safeRef});
402
+ el.click();
403
+ return 'clicked';
404
+ })()
405
+ `);
406
+ }
407
+ async nativeClick(x, y) {
408
+ await this.cdp('Input.dispatchMouseEvent', {
409
+ type: 'mouseMoved',
410
+ x,
411
+ y,
412
+ });
413
+ await this.cdp('Input.dispatchMouseEvent', {
414
+ type: 'mousePressed',
415
+ x, y,
416
+ button: 'left',
417
+ clickCount: 1,
418
+ });
419
+ await this.cdp('Input.dispatchMouseEvent', {
420
+ type: 'mouseReleased',
421
+ x, y,
422
+ button: 'left',
423
+ clickCount: 1,
424
+ });
425
+ }
426
+ async nativeType(text) {
427
+ // Use Input.insertText for reliable Unicode/CJK text insertion
428
+ await this.cdp('Input.insertText', { text });
429
+ }
430
+ async nativeKeyPress(key, modifiers = []) {
431
+ let modifierFlags = 0;
432
+ for (const mod of modifiers) {
433
+ if (mod === 'Alt')
434
+ modifierFlags |= 1;
435
+ if (mod === 'Ctrl' || mod === 'Control')
436
+ modifierFlags |= 2;
437
+ if (mod === 'Meta')
438
+ modifierFlags |= 4;
439
+ if (mod === 'Shift')
440
+ modifierFlags |= 8;
441
+ }
442
+ await this.cdp('Input.dispatchKeyEvent', {
443
+ type: 'keyDown',
444
+ key,
445
+ modifiers: modifierFlags,
446
+ });
447
+ await this.cdp('Input.dispatchKeyEvent', {
448
+ type: 'keyUp',
449
+ key,
450
+ modifiers: modifierFlags,
451
+ });
452
+ }
453
+ }
@@ -0,0 +1 @@
1
+ export {};