agent-web-interface 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/src/browser/ensure-browser.d.ts +39 -0
  4. package/dist/src/browser/ensure-browser.d.ts.map +1 -0
  5. package/dist/src/browser/ensure-browser.js +65 -0
  6. package/dist/src/browser/ensure-browser.js.map +1 -0
  7. package/dist/src/browser/index.d.ts +8 -0
  8. package/dist/src/browser/index.d.ts.map +1 -0
  9. package/dist/src/browser/index.js +8 -0
  10. package/dist/src/browser/index.js.map +1 -0
  11. package/dist/src/browser/page-network-tracker.d.ts +96 -0
  12. package/dist/src/browser/page-network-tracker.d.ts.map +1 -0
  13. package/dist/src/browser/page-network-tracker.js +235 -0
  14. package/dist/src/browser/page-network-tracker.js.map +1 -0
  15. package/dist/src/browser/page-registry.d.ts +137 -0
  16. package/dist/src/browser/page-registry.d.ts.map +1 -0
  17. package/dist/src/browser/page-registry.js +194 -0
  18. package/dist/src/browser/page-registry.js.map +1 -0
  19. package/dist/src/browser/page-stabilization.d.ts +35 -0
  20. package/dist/src/browser/page-stabilization.d.ts.map +1 -0
  21. package/dist/src/browser/page-stabilization.js +42 -0
  22. package/dist/src/browser/page-stabilization.js.map +1 -0
  23. package/dist/src/browser/session-manager.d.ts +336 -0
  24. package/dist/src/browser/session-manager.d.ts.map +1 -0
  25. package/dist/src/browser/session-manager.js +964 -0
  26. package/dist/src/browser/session-manager.js.map +1 -0
  27. package/dist/src/cdp/cdp-client.interface.d.ts +193 -0
  28. package/dist/src/cdp/cdp-client.interface.d.ts.map +1 -0
  29. package/dist/src/cdp/cdp-client.interface.js +9 -0
  30. package/dist/src/cdp/cdp-client.interface.js.map +1 -0
  31. package/dist/src/cdp/index.d.ts +9 -0
  32. package/dist/src/cdp/index.d.ts.map +1 -0
  33. package/dist/src/cdp/index.js +8 -0
  34. package/dist/src/cdp/index.js.map +1 -0
  35. package/dist/src/cdp/puppeteer-cdp-client.d.ts +97 -0
  36. package/dist/src/cdp/puppeteer-cdp-client.d.ts.map +1 -0
  37. package/dist/src/cdp/puppeteer-cdp-client.js +273 -0
  38. package/dist/src/cdp/puppeteer-cdp-client.js.map +1 -0
  39. package/dist/src/cli/args.d.ts +35 -0
  40. package/dist/src/cli/args.d.ts.map +1 -0
  41. package/dist/src/cli/args.js +76 -0
  42. package/dist/src/cli/args.js.map +1 -0
  43. package/dist/src/delta/dom-stabilizer.d.ts +46 -0
  44. package/dist/src/delta/dom-stabilizer.d.ts.map +1 -0
  45. package/dist/src/delta/dom-stabilizer.js +121 -0
  46. package/dist/src/delta/dom-stabilizer.js.map +1 -0
  47. package/dist/src/delta/index.d.ts +8 -0
  48. package/dist/src/delta/index.d.ts.map +1 -0
  49. package/dist/src/delta/index.js +7 -0
  50. package/dist/src/delta/index.js.map +1 -0
  51. package/dist/src/factpack/action-selector.d.ts +36 -0
  52. package/dist/src/factpack/action-selector.d.ts.map +1 -0
  53. package/dist/src/factpack/action-selector.js +367 -0
  54. package/dist/src/factpack/action-selector.js.map +1 -0
  55. package/dist/src/factpack/dialog-detector.d.ts +19 -0
  56. package/dist/src/factpack/dialog-detector.d.ts.map +1 -0
  57. package/dist/src/factpack/dialog-detector.js +354 -0
  58. package/dist/src/factpack/dialog-detector.js.map +1 -0
  59. package/dist/src/factpack/form-detector.d.ts +28 -0
  60. package/dist/src/factpack/form-detector.d.ts.map +1 -0
  61. package/dist/src/factpack/form-detector.js +555 -0
  62. package/dist/src/factpack/form-detector.js.map +1 -0
  63. package/dist/src/factpack/index.d.ts +32 -0
  64. package/dist/src/factpack/index.d.ts.map +1 -0
  65. package/dist/src/factpack/index.js +73 -0
  66. package/dist/src/factpack/index.js.map +1 -0
  67. package/dist/src/factpack/page-classifier.d.ts +22 -0
  68. package/dist/src/factpack/page-classifier.d.ts.map +1 -0
  69. package/dist/src/factpack/page-classifier.js +526 -0
  70. package/dist/src/factpack/page-classifier.js.map +1 -0
  71. package/dist/src/factpack/types.d.ts +307 -0
  72. package/dist/src/factpack/types.d.ts.map +1 -0
  73. package/dist/src/factpack/types.js +12 -0
  74. package/dist/src/factpack/types.js.map +1 -0
  75. package/dist/src/form/dependency-tracker.d.ts +108 -0
  76. package/dist/src/form/dependency-tracker.d.ts.map +1 -0
  77. package/dist/src/form/dependency-tracker.js +298 -0
  78. package/dist/src/form/dependency-tracker.js.map +1 -0
  79. package/dist/src/form/field-extractor.d.ts +32 -0
  80. package/dist/src/form/field-extractor.d.ts.map +1 -0
  81. package/dist/src/form/field-extractor.js +544 -0
  82. package/dist/src/form/field-extractor.js.map +1 -0
  83. package/dist/src/form/form-detector.d.ts +103 -0
  84. package/dist/src/form/form-detector.d.ts.map +1 -0
  85. package/dist/src/form/form-detector.js +704 -0
  86. package/dist/src/form/form-detector.js.map +1 -0
  87. package/dist/src/form/form-state.d.ts +23 -0
  88. package/dist/src/form/form-state.d.ts.map +1 -0
  89. package/dist/src/form/form-state.js +39 -0
  90. package/dist/src/form/form-state.js.map +1 -0
  91. package/dist/src/form/index.d.ts +23 -0
  92. package/dist/src/form/index.d.ts.map +1 -0
  93. package/dist/src/form/index.js +27 -0
  94. package/dist/src/form/index.js.map +1 -0
  95. package/dist/src/form/runtime-value-reader.d.ts +72 -0
  96. package/dist/src/form/runtime-value-reader.d.ts.map +1 -0
  97. package/dist/src/form/runtime-value-reader.js +232 -0
  98. package/dist/src/form/runtime-value-reader.js.map +1 -0
  99. package/dist/src/form/types.d.ts +384 -0
  100. package/dist/src/form/types.d.ts.map +1 -0
  101. package/dist/src/form/types.js +17 -0
  102. package/dist/src/form/types.js.map +1 -0
  103. package/dist/src/index.d.ts +8 -0
  104. package/dist/src/index.d.ts.map +1 -0
  105. package/dist/src/index.js +212 -0
  106. package/dist/src/index.js.map +1 -0
  107. package/dist/src/lib/constants.d.ts +27 -0
  108. package/dist/src/lib/constants.d.ts.map +1 -0
  109. package/dist/src/lib/constants.js +63 -0
  110. package/dist/src/lib/constants.js.map +1 -0
  111. package/dist/src/lib/index.d.ts +12 -0
  112. package/dist/src/lib/index.d.ts.map +1 -0
  113. package/dist/src/lib/index.js +17 -0
  114. package/dist/src/lib/index.js.map +1 -0
  115. package/dist/src/lib/regions.d.ts +29 -0
  116. package/dist/src/lib/regions.d.ts.map +1 -0
  117. package/dist/src/lib/regions.js +93 -0
  118. package/dist/src/lib/regions.js.map +1 -0
  119. package/dist/src/lib/scoring.d.ts +47 -0
  120. package/dist/src/lib/scoring.d.ts.map +1 -0
  121. package/dist/src/lib/scoring.js +79 -0
  122. package/dist/src/lib/scoring.js.map +1 -0
  123. package/dist/src/lib/selectors.d.ts +42 -0
  124. package/dist/src/lib/selectors.d.ts.map +1 -0
  125. package/dist/src/lib/selectors.js +138 -0
  126. package/dist/src/lib/selectors.js.map +1 -0
  127. package/dist/src/lib/text-utils.d.ts +155 -0
  128. package/dist/src/lib/text-utils.d.ts.map +1 -0
  129. package/dist/src/lib/text-utils.js +391 -0
  130. package/dist/src/lib/text-utils.js.map +1 -0
  131. package/dist/src/observation/eid-linker.d.ts +104 -0
  132. package/dist/src/observation/eid-linker.d.ts.map +1 -0
  133. package/dist/src/observation/eid-linker.js +403 -0
  134. package/dist/src/observation/eid-linker.js.map +1 -0
  135. package/dist/src/observation/index.d.ts +12 -0
  136. package/dist/src/observation/index.d.ts.map +1 -0
  137. package/dist/src/observation/index.js +15 -0
  138. package/dist/src/observation/index.js.map +1 -0
  139. package/dist/src/observation/observation-accumulator.d.ts +58 -0
  140. package/dist/src/observation/observation-accumulator.d.ts.map +1 -0
  141. package/dist/src/observation/observation-accumulator.js +213 -0
  142. package/dist/src/observation/observation-accumulator.js.map +1 -0
  143. package/dist/src/observation/observation.types.d.ts +139 -0
  144. package/dist/src/observation/observation.types.d.ts.map +1 -0
  145. package/dist/src/observation/observation.types.js +59 -0
  146. package/dist/src/observation/observation.types.js.map +1 -0
  147. package/dist/src/observation/observer-script.d.ts +19 -0
  148. package/dist/src/observation/observer-script.d.ts.map +1 -0
  149. package/dist/src/observation/observer-script.js +569 -0
  150. package/dist/src/observation/observer-script.js.map +1 -0
  151. package/dist/src/query/index.d.ts +9 -0
  152. package/dist/src/query/index.d.ts.map +1 -0
  153. package/dist/src/query/index.js +10 -0
  154. package/dist/src/query/index.js.map +1 -0
  155. package/dist/src/query/query-engine.d.ts +111 -0
  156. package/dist/src/query/query-engine.d.ts.map +1 -0
  157. package/dist/src/query/query-engine.js +509 -0
  158. package/dist/src/query/query-engine.js.map +1 -0
  159. package/dist/src/query/types/index.d.ts +5 -0
  160. package/dist/src/query/types/index.d.ts.map +1 -0
  161. package/dist/src/query/types/index.js +5 -0
  162. package/dist/src/query/types/index.js.map +1 -0
  163. package/dist/src/query/types/query.types.d.ts +141 -0
  164. package/dist/src/query/types/query.types.d.ts.map +1 -0
  165. package/dist/src/query/types/query.types.js +19 -0
  166. package/dist/src/query/types/query.types.js.map +1 -0
  167. package/dist/src/renderer/budget-manager.d.ts +46 -0
  168. package/dist/src/renderer/budget-manager.d.ts.map +1 -0
  169. package/dist/src/renderer/budget-manager.js +133 -0
  170. package/dist/src/renderer/budget-manager.js.map +1 -0
  171. package/dist/src/renderer/constants.d.ts +38 -0
  172. package/dist/src/renderer/constants.d.ts.map +1 -0
  173. package/dist/src/renderer/constants.js +29 -0
  174. package/dist/src/renderer/constants.js.map +1 -0
  175. package/dist/src/renderer/index.d.ts +12 -0
  176. package/dist/src/renderer/index.d.ts.map +1 -0
  177. package/dist/src/renderer/index.js +16 -0
  178. package/dist/src/renderer/index.js.map +1 -0
  179. package/dist/src/renderer/section-renderers.d.ts +42 -0
  180. package/dist/src/renderer/section-renderers.d.ts.map +1 -0
  181. package/dist/src/renderer/section-renderers.js +252 -0
  182. package/dist/src/renderer/section-renderers.js.map +1 -0
  183. package/dist/src/renderer/token-counter.d.ts +45 -0
  184. package/dist/src/renderer/token-counter.d.ts.map +1 -0
  185. package/dist/src/renderer/token-counter.js +65 -0
  186. package/dist/src/renderer/token-counter.js.map +1 -0
  187. package/dist/src/renderer/types.d.ts +71 -0
  188. package/dist/src/renderer/types.d.ts.map +1 -0
  189. package/dist/src/renderer/types.js +7 -0
  190. package/dist/src/renderer/types.js.map +1 -0
  191. package/dist/src/renderer/xml-renderer.d.ts +42 -0
  192. package/dist/src/renderer/xml-renderer.d.ts.map +1 -0
  193. package/dist/src/renderer/xml-renderer.js +103 -0
  194. package/dist/src/renderer/xml-renderer.js.map +1 -0
  195. package/dist/src/server/index.d.ts +8 -0
  196. package/dist/src/server/index.d.ts.map +1 -0
  197. package/dist/src/server/index.js +8 -0
  198. package/dist/src/server/index.js.map +1 -0
  199. package/dist/src/server/mcp-server.d.ts +59 -0
  200. package/dist/src/server/mcp-server.d.ts.map +1 -0
  201. package/dist/src/server/mcp-server.js +140 -0
  202. package/dist/src/server/mcp-server.js.map +1 -0
  203. package/dist/src/server/server-config.d.ts +41 -0
  204. package/dist/src/server/server-config.d.ts.map +1 -0
  205. package/dist/src/server/server-config.js +80 -0
  206. package/dist/src/server/server-config.js.map +1 -0
  207. package/dist/src/server/session-store.d.ts +148 -0
  208. package/dist/src/server/session-store.d.ts.map +1 -0
  209. package/dist/src/server/session-store.js +224 -0
  210. package/dist/src/server/session-store.js.map +1 -0
  211. package/dist/src/shared/errors/browser-session.error.d.ts +102 -0
  212. package/dist/src/shared/errors/browser-session.error.d.ts.map +1 -0
  213. package/dist/src/shared/errors/browser-session.error.js +153 -0
  214. package/dist/src/shared/errors/browser-session.error.js.map +1 -0
  215. package/dist/src/shared/errors/index.d.ts +5 -0
  216. package/dist/src/shared/errors/index.d.ts.map +1 -0
  217. package/dist/src/shared/errors/index.js +5 -0
  218. package/dist/src/shared/errors/index.js.map +1 -0
  219. package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
  220. package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
  221. package/dist/src/shared/services/dom-transformer.service.js +190 -0
  222. package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
  223. package/dist/src/shared/services/index.d.ts +7 -0
  224. package/dist/src/shared/services/index.d.ts.map +1 -0
  225. package/dist/src/shared/services/index.js +7 -0
  226. package/dist/src/shared/services/index.js.map +1 -0
  227. package/dist/src/shared/services/logging.service.d.ts +154 -0
  228. package/dist/src/shared/services/logging.service.d.ts.map +1 -0
  229. package/dist/src/shared/services/logging.service.js +267 -0
  230. package/dist/src/shared/services/logging.service.js.map +1 -0
  231. package/dist/src/shared/services/selector-builder.service.d.ts +53 -0
  232. package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
  233. package/dist/src/shared/services/selector-builder.service.js +240 -0
  234. package/dist/src/shared/services/selector-builder.service.js.map +1 -0
  235. package/dist/src/shared/types/base.types.d.ts +45 -0
  236. package/dist/src/shared/types/base.types.d.ts.map +1 -0
  237. package/dist/src/shared/types/base.types.js +8 -0
  238. package/dist/src/shared/types/base.types.js.map +1 -0
  239. package/dist/src/shared/types/index.d.ts +5 -0
  240. package/dist/src/shared/types/index.d.ts.map +1 -0
  241. package/dist/src/shared/types/index.js +5 -0
  242. package/dist/src/shared/types/index.js.map +1 -0
  243. package/dist/src/snapshot/element-resolver.d.ts +102 -0
  244. package/dist/src/snapshot/element-resolver.d.ts.map +1 -0
  245. package/dist/src/snapshot/element-resolver.js +379 -0
  246. package/dist/src/snapshot/element-resolver.js.map +1 -0
  247. package/dist/src/snapshot/extractors/attribute-extractor.d.ts +40 -0
  248. package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -0
  249. package/dist/src/snapshot/extractors/attribute-extractor.js +237 -0
  250. package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -0
  251. package/dist/src/snapshot/extractors/ax-extractor.d.ts +36 -0
  252. package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -0
  253. package/dist/src/snapshot/extractors/ax-extractor.js +144 -0
  254. package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -0
  255. package/dist/src/snapshot/extractors/dom-extractor.d.ts +21 -0
  256. package/dist/src/snapshot/extractors/dom-extractor.d.ts.map +1 -0
  257. package/dist/src/snapshot/extractors/dom-extractor.js +137 -0
  258. package/dist/src/snapshot/extractors/dom-extractor.js.map +1 -0
  259. package/dist/src/snapshot/extractors/grouping-resolver.d.ts +39 -0
  260. package/dist/src/snapshot/extractors/grouping-resolver.d.ts.map +1 -0
  261. package/dist/src/snapshot/extractors/grouping-resolver.js +260 -0
  262. package/dist/src/snapshot/extractors/grouping-resolver.js.map +1 -0
  263. package/dist/src/snapshot/extractors/index.d.ts +19 -0
  264. package/dist/src/snapshot/extractors/index.d.ts.map +1 -0
  265. package/dist/src/snapshot/extractors/index.js +27 -0
  266. package/dist/src/snapshot/extractors/index.js.map +1 -0
  267. package/dist/src/snapshot/extractors/label-resolver.d.ts +44 -0
  268. package/dist/src/snapshot/extractors/label-resolver.d.ts.map +1 -0
  269. package/dist/src/snapshot/extractors/label-resolver.js +173 -0
  270. package/dist/src/snapshot/extractors/label-resolver.js.map +1 -0
  271. package/dist/src/snapshot/extractors/layout-extractor.d.ts +52 -0
  272. package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -0
  273. package/dist/src/snapshot/extractors/layout-extractor.js +382 -0
  274. package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -0
  275. package/dist/src/snapshot/extractors/locator-builder.d.ts +27 -0
  276. package/dist/src/snapshot/extractors/locator-builder.d.ts.map +1 -0
  277. package/dist/src/snapshot/extractors/locator-builder.js +223 -0
  278. package/dist/src/snapshot/extractors/locator-builder.js.map +1 -0
  279. package/dist/src/snapshot/extractors/region-resolver.d.ts +31 -0
  280. package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -0
  281. package/dist/src/snapshot/extractors/region-resolver.js +168 -0
  282. package/dist/src/snapshot/extractors/region-resolver.js.map +1 -0
  283. package/dist/src/snapshot/extractors/state-extractor.d.ts +30 -0
  284. package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -0
  285. package/dist/src/snapshot/extractors/state-extractor.js +181 -0
  286. package/dist/src/snapshot/extractors/state-extractor.js.map +1 -0
  287. package/dist/src/snapshot/extractors/types.d.ts +213 -0
  288. package/dist/src/snapshot/extractors/types.d.ts.map +1 -0
  289. package/dist/src/snapshot/extractors/types.js +145 -0
  290. package/dist/src/snapshot/extractors/types.js.map +1 -0
  291. package/dist/src/snapshot/index.d.ts +14 -0
  292. package/dist/src/snapshot/index.d.ts.map +1 -0
  293. package/dist/src/snapshot/index.js +18 -0
  294. package/dist/src/snapshot/index.js.map +1 -0
  295. package/dist/src/snapshot/snapshot-compiler.d.ts +73 -0
  296. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -0
  297. package/dist/src/snapshot/snapshot-compiler.js +763 -0
  298. package/dist/src/snapshot/snapshot-compiler.js.map +1 -0
  299. package/dist/src/snapshot/snapshot-health.d.ts +97 -0
  300. package/dist/src/snapshot/snapshot-health.d.ts.map +1 -0
  301. package/dist/src/snapshot/snapshot-health.js +214 -0
  302. package/dist/src/snapshot/snapshot-health.js.map +1 -0
  303. package/dist/src/snapshot/snapshot-store.d.ts +137 -0
  304. package/dist/src/snapshot/snapshot-store.d.ts.map +1 -0
  305. package/dist/src/snapshot/snapshot-store.js +202 -0
  306. package/dist/src/snapshot/snapshot-store.js.map +1 -0
  307. package/dist/src/snapshot/snapshot.types.d.ts +250 -0
  308. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -0
  309. package/dist/src/snapshot/snapshot.types.js +54 -0
  310. package/dist/src/snapshot/snapshot.types.js.map +1 -0
  311. package/dist/src/state/actionables-filter.d.ts +47 -0
  312. package/dist/src/state/actionables-filter.d.ts.map +1 -0
  313. package/dist/src/state/actionables-filter.js +173 -0
  314. package/dist/src/state/actionables-filter.js.map +1 -0
  315. package/dist/src/state/atoms-extractor.d.ts +23 -0
  316. package/dist/src/state/atoms-extractor.d.ts.map +1 -0
  317. package/dist/src/state/atoms-extractor.js +160 -0
  318. package/dist/src/state/atoms-extractor.js.map +1 -0
  319. package/dist/src/state/constants.d.ts +125 -0
  320. package/dist/src/state/constants.d.ts.map +1 -0
  321. package/dist/src/state/constants.js +131 -0
  322. package/dist/src/state/constants.js.map +1 -0
  323. package/dist/src/state/diff-engine.d.ts +23 -0
  324. package/dist/src/state/diff-engine.d.ts.map +1 -0
  325. package/dist/src/state/diff-engine.js +475 -0
  326. package/dist/src/state/diff-engine.js.map +1 -0
  327. package/dist/src/state/element-identity.d.ts +75 -0
  328. package/dist/src/state/element-identity.d.ts.map +1 -0
  329. package/dist/src/state/element-identity.js +129 -0
  330. package/dist/src/state/element-identity.js.map +1 -0
  331. package/dist/src/state/element-ref.types.d.ts +135 -0
  332. package/dist/src/state/element-ref.types.d.ts.map +1 -0
  333. package/dist/src/state/element-ref.types.js +13 -0
  334. package/dist/src/state/element-ref.types.js.map +1 -0
  335. package/dist/src/state/element-registry.d.ts +118 -0
  336. package/dist/src/state/element-registry.d.ts.map +1 -0
  337. package/dist/src/state/element-registry.js +222 -0
  338. package/dist/src/state/element-registry.js.map +1 -0
  339. package/dist/src/state/health.types.d.ts +93 -0
  340. package/dist/src/state/health.types.d.ts.map +1 -0
  341. package/dist/src/state/health.types.js +56 -0
  342. package/dist/src/state/health.types.js.map +1 -0
  343. package/dist/src/state/layer-detector.d.ts +23 -0
  344. package/dist/src/state/layer-detector.d.ts.map +1 -0
  345. package/dist/src/state/layer-detector.js +368 -0
  346. package/dist/src/state/layer-detector.js.map +1 -0
  347. package/dist/src/state/locator-generator.d.ts +21 -0
  348. package/dist/src/state/locator-generator.d.ts.map +1 -0
  349. package/dist/src/state/locator-generator.js +137 -0
  350. package/dist/src/state/locator-generator.js.map +1 -0
  351. package/dist/src/state/state-manager.d.ts +104 -0
  352. package/dist/src/state/state-manager.d.ts.map +1 -0
  353. package/dist/src/state/state-manager.js +618 -0
  354. package/dist/src/state/state-manager.js.map +1 -0
  355. package/dist/src/state/state-renderer.d.ts +63 -0
  356. package/dist/src/state/state-renderer.d.ts.map +1 -0
  357. package/dist/src/state/state-renderer.js +340 -0
  358. package/dist/src/state/state-renderer.js.map +1 -0
  359. package/dist/src/state/types.d.ts +353 -0
  360. package/dist/src/state/types.d.ts.map +1 -0
  361. package/dist/src/state/types.js +8 -0
  362. package/dist/src/state/types.js.map +1 -0
  363. package/dist/src/tools/browser-tools.d.ts +140 -0
  364. package/dist/src/tools/browser-tools.d.ts.map +1 -0
  365. package/dist/src/tools/browser-tools.js +657 -0
  366. package/dist/src/tools/browser-tools.js.map +1 -0
  367. package/dist/src/tools/errors.d.ts +63 -0
  368. package/dist/src/tools/errors.d.ts.map +1 -0
  369. package/dist/src/tools/errors.js +86 -0
  370. package/dist/src/tools/errors.js.map +1 -0
  371. package/dist/src/tools/execute-action.d.ts +135 -0
  372. package/dist/src/tools/execute-action.d.ts.map +1 -0
  373. package/dist/src/tools/execute-action.js +579 -0
  374. package/dist/src/tools/execute-action.js.map +1 -0
  375. package/dist/src/tools/form-tools.d.ts +109 -0
  376. package/dist/src/tools/form-tools.d.ts.map +1 -0
  377. package/dist/src/tools/form-tools.js +434 -0
  378. package/dist/src/tools/form-tools.js.map +1 -0
  379. package/dist/src/tools/index.d.ts +11 -0
  380. package/dist/src/tools/index.d.ts.map +1 -0
  381. package/dist/src/tools/index.js +49 -0
  382. package/dist/src/tools/index.js.map +1 -0
  383. package/dist/src/tools/response-builder.d.ts +98 -0
  384. package/dist/src/tools/response-builder.d.ts.map +1 -0
  385. package/dist/src/tools/response-builder.js +219 -0
  386. package/dist/src/tools/response-builder.js.map +1 -0
  387. package/dist/src/tools/tool-schemas.d.ts +2482 -0
  388. package/dist/src/tools/tool-schemas.d.ts.map +1 -0
  389. package/dist/src/tools/tool-schemas.js +606 -0
  390. package/dist/src/tools/tool-schemas.js.map +1 -0
  391. package/dist/vitest.config.d.ts +3 -0
  392. package/dist/vitest.config.d.ts.map +1 -0
  393. package/dist/vitest.config.js +16 -0
  394. package/dist/vitest.config.js.map +1 -0
  395. package/package.json +76 -0
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Page Network Tracker
3
+ *
4
+ * Tracks in-flight network requests for a page and provides a reliable
5
+ * "network quiet" wait mechanism. Unlike Puppeteer's waitForNetworkIdle(),
6
+ * this tracks requests triggered after page load (e.g., by user actions).
7
+ *
8
+ * Uses a generation counter to safely handle navigation - late events from
9
+ * previous documents are ignored.
10
+ */
11
+ /** Default quiet window - time with 0 inflight requests to consider "idle" */
12
+ const DEFAULT_QUIET_WINDOW_MS = 500;
13
+ /**
14
+ * Tracks network requests for a single page.
15
+ *
16
+ * Attach to a page via `attach()`, then use `waitForQuiet()` to wait for
17
+ * network activity to settle. Call `markNavigation()` when navigating to
18
+ * safely reset state without race conditions.
19
+ */
20
+ export class PageNetworkTracker {
21
+ page = null;
22
+ inflightCount = 0;
23
+ generation = 0;
24
+ currentGeneration = 0;
25
+ // Quiet window state
26
+ quietTimer = null;
27
+ quietWindowMs = DEFAULT_QUIET_WINDOW_MS;
28
+ quietResolvers = [];
29
+ // Event handlers (stored for cleanup via page.off())
30
+ onRequest = null;
31
+ onRequestFinished = null;
32
+ onRequestFailed = null;
33
+ /**
34
+ * Attach network event listeners to a page.
35
+ *
36
+ * Must be called before `waitForQuiet()` can be used.
37
+ * Safe to call multiple times - will detach previous listeners first.
38
+ */
39
+ attach(page) {
40
+ if (this.page) {
41
+ this.detach();
42
+ }
43
+ this.page = page;
44
+ this.generation++;
45
+ this.currentGeneration = this.generation;
46
+ this.inflightCount = 0;
47
+ this.createAndAttachHandlers(page);
48
+ }
49
+ /**
50
+ * Detach all event listeners and cleanup timers.
51
+ *
52
+ * Call this when the page is closed or no longer needs tracking.
53
+ */
54
+ detach() {
55
+ if (this.page) {
56
+ this.removeHandlers(this.page);
57
+ }
58
+ this.onRequest = null;
59
+ this.onRequestFinished = null;
60
+ this.onRequestFailed = null;
61
+ this.page = null;
62
+ this.cancelQuietTimer();
63
+ for (const { resolve, timeoutId } of this.quietResolvers) {
64
+ clearTimeout(timeoutId);
65
+ resolve(false);
66
+ }
67
+ this.quietResolvers = [];
68
+ }
69
+ /**
70
+ * Mark that a navigation occurred.
71
+ *
72
+ * This safely resets state by bumping the generation counter, so any
73
+ * late events from the previous document are ignored. Use this instead
74
+ * of directly resetting state to avoid race conditions.
75
+ */
76
+ markNavigation() {
77
+ this.generation++;
78
+ this.currentGeneration = this.generation;
79
+ this.inflightCount = 0;
80
+ this.cancelQuietTimer();
81
+ if (this.page) {
82
+ this.removeHandlers(this.page);
83
+ this.createAndAttachHandlers(this.page);
84
+ }
85
+ }
86
+ /**
87
+ * Wait for network to become quiet (no inflight requests for quietWindowMs).
88
+ *
89
+ * @param timeoutMs - Maximum time to wait before returning false
90
+ * @param quietWindowMs - Time with 0 inflight requests to consider "idle"
91
+ * @returns true if network became quiet, false if timed out (never throws)
92
+ */
93
+ async waitForQuiet(timeoutMs, quietWindowMs = DEFAULT_QUIET_WINDOW_MS) {
94
+ // Store the quiet window for checkQuiet() to use
95
+ this.quietWindowMs = quietWindowMs;
96
+ return new Promise((resolve) => {
97
+ const hardTimeout = setTimeout(() => {
98
+ // Remove this resolver from the list
99
+ const index = this.quietResolvers.findIndex((r) => r.timeoutId === hardTimeout);
100
+ if (index !== -1) {
101
+ this.quietResolvers.splice(index, 1);
102
+ }
103
+ resolve(false);
104
+ }, timeoutMs);
105
+ this.quietResolvers.push({ resolve, timeoutId: hardTimeout });
106
+ // If already idle, start quiet timer immediately
107
+ if (this.inflightCount === 0) {
108
+ this.startQuietTimer();
109
+ }
110
+ });
111
+ }
112
+ /**
113
+ * Get current inflight request count (for debugging/testing).
114
+ */
115
+ getInflightCount() {
116
+ return this.inflightCount;
117
+ }
118
+ /**
119
+ * Check if tracker is attached to a page.
120
+ */
121
+ isAttached() {
122
+ return this.page !== null;
123
+ }
124
+ // --- Private methods ---
125
+ cancelQuietTimer() {
126
+ if (this.quietTimer) {
127
+ clearTimeout(this.quietTimer);
128
+ this.quietTimer = null;
129
+ }
130
+ }
131
+ checkQuiet() {
132
+ if (this.inflightCount === 0 && this.quietResolvers.length > 0) {
133
+ this.startQuietTimer();
134
+ }
135
+ }
136
+ startQuietTimer() {
137
+ this.cancelQuietTimer();
138
+ this.quietTimer = setTimeout(() => {
139
+ this.quietTimer = null;
140
+ for (const { resolve, timeoutId } of this.quietResolvers) {
141
+ clearTimeout(timeoutId);
142
+ resolve(true);
143
+ }
144
+ this.quietResolvers = [];
145
+ }, this.quietWindowMs);
146
+ }
147
+ /**
148
+ * Create and attach event handlers for the current generation.
149
+ */
150
+ createAndAttachHandlers(page) {
151
+ const gen = this.currentGeneration;
152
+ this.onRequest = (req) => {
153
+ if (this.currentGeneration !== gen)
154
+ return;
155
+ if (req.resourceType() === 'websocket')
156
+ return;
157
+ this.inflightCount++;
158
+ this.cancelQuietTimer();
159
+ };
160
+ this.onRequestFinished = (req) => {
161
+ if (this.currentGeneration !== gen)
162
+ return;
163
+ if (req.resourceType() === 'websocket')
164
+ return;
165
+ this.inflightCount = Math.max(0, this.inflightCount - 1);
166
+ this.checkQuiet();
167
+ };
168
+ this.onRequestFailed = (req) => {
169
+ if (this.currentGeneration !== gen)
170
+ return;
171
+ if (req.resourceType() === 'websocket')
172
+ return;
173
+ this.inflightCount = Math.max(0, this.inflightCount - 1);
174
+ this.checkQuiet();
175
+ };
176
+ page.on('request', this.onRequest);
177
+ page.on('requestfinished', this.onRequestFinished);
178
+ page.on('requestfailed', this.onRequestFailed);
179
+ }
180
+ /**
181
+ * Remove event handlers from a page.
182
+ */
183
+ removeHandlers(page) {
184
+ if (this.onRequest) {
185
+ page.off('request', this.onRequest);
186
+ }
187
+ if (this.onRequestFinished) {
188
+ page.off('requestfinished', this.onRequestFinished);
189
+ }
190
+ if (this.onRequestFailed) {
191
+ page.off('requestfailed', this.onRequestFailed);
192
+ }
193
+ }
194
+ }
195
+ // --- Global Registry ---
196
+ /**
197
+ * WeakMap registry for page-scoped trackers.
198
+ *
199
+ * Using WeakMap keyed by Page object provides automatic cleanup when
200
+ * the Page is garbage collected, avoiding memory leaks.
201
+ */
202
+ const trackers = new WeakMap();
203
+ /**
204
+ * Get or create a network tracker for a page.
205
+ *
206
+ * Note: This does NOT automatically attach the tracker.
207
+ * Call `tracker.attach(page)` after getting the tracker.
208
+ */
209
+ export function getOrCreateTracker(page) {
210
+ let tracker = trackers.get(page);
211
+ if (!tracker) {
212
+ tracker = new PageNetworkTracker();
213
+ trackers.set(page, tracker);
214
+ }
215
+ return tracker;
216
+ }
217
+ /**
218
+ * Remove and detach the tracker for a page.
219
+ *
220
+ * Call this when a page is closed to ensure proper cleanup.
221
+ */
222
+ export function removeTracker(page) {
223
+ const tracker = trackers.get(page);
224
+ if (tracker) {
225
+ tracker.detach();
226
+ trackers.delete(page);
227
+ }
228
+ }
229
+ /**
230
+ * Check if a page has a tracker attached.
231
+ */
232
+ export function hasTracker(page) {
233
+ return trackers.has(page);
234
+ }
235
+ //# sourceMappingURL=page-network-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-network-tracker.js","sourceRoot":"","sources":["../../../src/browser/page-network-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Page Registry
3
+ *
4
+ * Tracks active Puppeteer pages and their CDP sessions.
5
+ * Provides a central registry for page lifecycle management.
6
+ */
7
+ import type { Page } from 'puppeteer-core';
8
+ import type { CdpClient } from '../cdp/cdp-client.interface.js';
9
+ /**
10
+ * Handle to a registered page with its CDP session
11
+ */
12
+ export interface PageHandle {
13
+ /** Unique identifier for this page */
14
+ page_id: string;
15
+ /** Puppeteer Page instance */
16
+ page: Page;
17
+ /** CDP client for this page */
18
+ cdp: CdpClient;
19
+ /** When the page was registered */
20
+ created_at: Date;
21
+ /** Current URL (may be stale) */
22
+ url?: string;
23
+ /** Page title (may be stale) */
24
+ title?: string;
25
+ }
26
+ /**
27
+ * Registry for tracking active pages
28
+ */
29
+ export declare class PageRegistry {
30
+ private readonly pages;
31
+ /** Most recently used page ID for default resolution */
32
+ private mruPageId;
33
+ /**
34
+ * Register a new page with its CDP session
35
+ *
36
+ * @param page - Puppeteer Page instance
37
+ * @param cdp - CDP client for the page
38
+ * @returns PageHandle with unique page_id
39
+ * @throws Error if page is already closed
40
+ */
41
+ register(page: Page, cdp: CdpClient): PageHandle;
42
+ /**
43
+ * Get a page handle by its ID
44
+ *
45
+ * @param page_id - The page identifier
46
+ * @returns PageHandle if found, undefined otherwise
47
+ */
48
+ get(page_id: string): PageHandle | undefined;
49
+ /**
50
+ * Remove a page from the registry
51
+ *
52
+ * @param page_id - The page identifier
53
+ * @returns true if page was removed, false if not found
54
+ */
55
+ remove(page_id: string): boolean;
56
+ /**
57
+ * List all registered pages
58
+ *
59
+ * @returns Array of all PageHandle objects
60
+ */
61
+ list(): PageHandle[];
62
+ /**
63
+ * Remove all pages from the registry
64
+ */
65
+ clear(): void;
66
+ /**
67
+ * Get the number of registered pages
68
+ *
69
+ * @returns Current page count
70
+ */
71
+ size(): number;
72
+ /**
73
+ * Check if a page is registered
74
+ *
75
+ * @param page_id - The page identifier
76
+ * @returns true if page exists
77
+ */
78
+ has(page_id: string): boolean;
79
+ /**
80
+ * Replace a page handle in the registry.
81
+ *
82
+ * Used for CDP session rebinding - keeps the same page_id but
83
+ * updates the handle with a new CDP session.
84
+ *
85
+ * @param page_id - Page ID to replace
86
+ * @param handle - New handle to store
87
+ * @returns true if replaced, false if page_id not found
88
+ */
89
+ replace(page_id: string, handle: PageHandle): boolean;
90
+ /**
91
+ * Update metadata for a page
92
+ *
93
+ * @param page_id - The page identifier
94
+ * @param metadata - Partial metadata to update
95
+ * @returns true if updated, false if page not found
96
+ */
97
+ updateMetadata(page_id: string, metadata: Partial<Pick<PageHandle, 'url' | 'title'>>): boolean;
98
+ /**
99
+ * Find a handle by its Puppeteer Page instance
100
+ *
101
+ * @param page - Puppeteer Page instance to find
102
+ * @returns PageHandle if found, undefined otherwise
103
+ */
104
+ findByPage(page: Page): PageHandle | undefined;
105
+ /**
106
+ * Find all handles with a matching URL
107
+ *
108
+ * @param url - URL to search for
109
+ * @returns Array of matching PageHandle objects
110
+ */
111
+ findByUrl(url: string): PageHandle[];
112
+ /**
113
+ * Check if a page handle is still valid (page not closed, CDP active)
114
+ *
115
+ * Use this to detect stale handles before performing operations.
116
+ *
117
+ * @param page_id - The page identifier
118
+ * @returns true if the handle exists and both page and CDP session are active
119
+ */
120
+ isValid(page_id: string): boolean;
121
+ /**
122
+ * Touch a page to mark it as most recently used.
123
+ *
124
+ * @param page_id - The page identifier
125
+ * @returns true if the page exists and was touched, false otherwise
126
+ */
127
+ touch(page_id: string): boolean;
128
+ /**
129
+ * Get the most recently used page.
130
+ *
131
+ * Falls back to the first registered page if MRU is not set.
132
+ *
133
+ * @returns PageHandle for MRU page, or undefined if no pages
134
+ */
135
+ getMostRecent(): PageHandle | undefined;
136
+ }
137
+ //# sourceMappingURL=page-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-registry.d.ts","sourceRoot":"","sources":["../../../src/browser/page-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAGhE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,IAAI,EAAE,IAAI,CAAC;IAEX,+BAA+B;IAC/B,GAAG,EAAE,SAAS,CAAC;IAEf,mCAAmC;IACnC,UAAU,EAAE,IAAI,CAAC;IAEjB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,wDAAwD;IACxD,OAAO,CAAC,SAAS,CAAuB;IAExC;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAG,UAAU;IAsBhD;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI5C;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUhC;;;;OAIG;IACH,IAAI,IAAI,UAAU,EAAE;IAIpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACH,IAAI,IAAI,MAAM;IAId;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B;;;;;;;;;OASG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO;IAQrD;;;;;;OAMG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO;IAgB9F;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS;IAI9C;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE;IAIpC;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASjC;;;;;OAKG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ/B;;;;;;OAMG;IACH,aAAa,IAAI,UAAU,GAAG,SAAS;CAOxC"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Page Registry
3
+ *
4
+ * Tracks active Puppeteer pages and their CDP sessions.
5
+ * Provides a central registry for page lifecycle management.
6
+ */
7
+ import { randomUUID } from 'crypto';
8
+ /**
9
+ * Registry for tracking active pages
10
+ */
11
+ export class PageRegistry {
12
+ pages = new Map();
13
+ /** Most recently used page ID for default resolution */
14
+ mruPageId = null;
15
+ /**
16
+ * Register a new page with its CDP session
17
+ *
18
+ * @param page - Puppeteer Page instance
19
+ * @param cdp - CDP client for the page
20
+ * @returns PageHandle with unique page_id
21
+ * @throws Error if page is already closed
22
+ */
23
+ register(page, cdp) {
24
+ // Validate page is not closed (Puppeteer uses isClosed())
25
+ if (page.isClosed()) {
26
+ throw new Error('Cannot register a closed page');
27
+ }
28
+ const page_id = `page-${randomUUID()}`;
29
+ const handle = {
30
+ page_id,
31
+ page,
32
+ cdp,
33
+ created_at: new Date(),
34
+ url: page.url?.(),
35
+ };
36
+ this.pages.set(page_id, handle);
37
+ this.mruPageId = page_id;
38
+ return handle;
39
+ }
40
+ /**
41
+ * Get a page handle by its ID
42
+ *
43
+ * @param page_id - The page identifier
44
+ * @returns PageHandle if found, undefined otherwise
45
+ */
46
+ get(page_id) {
47
+ return this.pages.get(page_id);
48
+ }
49
+ /**
50
+ * Remove a page from the registry
51
+ *
52
+ * @param page_id - The page identifier
53
+ * @returns true if page was removed, false if not found
54
+ */
55
+ remove(page_id) {
56
+ const deleted = this.pages.delete(page_id);
57
+ if (deleted && this.mruPageId === page_id) {
58
+ // Transfer MRU to first remaining page, or null if empty
59
+ const firstRemaining = this.pages.values().next().value;
60
+ this.mruPageId = firstRemaining?.page_id ?? null;
61
+ }
62
+ return deleted;
63
+ }
64
+ /**
65
+ * List all registered pages
66
+ *
67
+ * @returns Array of all PageHandle objects
68
+ */
69
+ list() {
70
+ return Array.from(this.pages.values());
71
+ }
72
+ /**
73
+ * Remove all pages from the registry
74
+ */
75
+ clear() {
76
+ this.pages.clear();
77
+ this.mruPageId = null;
78
+ }
79
+ /**
80
+ * Get the number of registered pages
81
+ *
82
+ * @returns Current page count
83
+ */
84
+ size() {
85
+ return this.pages.size;
86
+ }
87
+ /**
88
+ * Check if a page is registered
89
+ *
90
+ * @param page_id - The page identifier
91
+ * @returns true if page exists
92
+ */
93
+ has(page_id) {
94
+ return this.pages.has(page_id);
95
+ }
96
+ /**
97
+ * Replace a page handle in the registry.
98
+ *
99
+ * Used for CDP session rebinding - keeps the same page_id but
100
+ * updates the handle with a new CDP session.
101
+ *
102
+ * @param page_id - Page ID to replace
103
+ * @param handle - New handle to store
104
+ * @returns true if replaced, false if page_id not found
105
+ */
106
+ replace(page_id, handle) {
107
+ if (!this.pages.has(page_id)) {
108
+ return false;
109
+ }
110
+ this.pages.set(page_id, handle);
111
+ return true;
112
+ }
113
+ /**
114
+ * Update metadata for a page
115
+ *
116
+ * @param page_id - The page identifier
117
+ * @param metadata - Partial metadata to update
118
+ * @returns true if updated, false if page not found
119
+ */
120
+ updateMetadata(page_id, metadata) {
121
+ const handle = this.pages.get(page_id);
122
+ if (!handle) {
123
+ return false;
124
+ }
125
+ if (metadata.url !== undefined) {
126
+ handle.url = metadata.url;
127
+ }
128
+ if (metadata.title !== undefined) {
129
+ handle.title = metadata.title;
130
+ }
131
+ return true;
132
+ }
133
+ /**
134
+ * Find a handle by its Puppeteer Page instance
135
+ *
136
+ * @param page - Puppeteer Page instance to find
137
+ * @returns PageHandle if found, undefined otherwise
138
+ */
139
+ findByPage(page) {
140
+ return this.list().find((h) => h.page === page);
141
+ }
142
+ /**
143
+ * Find all handles with a matching URL
144
+ *
145
+ * @param url - URL to search for
146
+ * @returns Array of matching PageHandle objects
147
+ */
148
+ findByUrl(url) {
149
+ return this.list().filter((h) => h.url === url);
150
+ }
151
+ /**
152
+ * Check if a page handle is still valid (page not closed, CDP active)
153
+ *
154
+ * Use this to detect stale handles before performing operations.
155
+ *
156
+ * @param page_id - The page identifier
157
+ * @returns true if the handle exists and both page and CDP session are active
158
+ */
159
+ isValid(page_id) {
160
+ const handle = this.pages.get(page_id);
161
+ if (!handle) {
162
+ return false;
163
+ }
164
+ return !handle.page.isClosed() && handle.cdp.isActive();
165
+ }
166
+ /**
167
+ * Touch a page to mark it as most recently used.
168
+ *
169
+ * @param page_id - The page identifier
170
+ * @returns true if the page exists and was touched, false otherwise
171
+ */
172
+ touch(page_id) {
173
+ if (this.pages.has(page_id)) {
174
+ this.mruPageId = page_id;
175
+ return true;
176
+ }
177
+ return false;
178
+ }
179
+ /**
180
+ * Get the most recently used page.
181
+ *
182
+ * Falls back to the first registered page if MRU is not set.
183
+ *
184
+ * @returns PageHandle for MRU page, or undefined if no pages
185
+ */
186
+ getMostRecent() {
187
+ if (this.mruPageId && this.pages.has(this.mruPageId)) {
188
+ return this.pages.get(this.mruPageId);
189
+ }
190
+ // Fallback to first page
191
+ return this.pages.values().next().value;
192
+ }
193
+ }
194
+ //# sourceMappingURL=page-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-registry.js","sourceRoot":"","sources":["../../../src/browser/page-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Page Stabilization Utilities
3
+ *
4
+ * Shared utilities for waiting on network activity to settle.
5
+ * Used by session-manager and execute-action.
6
+ *
7
+ * IMPORTANT: This module uses PageNetworkTracker for reliable network idle
8
+ * detection. Unlike Puppeteer's waitForNetworkIdle(), the tracker
9
+ * monitors actual request/response events and works for in-page actions
10
+ * (not just navigation load states).
11
+ */
12
+ import type { Page } from 'puppeteer-core';
13
+ /** Default timeout for network idle waiting after actions (ms) */
14
+ export declare const ACTION_NETWORK_IDLE_TIMEOUT_MS = 3000;
15
+ /** Default timeout for network idle waiting after navigation (ms) */
16
+ export declare const NAVIGATION_NETWORK_IDLE_TIMEOUT_MS = 5000;
17
+ /** Default quiet window - time with 0 inflight requests to consider "idle" (ms) */
18
+ export declare const DEFAULT_QUIET_WINDOW_MS = 500;
19
+ /**
20
+ * Wait for network to become quiet (no pending requests for 500ms).
21
+ *
22
+ * This catches pending API calls triggered by actions. Uses PageNetworkTracker
23
+ * which monitors request/response events directly, providing reliable detection
24
+ * of network activity for both navigation and in-page actions.
25
+ *
26
+ * Unlike Puppeteer's waitForNetworkIdle(), this works correctly
27
+ * for fetch/XHR requests triggered by user actions after page load.
28
+ *
29
+ * @param page - Puppeteer Page instance
30
+ * @param timeoutMs - Maximum time to wait for network idle
31
+ * @param quietWindowMs - Time with 0 inflight requests to consider "idle" (default: 500ms)
32
+ * @returns Whether network became idle (false = timed out, but that's OK - never throws)
33
+ */
34
+ export declare function waitForNetworkQuiet(page: Page, timeoutMs: number, quietWindowMs?: number): Promise<boolean>;
35
+ //# sourceMappingURL=page-stabilization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-stabilization.d.ts","sourceRoot":"","sources":["../../../src/browser/page-stabilization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,kEAAkE;AAClE,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,qEAAqE;AACrE,eAAO,MAAM,kCAAkC,OAAO,CAAC;AAEvD,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,MAAgC,GAC9C,OAAO,CAAC,OAAO,CAAC,CASlB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Page Stabilization Utilities
3
+ *
4
+ * Shared utilities for waiting on network activity to settle.
5
+ * Used by session-manager and execute-action.
6
+ *
7
+ * IMPORTANT: This module uses PageNetworkTracker for reliable network idle
8
+ * detection. Unlike Puppeteer's waitForNetworkIdle(), the tracker
9
+ * monitors actual request/response events and works for in-page actions
10
+ * (not just navigation load states).
11
+ */
12
+ import { getOrCreateTracker } from './page-network-tracker.js';
13
+ /** Default timeout for network idle waiting after actions (ms) */
14
+ export const ACTION_NETWORK_IDLE_TIMEOUT_MS = 3000;
15
+ /** Default timeout for network idle waiting after navigation (ms) */
16
+ export const NAVIGATION_NETWORK_IDLE_TIMEOUT_MS = 5000;
17
+ /** Default quiet window - time with 0 inflight requests to consider "idle" (ms) */
18
+ export const DEFAULT_QUIET_WINDOW_MS = 500;
19
+ /**
20
+ * Wait for network to become quiet (no pending requests for 500ms).
21
+ *
22
+ * This catches pending API calls triggered by actions. Uses PageNetworkTracker
23
+ * which monitors request/response events directly, providing reliable detection
24
+ * of network activity for both navigation and in-page actions.
25
+ *
26
+ * Unlike Puppeteer's waitForNetworkIdle(), this works correctly
27
+ * for fetch/XHR requests triggered by user actions after page load.
28
+ *
29
+ * @param page - Puppeteer Page instance
30
+ * @param timeoutMs - Maximum time to wait for network idle
31
+ * @param quietWindowMs - Time with 0 inflight requests to consider "idle" (default: 500ms)
32
+ * @returns Whether network became idle (false = timed out, but that's OK - never throws)
33
+ */
34
+ export async function waitForNetworkQuiet(page, timeoutMs, quietWindowMs = DEFAULT_QUIET_WINDOW_MS) {
35
+ const tracker = getOrCreateTracker(page);
36
+ // Ensure tracker is attached (may not be if page was created outside SessionManager)
37
+ if (!tracker.isAttached()) {
38
+ tracker.attach(page);
39
+ }
40
+ return tracker.waitForQuiet(timeoutMs, quietWindowMs);
41
+ }
42
+ //# sourceMappingURL=page-stabilization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-stabilization.js","sourceRoot":"","sources":["../../../src/browser/page-stabilization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,kEAAkE;AAClE,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,qEAAqE;AACrE,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC;AAEvD,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,SAAiB,EACjB,gBAAwB,uBAAuB;IAE/C,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzC,qFAAqF;IACrF,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC"}