@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,259 @@
1
+ /**
2
+ * Incremental crawl diff — compute stable content hashes and skip unchanged screens.
3
+ *
4
+ * Each crawled page gets a content fingerprint (murmurhash-free, pure JS).
5
+ * On the next crawl of the same project, pages with the same fingerprint are
6
+ * marked SKIPPED instead of re-processed, drastically reducing crawl time and
7
+ * LLM token spend for sites with mostly-static content.
8
+ *
9
+ * Design: "same content hash" means the meaningful text hasn't changed.
10
+ * Layout/CSS/JS changes that don't affect visible text are ignored intentionally.
11
+ */
12
+
13
+ export interface ContentHash {
14
+ url: string;
15
+ hash: string;
16
+ textLength: number;
17
+ computedAt: string; // ISO timestamp
18
+ }
19
+
20
+ export interface DiffResult {
21
+ url: string;
22
+ changed: boolean;
23
+ previousHash?: string;
24
+ currentHash: string;
25
+ reason: 'new' | 'changed' | 'unchanged';
26
+ }
27
+
28
+ /**
29
+ * Compute a stable 64-bit-ish hash from text content.
30
+ * djb2 variant — fast, no deps, collision-resistant enough for content fingerprinting.
31
+ */
32
+ export function hashContent(text: string): string {
33
+ let h1 = 5381;
34
+ let h2 = 52711;
35
+ for (let i = 0; i < text.length; i++) {
36
+ const c = text.charCodeAt(i);
37
+ h1 = (Math.imul(h1, 33) ^ c) >>> 0;
38
+ h2 = (Math.imul(h2, 31) ^ c) >>> 0;
39
+ }
40
+ return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');
41
+ }
42
+
43
+ /**
44
+ * Normalize text before hashing — strips whitespace-only lines, trims each line,
45
+ * collapses runs of blank lines. Makes hash stable across minor formatting changes.
46
+ */
47
+ export function normalizeText(text: string): string {
48
+ return text
49
+ .split('\n')
50
+ .map(l => l.trim())
51
+ .filter(l => l.length > 0)
52
+ .join('\n');
53
+ }
54
+
55
+ export function computeContentHash(url: string, markdownText: string): ContentHash {
56
+ const normalized = normalizeText(markdownText);
57
+ return {
58
+ url,
59
+ hash: hashContent(normalized),
60
+ textLength: normalized.length,
61
+ computedAt: new Date().toISOString(),
62
+ };
63
+ }
64
+
65
+ /**
66
+ * Compare a page's current content against prior hashes.
67
+ * Returns { changed: false } for unchanged pages — caller should skip re-processing.
68
+ */
69
+ export function diffContent(
70
+ url: string,
71
+ currentMarkdown: string,
72
+ priorHashes: Map<string, string>, // url → hash
73
+ ): DiffResult {
74
+ const current = computeContentHash(url, currentMarkdown);
75
+ const prior = priorHashes.get(url);
76
+
77
+ if (!prior) {
78
+ return { url, changed: true, currentHash: current.hash, reason: 'new' };
79
+ }
80
+ if (prior === current.hash) {
81
+ return { url, changed: false, previousHash: prior, currentHash: current.hash, reason: 'unchanged' };
82
+ }
83
+ return { url, changed: true, previousHash: prior, currentHash: current.hash, reason: 'changed' };
84
+ }
85
+
86
+ /**
87
+ * Build a hash map from prior screen records (from DB query result).
88
+ * screenRecords: Array<{ url: string; elementHash?: string | null }>
89
+ */
90
+ export function buildPriorHashMap(screenRecords: Array<{ url: string; elementHash?: string | null }>): Map<string, string> {
91
+ const map = new Map<string, string>();
92
+ for (const s of screenRecords) {
93
+ if (s.url && s.elementHash) map.set(s.url, s.elementHash);
94
+ }
95
+ return map;
96
+ }
97
+
98
+ /**
99
+ * Filter a batch of discovered URLs against prior hashes.
100
+ * Returns { toProcess, toSkip } — caller enqueues toProcess, logs toSkip count.
101
+ *
102
+ * Note: filtering at URL level only works if the prior crawl already visited the URL.
103
+ * For new URLs, they're always in toProcess.
104
+ */
105
+ export function partitionByChange(
106
+ urls: string[],
107
+ priorHashes: Map<string, string>,
108
+ ): { toProcess: string[]; toSkip: string[] } {
109
+ const toProcess: string[] = [];
110
+ const toSkip: string[] = [];
111
+ for (const url of urls) {
112
+ if (priorHashes.has(url)) {
113
+ // Can't know if changed without fetching — still needs fetch, but hash after fetch
114
+ // will determine skip. Include all — hash check happens post-fetch.
115
+ toProcess.push(url);
116
+ } else {
117
+ toProcess.push(url);
118
+ }
119
+ }
120
+ return { toProcess, toSkip };
121
+ }
122
+
123
+ // ─── Typed monitor diffs (GAP-01) ───────────────────────────────────────────
124
+
125
+ /** A single line-level change in text content (markdown, html, summary). */
126
+ export interface TextChange {
127
+ type: 'added' | 'removed';
128
+ line: number;
129
+ content: string;
130
+ }
131
+
132
+ /** A change to a specific JSON path between two scraped JSON objects. */
133
+ export interface JsonChange {
134
+ path: string;
135
+ old: unknown;
136
+ new: unknown;
137
+ }
138
+
139
+ /** Set-based change for collections like links or images. */
140
+ export interface SetChange {
141
+ added: string[];
142
+ removed: string[];
143
+ }
144
+
145
+ /** Screenshot pixel-level change. changed is percentage (0-100). */
146
+ export interface ImageChange {
147
+ size: number;
148
+ changed: number;
149
+ mask?: string; // base64 diff mask
150
+ }
151
+
152
+ /** All possible diffs for a single monitor tick. */
153
+ export interface MonitorDiffs {
154
+ markdown?: TextChange[];
155
+ html?: TextChange[];
156
+ json?: JsonChange[];
157
+ summary?: TextChange[];
158
+ links?: SetChange;
159
+ images?: SetChange;
160
+ branding?: JsonChange[];
161
+ screenshot?: ImageChange;
162
+ }
163
+
164
+ /**
165
+ * Compute line-level text diffs between two strings.
166
+ * Returns TextChange[] showing exactly which lines were added or removed.
167
+ * No external dependencies — pure JS Myers-inspired algorithm.
168
+ */
169
+ export function computeTextDiffs(previous: string, current: string): TextChange[] {
170
+ const prevLines = previous.split('\n');
171
+ const currLines = current.split('\n');
172
+ const changes: TextChange[] = [];
173
+
174
+ const prevSet = new Set(prevLines);
175
+ const currSet = new Set(currLines);
176
+
177
+ let lineNum = 0;
178
+ for (const line of prevLines) {
179
+ if (!currSet.has(line)) {
180
+ changes.push({ type: 'removed', line: lineNum, content: line });
181
+ }
182
+ lineNum++;
183
+ }
184
+ lineNum = 0;
185
+ for (const line of currLines) {
186
+ if (!prevSet.has(line)) {
187
+ changes.push({ type: 'added', line: lineNum, content: line });
188
+ }
189
+ lineNum++;
190
+ }
191
+
192
+ return changes;
193
+ }
194
+
195
+ /**
196
+ * Compute set-based diffs for URL collections (links, images).
197
+ */
198
+ export function computeSetDiffs(previous: string[], current: string[]): SetChange {
199
+ const prevSet = new Set(previous);
200
+ const currSet = new Set(current);
201
+ return {
202
+ added: current.filter(u => !prevSet.has(u)),
203
+ removed: previous.filter(u => !currSet.has(u)),
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Flatten a JSON object into dot-notation path/value pairs.
209
+ * Used to compute JsonChange[] between two JSON extraction results.
210
+ */
211
+ export function flattenJson(obj: unknown, prefix = ''): Record<string, unknown> {
212
+ if (typeof obj !== 'object' || obj === null) {
213
+ return { [prefix]: obj };
214
+ }
215
+ const result: Record<string, unknown> = {};
216
+ for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {
217
+ const path = prefix ? `${prefix}.${k}` : k;
218
+ if (typeof v === 'object' && v !== null && !Array.isArray(v)) {
219
+ Object.assign(result, flattenJson(v, path));
220
+ } else {
221
+ result[path] = v;
222
+ }
223
+ }
224
+ return result;
225
+ }
226
+
227
+ /**
228
+ * Compute JSON path-level diffs between two extraction results.
229
+ */
230
+ export function computeJsonDiffs(previous: unknown, current: unknown): JsonChange[] {
231
+ const prevFlat = flattenJson(previous);
232
+ const currFlat = flattenJson(current);
233
+ const allKeys = new Set([...Object.keys(prevFlat), ...Object.keys(currFlat)]);
234
+ const changes: JsonChange[] = [];
235
+ for (const path of allKeys) {
236
+ const oldVal = prevFlat[path];
237
+ const newVal = currFlat[path];
238
+ if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {
239
+ changes.push({ path, old: oldVal, new: newVal });
240
+ }
241
+ }
242
+ return changes;
243
+ }
244
+
245
+ /**
246
+ * Count total number of changes across all diff types.
247
+ */
248
+ export function countMonitorDiffs(diffs: MonitorDiffs): number {
249
+ let count = 0;
250
+ if (diffs.markdown) count += diffs.markdown.length;
251
+ if (diffs.html) count += diffs.html.length;
252
+ if (diffs.json) count += diffs.json.length;
253
+ if (diffs.summary) count += diffs.summary.length;
254
+ if (diffs.links) count += diffs.links.added.length + diffs.links.removed.length;
255
+ if (diffs.images) count += diffs.images.added.length + diffs.images.removed.length;
256
+ if (diffs.branding) count += diffs.branding.length;
257
+ if (diffs.screenshot) count += diffs.screenshot.changed > 0 ? 1 : 0;
258
+ return count;
259
+ }
package/src/index.ts ADDED
@@ -0,0 +1,52 @@
1
+ export * from './crawler.js';
2
+ export * from './visual-diff-verdict.js';
3
+ export * from './auth.js';
4
+ export * from './screen-reader.js';
5
+ export * from './job-queue.js';
6
+ export { startSqsWorker, getDlqStats, redriveFromDlq } from './sqs-queue.js';
7
+ export * from './session-capture.js';
8
+ export * from './session-export.js';
9
+ export * from './test-executor.js';
10
+ export { startLiveView, getFrame, liveViewNavigate, completeLiveView, closeLiveView, sendInput } from './live-view.js';
11
+ export { waitForEmailOTP, getInboxEmail } from './email-otp.js';
12
+ export { getSsoToken, getSsoClientCredentialsToken } from './sso-token.js';
13
+ export type { SsoConfig, SsoProvider } from './sso-token.js';
14
+ export * from './engine-router.js';
15
+ export * from './profiles/domain-profile.js';
16
+ export * from './policies/crawl-safety.js';
17
+ export * from './extractors/artifact-envelope.js';
18
+ export * from './network-observer.js';
19
+ export { createChromeTlsAgent, probeTlsFingerprint, chromeTlsAgent, CHROME_TLS_HEADERS } from './tls-fingerprint.js';
20
+ export type { TlsFingerprintOptions } from './tls-fingerprint.js';
21
+ export { prepareExtensionProfile, adBlockerProfile } from './browser-extension.js';
22
+ export type { ExtensionSource, ExtensionProfile } from './browser-extension.js';
23
+ export { createRedisQueue, maybeCreateRedisQueue, isRedisQueueEnabled } from './redis-queue.js';
24
+ export type { RedisQueueJob, RedisQueueClient } from './redis-queue.js';
25
+ export { discoverProjectUrls, discoverSitemapUrls } from './sitemap.js';
26
+ export type { UrlCandidate } from './sitemap.js';
27
+ export { httpCrawl } from './http-engine.js';
28
+ export { extractMarkdown } from './markdown-extract.js';
29
+ export type { ExtractedMarkdown } from './markdown-extract.js';
30
+ export type { HttpScreen, HttpCrawlOpts, HttpCrawlResult, HttpOutputFormat } from './http-engine.js';
31
+ export { TieredProxyManager } from './proxy.js';
32
+ export type { ProxyTier, ProxyTierConfig } from './proxy.js';
33
+ export { RedisCrawlFrontier, isRedisFrontierEnabled } from './redis-frontier.js';
34
+ export { startSpan, endSpan, withSpan, increment, flushMetrics } from './telemetry.js';
35
+ export type { Span, FinishedSpan } from './telemetry.js';
36
+ export { analyzeFailure } from './failure-analysis-agent.js';
37
+ export type { FailureContext } from './failure-analysis-agent.js';
38
+ export { elementToPlaywrightLocator, elementsToPlaywrightLocators, formatLocatorsForPrompt, detectAuthWallLocators } from './locator-extractor.js';
39
+ export type { PlaywrightLocator } from './locator-extractor.js';
40
+ export * from './dropdown-enumerator.js';
41
+ export * from './crud-interaction.js';
42
+ export * from './filter-pagination-crawler.js';
43
+ export * from './multi-context-handler.js';
44
+ export * from './advanced-ui-probes.js';
45
+ export * from './state-graph.js';
46
+ export * from './nested-window-crawler.js';
47
+ export * from './shadow-dom-crawler.js';
48
+ export * from './network-action-correlator.js';
49
+ export * from './crawl-session-manager.js';
50
+ export * from './accessibility-tree-crawler.js';
51
+ export * from './performance-metrics.js';
52
+ export * from './service-worker-interceptor.js';
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Input fuzzer — generate test data for form fields.
3
+ *
4
+ * For each field type, produces a set of test values covering:
5
+ * - Happy path (valid, normal input)
6
+ * - Boundary (min/max length, min/max value)
7
+ * - Edge cases (empty, very long, special chars, SQL injection probe, XSS probe)
8
+ * - Type-invalid (wrong type for the field)
9
+ *
10
+ * This feeds ZeTa's test generator to automatically create form validation tests.
11
+ * Values are safe probes (NOT actual exploits) — they test whether the app
12
+ * properly rejects/accepts boundary inputs.
13
+ */
14
+
15
+ import type { FormField } from './form-detector.js';
16
+
17
+ export type InputCase = {
18
+ label: string; // human-readable test case name
19
+ value: string;
20
+ expectedValid: boolean; // true if input should be accepted
21
+ category: 'happy' | 'boundary' | 'edge' | 'invalid';
22
+ };
23
+
24
+ const LOREM = 'Lorem ipsum dolor sit amet consectetur adipiscing elit';
25
+
26
+ function generateEmailCases(): InputCase[] {
27
+ return [
28
+ { label: 'valid email', value: 'test@example.com', expectedValid: true, category: 'happy' },
29
+ { label: 'email with plus', value: 'test+tag@example.com', expectedValid: true, category: 'happy' },
30
+ { label: 'missing @', value: 'notanemail.com', expectedValid: false, category: 'invalid' },
31
+ { label: 'missing domain', value: 'test@', expectedValid: false, category: 'invalid' },
32
+ { label: 'empty', value: '', expectedValid: false, category: 'edge' },
33
+ { label: 'very long email', value: 'a'.repeat(100) + '@example.com', expectedValid: false, category: 'boundary' },
34
+ { label: 'special chars', value: 'test<script>@example.com', expectedValid: false, category: 'edge' },
35
+ ];
36
+ }
37
+
38
+ function generatePasswordCases(minLength?: number, maxLength?: number): InputCase[] {
39
+ const min = minLength ?? 8;
40
+ const max = maxLength ?? 128;
41
+ return [
42
+ { label: 'valid password', value: 'ValidP@ss1', expectedValid: true, category: 'happy' },
43
+ { label: 'minimum length', value: 'A'.repeat(min), expectedValid: true, category: 'boundary' },
44
+ { label: 'below minimum', value: 'A'.repeat(Math.max(1, min - 1)), expectedValid: false, category: 'boundary' },
45
+ { label: 'max length', value: 'Aa1!'.repeat(Math.ceil(max / 4)).slice(0, max), expectedValid: true, category: 'boundary' },
46
+ { label: 'empty', value: '', expectedValid: false, category: 'edge' },
47
+ { label: 'spaces only', value: ' ', expectedValid: false, category: 'edge' },
48
+ ];
49
+ }
50
+
51
+ function generateTextCases(minLength?: number, maxLength?: number, required?: boolean): InputCase[] {
52
+ const cases: InputCase[] = [
53
+ { label: 'typical text', value: 'Test Input Value', expectedValid: true, category: 'happy' },
54
+ { label: 'single char', value: 'A', expectedValid: !minLength || minLength <= 1, category: 'boundary' },
55
+ { label: 'empty', value: '', expectedValid: !required, category: 'edge' },
56
+ { label: 'spaces only', value: ' ', expectedValid: !required, category: 'edge' },
57
+ { label: 'very long text', value: LOREM.repeat(20), expectedValid: !maxLength || maxLength > LOREM.length * 20, category: 'boundary' },
58
+ { label: 'unicode', value: '日本語テスト Ünïcödé Emojitest 🎉', expectedValid: true, category: 'edge' },
59
+ { label: 'HTML special chars', value: '<script>alert(1)</script>', expectedValid: true, category: 'edge' },
60
+ { label: 'SQL probe', value: "' OR '1'='1", expectedValid: true, category: 'edge' },
61
+ ];
62
+ if (minLength) cases.push({ label: `below min (${minLength})`, value: 'x'.repeat(Math.max(0, minLength - 1)), expectedValid: false, category: 'boundary' });
63
+ if (maxLength) cases.push({ label: `above max (${maxLength})`, value: 'x'.repeat(maxLength + 1), expectedValid: false, category: 'boundary' });
64
+ return cases;
65
+ }
66
+
67
+ function generateNumberCases(min?: string, max?: string): InputCase[] {
68
+ const minN = min !== undefined ? parseFloat(min) : undefined;
69
+ const maxN = max !== undefined ? parseFloat(max) : undefined;
70
+ return [
71
+ { label: 'valid number', value: '42', expectedValid: true, category: 'happy' },
72
+ { label: 'zero', value: '0', expectedValid: minN === undefined || minN <= 0, category: 'boundary' },
73
+ { label: 'negative', value: '-1', expectedValid: minN === undefined || minN < 0, category: 'boundary' },
74
+ { label: 'decimal', value: '3.14', expectedValid: true, category: 'happy' },
75
+ { label: 'text as number', value: 'notanumber', expectedValid: false, category: 'invalid' },
76
+ { label: 'empty', value: '', expectedValid: false, category: 'edge' },
77
+ ...(minN !== undefined ? [{ label: `below min (${min})`, value: String(minN - 1), expectedValid: false, category: 'boundary' as const }] : []),
78
+ ...(maxN !== undefined ? [{ label: `above max (${max})`, value: String(maxN + 1), expectedValid: false, category: 'boundary' as const }] : []),
79
+ ];
80
+ }
81
+
82
+ function generateSelectCases(options?: string[]): InputCase[] {
83
+ if (!options?.length) return [{ label: 'first option', value: '', expectedValid: true, category: 'happy' }];
84
+ return [
85
+ { label: `first option (${options[0]})`, value: options[0], expectedValid: true, category: 'happy' },
86
+ { label: 'invalid option', value: '__INVALID_OPTION__', expectedValid: false, category: 'invalid' },
87
+ { label: 'empty selection', value: '', expectedValid: false, category: 'edge' },
88
+ ...(options.length > 1 ? [{ label: `last option (${options[options.length - 1]})`, value: options[options.length - 1], expectedValid: true, category: 'happy' as const }] : []),
89
+ ];
90
+ }
91
+
92
+ export function generateFieldCases(field: FormField): InputCase[] {
93
+ switch (field.type) {
94
+ case 'email': return generateEmailCases();
95
+ case 'password': return generatePasswordCases(field.minLength, field.maxLength);
96
+ case 'number': return generateNumberCases(field.min, field.max);
97
+ case 'select': return generateSelectCases(field.options);
98
+ case 'checkbox': return [
99
+ { label: 'checked', value: 'true', expectedValid: true, category: 'happy' },
100
+ { label: 'unchecked', value: 'false', expectedValid: !field.required, category: field.required ? 'invalid' : 'happy' },
101
+ ];
102
+ case 'date': return [
103
+ { label: 'valid date', value: '2026-01-15', expectedValid: true, category: 'happy' },
104
+ { label: 'invalid date', value: '9999-99-99', expectedValid: false, category: 'invalid' },
105
+ { label: 'empty', value: '', expectedValid: !field.required, category: 'edge' },
106
+ ];
107
+ case 'url': return [
108
+ { label: 'valid URL', value: 'https://example.com', expectedValid: true, category: 'happy' },
109
+ { label: 'missing protocol', value: 'example.com', expectedValid: false, category: 'invalid' },
110
+ { label: 'empty', value: '', expectedValid: !field.required, category: 'edge' },
111
+ ];
112
+ default:
113
+ return generateTextCases(field.minLength, field.maxLength, field.required);
114
+ }
115
+ }
116
+
117
+ export interface FuzzedForm {
118
+ formIndex: number;
119
+ purpose: string;
120
+ fieldCases: Array<{ field: FormField; cases: InputCase[] }>;
121
+ }
122
+
123
+ export function fuzzForm(form: import('./form-detector.js').DetectedForm): FuzzedForm {
124
+ return {
125
+ formIndex: form.index,
126
+ purpose: form.purpose,
127
+ fieldCases: form.fields.map(field => ({ field, cases: generateFieldCases(field) })),
128
+ };
129
+ }