@taodigital/crawler 0.0.0-stage → 1.2.1

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 (494) hide show
  1. package/Dockerfile +82 -0
  2. package/README.md +10 -2
  3. package/dist/accessibility-auditor.d.ts +29 -0
  4. package/dist/accessibility-auditor.js +57 -0
  5. package/dist/accessibility-auditor.js.map +7 -0
  6. package/dist/accessibility-tree-crawler.d.ts +44 -0
  7. package/dist/accessibility-tree-crawler.js +156 -0
  8. package/dist/accessibility-tree-crawler.js.map +7 -0
  9. package/dist/advanced-ui-probes.d.ts +47 -0
  10. package/dist/advanced-ui-probes.js +310 -0
  11. package/dist/advanced-ui-probes.js.map +7 -0
  12. package/dist/ai-login.d.ts +32 -0
  13. package/dist/ai-login.js +250 -0
  14. package/dist/ai-login.js.map +7 -0
  15. package/dist/auth-token-rotator.d.ts +47 -0
  16. package/dist/auth-token-rotator.js +58 -0
  17. package/dist/auth-token-rotator.js.map +7 -0
  18. package/dist/auth.d.ts +20 -0
  19. package/dist/auth.js +348 -0
  20. package/dist/auth.js.map +7 -0
  21. package/dist/browser-extension.d.ts +37 -0
  22. package/dist/browser-extension.js +113 -0
  23. package/dist/browser-extension.js.map +7 -0
  24. package/dist/captcha-solver.d.ts +16 -0
  25. package/dist/captcha-solver.js +105 -0
  26. package/dist/captcha-solver.js.map +7 -0
  27. package/dist/color-contrast.d.ts +30 -0
  28. package/dist/color-contrast.js +78 -0
  29. package/dist/color-contrast.js.map +7 -0
  30. package/dist/content-chunker.d.ts +18 -0
  31. package/dist/content-chunker.js +152 -0
  32. package/dist/content-chunker.js.map +7 -0
  33. package/dist/content-dedup.d.ts +23 -0
  34. package/dist/content-dedup.js +60 -0
  35. package/dist/content-dedup.js.map +7 -0
  36. package/dist/cookie-consent.d.ts +25 -0
  37. package/dist/cookie-consent.js +78 -0
  38. package/dist/cookie-consent.js.map +7 -0
  39. package/dist/cookie-jar.d.ts +20 -0
  40. package/dist/cookie-jar.js +61 -0
  41. package/dist/cookie-jar.js.map +7 -0
  42. package/dist/crawl-session-manager.d.ts +44 -0
  43. package/dist/crawl-session-manager.js +145 -0
  44. package/dist/crawl-session-manager.js.map +7 -0
  45. package/dist/crawler.d.ts +233 -0
  46. package/dist/crawler.js +6239 -0
  47. package/dist/crawler.js.map +7 -0
  48. package/dist/crud-interaction.d.ts +31 -0
  49. package/dist/crud-interaction.js +264 -0
  50. package/dist/crud-interaction.js.map +7 -0
  51. package/dist/custom-js-injector.d.ts +42 -0
  52. package/dist/custom-js-injector.js +50 -0
  53. package/dist/custom-js-injector.js.map +7 -0
  54. package/dist/dark-mode-capture.d.ts +23 -0
  55. package/dist/dark-mode-capture.js +75 -0
  56. package/dist/dark-mode-capture.js.map +7 -0
  57. package/dist/dead-link-detector.d.ts +37 -0
  58. package/dist/dead-link-detector.js +50 -0
  59. package/dist/dead-link-detector.js.map +7 -0
  60. package/dist/dropdown-enumerator.d.ts +20 -0
  61. package/dist/dropdown-enumerator.js +230 -0
  62. package/dist/dropdown-enumerator.js.map +7 -0
  63. package/dist/element-hash.d.ts +9 -0
  64. package/dist/element-hash.js +9 -0
  65. package/dist/element-hash.js.map +7 -0
  66. package/dist/email-otp.d.ts +42 -0
  67. package/dist/email-otp.js +177 -0
  68. package/dist/email-otp.js.map +7 -0
  69. package/dist/engine-router.d.ts +47 -0
  70. package/dist/engine-router.js +94 -0
  71. package/dist/engine-router.js.map +7 -0
  72. package/dist/export/bulk-export.d.ts +26 -0
  73. package/dist/export/bulk-export.js +76 -0
  74. package/dist/export/bulk-export.js.map +7 -0
  75. package/dist/export/vector-export.d.ts +76 -0
  76. package/dist/export/vector-export.js +85 -0
  77. package/dist/export/vector-export.js.map +7 -0
  78. package/dist/extractors/advanced.d.ts +64 -0
  79. package/dist/extractors/advanced.js +265 -0
  80. package/dist/extractors/advanced.js.map +7 -0
  81. package/dist/extractors/artifact-envelope.d.ts +63 -0
  82. package/dist/extractors/artifact-envelope.js +63 -0
  83. package/dist/extractors/artifact-envelope.js.map +7 -0
  84. package/dist/extractors/branding-extractor.d.ts +46 -0
  85. package/dist/extractors/branding-extractor.js +104 -0
  86. package/dist/extractors/branding-extractor.js.map +7 -0
  87. package/dist/extractors/summary-extractor.d.ts +10 -0
  88. package/dist/extractors/summary-extractor.js +36 -0
  89. package/dist/extractors/summary-extractor.js.map +7 -0
  90. package/dist/failure-analysis-agent.d.ts +16 -0
  91. package/dist/failure-analysis-agent.js +42 -0
  92. package/dist/failure-analysis-agent.js.map +7 -0
  93. package/dist/feature-flag-detector.d.ts +30 -0
  94. package/dist/feature-flag-detector.js +55 -0
  95. package/dist/feature-flag-detector.js.map +7 -0
  96. package/dist/filter-pagination-crawler.d.ts +52 -0
  97. package/dist/filter-pagination-crawler.js +299 -0
  98. package/dist/filter-pagination-crawler.js.map +7 -0
  99. package/dist/form-detector.d.ts +34 -0
  100. package/dist/form-detector.js +58 -0
  101. package/dist/form-detector.js.map +7 -0
  102. package/dist/frontier.d.ts +40 -0
  103. package/dist/frontier.js +103 -0
  104. package/dist/frontier.js.map +7 -0
  105. package/dist/gap-pass.d.ts +36 -0
  106. package/dist/gap-pass.js +115 -0
  107. package/dist/gap-pass.js.map +7 -0
  108. package/dist/graphql-detector.d.ts +39 -0
  109. package/dist/graphql-detector.js +86 -0
  110. package/dist/graphql-detector.js.map +7 -0
  111. package/dist/http-engine.d.ts +80 -0
  112. package/dist/http-engine.js +318 -0
  113. package/dist/http-engine.js.map +7 -0
  114. package/dist/incremental-diff.d.ts +116 -0
  115. package/dist/incremental-diff.js +137 -0
  116. package/dist/incremental-diff.js.map +7 -0
  117. package/dist/index.d.ts +52 -0
  118. package/dist/index.js +83 -0
  119. package/dist/index.js.map +7 -0
  120. package/dist/input-fuzzer.d.ts +30 -0
  121. package/dist/input-fuzzer.js +105 -0
  122. package/dist/input-fuzzer.js.map +7 -0
  123. package/dist/interactive-probe.d.ts +144 -0
  124. package/dist/interactive-probe.js +865 -0
  125. package/dist/interactive-probe.js.map +7 -0
  126. package/dist/job-queue.d.ts +297 -0
  127. package/dist/job-queue.js +3812 -0
  128. package/dist/job-queue.js.map +7 -0
  129. package/dist/js-coverage.d.ts +29 -0
  130. package/dist/js-coverage.js +56 -0
  131. package/dist/js-coverage.js.map +7 -0
  132. package/dist/js-router-detector.d.ts +17 -0
  133. package/dist/js-router-detector.js +90 -0
  134. package/dist/js-router-detector.js.map +7 -0
  135. package/dist/language-detector.d.ts +22 -0
  136. package/dist/language-detector.js +57 -0
  137. package/dist/language-detector.js.map +7 -0
  138. package/dist/link-classifier.d.ts +23 -0
  139. package/dist/link-classifier.js +40 -0
  140. package/dist/link-classifier.js.map +7 -0
  141. package/dist/live-view.d.ts +36 -0
  142. package/dist/live-view.js +105 -0
  143. package/dist/live-view.js.map +7 -0
  144. package/dist/locator-extractor.d.ts +46 -0
  145. package/dist/locator-extractor.js +220 -0
  146. package/dist/locator-extractor.js.map +7 -0
  147. package/dist/logger.d.ts +2 -0
  148. package/dist/logger.js +10 -0
  149. package/dist/logger.js.map +7 -0
  150. package/dist/markdown-extract.d.ts +8 -0
  151. package/dist/markdown-extract.js +54 -0
  152. package/dist/markdown-extract.js.map +7 -0
  153. package/dist/multi-context-handler.d.ts +55 -0
  154. package/dist/multi-context-handler.js +182 -0
  155. package/dist/multi-context-handler.js.map +7 -0
  156. package/dist/native-crawler.d.ts +69 -0
  157. package/dist/native-crawler.js +839 -0
  158. package/dist/native-crawler.js.map +7 -0
  159. package/dist/nested-window-crawler.d.ts +41 -0
  160. package/dist/nested-window-crawler.js +172 -0
  161. package/dist/nested-window-crawler.js.map +7 -0
  162. package/dist/network-action-correlator.d.ts +47 -0
  163. package/dist/network-action-correlator.js +209 -0
  164. package/dist/network-action-correlator.js.map +7 -0
  165. package/dist/network-observer.d.ts +49 -0
  166. package/dist/network-observer.js +149 -0
  167. package/dist/network-observer.js.map +7 -0
  168. package/dist/network-throttle.d.ts +25 -0
  169. package/dist/network-throttle.js +34 -0
  170. package/dist/network-throttle.js.map +7 -0
  171. package/dist/openapi-generator.d.ts +49 -0
  172. package/dist/openapi-generator.js +89 -0
  173. package/dist/openapi-generator.js.map +7 -0
  174. package/dist/pdf-extractor.d.ts +28 -0
  175. package/dist/pdf-extractor.js +81 -0
  176. package/dist/pdf-extractor.js.map +7 -0
  177. package/dist/performance-metrics-collector.d.ts +50 -0
  178. package/dist/performance-metrics-collector.js +155 -0
  179. package/dist/performance-metrics-collector.js.map +7 -0
  180. package/dist/performance-metrics.d.ts +52 -0
  181. package/dist/performance-metrics.js +83 -0
  182. package/dist/performance-metrics.js.map +7 -0
  183. package/dist/phash.d.ts +50 -0
  184. package/dist/phash.js +136 -0
  185. package/dist/phash.js.map +7 -0
  186. package/dist/pii-scrubber.d.ts +21 -0
  187. package/dist/pii-scrubber.js +75 -0
  188. package/dist/pii-scrubber.js.map +7 -0
  189. package/dist/playwright-recorder.d.ts +39 -0
  190. package/dist/playwright-recorder.js +123 -0
  191. package/dist/playwright-recorder.js.map +7 -0
  192. package/dist/policies/crawl-safety.d.ts +9 -0
  193. package/dist/policies/crawl-safety.js +41 -0
  194. package/dist/policies/crawl-safety.js.map +7 -0
  195. package/dist/profiles/domain-profile.d.ts +19 -0
  196. package/dist/profiles/domain-profile.js +160 -0
  197. package/dist/profiles/domain-profile.js.map +7 -0
  198. package/dist/proxy.d.ts +50 -0
  199. package/dist/proxy.js +165 -0
  200. package/dist/proxy.js.map +7 -0
  201. package/dist/rate-limiter.d.ts +31 -0
  202. package/dist/rate-limiter.js +64 -0
  203. package/dist/rate-limiter.js.map +7 -0
  204. package/dist/redirect-tracker.d.ts +37 -0
  205. package/dist/redirect-tracker.js +65 -0
  206. package/dist/redirect-tracker.js.map +7 -0
  207. package/dist/redis-frontier.d.ts +48 -0
  208. package/dist/redis-frontier.js +126 -0
  209. package/dist/redis-frontier.js.map +7 -0
  210. package/dist/redis-queue.d.ts +48 -0
  211. package/dist/redis-queue.js +165 -0
  212. package/dist/redis-queue.js.map +7 -0
  213. package/dist/response-cache.d.ts +38 -0
  214. package/dist/response-cache.js +140 -0
  215. package/dist/response-cache.js.map +7 -0
  216. package/dist/responsive-detector.d.ts +29 -0
  217. package/dist/responsive-detector.js +46 -0
  218. package/dist/responsive-detector.js.map +7 -0
  219. package/dist/retry-policy.d.ts +20 -0
  220. package/dist/retry-policy.js +54 -0
  221. package/dist/retry-policy.js.map +7 -0
  222. package/dist/robots-txt.d.ts +9 -0
  223. package/dist/robots-txt.js +77 -0
  224. package/dist/robots-txt.js.map +7 -0
  225. package/dist/screen-reader.d.ts +15 -0
  226. package/dist/screen-reader.js +48 -0
  227. package/dist/screen-reader.js.map +7 -0
  228. package/dist/screenshot-masker.d.ts +28 -0
  229. package/dist/screenshot-masker.js +62 -0
  230. package/dist/screenshot-masker.js.map +7 -0
  231. package/dist/seo-checker.d.ts +33 -0
  232. package/dist/seo-checker.js +91 -0
  233. package/dist/seo-checker.js.map +7 -0
  234. package/dist/service-worker-interceptor.d.ts +36 -0
  235. package/dist/service-worker-interceptor.js +136 -0
  236. package/dist/service-worker-interceptor.js.map +7 -0
  237. package/dist/session-capture.d.ts +39 -0
  238. package/dist/session-capture.js +274 -0
  239. package/dist/session-capture.js.map +7 -0
  240. package/dist/session-export.d.ts +49 -0
  241. package/dist/session-export.js +117 -0
  242. package/dist/session-export.js.map +7 -0
  243. package/dist/shadow-dom-crawler.d.ts +35 -0
  244. package/dist/shadow-dom-crawler.js +132 -0
  245. package/dist/shadow-dom-crawler.js.map +7 -0
  246. package/dist/sitemap-writer.d.ts +21 -0
  247. package/dist/sitemap-writer.js +47 -0
  248. package/dist/sitemap-writer.js.map +7 -0
  249. package/dist/sitemap.d.ts +51 -0
  250. package/dist/sitemap.js +160 -0
  251. package/dist/sitemap.js.map +7 -0
  252. package/dist/skyvern.d.ts +56 -0
  253. package/dist/skyvern.js +129 -0
  254. package/dist/skyvern.js.map +7 -0
  255. package/dist/sqs-queue.d.ts +13 -0
  256. package/dist/sqs-queue.js +115 -0
  257. package/dist/sqs-queue.js.map +7 -0
  258. package/dist/sso-token.d.ts +29 -0
  259. package/dist/sso-token.js +76 -0
  260. package/dist/sso-token.js.map +7 -0
  261. package/dist/state-graph.d.ts +59 -0
  262. package/dist/state-graph.js +193 -0
  263. package/dist/state-graph.js.map +7 -0
  264. package/dist/stealth/human-behavior.d.ts +20 -0
  265. package/dist/stealth/human-behavior.js +202 -0
  266. package/dist/stealth/human-behavior.js.map +7 -0
  267. package/dist/telemetry.d.ts +34 -0
  268. package/dist/telemetry.js +77 -0
  269. package/dist/telemetry.js.map +7 -0
  270. package/dist/test-executor.d.ts +81 -0
  271. package/dist/test-executor.js +443 -0
  272. package/dist/test-executor.js.map +7 -0
  273. package/dist/tls-fingerprint.d.ts +50 -0
  274. package/dist/tls-fingerprint.js +81 -0
  275. package/dist/tls-fingerprint.js.map +7 -0
  276. package/dist/url-pattern-completer.d.ts +28 -0
  277. package/dist/url-pattern-completer.js +122 -0
  278. package/dist/url-pattern-completer.js.map +7 -0
  279. package/dist/visual-diff-verdict.d.ts +40 -0
  280. package/dist/visual-diff-verdict.js +27 -0
  281. package/dist/visual-diff-verdict.js.map +7 -0
  282. package/dist/webhook-notifier.d.ts +30 -0
  283. package/dist/webhook-notifier.js +76 -0
  284. package/dist/webhook-notifier.js.map +7 -0
  285. package/dist/websocket-detector.d.ts +24 -0
  286. package/dist/websocket-detector.js +60 -0
  287. package/dist/websocket-detector.js.map +7 -0
  288. package/dist/worker.d.ts +1 -0
  289. package/dist/worker.js +33 -0
  290. package/dist/worker.js.map +7 -0
  291. package/package.json +49 -4
  292. package/src/accessibility-auditor.ts +102 -0
  293. package/src/accessibility-tree-crawler.ts +246 -0
  294. package/src/advanced-ui-probes.ts +470 -0
  295. package/src/ai-login.ts +298 -0
  296. package/src/auth-token-rotator.ts +89 -0
  297. package/src/auth.ts +418 -0
  298. package/src/browser-extension.ts +186 -0
  299. package/src/captcha-solver.ts +143 -0
  300. package/src/color-contrast.ts +116 -0
  301. package/src/content-chunker.ts +170 -0
  302. package/src/content-dedup.ts +99 -0
  303. package/src/cookie-consent.ts +106 -0
  304. package/src/cookie-jar.ts +91 -0
  305. package/src/crawl-session-manager.ts +231 -0
  306. package/src/crawler.ts +7123 -0
  307. package/src/crawler.ts.rej +12 -0
  308. package/src/crud-interaction.ts +386 -0
  309. package/src/custom-js-injector.ts +93 -0
  310. package/src/dark-mode-capture.ts +110 -0
  311. package/src/dead-link-detector.ts +76 -0
  312. package/src/dropdown-enumerator.ts +312 -0
  313. package/src/element-hash.ts +16 -0
  314. package/src/email-otp.ts +252 -0
  315. package/src/engine-router.ts +141 -0
  316. package/src/export/bulk-export.ts +85 -0
  317. package/src/export/vector-export.ts +160 -0
  318. package/src/extractors/advanced.ts +309 -0
  319. package/src/extractors/artifact-envelope.ts +111 -0
  320. package/src/extractors/branding-extractor.ts +159 -0
  321. package/src/extractors/summary-extractor.ts +49 -0
  322. package/src/failure-analysis-agent.ts +51 -0
  323. package/src/feature-flag-detector.ts +97 -0
  324. package/src/filter-pagination-crawler.ts +500 -0
  325. package/src/form-detector.ts +103 -0
  326. package/src/frontier.test.ts +64 -0
  327. package/src/frontier.ts +144 -0
  328. package/src/gap-pass.ts +165 -0
  329. package/src/graphql-detector.ts +129 -0
  330. package/src/http-engine.ts +453 -0
  331. package/src/incremental-diff.ts +259 -0
  332. package/src/index.ts +52 -0
  333. package/src/input-fuzzer.ts +129 -0
  334. package/src/interactive-probe.ts +1136 -0
  335. package/src/job-queue.test.ts +187 -0
  336. package/src/job-queue.ts +4504 -0
  337. package/src/js-coverage.ts +87 -0
  338. package/src/js-router-detector.ts +112 -0
  339. package/src/language-detector.ts +82 -0
  340. package/src/link-classifier.ts +65 -0
  341. package/src/live-view.ts +146 -0
  342. package/src/locator-extractor.ts +309 -0
  343. package/src/logger.ts +9 -0
  344. package/src/markdown-extract.test.ts +73 -0
  345. package/src/markdown-extract.ts +76 -0
  346. package/src/multi-context-handler.ts +296 -0
  347. package/src/native-crawler.ts +1108 -0
  348. package/src/nested-window-crawler.ts +310 -0
  349. package/src/network-action-correlator.ts +320 -0
  350. package/src/network-observer.ts +204 -0
  351. package/src/network-throttle.ts +69 -0
  352. package/src/openapi-generator.ts +135 -0
  353. package/src/pdf-extractor.ts +123 -0
  354. package/src/performance-metrics-collector.ts +243 -0
  355. package/src/performance-metrics.ts +134 -0
  356. package/src/phash.ts +184 -0
  357. package/src/pii-scrubber.ts +99 -0
  358. package/src/playwright-recorder.ts +170 -0
  359. package/src/policies/crawl-safety.ts +52 -0
  360. package/src/profiles/domain-profile.ts +190 -0
  361. package/src/proxy.ts +238 -0
  362. package/src/rate-limiter.ts +87 -0
  363. package/src/redirect-tracker.ts +97 -0
  364. package/src/redis-frontier.ts +143 -0
  365. package/src/redis-queue.ts +208 -0
  366. package/src/response-cache.ts +150 -0
  367. package/src/responsive-detector.ts +92 -0
  368. package/src/retry-policy.ts +87 -0
  369. package/src/robots-txt.ts +96 -0
  370. package/src/screen-reader.ts +98 -0
  371. package/src/screenshot-masker.ts +98 -0
  372. package/src/seo-checker.ts +134 -0
  373. package/src/service-worker-interceptor.ts +185 -0
  374. package/src/session-capture.ts +335 -0
  375. package/src/session-export.test.ts +75 -0
  376. package/src/session-export.ts +172 -0
  377. package/src/shadow-dom-crawler.ts +198 -0
  378. package/src/sitemap-writer.ts +65 -0
  379. package/src/sitemap.test.ts +127 -0
  380. package/src/sitemap.ts +233 -0
  381. package/src/skyvern.ts +199 -0
  382. package/src/sqs-queue.ts +129 -0
  383. package/src/sso-token.ts +120 -0
  384. package/src/state-graph.ts +280 -0
  385. package/src/stealth/human-behavior.ts +227 -0
  386. package/src/telemetry.ts +122 -0
  387. package/src/test-executor.test.ts +72 -0
  388. package/src/test-executor.ts +578 -0
  389. package/src/tls-fingerprint.ts +111 -0
  390. package/src/url-pattern-completer.ts +161 -0
  391. package/src/vendor.d.ts +20 -0
  392. package/src/visual-diff-verdict.test.ts +80 -0
  393. package/src/visual-diff-verdict.ts +59 -0
  394. package/src/webhook-notifier.ts +109 -0
  395. package/src/websocket-detector.ts +83 -0
  396. package/src/worker.ts +50 -0
  397. package/tsconfig.json +13 -0
  398. package/types/accessibility-auditor.d.ts +29 -0
  399. package/types/accessibility-tree-crawler.d.ts +44 -0
  400. package/types/advanced-ui-probes.d.ts +47 -0
  401. package/types/ai-login.d.ts +32 -0
  402. package/types/auth-token-rotator.d.ts +47 -0
  403. package/types/auth.d.ts +20 -0
  404. package/types/browser-extension.d.ts +37 -0
  405. package/types/bull-worker.d.ts +6 -0
  406. package/types/captcha-solver.d.ts +16 -0
  407. package/types/color-contrast.d.ts +30 -0
  408. package/types/content-chunker.d.ts +18 -0
  409. package/types/content-dedup.d.ts +23 -0
  410. package/types/cookie-consent.d.ts +25 -0
  411. package/types/cookie-jar.d.ts +20 -0
  412. package/types/crawl-session-manager.d.ts +44 -0
  413. package/types/crawler.d.ts +233 -0
  414. package/types/crud-interaction.d.ts +31 -0
  415. package/types/custom-js-injector.d.ts +42 -0
  416. package/types/dark-mode-capture.d.ts +23 -0
  417. package/types/dead-link-detector.d.ts +37 -0
  418. package/types/dropdown-enumerator.d.ts +20 -0
  419. package/types/element-hash.d.ts +9 -0
  420. package/types/email-otp.d.ts +42 -0
  421. package/types/engine-router.d.ts +47 -0
  422. package/types/export/bulk-export.d.ts +26 -0
  423. package/types/export/vector-export.d.ts +76 -0
  424. package/types/extractors/advanced.d.ts +64 -0
  425. package/types/extractors/artifact-envelope.d.ts +63 -0
  426. package/types/extractors/branding-extractor.d.ts +46 -0
  427. package/types/extractors/summary-extractor.d.ts +10 -0
  428. package/types/failure-analysis-agent.d.ts +16 -0
  429. package/types/feature-flag-detector.d.ts +30 -0
  430. package/types/filter-pagination-crawler.d.ts +52 -0
  431. package/types/form-detector.d.ts +34 -0
  432. package/types/frontier.d.ts +40 -0
  433. package/types/gap-pass.d.ts +36 -0
  434. package/types/graphql-detector.d.ts +39 -0
  435. package/types/http-engine.d.ts +80 -0
  436. package/types/incremental-diff.d.ts +116 -0
  437. package/types/index.d.ts +52 -0
  438. package/types/input-fuzzer.d.ts +30 -0
  439. package/types/interactive-probe.d.ts +144 -0
  440. package/types/job-queue.d.ts +308 -0
  441. package/types/js-coverage.d.ts +29 -0
  442. package/types/js-router-detector.d.ts +17 -0
  443. package/types/language-detector.d.ts +22 -0
  444. package/types/link-classifier.d.ts +23 -0
  445. package/types/live-view.d.ts +36 -0
  446. package/types/locator-extractor.d.ts +46 -0
  447. package/types/logger.d.ts +2 -0
  448. package/types/markdown-extract.d.ts +8 -0
  449. package/types/multi-context-handler.d.ts +55 -0
  450. package/types/native-crawler.d.ts +69 -0
  451. package/types/nested-window-crawler.d.ts +41 -0
  452. package/types/network-action-correlator.d.ts +47 -0
  453. package/types/network-observer.d.ts +49 -0
  454. package/types/network-throttle.d.ts +25 -0
  455. package/types/openapi-generator.d.ts +49 -0
  456. package/types/pdf-extractor.d.ts +28 -0
  457. package/types/performance-metrics-collector.d.ts +50 -0
  458. package/types/performance-metrics.d.ts +52 -0
  459. package/types/phash.d.ts +50 -0
  460. package/types/pii-scrubber.d.ts +21 -0
  461. package/types/playwright-recorder.d.ts +39 -0
  462. package/types/policies/crawl-safety.d.ts +9 -0
  463. package/types/profiles/domain-profile.d.ts +19 -0
  464. package/types/proxy.d.ts +50 -0
  465. package/types/rate-limiter.d.ts +31 -0
  466. package/types/redirect-tracker.d.ts +37 -0
  467. package/types/redis-frontier.d.ts +48 -0
  468. package/types/redis-queue.d.ts +48 -0
  469. package/types/response-cache.d.ts +38 -0
  470. package/types/responsive-detector.d.ts +29 -0
  471. package/types/retry-policy.d.ts +20 -0
  472. package/types/robots-txt.d.ts +9 -0
  473. package/types/screen-reader.d.ts +15 -0
  474. package/types/screenshot-masker.d.ts +28 -0
  475. package/types/seo-checker.d.ts +33 -0
  476. package/types/service-worker-interceptor.d.ts +36 -0
  477. package/types/session-capture.d.ts +39 -0
  478. package/types/session-export.d.ts +49 -0
  479. package/types/shadow-dom-crawler.d.ts +35 -0
  480. package/types/sitemap-writer.d.ts +21 -0
  481. package/types/sitemap.d.ts +51 -0
  482. package/types/skyvern.d.ts +56 -0
  483. package/types/sqs-queue.d.ts +13 -0
  484. package/types/sso-token.d.ts +29 -0
  485. package/types/state-graph.d.ts +59 -0
  486. package/types/stealth/human-behavior.d.ts +20 -0
  487. package/types/telemetry.d.ts +34 -0
  488. package/types/test-executor.d.ts +84 -0
  489. package/types/tls-fingerprint.d.ts +50 -0
  490. package/types/url-pattern-completer.d.ts +28 -0
  491. package/types/visual-diff-verdict.d.ts +40 -0
  492. package/types/webhook-notifier.d.ts +30 -0
  493. package/types/websocket-detector.d.ts +24 -0
  494. package/types/worker.d.ts +1 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/screenshot-masker.ts"],
4
+ "sourcesContent": ["/**\n * Screenshot masker \u2014 blur or black-box PII regions in captured screenshots.\n *\n * Strategy: inject a CSS overlay into the page before screenshot capture that\n * covers detected PII-likely elements (input[type=email], input[type=password],\n * elements with PII-containing text) with a blur or solid black mask.\n *\n * This is a CSS-based approach (no image processing library needed):\n * 1. Identify likely-PII DOM elements via selectors\n * 2. Add an overlaid <div> with blur/black filter at each element's bounding box\n * 3. Take screenshot\n * 4. Remove overlays\n *\n * Falls back gracefully if elements are not found or overlay injection fails.\n */\n\nimport type { Page } from 'playwright';\n\nexport interface MaskingOpts {\n /** Additional CSS selectors to mask (in addition to defaults) */\n extraSelectors?: string[];\n /** Masking style: 'blur' or 'blackout' */\n style?: 'blur' | 'blackout';\n /** Blur strength in px (default 8) */\n blurPx?: number;\n}\n\n// Default PII-sensitive selectors\nconst DEFAULT_PII_SELECTORS = [\n 'input[type=\"email\"]',\n 'input[type=\"password\"]',\n 'input[type=\"tel\"]',\n 'input[autocomplete=\"cc-number\"]',\n 'input[autocomplete=\"cc-csc\"]',\n 'input[autocomplete=\"ssn\"]',\n '[data-pii=\"true\"]',\n '[data-sensitive=\"true\"]',\n];\n\nexport async function maskScreenshot(\n page: Page,\n opts: MaskingOpts = {},\n): Promise<{ maskedCount: number; screenshot: Buffer }> {\n const { extraSelectors = [], style = 'blur', blurPx = 8 } = opts;\n const selectors = [...DEFAULT_PII_SELECTORS, ...extraSelectors];\n\n let maskedCount = 0;\n const overlayIds: string[] = [];\n\n // Inject CSS overlays\n try {\n const result = await page.evaluate(({ selectors, style, blurPx }) => {\n const ids: string[] = [];\n for (const sel of selectors) {\n try {\n const elements = Array.from(document.querySelectorAll(sel));\n for (const el of elements) {\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) continue;\n const overlay = document.createElement('div');\n const id = `__zeta_mask_${Math.random().toString(36).slice(2)}`;\n overlay.id = id;\n overlay.style.cssText = [\n 'position: fixed',\n `top: ${rect.top + window.scrollY}px`,\n `left: ${rect.left + window.scrollX}px`,\n `width: ${rect.width}px`,\n `height: ${rect.height}px`,\n 'z-index: 2147483647',\n style === 'blur'\n ? `backdrop-filter: blur(${blurPx}px); -webkit-backdrop-filter: blur(${blurPx}px); background: rgba(0,0,0,0.1);`\n : 'background: #000000;',\n 'pointer-events: none',\n ].join('; ');\n document.body.appendChild(overlay);\n ids.push(id);\n }\n } catch { /* selector error */ }\n }\n return ids;\n }, { selectors, style, blurPx });\n\n overlayIds.push(...result);\n maskedCount = result.length;\n } catch { /* non-fatal */ }\n\n // Take screenshot with overlays active\n const screenshot = await page.screenshot({ type: 'png', fullPage: false });\n\n // Remove overlays\n if (overlayIds.length > 0) {\n await page.evaluate((ids) => {\n for (const id of ids) document.getElementById(id)?.remove();\n }, overlayIds).catch(() => {});\n }\n\n return { maskedCount, screenshot };\n}\n"],
5
+ "mappings": "AA4BA,MAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,eACpB,MACA,OAAoB,CAAC,GACiC;AACtD,QAAM,EAAE,iBAAiB,CAAC,GAAG,QAAQ,QAAQ,SAAS,EAAE,IAAI;AAC5D,QAAM,YAAY,CAAC,GAAG,uBAAuB,GAAG,cAAc;AAE9D,MAAI,cAAc;AAClB,QAAM,aAAuB,CAAC;AAG9B,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,EAAE,WAAAA,YAAW,OAAAC,QAAO,QAAAC,QAAO,MAAM;AACnE,YAAM,MAAgB,CAAC;AACvB,iBAAW,OAAOF,YAAW;AAC3B,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,SAAS,iBAAiB,GAAG,CAAC;AAC1D,qBAAW,MAAM,UAAU;AACzB,kBAAM,OAAO,GAAG,sBAAsB;AACtC,gBAAI,KAAK,UAAU,KAAK,KAAK,WAAW,EAAG;AAC3C,kBAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,kBAAM,KAAK,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7D,oBAAQ,KAAK;AACb,oBAAQ,MAAM,UAAU;AAAA,cACtB;AAAA,cACA,QAAQ,KAAK,MAAM,OAAO,OAAO;AAAA,cACjC,SAAS,KAAK,OAAO,OAAO,OAAO;AAAA,cACnC,UAAU,KAAK,KAAK;AAAA,cACpB,WAAW,KAAK,MAAM;AAAA,cACtB;AAAA,cACAC,WAAU,SACN,yBAAyBC,OAAM,sCAAsCA,OAAM,sCAC3E;AAAA,cACJ;AAAA,YACF,EAAE,KAAK,IAAI;AACX,qBAAS,KAAK,YAAY,OAAO;AACjC,gBAAI,KAAK,EAAE;AAAA,UACb;AAAA,QACF,QAAQ;AAAA,QAAuB;AAAA,MACjC;AACA,aAAO;AAAA,IACT,GAAG,EAAE,WAAW,OAAO,OAAO,CAAC;AAE/B,eAAW,KAAK,GAAG,MAAM;AACzB,kBAAc,OAAO;AAAA,EACvB,QAAQ;AAAA,EAAkB;AAG1B,QAAM,aAAa,MAAM,KAAK,WAAW,EAAE,MAAM,OAAO,UAAU,MAAM,CAAC;AAGzE,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,SAAS,CAAC,QAAQ;AAC3B,iBAAW,MAAM,IAAK,UAAS,eAAe,EAAE,GAAG,OAAO;AAAA,IAC5D,GAAG,UAAU,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/B;AAEA,SAAO,EAAE,aAAa,WAAW;AACnC;",
6
+ "names": ["selectors", "style", "blurPx"]
7
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SEO indexability checker — determines if a page is crawlable and indexable.
3
+ *
4
+ * Checks:
5
+ * 1. X-Robots-Tag response header (noindex, nofollow, noarchive)
6
+ * 2. <meta name="robots"> tag (noindex, nofollow)
7
+ * 3. Canonical URL (self-canonical vs cross-canonical)
8
+ * 4. rel="nofollow" on outbound links
9
+ * 5. hreflang tags (multilingual)
10
+ * 6. Open Graph completeness (og:title, og:description, og:image)
11
+ * 7. Structured data presence (JSON-LD)
12
+ * 8. Meta description
13
+ * 9. Title tag length (< 60 chars recommended)
14
+ * 10. URL structure (query params, fragments, excessive depth)
15
+ */
16
+ import type { Page } from 'playwright';
17
+ export interface SeoIssue {
18
+ rule: string;
19
+ severity: 'critical' | 'warning' | 'info';
20
+ message: string;
21
+ value?: string;
22
+ }
23
+ export interface SeoCheckResult {
24
+ url: string;
25
+ isIndexable: boolean;
26
+ canonicalUrl?: string;
27
+ isSelfCanonical?: boolean;
28
+ hreflang: Record<string, string>;
29
+ issues: SeoIssue[];
30
+ score: number;
31
+ checkedAt: string;
32
+ }
33
+ export declare function checkSeo(page: Page, url: string, responseHeaders?: Record<string, string>): Promise<SeoCheckResult>;
@@ -0,0 +1,91 @@
1
+ async function checkSeo(page, url, responseHeaders = {}) {
2
+ const issues = [];
3
+ const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
4
+ let isIndexable = true;
5
+ const robotsHeader = responseHeaders["x-robots-tag"] ?? "";
6
+ if (/noindex/i.test(robotsHeader)) {
7
+ isIndexable = false;
8
+ issues.push({ rule: "x-robots-noindex", severity: "critical", message: "X-Robots-Tag: noindex found in response header", value: robotsHeader });
9
+ }
10
+ const pageData = await page.evaluate(() => {
11
+ const meta = (name) => document.querySelector(`meta[name="${name}"]`)?.getAttribute("content") ?? "";
12
+ const og = (prop) => document.querySelector(`meta[property="og:${prop}"]`)?.getAttribute("content") ?? "";
13
+ const canonical = document.querySelector('link[rel="canonical"]')?.getAttribute("href") ?? "";
14
+ const hreflang = {};
15
+ document.querySelectorAll('link[rel="alternate"][hreflang]').forEach((el) => {
16
+ hreflang[el.getAttribute("hreflang")] = el.getAttribute("href") ?? "";
17
+ });
18
+ const jsonLd = Array.from(document.querySelectorAll('script[type="application/ld+json"]')).map((s) => s.textContent ?? "");
19
+ return {
20
+ robotsMeta: meta("robots"),
21
+ description: meta("description"),
22
+ title: document.title ?? "",
23
+ canonical,
24
+ hreflang,
25
+ ogTitle: og("title"),
26
+ ogDescription: og("description"),
27
+ ogImage: og("image"),
28
+ hasJsonLd: jsonLd.length > 0,
29
+ jsonLd
30
+ };
31
+ }).catch(() => ({
32
+ robotsMeta: "",
33
+ description: "",
34
+ title: "",
35
+ canonical: "",
36
+ hreflang: {},
37
+ ogTitle: "",
38
+ ogDescription: "",
39
+ ogImage: "",
40
+ hasJsonLd: false,
41
+ jsonLd: []
42
+ }));
43
+ if (/noindex/i.test(pageData.robotsMeta)) {
44
+ isIndexable = false;
45
+ issues.push({ rule: "meta-robots-noindex", severity: "critical", message: "Meta robots noindex found", value: pageData.robotsMeta });
46
+ }
47
+ let isSelfCanonical;
48
+ if (pageData.canonical) {
49
+ isSelfCanonical = pageData.canonical === url || pageData.canonical.replace(/\/$/, "") === url.replace(/\/$/, "");
50
+ if (!isSelfCanonical) {
51
+ issues.push({ rule: "cross-canonical", severity: "warning", message: "Cross-canonical points elsewhere", value: pageData.canonical });
52
+ }
53
+ } else {
54
+ issues.push({ rule: "missing-canonical", severity: "warning", message: "No canonical link tag" });
55
+ }
56
+ if (!pageData.title) {
57
+ issues.push({ rule: "missing-title", severity: "critical", message: "Page has no title tag" });
58
+ } else if (pageData.title.length > 60) {
59
+ issues.push({ rule: "title-too-long", severity: "warning", message: `Title ${pageData.title.length} chars (>60)`, value: pageData.title });
60
+ }
61
+ if (!pageData.description) {
62
+ issues.push({ rule: "missing-description", severity: "warning", message: "Missing meta description" });
63
+ } else if (pageData.description.length > 160) {
64
+ issues.push({ rule: "description-too-long", severity: "info", message: `Description ${pageData.description.length} chars (>160)` });
65
+ }
66
+ if (!pageData.ogTitle) issues.push({ rule: "missing-og-title", severity: "info", message: "Missing og:title" });
67
+ if (!pageData.ogImage) issues.push({ rule: "missing-og-image", severity: "info", message: "Missing og:image" });
68
+ if (!pageData.hasJsonLd) issues.push({ rule: "no-structured-data", severity: "info", message: "No JSON-LD structured data found" });
69
+ try {
70
+ const depth = new URL(url).pathname.split("/").filter(Boolean).length;
71
+ if (depth > 5) issues.push({ rule: "deep-url", severity: "info", message: `URL depth ${depth} (>5 levels)`, value: url });
72
+ } catch {
73
+ }
74
+ const criticals = issues.filter((i) => i.severity === "critical").length;
75
+ const warnings = issues.filter((i) => i.severity === "warning").length;
76
+ const score = Math.max(0, 100 - criticals * 20 - warnings * 5 - issues.filter((i) => i.severity === "info").length * 2);
77
+ return {
78
+ url,
79
+ isIndexable,
80
+ canonicalUrl: pageData.canonical || void 0,
81
+ isSelfCanonical,
82
+ hreflang: pageData.hreflang,
83
+ issues,
84
+ score,
85
+ checkedAt
86
+ };
87
+ }
88
+ export {
89
+ checkSeo
90
+ };
91
+ //# sourceMappingURL=seo-checker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/seo-checker.ts"],
4
+ "sourcesContent": ["/**\n * SEO indexability checker \u2014 determines if a page is crawlable and indexable.\n *\n * Checks:\n * 1. X-Robots-Tag response header (noindex, nofollow, noarchive)\n * 2. <meta name=\"robots\"> tag (noindex, nofollow)\n * 3. Canonical URL (self-canonical vs cross-canonical)\n * 4. rel=\"nofollow\" on outbound links\n * 5. hreflang tags (multilingual)\n * 6. Open Graph completeness (og:title, og:description, og:image)\n * 7. Structured data presence (JSON-LD)\n * 8. Meta description\n * 9. Title tag length (< 60 chars recommended)\n * 10. URL structure (query params, fragments, excessive depth)\n */\n\nimport type { Page } from 'playwright';\n\nexport interface SeoIssue {\n rule: string;\n severity: 'critical' | 'warning' | 'info';\n message: string;\n value?: string;\n}\n\nexport interface SeoCheckResult {\n url: string;\n isIndexable: boolean;\n canonicalUrl?: string;\n isSelfCanonical?: boolean;\n hreflang: Record<string, string>; // lang \u2192 url\n issues: SeoIssue[];\n score: number; // 0-100\n checkedAt: string;\n}\n\nexport async function checkSeo(page: Page, url: string, responseHeaders: Record<string, string> = {}): Promise<SeoCheckResult> {\n const issues: SeoIssue[] = [];\n const checkedAt = new Date().toISOString();\n let isIndexable = true;\n\n // 1. X-Robots-Tag\n const robotsHeader = responseHeaders['x-robots-tag'] ?? '';\n if (/noindex/i.test(robotsHeader)) {\n isIndexable = false;\n issues.push({ rule: 'x-robots-noindex', severity: 'critical', message: 'X-Robots-Tag: noindex found in response header', value: robotsHeader });\n }\n\n // 2-9. Page-level checks\n const pageData = await page.evaluate(() => {\n const meta = (name: string) => document.querySelector(`meta[name=\"${name}\"]`)?.getAttribute('content') ?? '';\n const og = (prop: string) => document.querySelector(`meta[property=\"og:${prop}\"]`)?.getAttribute('content') ?? '';\n const canonical = document.querySelector('link[rel=\"canonical\"]')?.getAttribute('href') ?? '';\n const hreflang: Record<string, string> = {};\n document.querySelectorAll('link[rel=\"alternate\"][hreflang]').forEach((el: any) => {\n hreflang[el.getAttribute('hreflang')] = el.getAttribute('href') ?? '';\n });\n const jsonLd = Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map((s: any) => s.textContent ?? '');\n return {\n robotsMeta: meta('robots'),\n description: meta('description'),\n title: document.title ?? '',\n canonical,\n hreflang,\n ogTitle: og('title'),\n ogDescription: og('description'),\n ogImage: og('image'),\n hasJsonLd: jsonLd.length > 0,\n jsonLd,\n };\n }).catch(() => ({\n robotsMeta: '', description: '', title: '', canonical: '', hreflang: {},\n ogTitle: '', ogDescription: '', ogImage: '', hasJsonLd: false, jsonLd: [],\n }));\n\n // 2. Meta robots\n if (/noindex/i.test(pageData.robotsMeta)) {\n isIndexable = false;\n issues.push({ rule: 'meta-robots-noindex', severity: 'critical', message: 'Meta robots noindex found', value: pageData.robotsMeta });\n }\n\n // 3. Canonical\n let isSelfCanonical: boolean | undefined;\n if (pageData.canonical) {\n isSelfCanonical = pageData.canonical === url || pageData.canonical.replace(/\\/$/, '') === url.replace(/\\/$/, '');\n if (!isSelfCanonical) {\n issues.push({ rule: 'cross-canonical', severity: 'warning', message: 'Cross-canonical points elsewhere', value: pageData.canonical });\n }\n } else {\n issues.push({ rule: 'missing-canonical', severity: 'warning', message: 'No canonical link tag' });\n }\n\n // 4. Title\n if (!pageData.title) {\n issues.push({ rule: 'missing-title', severity: 'critical', message: 'Page has no title tag' });\n } else if (pageData.title.length > 60) {\n issues.push({ rule: 'title-too-long', severity: 'warning', message: `Title ${pageData.title.length} chars (>60)`, value: pageData.title });\n }\n\n // 5. Meta description\n if (!pageData.description) {\n issues.push({ rule: 'missing-description', severity: 'warning', message: 'Missing meta description' });\n } else if (pageData.description.length > 160) {\n issues.push({ rule: 'description-too-long', severity: 'info', message: `Description ${pageData.description.length} chars (>160)` });\n }\n\n // 6. OG tags\n if (!pageData.ogTitle) issues.push({ rule: 'missing-og-title', severity: 'info', message: 'Missing og:title' });\n if (!pageData.ogImage) issues.push({ rule: 'missing-og-image', severity: 'info', message: 'Missing og:image' });\n\n // 7. Structured data\n if (!pageData.hasJsonLd) issues.push({ rule: 'no-structured-data', severity: 'info', message: 'No JSON-LD structured data found' });\n\n // 8. URL depth\n try {\n const depth = new URL(url).pathname.split('/').filter(Boolean).length;\n if (depth > 5) issues.push({ rule: 'deep-url', severity: 'info', message: `URL depth ${depth} (>5 levels)`, value: url });\n } catch {}\n\n const criticals = issues.filter(i => i.severity === 'critical').length;\n const warnings = issues.filter(i => i.severity === 'warning').length;\n const score = Math.max(0, 100 - criticals * 20 - warnings * 5 - issues.filter(i => i.severity === 'info').length * 2);\n\n return {\n url,\n isIndexable,\n canonicalUrl: pageData.canonical || undefined,\n isSelfCanonical,\n hreflang: pageData.hreflang,\n issues,\n score,\n checkedAt,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Service Worker detection — inspects SW registrations, cache storage, background
3
+ * sync queues, and PWA installability for a crawled page.
4
+ * Surfaces offline-first contracts and push-capable surfaces that HTTP-only
5
+ * crawlers cannot observe.
6
+ */
7
+ export interface SwRegistration {
8
+ scope: string;
9
+ scriptURL: string | null;
10
+ state: 'active' | 'installing' | 'waiting' | 'none';
11
+ updateViaCache: string;
12
+ }
13
+ export interface SwCacheEntry {
14
+ cacheName: string;
15
+ entryCount: number;
16
+ sampleUrls: string[];
17
+ }
18
+ export interface BackgroundSyncInfo {
19
+ scope: string;
20
+ pendingTags: string[];
21
+ }
22
+ export interface PwaInfo {
23
+ isInstallable: boolean;
24
+ manifestUrl: string | null;
25
+ hasPushPermission: boolean;
26
+ }
27
+ export interface ServiceWorkerResult {
28
+ supported: boolean;
29
+ active: boolean;
30
+ registrations: SwRegistration[];
31
+ cacheStorages: SwCacheEntry[];
32
+ backgroundSync: BackgroundSyncInfo[];
33
+ pwa: PwaInfo;
34
+ totalCachedEntries: number;
35
+ }
36
+ export declare function inspectServiceWorker(page: any): Promise<ServiceWorkerResult>;
@@ -0,0 +1,136 @@
1
+ const EMPTY_RESULT = {
2
+ supported: false,
3
+ active: false,
4
+ registrations: [],
5
+ cacheStorages: [],
6
+ backgroundSync: [],
7
+ pwa: { isInstallable: false, manifestUrl: null, hasPushPermission: false },
8
+ totalCachedEntries: 0
9
+ };
10
+ async function detectServiceWorkers(page) {
11
+ const result = await page.evaluate(async () => {
12
+ if (!("serviceWorker" in navigator)) return { supported: false, active: false, registrations: [] };
13
+ try {
14
+ const controller = navigator.serviceWorker.controller;
15
+ const regs = await navigator.serviceWorker.getRegistrations();
16
+ return {
17
+ supported: true,
18
+ active: !!controller,
19
+ registrations: regs.map((r) => ({
20
+ scope: r.scope,
21
+ scriptURL: r.active?.scriptURL || r.installing?.scriptURL || r.waiting?.scriptURL || null,
22
+ state: r.active ? "active" : r.installing ? "installing" : r.waiting ? "waiting" : "none",
23
+ updateViaCache: r.updateViaCache
24
+ }))
25
+ };
26
+ } catch {
27
+ return { supported: true, active: false, registrations: [] };
28
+ }
29
+ });
30
+ return result;
31
+ }
32
+ async function enumerateCacheStorage(page) {
33
+ const caches = await page.evaluate(async () => {
34
+ if (!("caches" in window)) return [];
35
+ try {
36
+ const names = await window.caches.keys();
37
+ const result = [];
38
+ for (const name of names) {
39
+ try {
40
+ const cache = await window.caches.open(name);
41
+ const keys = await cache.keys();
42
+ result.push({
43
+ cacheName: name,
44
+ entryCount: keys.length,
45
+ sampleUrls: keys.slice(0, 15).map((k) => {
46
+ try {
47
+ return new URL(k.url).pathname;
48
+ } catch {
49
+ return k.url.slice(0, 80);
50
+ }
51
+ })
52
+ });
53
+ } catch {
54
+ }
55
+ }
56
+ return result;
57
+ } catch {
58
+ return [];
59
+ }
60
+ });
61
+ return caches;
62
+ }
63
+ async function detectBackgroundSync(page) {
64
+ const syncInfo = await page.evaluate(async () => {
65
+ if (!("serviceWorker" in navigator)) return [];
66
+ try {
67
+ const regs = await navigator.serviceWorker.getRegistrations();
68
+ const result = [];
69
+ for (const reg of regs) {
70
+ if ("sync" in reg) {
71
+ try {
72
+ const tags = await reg.sync.getTags();
73
+ result.push({ scope: reg.scope, pendingTags: tags || [] });
74
+ } catch {
75
+ result.push({ scope: reg.scope, pendingTags: [] });
76
+ }
77
+ }
78
+ }
79
+ return result;
80
+ } catch {
81
+ return [];
82
+ }
83
+ });
84
+ return syncInfo;
85
+ }
86
+ async function detectPwa(page) {
87
+ const pwa = await page.evaluate(() => {
88
+ const manifestEl = document.querySelector('link[rel="manifest"]');
89
+ const manifestUrl = manifestEl?.getAttribute("href") || null;
90
+ const hasSW = "serviceWorker" in navigator && !!navigator.serviceWorker.controller;
91
+ let hasPushPermission = false;
92
+ try {
93
+ hasPushPermission = Notification.permission === "granted";
94
+ } catch {
95
+ }
96
+ return {
97
+ isInstallable: !!(manifestUrl && hasSW),
98
+ manifestUrl,
99
+ hasPushPermission
100
+ };
101
+ });
102
+ return pwa;
103
+ }
104
+ async function inspectServiceWorker(page) {
105
+ try {
106
+ const url = page.url();
107
+ const isSecureContext = url.startsWith("https://") || /^http:\/\/(localhost|127\.0\.0\.1)(:\d+)?/.test(url);
108
+ if (!isSecureContext) return { ...EMPTY_RESULT };
109
+ const [swResult, cacheResult, syncResult, pwaResult] = await Promise.allSettled([
110
+ detectServiceWorkers(page),
111
+ enumerateCacheStorage(page),
112
+ detectBackgroundSync(page),
113
+ detectPwa(page)
114
+ ]);
115
+ const sw = swResult.status === "fulfilled" ? swResult.value : { supported: false, active: false, registrations: [] };
116
+ const cacheStorages = cacheResult.status === "fulfilled" ? cacheResult.value : [];
117
+ const backgroundSync = syncResult.status === "fulfilled" ? syncResult.value : [];
118
+ const pwa = pwaResult.status === "fulfilled" ? pwaResult.value : EMPTY_RESULT.pwa;
119
+ const totalCachedEntries = cacheStorages.reduce((sum, c) => sum + c.entryCount, 0);
120
+ return {
121
+ supported: sw.supported,
122
+ active: sw.active,
123
+ registrations: sw.registrations,
124
+ cacheStorages,
125
+ backgroundSync,
126
+ pwa,
127
+ totalCachedEntries
128
+ };
129
+ } catch {
130
+ return { ...EMPTY_RESULT };
131
+ }
132
+ }
133
+ export {
134
+ inspectServiceWorker
135
+ };
136
+ //# sourceMappingURL=service-worker-interceptor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/service-worker-interceptor.ts"],
4
+ "sourcesContent": ["/**\n * Service Worker detection \u2014 inspects SW registrations, cache storage, background\n * sync queues, and PWA installability for a crawled page.\n * Surfaces offline-first contracts and push-capable surfaces that HTTP-only\n * crawlers cannot observe.\n */\n\nimport type { Page } from 'playwright';\n\nexport interface SwRegistration {\n scope: string;\n scriptURL: string | null;\n state: 'active' | 'installing' | 'waiting' | 'none';\n updateViaCache: string;\n}\n\nexport interface SwCacheEntry {\n cacheName: string;\n entryCount: number;\n sampleUrls: string[];\n}\n\nexport interface BackgroundSyncInfo {\n scope: string;\n pendingTags: string[];\n}\n\nexport interface PwaInfo {\n isInstallable: boolean;\n manifestUrl: string | null;\n hasPushPermission: boolean;\n}\n\nexport interface ServiceWorkerResult {\n supported: boolean;\n active: boolean;\n registrations: SwRegistration[];\n cacheStorages: SwCacheEntry[];\n backgroundSync: BackgroundSyncInfo[];\n pwa: PwaInfo;\n totalCachedEntries: number;\n}\n\nconst EMPTY_RESULT: ServiceWorkerResult = {\n supported: false,\n active: false,\n registrations: [],\n cacheStorages: [],\n backgroundSync: [],\n pwa: { isInstallable: false, manifestUrl: null, hasPushPermission: false },\n totalCachedEntries: 0,\n};\n\nasync function detectServiceWorkers(\n page: any,\n): Promise<{ supported: boolean; active: boolean; registrations: SwRegistration[] }> {\n const result = await page.evaluate(async () => {\n if (!('serviceWorker' in navigator)) return { supported: false, active: false, registrations: [] };\n try {\n const controller = navigator.serviceWorker.controller;\n const regs = await navigator.serviceWorker.getRegistrations();\n return {\n supported: true,\n active: !!controller,\n registrations: regs.map(r => ({\n scope: r.scope,\n scriptURL: r.active?.scriptURL || r.installing?.scriptURL || r.waiting?.scriptURL || null,\n state: r.active ? 'active' : r.installing ? 'installing' : r.waiting ? 'waiting' : 'none',\n updateViaCache: r.updateViaCache,\n })),\n };\n } catch {\n return { supported: true, active: false, registrations: [] };\n }\n });\n return result as { supported: boolean; active: boolean; registrations: SwRegistration[] };\n}\n\nasync function enumerateCacheStorage(page: any): Promise<SwCacheEntry[]> {\n const caches = await page.evaluate(async () => {\n if (!('caches' in window)) return [];\n try {\n const names = await window.caches.keys();\n const result = [];\n for (const name of names) {\n try {\n const cache = await window.caches.open(name);\n const keys = await cache.keys();\n result.push({\n cacheName: name,\n entryCount: keys.length,\n sampleUrls: keys.slice(0, 15).map(k => {\n try { return new URL(k.url).pathname; } catch { return k.url.slice(0, 80); }\n }),\n });\n } catch { /* skip inaccessible cache */ }\n }\n return result;\n } catch {\n return [];\n }\n });\n return caches as SwCacheEntry[];\n}\n\nasync function detectBackgroundSync(page: any): Promise<BackgroundSyncInfo[]> {\n const syncInfo = await page.evaluate(async () => {\n if (!('serviceWorker' in navigator)) return [];\n try {\n const regs = await navigator.serviceWorker.getRegistrations();\n const result = [];\n for (const reg of regs) {\n if ('sync' in reg) {\n try {\n const tags = await (reg as any).sync.getTags();\n result.push({ scope: reg.scope, pendingTags: tags || [] });\n } catch {\n result.push({ scope: reg.scope, pendingTags: [] });\n }\n }\n }\n return result;\n } catch {\n return [];\n }\n });\n return syncInfo as BackgroundSyncInfo[];\n}\n\nasync function detectPwa(page: any): Promise<PwaInfo> {\n const pwa = await page.evaluate(() => {\n const manifestEl = document.querySelector('link[rel=\"manifest\"]');\n const manifestUrl = manifestEl?.getAttribute('href') || null;\n const hasSW = 'serviceWorker' in navigator && !!navigator.serviceWorker.controller;\n let hasPushPermission = false;\n try { hasPushPermission = Notification.permission === 'granted'; } catch { /* ignore */ }\n return {\n isInstallable: !!(manifestUrl && hasSW),\n manifestUrl,\n hasPushPermission,\n };\n });\n return pwa as PwaInfo;\n}\n\nexport async function inspectServiceWorker(page: any): Promise<ServiceWorkerResult> {\n try {\n // Allow SW on HTTPS or localhost (http://localhost and http://127.0.0.1 support SW)\n const url = page.url();\n const isSecureContext = url.startsWith('https://') ||\n /^http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?/.test(url);\n if (!isSecureContext) return { ...EMPTY_RESULT };\n\n const [swResult, cacheResult, syncResult, pwaResult] = await Promise.allSettled([\n detectServiceWorkers(page),\n enumerateCacheStorage(page),\n detectBackgroundSync(page),\n detectPwa(page),\n ]);\n\n const sw = swResult.status === 'fulfilled'\n ? swResult.value\n : { supported: false, active: false, registrations: [] };\n\n const cacheStorages = cacheResult.status === 'fulfilled' ? cacheResult.value : [];\n const backgroundSync = syncResult.status === 'fulfilled' ? syncResult.value : [];\n const pwa = pwaResult.status === 'fulfilled'\n ? pwaResult.value\n : EMPTY_RESULT.pwa;\n\n const totalCachedEntries = cacheStorages.reduce((sum, c) => sum + c.entryCount, 0);\n\n return {\n supported: sw.supported,\n active: sw.active,\n registrations: sw.registrations,\n cacheStorages,\n backgroundSync,\n pwa,\n totalCachedEntries,\n };\n } catch {\n return { ...EMPTY_RESULT };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Opens a headed (visible) browser at appUrl and returns a captureId.
3
+ * The user logs in manually, then calls completeSessionCapture() to harvest storageState.
4
+ * Sessions expire after 10 minutes if not completed.
5
+ *
6
+ * Throws 'HEADLESS_ENV' if running in Docker/Linux without a display server.
7
+ * The API route surfaces this as a 503 so the frontend can switch to manual JSON paste.
8
+ */
9
+ export declare function startSessionCapture(appUrl: string): Promise<string>;
10
+ /** Captures storageState from the open browser, closes it, and returns the JSON string. */
11
+ export declare function completeSessionCapture(captureId: string): Promise<string>;
12
+ /** Closes the browser without capturing — called on Cancel. */
13
+ export declare function cancelSessionCapture(captureId: string): Promise<void>;
14
+ /**
15
+ * Headless login + session capture — works on Docker/cloud (no display needed).
16
+ * Tries DOM-based login first (fast, free). If it fails and llmConfig is provided,
17
+ * falls back to Stagehand AI-guided login (handles modals, multi-step, marketing pages).
18
+ *
19
+ * Returns { storageState, cookies, localStorage } on success.
20
+ * Throws a human-readable error on failure.
21
+ */
22
+ export declare function validateAndCaptureSession(appUrl: string, creds: {
23
+ username: string;
24
+ password: string;
25
+ totpSecret?: string;
26
+ httpBasicUsername?: string;
27
+ httpBasicPassword?: string;
28
+ }, llmConfig?: {
29
+ modelName: string;
30
+ apiKey: string;
31
+ }, captchaOpts?: {
32
+ apiKey?: string;
33
+ provider?: '2captcha' | 'capsolver';
34
+ }, loginInstructions?: string): Promise<{
35
+ storageState: string;
36
+ cookies: number;
37
+ localStorage: number;
38
+ finalUrl?: string;
39
+ }>;