@detiq/crawler 0.1.3

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 (412) hide show
  1. package/Dockerfile +49 -0
  2. package/README.md +11 -0
  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/ai-login.d.ts +32 -0
  7. package/dist/ai-login.js +177 -0
  8. package/dist/ai-login.js.map +7 -0
  9. package/dist/auth-token-rotator.d.ts +47 -0
  10. package/dist/auth-token-rotator.js +58 -0
  11. package/dist/auth-token-rotator.js.map +7 -0
  12. package/dist/auth.d.ts +20 -0
  13. package/dist/auth.js +329 -0
  14. package/dist/auth.js.map +7 -0
  15. package/dist/browser-extension.d.ts +37 -0
  16. package/dist/browser-extension.js +113 -0
  17. package/dist/browser-extension.js.map +7 -0
  18. package/dist/captcha-solver.d.ts +16 -0
  19. package/dist/captcha-solver.js +105 -0
  20. package/dist/captcha-solver.js.map +7 -0
  21. package/dist/color-contrast.d.ts +30 -0
  22. package/dist/color-contrast.js +78 -0
  23. package/dist/color-contrast.js.map +7 -0
  24. package/dist/content-chunker.d.ts +18 -0
  25. package/dist/content-chunker.js +152 -0
  26. package/dist/content-chunker.js.map +7 -0
  27. package/dist/content-dedup.d.ts +23 -0
  28. package/dist/content-dedup.js +60 -0
  29. package/dist/content-dedup.js.map +7 -0
  30. package/dist/cookie-consent.d.ts +25 -0
  31. package/dist/cookie-consent.js +78 -0
  32. package/dist/cookie-consent.js.map +7 -0
  33. package/dist/cookie-jar.d.ts +20 -0
  34. package/dist/cookie-jar.js +61 -0
  35. package/dist/cookie-jar.js.map +7 -0
  36. package/dist/crawler.d.ts +179 -0
  37. package/dist/crawler.js +3672 -0
  38. package/dist/crawler.js.map +7 -0
  39. package/dist/custom-js-injector.d.ts +42 -0
  40. package/dist/custom-js-injector.js +50 -0
  41. package/dist/custom-js-injector.js.map +7 -0
  42. package/dist/dark-mode-capture.d.ts +23 -0
  43. package/dist/dark-mode-capture.js +75 -0
  44. package/dist/dark-mode-capture.js.map +7 -0
  45. package/dist/dead-link-detector.d.ts +37 -0
  46. package/dist/dead-link-detector.js +50 -0
  47. package/dist/dead-link-detector.js.map +7 -0
  48. package/dist/element-hash.d.ts +9 -0
  49. package/dist/element-hash.js +9 -0
  50. package/dist/element-hash.js.map +7 -0
  51. package/dist/email-otp.d.ts +42 -0
  52. package/dist/email-otp.js +177 -0
  53. package/dist/email-otp.js.map +7 -0
  54. package/dist/engine-router.d.ts +47 -0
  55. package/dist/engine-router.js +94 -0
  56. package/dist/engine-router.js.map +7 -0
  57. package/dist/export/bulk-export.d.ts +26 -0
  58. package/dist/export/bulk-export.js +76 -0
  59. package/dist/export/bulk-export.js.map +7 -0
  60. package/dist/export/vector-export.d.ts +76 -0
  61. package/dist/export/vector-export.js +85 -0
  62. package/dist/export/vector-export.js.map +7 -0
  63. package/dist/extractors/advanced.d.ts +54 -0
  64. package/dist/extractors/advanced.js +245 -0
  65. package/dist/extractors/advanced.js.map +7 -0
  66. package/dist/extractors/artifact-envelope.d.ts +63 -0
  67. package/dist/extractors/artifact-envelope.js +63 -0
  68. package/dist/extractors/artifact-envelope.js.map +7 -0
  69. package/dist/failure-analysis-agent.d.ts +16 -0
  70. package/dist/failure-analysis-agent.js +40 -0
  71. package/dist/failure-analysis-agent.js.map +7 -0
  72. package/dist/feature-flag-detector.d.ts +30 -0
  73. package/dist/feature-flag-detector.js +55 -0
  74. package/dist/feature-flag-detector.js.map +7 -0
  75. package/dist/form-detector.d.ts +34 -0
  76. package/dist/form-detector.js +58 -0
  77. package/dist/form-detector.js.map +7 -0
  78. package/dist/frontier.d.ts +32 -0
  79. package/dist/frontier.js +83 -0
  80. package/dist/frontier.js.map +7 -0
  81. package/dist/gap-pass.d.ts +35 -0
  82. package/dist/gap-pass.js +81 -0
  83. package/dist/gap-pass.js.map +7 -0
  84. package/dist/graphql-detector.d.ts +39 -0
  85. package/dist/graphql-detector.js +86 -0
  86. package/dist/graphql-detector.js.map +7 -0
  87. package/dist/http-engine.d.ts +80 -0
  88. package/dist/http-engine.js +304 -0
  89. package/dist/http-engine.js.map +7 -0
  90. package/dist/incremental-diff.d.ts +59 -0
  91. package/dist/incremental-diff.js +61 -0
  92. package/dist/incremental-diff.js.map +7 -0
  93. package/dist/index.d.ts +35 -0
  94. package/dist/index.js +61 -0
  95. package/dist/index.js.map +7 -0
  96. package/dist/input-fuzzer.d.ts +30 -0
  97. package/dist/input-fuzzer.js +105 -0
  98. package/dist/input-fuzzer.js.map +7 -0
  99. package/dist/interactive-probe.d.ts +104 -0
  100. package/dist/interactive-probe.js +442 -0
  101. package/dist/interactive-probe.js.map +7 -0
  102. package/dist/job-queue.d.ts +171 -0
  103. package/dist/job-queue.js +2256 -0
  104. package/dist/job-queue.js.map +7 -0
  105. package/dist/js-coverage.d.ts +29 -0
  106. package/dist/js-coverage.js +56 -0
  107. package/dist/js-coverage.js.map +7 -0
  108. package/dist/js-router-detector.d.ts +17 -0
  109. package/dist/js-router-detector.js +90 -0
  110. package/dist/js-router-detector.js.map +7 -0
  111. package/dist/language-detector.d.ts +22 -0
  112. package/dist/language-detector.js +57 -0
  113. package/dist/language-detector.js.map +7 -0
  114. package/dist/link-classifier.d.ts +23 -0
  115. package/dist/link-classifier.js +40 -0
  116. package/dist/link-classifier.js.map +7 -0
  117. package/dist/live-view.d.ts +36 -0
  118. package/dist/live-view.js +100 -0
  119. package/dist/live-view.js.map +7 -0
  120. package/dist/logger.d.ts +2 -0
  121. package/dist/logger.js +10 -0
  122. package/dist/logger.js.map +7 -0
  123. package/dist/markdown-extract.d.ts +8 -0
  124. package/dist/markdown-extract.js +54 -0
  125. package/dist/markdown-extract.js.map +7 -0
  126. package/dist/native-crawler.d.ts +69 -0
  127. package/dist/native-crawler.js +839 -0
  128. package/dist/native-crawler.js.map +7 -0
  129. package/dist/network-observer.d.ts +49 -0
  130. package/dist/network-observer.js +149 -0
  131. package/dist/network-observer.js.map +7 -0
  132. package/dist/network-throttle.d.ts +25 -0
  133. package/dist/network-throttle.js +34 -0
  134. package/dist/network-throttle.js.map +7 -0
  135. package/dist/openapi-generator.d.ts +49 -0
  136. package/dist/openapi-generator.js +89 -0
  137. package/dist/openapi-generator.js.map +7 -0
  138. package/dist/pdf-extractor.d.ts +28 -0
  139. package/dist/pdf-extractor.js +81 -0
  140. package/dist/pdf-extractor.js.map +7 -0
  141. package/dist/performance-metrics.d.ts +53 -0
  142. package/dist/performance-metrics.js +83 -0
  143. package/dist/performance-metrics.js.map +7 -0
  144. package/dist/phash.d.ts +38 -0
  145. package/dist/phash.js +115 -0
  146. package/dist/phash.js.map +7 -0
  147. package/dist/pii-scrubber.d.ts +21 -0
  148. package/dist/pii-scrubber.js +75 -0
  149. package/dist/pii-scrubber.js.map +7 -0
  150. package/dist/playwright-recorder.d.ts +39 -0
  151. package/dist/playwright-recorder.js +123 -0
  152. package/dist/playwright-recorder.js.map +7 -0
  153. package/dist/policies/crawl-safety.d.ts +9 -0
  154. package/dist/policies/crawl-safety.js +37 -0
  155. package/dist/policies/crawl-safety.js.map +7 -0
  156. package/dist/profiles/domain-profile.d.ts +19 -0
  157. package/dist/profiles/domain-profile.js +140 -0
  158. package/dist/profiles/domain-profile.js.map +7 -0
  159. package/dist/proxy.d.ts +50 -0
  160. package/dist/proxy.js +165 -0
  161. package/dist/proxy.js.map +7 -0
  162. package/dist/rate-limiter.d.ts +31 -0
  163. package/dist/rate-limiter.js +64 -0
  164. package/dist/rate-limiter.js.map +7 -0
  165. package/dist/redirect-tracker.d.ts +37 -0
  166. package/dist/redirect-tracker.js +65 -0
  167. package/dist/redirect-tracker.js.map +7 -0
  168. package/dist/redis-frontier.d.ts +48 -0
  169. package/dist/redis-frontier.js +126 -0
  170. package/dist/redis-frontier.js.map +7 -0
  171. package/dist/redis-queue.d.ts +48 -0
  172. package/dist/redis-queue.js +165 -0
  173. package/dist/redis-queue.js.map +7 -0
  174. package/dist/response-cache.d.ts +38 -0
  175. package/dist/response-cache.js +140 -0
  176. package/dist/response-cache.js.map +7 -0
  177. package/dist/responsive-detector.d.ts +29 -0
  178. package/dist/responsive-detector.js +46 -0
  179. package/dist/responsive-detector.js.map +7 -0
  180. package/dist/retry-policy.d.ts +20 -0
  181. package/dist/retry-policy.js +54 -0
  182. package/dist/retry-policy.js.map +7 -0
  183. package/dist/robots-txt.d.ts +9 -0
  184. package/dist/robots-txt.js +77 -0
  185. package/dist/robots-txt.js.map +7 -0
  186. package/dist/screen-reader.d.ts +16 -0
  187. package/dist/screen-reader.js +46 -0
  188. package/dist/screen-reader.js.map +7 -0
  189. package/dist/screenshot-masker.d.ts +28 -0
  190. package/dist/screenshot-masker.js +62 -0
  191. package/dist/screenshot-masker.js.map +7 -0
  192. package/dist/seo-checker.d.ts +33 -0
  193. package/dist/seo-checker.js +91 -0
  194. package/dist/seo-checker.js.map +7 -0
  195. package/dist/session-capture.d.ts +35 -0
  196. package/dist/session-capture.js +267 -0
  197. package/dist/session-capture.js.map +7 -0
  198. package/dist/session-export.d.ts +49 -0
  199. package/dist/session-export.js +117 -0
  200. package/dist/session-export.js.map +7 -0
  201. package/dist/sitemap-writer.d.ts +21 -0
  202. package/dist/sitemap-writer.js +47 -0
  203. package/dist/sitemap-writer.js.map +7 -0
  204. package/dist/sitemap.d.ts +51 -0
  205. package/dist/sitemap.js +152 -0
  206. package/dist/sitemap.js.map +7 -0
  207. package/dist/skyvern.d.ts +56 -0
  208. package/dist/skyvern.js +129 -0
  209. package/dist/skyvern.js.map +7 -0
  210. package/dist/sqs-queue.d.ts +2 -0
  211. package/dist/sqs-queue.js +47 -0
  212. package/dist/sqs-queue.js.map +7 -0
  213. package/dist/sso-token.d.ts +29 -0
  214. package/dist/sso-token.js +76 -0
  215. package/dist/sso-token.js.map +7 -0
  216. package/dist/stealth/human-behavior.d.ts +20 -0
  217. package/dist/stealth/human-behavior.js +168 -0
  218. package/dist/stealth/human-behavior.js.map +7 -0
  219. package/dist/telemetry.d.ts +34 -0
  220. package/dist/telemetry.js +77 -0
  221. package/dist/telemetry.js.map +7 -0
  222. package/dist/test-executor.d.ts +67 -0
  223. package/dist/test-executor.js +311 -0
  224. package/dist/test-executor.js.map +7 -0
  225. package/dist/tls-fingerprint.d.ts +50 -0
  226. package/dist/tls-fingerprint.js +81 -0
  227. package/dist/tls-fingerprint.js.map +7 -0
  228. package/dist/url-pattern-completer.d.ts +28 -0
  229. package/dist/url-pattern-completer.js +87 -0
  230. package/dist/url-pattern-completer.js.map +7 -0
  231. package/dist/visual-diff-verdict.d.ts +40 -0
  232. package/dist/visual-diff-verdict.js +25 -0
  233. package/dist/visual-diff-verdict.js.map +7 -0
  234. package/dist/webhook-notifier.d.ts +30 -0
  235. package/dist/webhook-notifier.js +76 -0
  236. package/dist/webhook-notifier.js.map +7 -0
  237. package/dist/websocket-detector.d.ts +24 -0
  238. package/dist/websocket-detector.js +60 -0
  239. package/dist/websocket-detector.js.map +7 -0
  240. package/dist/worker.d.ts +1 -0
  241. package/dist/worker.js +33 -0
  242. package/dist/worker.js.map +7 -0
  243. package/package.json +45 -0
  244. package/src/accessibility-auditor.ts +102 -0
  245. package/src/ai-login.ts +218 -0
  246. package/src/auth-token-rotator.ts +89 -0
  247. package/src/auth.ts +396 -0
  248. package/src/browser-extension.ts +186 -0
  249. package/src/captcha-solver.ts +143 -0
  250. package/src/color-contrast.ts +116 -0
  251. package/src/content-chunker.ts +170 -0
  252. package/src/content-dedup.ts +99 -0
  253. package/src/cookie-consent.ts +106 -0
  254. package/src/cookie-jar.ts +91 -0
  255. package/src/crawler.ts +4305 -0
  256. package/src/custom-js-injector.ts +93 -0
  257. package/src/dark-mode-capture.ts +110 -0
  258. package/src/dead-link-detector.ts +76 -0
  259. package/src/element-hash.ts +16 -0
  260. package/src/email-otp.ts +252 -0
  261. package/src/engine-router.ts +141 -0
  262. package/src/export/bulk-export.ts +85 -0
  263. package/src/export/vector-export.ts +160 -0
  264. package/src/extractors/advanced.ts +283 -0
  265. package/src/extractors/artifact-envelope.ts +111 -0
  266. package/src/failure-analysis-agent.ts +49 -0
  267. package/src/feature-flag-detector.ts +97 -0
  268. package/src/form-detector.ts +103 -0
  269. package/src/frontier.test.ts +64 -0
  270. package/src/frontier.ts +112 -0
  271. package/src/gap-pass.ts +122 -0
  272. package/src/graphql-detector.ts +129 -0
  273. package/src/http-engine.ts +433 -0
  274. package/src/incremental-diff.ts +121 -0
  275. package/src/index.ts +35 -0
  276. package/src/input-fuzzer.ts +129 -0
  277. package/src/interactive-probe.ts +623 -0
  278. package/src/job-queue.test.ts +120 -0
  279. package/src/job-queue.ts +2701 -0
  280. package/src/js-coverage.ts +87 -0
  281. package/src/js-router-detector.ts +112 -0
  282. package/src/language-detector.ts +82 -0
  283. package/src/link-classifier.ts +65 -0
  284. package/src/live-view.ts +141 -0
  285. package/src/logger.ts +9 -0
  286. package/src/markdown-extract.test.ts +73 -0
  287. package/src/markdown-extract.ts +76 -0
  288. package/src/native-crawler.ts +1106 -0
  289. package/src/network-observer.ts +204 -0
  290. package/src/network-throttle.ts +69 -0
  291. package/src/openapi-generator.ts +135 -0
  292. package/src/pdf-extractor.ts +123 -0
  293. package/src/performance-metrics.ts +134 -0
  294. package/src/phash.ts +151 -0
  295. package/src/pii-scrubber.ts +99 -0
  296. package/src/playwright-recorder.ts +170 -0
  297. package/src/policies/crawl-safety.ts +46 -0
  298. package/src/profiles/domain-profile.ts +167 -0
  299. package/src/proxy.ts +238 -0
  300. package/src/rate-limiter.ts +87 -0
  301. package/src/redirect-tracker.ts +97 -0
  302. package/src/redis-frontier.ts +143 -0
  303. package/src/redis-queue.ts +208 -0
  304. package/src/response-cache.ts +150 -0
  305. package/src/responsive-detector.ts +92 -0
  306. package/src/retry-policy.ts +87 -0
  307. package/src/robots-txt.ts +96 -0
  308. package/src/screen-reader.ts +89 -0
  309. package/src/screenshot-masker.ts +98 -0
  310. package/src/seo-checker.ts +134 -0
  311. package/src/session-capture.ts +325 -0
  312. package/src/session-export.test.ts +75 -0
  313. package/src/session-export.ts +172 -0
  314. package/src/sitemap-writer.ts +65 -0
  315. package/src/sitemap.test.ts +131 -0
  316. package/src/sitemap.ts +224 -0
  317. package/src/skyvern.ts +199 -0
  318. package/src/sqs-queue.ts +49 -0
  319. package/src/sso-token.ts +120 -0
  320. package/src/stealth/human-behavior.ts +191 -0
  321. package/src/telemetry.ts +122 -0
  322. package/src/test-executor.test.ts +72 -0
  323. package/src/test-executor.ts +424 -0
  324. package/src/tls-fingerprint.ts +111 -0
  325. package/src/url-pattern-completer.ts +114 -0
  326. package/src/visual-diff-verdict.test.ts +80 -0
  327. package/src/visual-diff-verdict.ts +57 -0
  328. package/src/webhook-notifier.ts +109 -0
  329. package/src/websocket-detector.ts +83 -0
  330. package/src/worker.ts +48 -0
  331. package/tsconfig.json +13 -0
  332. package/types/accessibility-auditor.d.ts +29 -0
  333. package/types/ai-login.d.ts +32 -0
  334. package/types/auth-token-rotator.d.ts +47 -0
  335. package/types/auth.d.ts +20 -0
  336. package/types/browser-extension.d.ts +37 -0
  337. package/types/bull-worker.d.ts +6 -0
  338. package/types/captcha-solver.d.ts +16 -0
  339. package/types/color-contrast.d.ts +30 -0
  340. package/types/content-chunker.d.ts +18 -0
  341. package/types/content-dedup.d.ts +23 -0
  342. package/types/cookie-consent.d.ts +25 -0
  343. package/types/cookie-jar.d.ts +20 -0
  344. package/types/crawler.d.ts +179 -0
  345. package/types/custom-js-injector.d.ts +42 -0
  346. package/types/dark-mode-capture.d.ts +23 -0
  347. package/types/dead-link-detector.d.ts +37 -0
  348. package/types/element-hash.d.ts +9 -0
  349. package/types/email-otp.d.ts +42 -0
  350. package/types/engine-router.d.ts +47 -0
  351. package/types/export/bulk-export.d.ts +26 -0
  352. package/types/export/vector-export.d.ts +76 -0
  353. package/types/extractors/advanced.d.ts +54 -0
  354. package/types/extractors/artifact-envelope.d.ts +63 -0
  355. package/types/failure-analysis-agent.d.ts +16 -0
  356. package/types/feature-flag-detector.d.ts +30 -0
  357. package/types/form-detector.d.ts +34 -0
  358. package/types/frontier.d.ts +32 -0
  359. package/types/gap-pass.d.ts +35 -0
  360. package/types/graphql-detector.d.ts +39 -0
  361. package/types/http-engine.d.ts +80 -0
  362. package/types/incremental-diff.d.ts +59 -0
  363. package/types/index.d.ts +35 -0
  364. package/types/input-fuzzer.d.ts +30 -0
  365. package/types/interactive-probe.d.ts +104 -0
  366. package/types/job-queue.d.ts +171 -0
  367. package/types/js-coverage.d.ts +29 -0
  368. package/types/js-router-detector.d.ts +17 -0
  369. package/types/language-detector.d.ts +22 -0
  370. package/types/link-classifier.d.ts +23 -0
  371. package/types/live-view.d.ts +36 -0
  372. package/types/logger.d.ts +2 -0
  373. package/types/markdown-extract.d.ts +8 -0
  374. package/types/native-crawler.d.ts +69 -0
  375. package/types/network-observer.d.ts +49 -0
  376. package/types/network-throttle.d.ts +25 -0
  377. package/types/openapi-generator.d.ts +49 -0
  378. package/types/pdf-extractor.d.ts +28 -0
  379. package/types/performance-metrics.d.ts +53 -0
  380. package/types/phash.d.ts +38 -0
  381. package/types/pii-scrubber.d.ts +21 -0
  382. package/types/playwright-recorder.d.ts +39 -0
  383. package/types/policies/crawl-safety.d.ts +9 -0
  384. package/types/profiles/domain-profile.d.ts +19 -0
  385. package/types/proxy.d.ts +50 -0
  386. package/types/rate-limiter.d.ts +31 -0
  387. package/types/redirect-tracker.d.ts +37 -0
  388. package/types/redis-frontier.d.ts +48 -0
  389. package/types/redis-queue.d.ts +48 -0
  390. package/types/response-cache.d.ts +38 -0
  391. package/types/responsive-detector.d.ts +29 -0
  392. package/types/retry-policy.d.ts +20 -0
  393. package/types/robots-txt.d.ts +9 -0
  394. package/types/screen-reader.d.ts +16 -0
  395. package/types/screenshot-masker.d.ts +28 -0
  396. package/types/seo-checker.d.ts +33 -0
  397. package/types/session-capture.d.ts +38 -0
  398. package/types/session-export.d.ts +49 -0
  399. package/types/sitemap-writer.d.ts +21 -0
  400. package/types/sitemap.d.ts +51 -0
  401. package/types/skyvern.d.ts +56 -0
  402. package/types/sqs-queue.d.ts +2 -0
  403. package/types/sso-token.d.ts +29 -0
  404. package/types/stealth/human-behavior.d.ts +20 -0
  405. package/types/telemetry.d.ts +34 -0
  406. package/types/test-executor.d.ts +67 -0
  407. package/types/tls-fingerprint.d.ts +50 -0
  408. package/types/url-pattern-completer.d.ts +28 -0
  409. package/types/visual-diff-verdict.d.ts +40 -0
  410. package/types/webhook-notifier.d.ts +30 -0
  411. package/types/websocket-detector.d.ts +24 -0
  412. package/types/worker.d.ts +1 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * ZeTa-AI Background Job Queue
3
+ *
4
+ * Postgres-backed durable queue. Each job becomes a PlatformJob record.
5
+ * enqueueJob() writes it QUEUED and, for same-process responsiveness, kicks
6
+ * an immediate best-effort claim attempt — but durability comes from
7
+ * startJobWorkerLoop()'s poll: it atomically claims QUEUED jobs (Postgres
8
+ * `FOR UPDATE SKIP LOCKED`, safe across any number of concurrent worker
9
+ * processes/containers) and requeues jobs whose heartbeat went stale,
10
+ * so a crashed/restarted worker never silently loses a job.
11
+ *
12
+ * CRAWL-type jobs additionally support AWS SQS as an alternate transport
13
+ * (JOB_QUEUE_BACKEND=sqs, see sqs-queue.ts) for horizontally-scaled crawler
14
+ * fleets; every other job type always goes through the DB-backed queue.
15
+ */
16
+ export declare function generateTOTP(secret: string): string;
17
+ export interface PlatformJobConfig {
18
+ tenantId: string;
19
+ projectId: string;
20
+ appUrl?: string;
21
+ credentials?: {
22
+ username: string;
23
+ password: string;
24
+ oneTimeCode?: string;
25
+ };
26
+ /** Decrypted Playwright storageState JSON — if present, session is restored without AI login. */
27
+ storageState?: string;
28
+ screenshotDir?: string;
29
+ maxScreens?: number;
30
+ /** Seed URLs added to the initial crawl queue — link discovery still runs from each page. */
31
+ startUrls?: string[];
32
+ /** When provided, crawl ONLY these exact URLs (no link-following). Used for selected-screen recrawl. */
33
+ selectiveUrls?: string[];
34
+ /** Device profiles for multi-viewport screenshot pass after main DESKTOP crawl. */
35
+ deviceProfiles?: string[];
36
+ /** HTTP Basic Auth credentials — injected as Authorization header on same-origin requests. */
37
+ httpBasicUsername?: string;
38
+ httpBasicPassword?: string;
39
+ /** Bearer/API token — injected as a request header and into localStorage. Skips AI login. */
40
+ authToken?: string;
41
+ /** Header name for authToken (default: 'Authorization'). */
42
+ authTokenHeader?: string;
43
+ /** Prefix for authToken value (default: 'Bearer '). */
44
+ authTokenPrefix?: string;
45
+ /** CAPTCHA solving API key (2captcha or CapSolver). */
46
+ captchaSolverApiKey?: string;
47
+ /** CAPTCHA solving service provider (default: '2captcha'). */
48
+ captchaSolverProvider?: '2captcha' | 'capsolver';
49
+ /**
50
+ * Path to a Chrome user data directory for profile inheritance (local deployments only).
51
+ * When set, the crawler exports the existing session from this profile and injects it.
52
+ */
53
+ chromeProfilePath?: string;
54
+ /** MailSlurp API key for email OTP auto-retrieval. */
55
+ mailslurpApiKey?: string;
56
+ /** MailSlurp inbox ID to poll for OTP emails. */
57
+ mailslurpInboxId?: string;
58
+ /** SSO provider ('okta' | 'azure_ad' | 'generic_oidc'). */
59
+ ssoProvider?: string;
60
+ /** SSO domain or tenant ID. */
61
+ ssoDomain?: string;
62
+ /** SSO OAuth2 client ID. */
63
+ ssoClientId?: string;
64
+ /** SSO OAuth2 client secret (decrypted). */
65
+ ssoClientSecret?: string;
66
+ /** SSO scopes (space-separated). Default: 'openid profile'. */
67
+ ssoScope?: string;
68
+ /** HTTP/HTTPS/SOCKS5 proxy URL — routes browser through this proxy for bot-protected sites. */
69
+ proxyUrl?: string;
70
+ }
71
+ type ClaimedJob = {
72
+ id: string;
73
+ tenantId: string;
74
+ projectId: string;
75
+ type: string;
76
+ config: any;
77
+ };
78
+ /** Atomically claims one specific QUEUED job for this worker. Returns null if it was already claimed. */
79
+ export declare function claimSpecificJob(jobId: string): Promise<ClaimedJob | null>;
80
+ /** Atomically claims the oldest QUEUED job across all tenants. SKIP LOCKED makes this
81
+ * race-safe against any number of other pollers doing the same thing concurrently. */
82
+ export declare function claimNextQueuedJob(): Promise<ClaimedJob | null>;
83
+ /** Requeues RUNNING jobs whose heartbeat has gone stale — the worker that claimed them
84
+ * died (crash, restart, OOM) without ever marking them DONE/FAILED. Idempotent and
85
+ * safe to run from every worker process; only affects rows past the timeout. */
86
+ export declare function requeueStaleRunningJobs(): Promise<void>;
87
+ /**
88
+ * Starts the durable job worker poll loop. This is what makes job processing
89
+ * survive a restart — enqueueJob()'s immediate same-process claim attempt is
90
+ * only a latency optimization; if the process dies before that fires (or
91
+ * mid-job), this loop's next tick claims/requeues it. Call once at process
92
+ * startup (API server and/or a dedicated crawler worker process — safe to
93
+ * run in both, and safe to run in many container replicas at once).
94
+ */
95
+ export declare function startJobWorkerLoop(opts?: {
96
+ pollIntervalMs?: number;
97
+ concurrency?: number;
98
+ }): void;
99
+ /** Stops the poll loop. Mainly for tests. */
100
+ export declare function stopJobWorkerLoop(): void;
101
+ /** Create a job record that tracks a synchronous operation (telemetry only, no background processor). */
102
+ export declare function createTrackedJob(type: string, config: {
103
+ tenantId: string;
104
+ projectId: string;
105
+ [k: string]: any;
106
+ }): Promise<string>;
107
+ /** Mark a tracked job DONE or FAILED. Safe to call in finally — swallows errors. */
108
+ export declare function finishTrackedJob(tenantId: string, jobId: string, error?: string): Promise<void>;
109
+ /** Enqueue a generic platform job — returns the job ID immediately. */
110
+ export declare function enqueueJob(type: string, config: any): Promise<string>;
111
+ /** Get the current state of a platform job. */
112
+ export declare function getJob(tenantId: string, jobId: string): Promise<{
113
+ progress: number;
114
+ error: string | null;
115
+ type: string;
116
+ status: string;
117
+ tenantId: string;
118
+ projectId: string;
119
+ name: string | null;
120
+ result: import("@prisma/client/runtime/library").JsonValue | null;
121
+ id: string;
122
+ config: import("@prisma/client/runtime/library").JsonValue;
123
+ queuedAt: Date;
124
+ startedAt: Date | null;
125
+ finishedAt: Date | null;
126
+ workerId: string | null;
127
+ heartbeatAt: Date | null;
128
+ totalPromptTokens: number | null;
129
+ totalCompletionTokens: number | null;
130
+ totalCacheReadTokens: number | null;
131
+ totalEstimatedCostUsd: number | null;
132
+ llmCallCount: number;
133
+ } | null>;
134
+ /** List recent jobs for a project. */
135
+ export declare function listJobs(tenantId: string, projectId: string): Promise<{
136
+ progress: number;
137
+ error: string | null;
138
+ type: string;
139
+ status: string;
140
+ tenantId: string;
141
+ projectId: string;
142
+ name: string | null;
143
+ result: import("@prisma/client/runtime/library").JsonValue | null;
144
+ id: string;
145
+ config: import("@prisma/client/runtime/library").JsonValue;
146
+ queuedAt: Date;
147
+ startedAt: Date | null;
148
+ finishedAt: Date | null;
149
+ workerId: string | null;
150
+ heartbeatAt: Date | null;
151
+ totalPromptTokens: number | null;
152
+ totalCompletionTokens: number | null;
153
+ totalCacheReadTokens: number | null;
154
+ totalEstimatedCostUsd: number | null;
155
+ llmCallCount: number;
156
+ }[]>;
157
+ /** Cancel a RUNNING or QUEUED job. Aborts the in-process crawl and marks DB CANCELLED. */
158
+ export declare function cancelJob(tenantId: string, jobId: string): Promise<void>;
159
+ /** Re-enqueue a job using the same config as a previous job. */
160
+ export declare function rerunJob(tenantId: string, jobId: string): Promise<string>;
161
+ export declare function resumeJob(tenantId: string, jobId: string): Promise<string>;
162
+ /** Update progress percentage and current step label on a running job (non-fatal). */
163
+ export declare function updateJobProgress(tenantId: string, jobId: string, progress: number, step: string): Promise<void>;
164
+ export interface ProcessJobOpts {
165
+ onProgress?: (pct: number) => Promise<void>;
166
+ }
167
+ export declare function processJob(jobId: string, config: any, opts?: ProcessJobOpts): Promise<void>;
168
+ /** After a job finishes, sum LLMCallLog entries for that project during the job window. */
169
+ export declare function aggregateJobTokens(tenantId: string, jobId: string, projectId: string, startedAt: Date): Promise<void>;
170
+ export declare function processDataRetentionPurge(): Promise<void>;
171
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * JS/CSS coverage collector via Playwright's built-in coverage API.
3
+ *
4
+ * For each crawled page, records what percentage of loaded JS/CSS was actually
5
+ * executed/applied. High unused code % → performance opportunity (code splitting, lazy loading).
6
+ *
7
+ * Uses Playwright's page.coverage API (wraps CDP Coverage domain).
8
+ */
9
+ import type { Page } from 'playwright';
10
+ export interface CoverageEntry {
11
+ url: string;
12
+ type: 'js' | 'css';
13
+ totalBytes: number;
14
+ usedBytes: number;
15
+ unusedPercent: number;
16
+ }
17
+ export interface CoverageReport {
18
+ pageUrl: string;
19
+ entries: CoverageEntry[];
20
+ totalJsBytes: number;
21
+ usedJsBytes: number;
22
+ totalCssBytes: number;
23
+ usedCssBytes: number;
24
+ jsUnusedPercent: number;
25
+ cssUnusedPercent: number;
26
+ collectedAt: string;
27
+ }
28
+ export declare function startCoverage(page: Page): Promise<void>;
29
+ export declare function stopAndCollectCoverage(page: Page, pageUrl: string): Promise<CoverageReport | null>;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * P2: JS Router Detection
3
+ *
4
+ * Scans the loaded page for client-side route tables declared by React Router v6,
5
+ * Vue Router, Angular Router, or custom window globals. Supplements the existing
6
+ * history.pushState interception (which only captures runtime navigation) with a
7
+ * static analysis of routes declared in the JS bundle.
8
+ *
9
+ * Called once per page after goto(). Runs entirely in-browser via page.evaluate().
10
+ * Adds discovered routes to the BFS frontier so the crawler visits them.
11
+ */
12
+ /**
13
+ * Extract absolute page URLs from the current page's JS router config.
14
+ * Returns deduplicated absolute URLs (same origin). Dynamic segments (:id, *)
15
+ * are skipped — the crawler can't resolve them without knowing valid IDs.
16
+ */
17
+ export declare function detectJsRoutes(page: any, origin: string): Promise<string[]>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Language detector — identify page language from HTML attributes and content analysis.
3
+ *
4
+ * Sources (in priority order):
5
+ * 1. <html lang="..."> attribute
6
+ * 2. <meta http-equiv="Content-Language"> header
7
+ * 3. hreflang alternate links
8
+ * 4. Content-based n-gram fingerprint (detects top 20 languages)
9
+ *
10
+ * Used to: route pages to the correct markdown processor, group screens by locale,
11
+ * and detect missing hreflang implementations.
12
+ */
13
+ import type { Page } from 'playwright';
14
+ export interface LanguageDetectionResult {
15
+ url: string;
16
+ declaredLang: string;
17
+ detectedLang: string;
18
+ confidence: 'high' | 'medium' | 'low';
19
+ alternates: Record<string, string>;
20
+ isMultilingual: boolean;
21
+ }
22
+ export declare function detectLanguage(page: Page, url: string): Promise<LanguageDetectionResult>;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Link classifier — assigns priority and category to discovered URLs.
3
+ *
4
+ * Categories:
5
+ * - 'nav' : site navigation (homepage, top-level pages) — highest priority
6
+ * - 'auth' : login/register/password flows — high priority
7
+ * - 'app' : authenticated app screens — high priority
8
+ * - 'content' : blog/docs/articles — medium priority
9
+ * - 'api' : REST/GraphQL API endpoints — detected, not crawled as screens
10
+ * - 'resource' : static assets (JS/CSS/img/fonts) — skip
11
+ * - 'external' : different domain — skip unless cross-domain crawl enabled
12
+ * - 'low-value' : pagination, sort, filter query strings — deprioritize
13
+ */
14
+ export type LinkCategory = 'nav' | 'auth' | 'app' | 'content' | 'api' | 'resource' | 'external' | 'low-value';
15
+ export interface ClassifiedLink {
16
+ url: string;
17
+ category: LinkCategory;
18
+ priority: number;
19
+ reason: string;
20
+ }
21
+ export declare function classifyLink(url: string, baseUrl: string): ClassifiedLink;
22
+ export declare function classifyLinks(urls: string[], baseUrl: string): ClassifiedLink[];
23
+ export declare function filterCrawlable(classified: ClassifiedLink[]): ClassifiedLink[];
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Start a live view session: launches a headless browser, navigates to appUrl,
3
+ * begins capturing frames. Returns the session ID.
4
+ */
5
+ export declare function startLiveView(appUrl: string, storageState?: string): Promise<string>;
6
+ /**
7
+ * Get the latest frame for a session (base64 JPEG).
8
+ */
9
+ export declare function getFrame(id: string): string | null;
10
+ /**
11
+ * Navigate the live view browser to a URL.
12
+ */
13
+ export declare function liveViewNavigate(id: string, url: string): Promise<void>;
14
+ /**
15
+ * Capture storageState from the live view session, close the browser, return JSON string.
16
+ */
17
+ export declare function completeLiveView(id: string): Promise<string>;
18
+ /**
19
+ * Send a mouse or keyboard input event to the live view browser.
20
+ */
21
+ export declare function sendInput(id: string, event: {
22
+ type: 'click' | 'type' | 'key';
23
+ x?: number;
24
+ y?: number;
25
+ button?: 'left' | 'right' | 'middle';
26
+ text?: string;
27
+ key?: string;
28
+ }): Promise<void>;
29
+ /**
30
+ * Close a live view session without capturing.
31
+ */
32
+ export declare function closeLiveView(id: string): Promise<void>;
33
+ /**
34
+ * List all active session IDs (for health checks / cleanup).
35
+ */
36
+ export declare function listLiveViews(): string[];
@@ -0,0 +1,2 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger<never, boolean>;
@@ -0,0 +1,8 @@
1
+ export interface ExtractedMarkdown {
2
+ markdown: string;
3
+ method: 'readability' | 'full-page';
4
+ title: string | null;
5
+ wordCount: number;
6
+ }
7
+ /** Best-effort HTML→Markdown for one crawled page. Never throws. */
8
+ export declare function extractMarkdown(html: string, url: string): ExtractedMarkdown | null;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * ZeTa Native App Crawler — Appium-based crawler for Android APK and iOS IPA.
3
+ *
4
+ * Architecture:
5
+ * Appium Server (running at APPIUM_SERVER_URL) → WebDriverIO session
6
+ * → UiAutomator2 (Android) / XCUITest (iOS)
7
+ * → accessibility tree XML → ZeTa Element records
8
+ *
9
+ * TODO: requires Appium server running at APPIUM_SERVER_URL env var
10
+ * TODO: requires `webdriverio` package — add "webdriverio": "^9.x" to package.json
11
+ *
12
+ * Device farm support:
13
+ * - local_emulator: Appium server + local emulator/simulator
14
+ * - aws_device_farm: presigned S3 URL uploaded to Device Farm, session via WDIO
15
+ * - browserstack: BrowserStack Automate Appium endpoint
16
+ */
17
+ export interface NativeCrawlerOptions {
18
+ tenantId: string;
19
+ projectId: string;
20
+ jobId: string;
21
+ platform: 'android' | 'ios' | 'windows' | 'macos';
22
+ appS3Path: string;
23
+ packageName?: string;
24
+ deviceModel?: string;
25
+ osVersion?: string;
26
+ appActivity?: string;
27
+ appWaitActivity?: string;
28
+ deviceFarm: 'local_emulator' | 'aws_device_farm' | 'browserstack';
29
+ appiumServerUrl?: string;
30
+ browserstackUsername?: string;
31
+ browserstackAccessKey?: string;
32
+ awsAccessKeyId?: string;
33
+ awsSecretAccessKey?: string;
34
+ awsRegion?: string;
35
+ awsDeviceFarmProjectArn?: string;
36
+ credentials?: {
37
+ username?: string;
38
+ password?: string;
39
+ usernameFieldLabel?: string;
40
+ passwordFieldLabel?: string;
41
+ loginButtonLabel?: string;
42
+ };
43
+ visionLlmConfig?: {
44
+ provider: string;
45
+ model: string;
46
+ apiKey?: string;
47
+ baseUrl?: string;
48
+ } | null;
49
+ gestureConfig?: {
50
+ enableSwipe?: boolean;
51
+ enableLongPress?: boolean;
52
+ };
53
+ mitmProxyPort?: number;
54
+ }
55
+ /**
56
+ * Run a native app crawl session via Appium.
57
+ *
58
+ * Flow:
59
+ * 1. Download APK/IPA from S3 to local temp dir
60
+ * 2. Build Appium WebDriverIO capabilities for the target platform
61
+ * 3. Create WebDriverIO remote session (Appium server at APPIUM_SERVER_URL)
62
+ * 4. For each discovered screen:
63
+ * a. Get page source XML → parse elements
64
+ * b. Take screenshot → save to screenshotDir → persist via AppBrain
65
+ * c. Save screen + elements to DB
66
+ * d. Tap nav elements to discover next screens
67
+ * 5. Update PlatformJob as DONE (or FAILED on error)
68
+ */
69
+ export declare function runNativeCrawl(opts: NativeCrawlerOptions): Promise<void>;
@@ -0,0 +1,49 @@
1
+ import type { BrowserContext } from 'playwright';
2
+ export interface ApiEndpointObservationInput {
3
+ method: string;
4
+ urlPattern: string;
5
+ statusCode?: number;
6
+ requestKind?: string;
7
+ responseShape?: unknown;
8
+ durationMs?: number;
9
+ errorBody?: string;
10
+ }
11
+ export declare function attachNetworkObserver(context: BrowserContext, sink: ApiEndpointObservationInput[], onPageUrlDiscovered?: (relPath: string) => void): void;
12
+ export interface HarEntry {
13
+ startedAt: string;
14
+ method: string;
15
+ url: string;
16
+ status: number;
17
+ statusText: string;
18
+ requestHeaders: Record<string, string>;
19
+ responseHeaders: Record<string, string>;
20
+ contentType: string;
21
+ bodySize: number;
22
+ durationMs: number;
23
+ timings: {
24
+ send: number;
25
+ wait: number;
26
+ receive: number;
27
+ };
28
+ }
29
+ export interface HarLog {
30
+ version: '1.2';
31
+ creator: {
32
+ name: 'ZeTa-Crawler';
33
+ version: '1.0';
34
+ };
35
+ pages: Array<{
36
+ id: string;
37
+ title: string;
38
+ startedAt: string;
39
+ }>;
40
+ entries: HarEntry[];
41
+ }
42
+ /**
43
+ * Full HAR capture via CDP — intercepts ALL network traffic, not just API endpoints.
44
+ * Returns a controller with getHar() and detach().
45
+ */
46
+ export declare function attachHarCapture(cdpSession: any, pageTitle?: string): {
47
+ getHar(): HarLog;
48
+ detach(): void;
49
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Network throttle simulation via CDP.
3
+ *
4
+ * Simulates different network conditions during crawl to test how the app
5
+ * behaves under slow connections. Useful for detecting loading states, error
6
+ * handling, and performance degradation on poor networks.
7
+ *
8
+ * Conditions mirror Chrome DevTools presets:
9
+ * - slow3g: ~500kbps download, high latency
10
+ * - fast3g: ~1.6Mbps download, medium latency
11
+ * - 4g: ~9Mbps download, low latency
12
+ * - offline: no connectivity
13
+ * - none: no throttle (default)
14
+ */
15
+ export type NetworkConditionPreset = 'none' | 'slow3g' | 'fast3g' | '4g' | 'offline';
16
+ export declare function applyNetworkThrottle(cdpSession: any, preset: NetworkConditionPreset): Promise<void>;
17
+ export declare function clearNetworkThrottle(cdpSession: any): Promise<void>;
18
+ export interface ThrottledCrawlOpts {
19
+ /** Network preset to apply during this URL's crawl */
20
+ preset: NetworkConditionPreset;
21
+ /** Restore to 'none' after navigation (default: true) */
22
+ restoreAfter?: boolean;
23
+ }
24
+ /** Apply throttle, run fn, restore. Returns fn's result. */
25
+ export declare function withNetworkThrottle<T>(cdpSession: any, preset: NetworkConditionPreset, fn: () => Promise<T>, restoreAfter?: boolean): Promise<T>;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OpenAPI 3.0 spec generator from observed network traffic.
3
+ *
4
+ * Takes the ApiEndpointObservationInput[] collected by the network observer
5
+ * during crawl and generates a minimal but valid OpenAPI 3.0 spec.
6
+ *
7
+ * The spec captures: endpoints, methods, observed response shapes, status codes.
8
+ * It does NOT capture request bodies (we'd need to intercept requests too) — that's
9
+ * marked as a TODO. But it's enough for generating smoke-test suites.
10
+ */
11
+ import type { ApiEndpointObservationInput } from './network-observer.js';
12
+ export interface OpenApiSpec {
13
+ openapi: '3.0.3';
14
+ info: {
15
+ title: string;
16
+ version: string;
17
+ description?: string;
18
+ };
19
+ servers: Array<{
20
+ url: string;
21
+ }>;
22
+ paths: Record<string, Record<string, OpenApiOperation>>;
23
+ }
24
+ interface OpenApiOperation {
25
+ summary: string;
26
+ parameters?: OpenApiParam[];
27
+ responses: Record<string, {
28
+ description: string;
29
+ content?: Record<string, {
30
+ schema: unknown;
31
+ }>;
32
+ }>;
33
+ tags?: string[];
34
+ }
35
+ interface OpenApiParam {
36
+ name: string;
37
+ in: 'path' | 'query';
38
+ required: boolean;
39
+ schema: {
40
+ type: string;
41
+ };
42
+ }
43
+ export declare function generateOpenApiSpec(observations: ApiEndpointObservationInput[], opts?: {
44
+ title?: string;
45
+ baseUrl?: string;
46
+ version?: string;
47
+ }): OpenApiSpec;
48
+ export declare function specToYaml(spec: OpenApiSpec): string;
49
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * PDF extraction — discovers and extracts text from PDF URLs found during crawl.
3
+ *
4
+ * When the HTTP engine or browser engine discovers a link to a .pdf file,
5
+ * this module fetches the PDF, extracts its text content, and returns it
6
+ * as a screen-compatible markdown string for test generation.
7
+ *
8
+ * Uses pdf-parse (already installed in API package, accessible via dynamic import).
9
+ */
10
+ export interface PdfScreen {
11
+ url: string;
12
+ title: string;
13
+ markdown: string;
14
+ pageCount: number;
15
+ info: Record<string, string>;
16
+ sizeBytes: number;
17
+ }
18
+ export declare function isPdfUrl(url: string, contentType?: string): boolean;
19
+ export declare function extractPdfFromUrl(url: string, opts?: {
20
+ userAgent?: string;
21
+ timeoutMs?: number;
22
+ maxSizeBytes?: number;
23
+ }): Promise<PdfScreen | null>;
24
+ /**
25
+ * Filter a list of discovered URLs to find PDF links.
26
+ * Used by http-engine and browser crawler to decide which links to pass to extractPdfFromUrl.
27
+ */
28
+ export declare function filterPdfUrls(urls: string[]): string[];
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Performance metrics collection via CDP + Playwright page.evaluate().
3
+ *
4
+ * Collects Core Web Vitals and resource timing after page navigation.
5
+ * Stored alongside screen data for test generation context and regression detection.
6
+ *
7
+ * Metrics:
8
+ * - LCP (Largest Contentful Paint) — via PerformanceObserver in page
9
+ * - CLS (Cumulative Layout Shift) — via PerformanceObserver in page
10
+ * - TTFB (Time to First Byte) — from navigation timing
11
+ * - DOMContentLoaded — from navigation timing
12
+ * - Resource count and size by type
13
+ */
14
+ import type { Page } from 'playwright';
15
+ export interface CoreWebVitals {
16
+ lcp?: number;
17
+ cls?: number;
18
+ ttfb?: number;
19
+ fcp?: number;
20
+ domContentLoaded?: number;
21
+ loadEventEnd?: number;
22
+ }
23
+ export interface ResourceSummary {
24
+ scripts: {
25
+ count: number;
26
+ totalBytes: number;
27
+ };
28
+ styles: {
29
+ count: number;
30
+ totalBytes: number;
31
+ };
32
+ images: {
33
+ count: number;
34
+ totalBytes: number;
35
+ };
36
+ fonts: {
37
+ count: number;
38
+ totalBytes: number;
39
+ };
40
+ other: {
41
+ count: number;
42
+ totalBytes: number;
43
+ };
44
+ }
45
+ export interface PagePerfMetrics {
46
+ url: string;
47
+ vitals: CoreWebVitals;
48
+ resources: ResourceSummary;
49
+ totalTransferBytes: number;
50
+ requestCount: number;
51
+ measuredAt: string;
52
+ }
53
+ export declare function collectPerfMetrics(page: Page, url: string): Promise<PagePerfMetrics>;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Composites neutral grey (128,128,128) over each ignoredRegion (fractional
3
+ * 0-1 coordinates) so masked content — timestamps, live counters, ads —
4
+ * contributes nothing to any downstream pixel comparison. Shared by every
5
+ * comparison path (whole-image hash, per-cell grid hash, AI vision) so a
6
+ * region masked once is actually ignored everywhere, not just in the
7
+ * cheapest check.
8
+ */
9
+ export declare function applyMask(imagePath: string, ignoredRegions: Array<{
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ height: number;
14
+ }>): Promise<Buffer>;
15
+ export declare function screenshotDiffPercent(pathA: string, pathB: string, ignoredRegions?: Array<{
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ }>): Promise<{
21
+ pHashDistance: number;
22
+ changeLevel: 'IDENTICAL' | 'MINOR' | 'MODERATE' | 'SIGNIFICANT';
23
+ }>;
24
+ /**
25
+ * Grid-based layout analysis: divides screenshots into a 3×3 grid and computes
26
+ * pHash per cell. Returns which regions changed and where, for the VisualDiff.changes field.
27
+ * Uses sharp's `extract` to crop each cell before hashing.
28
+ */
29
+ export declare function gridLayoutDiff(pathA: string, pathB: string, ignoredRegions?: Array<{
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ }>): Promise<Array<{
35
+ location: string;
36
+ severity: string;
37
+ description: string;
38
+ }>>;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * PII scrubber — detects and redacts Personally Identifiable Information
3
+ * from crawled markdown, HTML, and extracted text before storage.
4
+ *
5
+ * GDPR Article 4(1): "any information relating to an identified or identifiable natural person"
6
+ */
7
+ export interface PiiMatch {
8
+ type: 'email' | 'phone' | 'ssn' | 'credit-card' | 'ip-address' | 'passport' | 'iban' | 'dob';
9
+ value: string;
10
+ start: number;
11
+ end: number;
12
+ }
13
+ export interface ScrubResult {
14
+ text: string;
15
+ matches: PiiMatch[];
16
+ scrubbed: boolean;
17
+ }
18
+ export declare function detectPii(text: string): PiiMatch[];
19
+ export declare function scrubPii(text: string): ScrubResult;
20
+ export declare function hasPii(text: string): boolean;
21
+ export declare function scrubObject<T extends Record<string, unknown>>(obj: T, fields: (keyof T)[]): T;