@enricai/barnacle 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +958 -0
  3. package/dist/api/errors.d.ts +88 -0
  4. package/dist/api/errors.d.ts.map +1 -0
  5. package/dist/api/errors.js +164 -0
  6. package/dist/api/errors.js.map +1 -0
  7. package/dist/api/helpers/envelope.d.ts +13 -0
  8. package/dist/api/helpers/envelope.d.ts.map +1 -0
  9. package/dist/api/helpers/envelope.js +20 -0
  10. package/dist/api/helpers/envelope.js.map +1 -0
  11. package/dist/api/helpers/reply.d.ts +9 -0
  12. package/dist/api/helpers/reply.d.ts.map +1 -0
  13. package/dist/api/helpers/reply.js +14 -0
  14. package/dist/api/helpers/reply.js.map +1 -0
  15. package/dist/api/plugins/auth.d.ts +27 -0
  16. package/dist/api/plugins/auth.d.ts.map +1 -0
  17. package/dist/api/plugins/auth.js +111 -0
  18. package/dist/api/plugins/auth.js.map +1 -0
  19. package/dist/api/plugins/error-handler.d.ts +12 -0
  20. package/dist/api/plugins/error-handler.d.ts.map +1 -0
  21. package/dist/api/plugins/error-handler.js +72 -0
  22. package/dist/api/plugins/error-handler.js.map +1 -0
  23. package/dist/api/plugins/request-context.d.ts +17 -0
  24. package/dist/api/plugins/request-context.d.ts.map +1 -0
  25. package/dist/api/plugins/request-context.js +61 -0
  26. package/dist/api/plugins/request-context.js.map +1 -0
  27. package/dist/api/routes/health.d.ts +55 -0
  28. package/dist/api/routes/health.d.ts.map +1 -0
  29. package/dist/api/routes/health.js +137 -0
  30. package/dist/api/routes/health.js.map +1 -0
  31. package/dist/api/routes/plugins-introspection.d.ts +17 -0
  32. package/dist/api/routes/plugins-introspection.d.ts.map +1 -0
  33. package/dist/api/routes/plugins-introspection.js +13 -0
  34. package/dist/api/routes/plugins-introspection.js.map +1 -0
  35. package/dist/api/schemas/common.d.ts +114 -0
  36. package/dist/api/schemas/common.d.ts.map +1 -0
  37. package/dist/api/schemas/common.js +109 -0
  38. package/dist/api/schemas/common.js.map +1 -0
  39. package/dist/api/schemas/telemetry.d.ts +66 -0
  40. package/dist/api/schemas/telemetry.d.ts.map +1 -0
  41. package/dist/api/schemas/telemetry.js +52 -0
  42. package/dist/api/schemas/telemetry.js.map +1 -0
  43. package/dist/cache/keyed-ttl-cache.d.ts +45 -0
  44. package/dist/cache/keyed-ttl-cache.d.ts.map +1 -0
  45. package/dist/cache/keyed-ttl-cache.js +69 -0
  46. package/dist/cache/keyed-ttl-cache.js.map +1 -0
  47. package/dist/cache/response-cache.d.ts +37 -0
  48. package/dist/cache/response-cache.d.ts.map +1 -0
  49. package/dist/cache/response-cache.js +114 -0
  50. package/dist/cache/response-cache.js.map +1 -0
  51. package/dist/config.d.ts +258 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +138 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/lib/applicant-payload.d.ts +28 -0
  56. package/dist/lib/applicant-payload.d.ts.map +1 -0
  57. package/dist/lib/applicant-payload.js +20 -0
  58. package/dist/lib/applicant-payload.js.map +1 -0
  59. package/dist/lib/application-address.d.ts +16 -0
  60. package/dist/lib/application-address.d.ts.map +1 -0
  61. package/dist/lib/application-address.js +20 -0
  62. package/dist/lib/application-address.js.map +1 -0
  63. package/dist/lib/application-answers.d.ts +151 -0
  64. package/dist/lib/application-answers.d.ts.map +1 -0
  65. package/dist/lib/application-answers.js +95 -0
  66. package/dist/lib/application-answers.js.map +1 -0
  67. package/dist/lib/application-identity.d.ts +18 -0
  68. package/dist/lib/application-identity.d.ts.map +1 -0
  69. package/dist/lib/application-identity.js +20 -0
  70. package/dist/lib/application-identity.js.map +1 -0
  71. package/dist/lib/application-resume.d.ts +21 -0
  72. package/dist/lib/application-resume.d.ts.map +1 -0
  73. package/dist/lib/application-resume.js +23 -0
  74. package/dist/lib/application-resume.js.map +1 -0
  75. package/dist/lib/bedrock.d.ts +22 -0
  76. package/dist/lib/bedrock.d.ts.map +1 -0
  77. package/dist/lib/bedrock.js +35 -0
  78. package/dist/lib/bedrock.js.map +1 -0
  79. package/dist/lib/case-insensitive-headers.d.ts +15 -0
  80. package/dist/lib/case-insensitive-headers.d.ts.map +1 -0
  81. package/dist/lib/case-insensitive-headers.js +29 -0
  82. package/dist/lib/case-insensitive-headers.js.map +1 -0
  83. package/dist/lib/chromium-client-hints.d.ts +11 -0
  84. package/dist/lib/chromium-client-hints.d.ts.map +1 -0
  85. package/dist/lib/chromium-client-hints.js +17 -0
  86. package/dist/lib/chromium-client-hints.js.map +1 -0
  87. package/dist/lib/cookie-value.d.ts +8 -0
  88. package/dist/lib/cookie-value.d.ts.map +1 -0
  89. package/dist/lib/cookie-value.js +14 -0
  90. package/dist/lib/cookie-value.js.map +1 -0
  91. package/dist/lib/datadog.d.ts +8 -0
  92. package/dist/lib/datadog.d.ts.map +1 -0
  93. package/dist/lib/datadog.js +27 -0
  94. package/dist/lib/datadog.js.map +1 -0
  95. package/dist/lib/dd-metrics.d.ts +28 -0
  96. package/dist/lib/dd-metrics.d.ts.map +1 -0
  97. package/dist/lib/dd-metrics.js +62 -0
  98. package/dist/lib/dd-metrics.js.map +1 -0
  99. package/dist/lib/dispatch-metrics.d.ts +19 -0
  100. package/dist/lib/dispatch-metrics.d.ts.map +1 -0
  101. package/dist/lib/dispatch-metrics.js +65 -0
  102. package/dist/lib/dispatch-metrics.js.map +1 -0
  103. package/dist/lib/env.d.ts +37 -0
  104. package/dist/lib/env.d.ts.map +1 -0
  105. package/dist/lib/env.js +70 -0
  106. package/dist/lib/env.js.map +1 -0
  107. package/dist/lib/errors.d.ts +15 -0
  108. package/dist/lib/errors.d.ts.map +1 -0
  109. package/dist/lib/errors.js +20 -0
  110. package/dist/lib/errors.js.map +1 -0
  111. package/dist/lib/http.d.ts +7 -0
  112. package/dist/lib/http.d.ts.map +1 -0
  113. package/dist/lib/http.js +14 -0
  114. package/dist/lib/http.js.map +1 -0
  115. package/dist/lib/job-tracking.d.ts +17 -0
  116. package/dist/lib/job-tracking.d.ts.map +1 -0
  117. package/dist/lib/job-tracking.js +19 -0
  118. package/dist/lib/job-tracking.js.map +1 -0
  119. package/dist/lib/llm/anthropic-client.d.ts +12 -0
  120. package/dist/lib/llm/anthropic-client.d.ts.map +1 -0
  121. package/dist/lib/llm/anthropic-client.js +23 -0
  122. package/dist/lib/llm/anthropic-client.js.map +1 -0
  123. package/dist/lib/llm/judge.d.ts +57 -0
  124. package/dist/lib/llm/judge.d.ts.map +1 -0
  125. package/dist/lib/llm/judge.js +123 -0
  126. package/dist/lib/llm/judge.js.map +1 -0
  127. package/dist/lib/llm/judges/error-messages.d.ts +38 -0
  128. package/dist/lib/llm/judges/error-messages.d.ts.map +1 -0
  129. package/dist/lib/llm/judges/error-messages.js +72 -0
  130. package/dist/lib/llm/judges/error-messages.js.map +1 -0
  131. package/dist/lib/llm/judges/invalid-fields.d.ts +43 -0
  132. package/dist/lib/llm/judges/invalid-fields.d.ts.map +1 -0
  133. package/dist/lib/llm/judges/invalid-fields.js +80 -0
  134. package/dist/lib/llm/judges/invalid-fields.js.map +1 -0
  135. package/dist/lib/llm/judges/modal-priority.d.ts +41 -0
  136. package/dist/lib/llm/judges/modal-priority.d.ts.map +1 -0
  137. package/dist/lib/llm/judges/modal-priority.js +74 -0
  138. package/dist/lib/llm/judges/modal-priority.js.map +1 -0
  139. package/dist/lib/llm/judges/select-option.d.ts +49 -0
  140. package/dist/lib/llm/judges/select-option.d.ts.map +1 -0
  141. package/dist/lib/llm/judges/select-option.js +90 -0
  142. package/dist/lib/llm/judges/select-option.js.map +1 -0
  143. package/dist/lib/llm/judges/verify-submit.d.ts +68 -0
  144. package/dist/lib/llm/judges/verify-submit.d.ts.map +1 -0
  145. package/dist/lib/llm/judges/verify-submit.js +89 -0
  146. package/dist/lib/llm/judges/verify-submit.js.map +1 -0
  147. package/dist/lib/llm/schemas.d.ts +220 -0
  148. package/dist/lib/llm/schemas.d.ts.map +1 -0
  149. package/dist/lib/llm/schemas.js +239 -0
  150. package/dist/lib/llm/schemas.js.map +1 -0
  151. package/dist/lib/logging.d.ts +39 -0
  152. package/dist/lib/logging.d.ts.map +1 -0
  153. package/dist/lib/logging.js +219 -0
  154. package/dist/lib/logging.js.map +1 -0
  155. package/dist/lib/multipart.d.ts +34 -0
  156. package/dist/lib/multipart.d.ts.map +1 -0
  157. package/dist/lib/multipart.js +55 -0
  158. package/dist/lib/multipart.js.map +1 -0
  159. package/dist/lib/option-matcher.d.ts +15 -0
  160. package/dist/lib/option-matcher.d.ts.map +1 -0
  161. package/dist/lib/option-matcher.js +69 -0
  162. package/dist/lib/option-matcher.js.map +1 -0
  163. package/dist/lib/phone.d.ts +11 -0
  164. package/dist/lib/phone.d.ts.map +1 -0
  165. package/dist/lib/phone.js +17 -0
  166. package/dist/lib/phone.js.map +1 -0
  167. package/dist/lib/random.d.ts +22 -0
  168. package/dist/lib/random.d.ts.map +1 -0
  169. package/dist/lib/random.js +33 -0
  170. package/dist/lib/random.js.map +1 -0
  171. package/dist/lib/statsd.d.ts +11 -0
  172. package/dist/lib/statsd.d.ts.map +1 -0
  173. package/dist/lib/statsd.js +68 -0
  174. package/dist/lib/statsd.js.map +1 -0
  175. package/dist/lib/telemetry/call-capture.d.ts +89 -0
  176. package/dist/lib/telemetry/call-capture.d.ts.map +1 -0
  177. package/dist/lib/telemetry/call-capture.js +190 -0
  178. package/dist/lib/telemetry/call-capture.js.map +1 -0
  179. package/dist/lib/telemetry/call-types.d.ts +65 -0
  180. package/dist/lib/telemetry/call-types.d.ts.map +1 -0
  181. package/dist/lib/telemetry/call-types.js +68 -0
  182. package/dist/lib/telemetry/call-types.js.map +1 -0
  183. package/dist/lib/telemetry/run-state.d.ts +15 -0
  184. package/dist/lib/telemetry/run-state.d.ts.map +1 -0
  185. package/dist/lib/telemetry/run-state.js +23 -0
  186. package/dist/lib/telemetry/run-state.js.map +1 -0
  187. package/dist/lib/telemetry/s3-sink.d.ts +48 -0
  188. package/dist/lib/telemetry/s3-sink.d.ts.map +1 -0
  189. package/dist/lib/telemetry/s3-sink.js +229 -0
  190. package/dist/lib/telemetry/s3-sink.js.map +1 -0
  191. package/dist/lib/telemetry/submission-capture.d.ts +45 -0
  192. package/dist/lib/telemetry/submission-capture.d.ts.map +1 -0
  193. package/dist/lib/telemetry/submission-capture.js +57 -0
  194. package/dist/lib/telemetry/submission-capture.js.map +1 -0
  195. package/dist/lib/telemetry/telemetry-paths.d.ts +59 -0
  196. package/dist/lib/telemetry/telemetry-paths.d.ts.map +1 -0
  197. package/dist/lib/telemetry/telemetry-paths.js +103 -0
  198. package/dist/lib/telemetry/telemetry-paths.js.map +1 -0
  199. package/dist/lib/tracking-click.d.ts +20 -0
  200. package/dist/lib/tracking-click.d.ts.map +1 -0
  201. package/dist/lib/tracking-click.js +75 -0
  202. package/dist/lib/tracking-click.js.map +1 -0
  203. package/dist/lib/url-capture.d.ts +8 -0
  204. package/dist/lib/url-capture.d.ts.map +1 -0
  205. package/dist/lib/url-capture.js +17 -0
  206. package/dist/lib/url-capture.js.map +1 -0
  207. package/dist/lib/us-states.d.ts +20 -0
  208. package/dist/lib/us-states.d.ts.map +1 -0
  209. package/dist/lib/us-states.js +86 -0
  210. package/dist/lib/us-states.js.map +1 -0
  211. package/dist/lib/zod-multipart.d.ts +18 -0
  212. package/dist/lib/zod-multipart.d.ts.map +1 -0
  213. package/dist/lib/zod-multipart.js +35 -0
  214. package/dist/lib/zod-multipart.js.map +1 -0
  215. package/dist/plugins/config-plugin.d.ts +77 -0
  216. package/dist/plugins/config-plugin.d.ts.map +1 -0
  217. package/dist/plugins/config-plugin.js +216 -0
  218. package/dist/plugins/config-plugin.js.map +1 -0
  219. package/dist/plugins/discover.d.ts +72 -0
  220. package/dist/plugins/discover.d.ts.map +1 -0
  221. package/dist/plugins/discover.js +265 -0
  222. package/dist/plugins/discover.js.map +1 -0
  223. package/dist/plugins/json-schema-to-zod.d.ts +47 -0
  224. package/dist/plugins/json-schema-to-zod.d.ts.map +1 -0
  225. package/dist/plugins/json-schema-to-zod.js +85 -0
  226. package/dist/plugins/json-schema-to-zod.js.map +1 -0
  227. package/dist/plugins/loader.d.ts +34 -0
  228. package/dist/plugins/loader.d.ts.map +1 -0
  229. package/dist/plugins/loader.js +348 -0
  230. package/dist/plugins/loader.js.map +1 -0
  231. package/dist/plugins/plugin-api-version.d.ts +8 -0
  232. package/dist/plugins/plugin-api-version.d.ts.map +1 -0
  233. package/dist/plugins/plugin-api-version.js +11 -0
  234. package/dist/plugins/plugin-api-version.js.map +1 -0
  235. package/dist/plugins/plugin-manifest-envelope.d.ts +16 -0
  236. package/dist/plugins/plugin-manifest-envelope.d.ts.map +1 -0
  237. package/dist/plugins/plugin-manifest-envelope.js +19 -0
  238. package/dist/plugins/plugin-manifest-envelope.js.map +1 -0
  239. package/dist/scraper/behavioral-signals.d.ts +16 -0
  240. package/dist/scraper/behavioral-signals.d.ts.map +1 -0
  241. package/dist/scraper/behavioral-signals.js +30 -0
  242. package/dist/scraper/behavioral-signals.js.map +1 -0
  243. package/dist/scraper/errors.d.ts +193 -0
  244. package/dist/scraper/errors.d.ts.map +1 -0
  245. package/dist/scraper/errors.js +226 -0
  246. package/dist/scraper/errors.js.map +1 -0
  247. package/dist/scraper/fixtures.d.ts +23 -0
  248. package/dist/scraper/fixtures.d.ts.map +1 -0
  249. package/dist/scraper/fixtures.js +48 -0
  250. package/dist/scraper/fixtures.js.map +1 -0
  251. package/dist/scraper/flow-runner.d.ts +1319 -0
  252. package/dist/scraper/flow-runner.d.ts.map +1 -0
  253. package/dist/scraper/flow-runner.js +5637 -0
  254. package/dist/scraper/flow-runner.js.map +1 -0
  255. package/dist/scraper/graphql-client.d.ts +30 -0
  256. package/dist/scraper/graphql-client.d.ts.map +1 -0
  257. package/dist/scraper/graphql-client.js +14 -0
  258. package/dist/scraper/graphql-client.js.map +1 -0
  259. package/dist/scraper/http-client.d.ts +75 -0
  260. package/dist/scraper/http-client.d.ts.map +1 -0
  261. package/dist/scraper/http-client.js +189 -0
  262. package/dist/scraper/http-client.js.map +1 -0
  263. package/dist/scraper/http-status-classifier.d.ts +12 -0
  264. package/dist/scraper/http-status-classifier.d.ts.map +1 -0
  265. package/dist/scraper/http-status-classifier.js +29 -0
  266. package/dist/scraper/http-status-classifier.js.map +1 -0
  267. package/dist/scraper/metrics.d.ts +50 -0
  268. package/dist/scraper/metrics.d.ts.map +1 -0
  269. package/dist/scraper/metrics.js +85 -0
  270. package/dist/scraper/metrics.js.map +1 -0
  271. package/dist/scraper/navigate.d.ts +20 -0
  272. package/dist/scraper/navigate.d.ts.map +1 -0
  273. package/dist/scraper/navigate.js +30 -0
  274. package/dist/scraper/navigate.js.map +1 -0
  275. package/dist/scraper/oracle-sentinels.d.ts +22 -0
  276. package/dist/scraper/oracle-sentinels.d.ts.map +1 -0
  277. package/dist/scraper/oracle-sentinels.js +40 -0
  278. package/dist/scraper/oracle-sentinels.js.map +1 -0
  279. package/dist/scraper/parse-json-response.d.ts +16 -0
  280. package/dist/scraper/parse-json-response.d.ts.map +1 -0
  281. package/dist/scraper/parse-json-response.js +37 -0
  282. package/dist/scraper/parse-json-response.js.map +1 -0
  283. package/dist/scraper/pool.d.ts +37 -0
  284. package/dist/scraper/pool.d.ts.map +1 -0
  285. package/dist/scraper/pool.js +105 -0
  286. package/dist/scraper/pool.js.map +1 -0
  287. package/dist/scraper/rate-limited-json-client.d.ts +35 -0
  288. package/dist/scraper/rate-limited-json-client.d.ts.map +1 -0
  289. package/dist/scraper/rate-limited-json-client.js +29 -0
  290. package/dist/scraper/rate-limited-json-client.js.map +1 -0
  291. package/dist/scraper/raw-fetch.d.ts +49 -0
  292. package/dist/scraper/raw-fetch.d.ts.map +1 -0
  293. package/dist/scraper/raw-fetch.js +40 -0
  294. package/dist/scraper/raw-fetch.js.map +1 -0
  295. package/dist/scraper/require-response-field.d.ts +23 -0
  296. package/dist/scraper/require-response-field.d.ts.map +1 -0
  297. package/dist/scraper/require-response-field.js +42 -0
  298. package/dist/scraper/require-response-field.js.map +1 -0
  299. package/dist/scraper/retry.d.ts +33 -0
  300. package/dist/scraper/retry.d.ts.map +1 -0
  301. package/dist/scraper/retry.js +122 -0
  302. package/dist/scraper/retry.js.map +1 -0
  303. package/dist/scraper/session-browserbase.d.ts +35 -0
  304. package/dist/scraper/session-browserbase.d.ts.map +1 -0
  305. package/dist/scraper/session-browserbase.js +198 -0
  306. package/dist/scraper/session-browserbase.js.map +1 -0
  307. package/dist/scraper/session-shared.d.ts +29 -0
  308. package/dist/scraper/session-shared.d.ts.map +1 -0
  309. package/dist/scraper/session-shared.js +35 -0
  310. package/dist/scraper/session-shared.js.map +1 -0
  311. package/dist/scraper/session-steel.d.ts +31 -0
  312. package/dist/scraper/session-steel.d.ts.map +1 -0
  313. package/dist/scraper/session-steel.js +140 -0
  314. package/dist/scraper/session-steel.js.map +1 -0
  315. package/dist/scraper/session-warmup.d.ts +31 -0
  316. package/dist/scraper/session-warmup.d.ts.map +1 -0
  317. package/dist/scraper/session-warmup.js +46 -0
  318. package/dist/scraper/session-warmup.js.map +1 -0
  319. package/dist/scraper/session.d.ts +21 -0
  320. package/dist/scraper/session.d.ts.map +1 -0
  321. package/dist/scraper/session.js +28 -0
  322. package/dist/scraper/session.js.map +1 -0
  323. package/dist/scraper/stagehand-guard.d.ts +128 -0
  324. package/dist/scraper/stagehand-guard.d.ts.map +1 -0
  325. package/dist/scraper/stagehand-guard.js +337 -0
  326. package/dist/scraper/stagehand-guard.js.map +1 -0
  327. package/dist/scraper/throttle.d.ts +21 -0
  328. package/dist/scraper/throttle.d.ts.map +1 -0
  329. package/dist/scraper/throttle.js +45 -0
  330. package/dist/scraper/throttle.js.map +1 -0
  331. package/dist/scripts/hca-inbox-poll.d.ts +19 -0
  332. package/dist/scripts/hca-inbox-poll.d.ts.map +1 -0
  333. package/dist/scripts/hca-inbox-poll.js +151 -0
  334. package/dist/scripts/hca-inbox-poll.js.map +1 -0
  335. package/dist/scripts/judge-llm-batch.d.ts +98 -0
  336. package/dist/scripts/judge-llm-batch.d.ts.map +1 -0
  337. package/dist/scripts/judge-llm-batch.js +350 -0
  338. package/dist/scripts/judge-llm-batch.js.map +1 -0
  339. package/dist/scripts/llm-heal.d.ts +165 -0
  340. package/dist/scripts/llm-heal.d.ts.map +1 -0
  341. package/dist/scripts/llm-heal.js +595 -0
  342. package/dist/scripts/llm-heal.js.map +1 -0
  343. package/dist/scripts/migrate-telemetry-dir-names.d.ts +57 -0
  344. package/dist/scripts/migrate-telemetry-dir-names.d.ts.map +1 -0
  345. package/dist/scripts/migrate-telemetry-dir-names.js +156 -0
  346. package/dist/scripts/migrate-telemetry-dir-names.js.map +1 -0
  347. package/dist/scripts/probe-setinputfiles.d.ts +28 -0
  348. package/dist/scripts/probe-setinputfiles.d.ts.map +1 -0
  349. package/dist/scripts/probe-setinputfiles.js +95 -0
  350. package/dist/scripts/probe-setinputfiles.js.map +1 -0
  351. package/dist/scripts/recon-browser.d.ts +304 -0
  352. package/dist/scripts/recon-browser.d.ts.map +1 -0
  353. package/dist/scripts/recon-browser.js +1833 -0
  354. package/dist/scripts/recon-browser.js.map +1 -0
  355. package/dist/scripts/recon-generate.d.ts +182 -0
  356. package/dist/scripts/recon-generate.d.ts.map +1 -0
  357. package/dist/scripts/recon-generate.js +2572 -0
  358. package/dist/scripts/recon-generate.js.map +1 -0
  359. package/dist/scripts/recon-heal.d.ts +176 -0
  360. package/dist/scripts/recon-heal.d.ts.map +1 -0
  361. package/dist/scripts/recon-heal.js +584 -0
  362. package/dist/scripts/recon-heal.js.map +1 -0
  363. package/dist/scripts/recon-http.d.ts +19 -0
  364. package/dist/scripts/recon-http.d.ts.map +1 -0
  365. package/dist/scripts/recon-http.js +377 -0
  366. package/dist/scripts/recon-http.js.map +1 -0
  367. package/dist/scripts/recon-replay-jobs.d.ts +21 -0
  368. package/dist/scripts/recon-replay-jobs.d.ts.map +1 -0
  369. package/dist/scripts/recon-replay-jobs.js +221 -0
  370. package/dist/scripts/recon-replay-jobs.js.map +1 -0
  371. package/dist/scripts/recon-shared.d.ts +52 -0
  372. package/dist/scripts/recon-shared.d.ts.map +1 -0
  373. package/dist/scripts/recon-shared.js +68 -0
  374. package/dist/scripts/recon-shared.js.map +1 -0
  375. package/dist/scripts/recon-summarize.d.ts +15 -0
  376. package/dist/scripts/recon-summarize.d.ts.map +1 -0
  377. package/dist/scripts/recon-summarize.js +233 -0
  378. package/dist/scripts/recon-summarize.js.map +1 -0
  379. package/dist/scripts/smoke-test.d.ts +22 -0
  380. package/dist/scripts/smoke-test.d.ts.map +1 -0
  381. package/dist/scripts/smoke-test.js +236 -0
  382. package/dist/scripts/smoke-test.js.map +1 -0
  383. package/dist/server.d.ts +10 -0
  384. package/dist/server.d.ts.map +1 -0
  385. package/dist/server.js +189 -0
  386. package/dist/server.js.map +1 -0
  387. package/dist/site-plugin.d.ts +226 -0
  388. package/dist/site-plugin.d.ts.map +1 -0
  389. package/dist/site-plugin.js +13 -0
  390. package/dist/site-plugin.js.map +1 -0
  391. package/dist/testing/answers-fixture.d.ts +13 -0
  392. package/dist/testing/answers-fixture.d.ts.map +1 -0
  393. package/dist/testing/answers-fixture.js +37 -0
  394. package/dist/testing/answers-fixture.js.map +1 -0
  395. package/dist/testing/batch-email-confirmation.d.ts +58 -0
  396. package/dist/testing/batch-email-confirmation.d.ts.map +1 -0
  397. package/dist/testing/batch-email-confirmation.js +62 -0
  398. package/dist/testing/batch-email-confirmation.js.map +1 -0
  399. package/dist/testing/batch-report.d.ts +33 -0
  400. package/dist/testing/batch-report.d.ts.map +1 -0
  401. package/dist/testing/batch-report.js +30 -0
  402. package/dist/testing/batch-report.js.map +1 -0
  403. package/dist/testing/contract-parity-suite.d.ts +55 -0
  404. package/dist/testing/contract-parity-suite.d.ts.map +1 -0
  405. package/dist/testing/contract-parity-suite.js +39 -0
  406. package/dist/testing/contract-parity-suite.js.map +1 -0
  407. package/dist/testing/coverage-guard-suite.d.ts +46 -0
  408. package/dist/testing/coverage-guard-suite.d.ts.map +1 -0
  409. package/dist/testing/coverage-guard-suite.js +39 -0
  410. package/dist/testing/coverage-guard-suite.js.map +1 -0
  411. package/dist/testing/fixtures/resume.pdf +54 -0
  412. package/dist/testing/integration-runner.d.ts +62 -0
  413. package/dist/testing/integration-runner.d.ts.map +1 -0
  414. package/dist/testing/integration-runner.js +46 -0
  415. package/dist/testing/integration-runner.js.map +1 -0
  416. package/dist/testing/mock-fetch-response.d.ts +7 -0
  417. package/dist/testing/mock-fetch-response.d.ts.map +1 -0
  418. package/dist/testing/mock-fetch-response.js +16 -0
  419. package/dist/testing/mock-fetch-response.js.map +1 -0
  420. package/dist/testing/persona-fixture.d.ts +77 -0
  421. package/dist/testing/persona-fixture.d.ts.map +1 -0
  422. package/dist/testing/persona-fixture.js +83 -0
  423. package/dist/testing/persona-fixture.js.map +1 -0
  424. package/dist/testing/replay-integration-suite.d.ts +50 -0
  425. package/dist/testing/replay-integration-suite.d.ts.map +1 -0
  426. package/dist/testing/replay-integration-suite.js +45 -0
  427. package/dist/testing/replay-integration-suite.js.map +1 -0
  428. package/dist/testing/resume-fixture.d.ts +39 -0
  429. package/dist/testing/resume-fixture.d.ts.map +1 -0
  430. package/dist/testing/resume-fixture.js +38 -0
  431. package/dist/testing/resume-fixture.js.map +1 -0
  432. package/dist/testmail/client.d.ts +61 -0
  433. package/dist/testmail/client.d.ts.map +1 -0
  434. package/dist/testmail/client.js +190 -0
  435. package/dist/testmail/client.js.map +1 -0
  436. package/dist/testmail/errors.d.ts +18 -0
  437. package/dist/testmail/errors.d.ts.map +1 -0
  438. package/dist/testmail/errors.js +29 -0
  439. package/dist/testmail/errors.js.map +1 -0
  440. package/dist/types/dispatch-metrics.d.ts +46 -0
  441. package/dist/types/dispatch-metrics.d.ts.map +1 -0
  442. package/dist/types/dispatch-metrics.js +25 -0
  443. package/dist/types/dispatch-metrics.js.map +1 -0
  444. package/dist/types/logging.d.ts +11 -0
  445. package/dist/types/logging.d.ts.map +1 -0
  446. package/dist/types/logging.js +3 -0
  447. package/dist/types/logging.js.map +1 -0
  448. package/package.json +283 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTimeoutFetch = createTimeoutFetch;
4
+ exports.pickRandomViewport = pickRandomViewport;
5
+ const random_1 = require("../lib/random");
6
+ /**
7
+ * Returns a fetch wrapper that aborts after `timeoutMs` milliseconds.
8
+ * Handles the total request timeout for Anthropic API calls; the TCP connect
9
+ * timeout is handled separately via setGlobalDispatcher in server.ts.
10
+ */
11
+ function createTimeoutFetch(timeoutMs) {
12
+ return (url, init) => {
13
+ const controller = new AbortController();
14
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
15
+ // Merge with any existing signal from the caller (e.g. AI SDK's own abort signal)
16
+ // so both can independently cancel the request.
17
+ const signals = [controller.signal, init?.signal].filter((s) => s instanceof AbortSignal);
18
+ const signal = signals.length > 1 ? AbortSignal.any(signals) : signals[0];
19
+ return fetch(url, { ...init, signal }).finally(() => clearTimeout(timer));
20
+ };
21
+ }
22
+ /**
23
+ * Common desktop viewports rotated per session to reduce bot-detection
24
+ * fingerprinting — a fixed pixel size is an easy signal to filter on.
25
+ */
26
+ const VIEWPORTS = [
27
+ { width: 1280, height: 720 },
28
+ { width: 1366, height: 768 },
29
+ { width: 1440, height: 900 },
30
+ { width: 1920, height: 1080 },
31
+ ];
32
+ function pickRandomViewport() {
33
+ return (0, random_1.pickRandom)(VIEWPORTS);
34
+ }
35
+ //# sourceMappingURL=session-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-shared.js","sourceRoot":"","sources":["../../src/scraper/session-shared.ts"],"names":[],"mappings":";;AA4BA,gDAYC;AAaD,gDAEC;AApDD,yCAA0C;AAoB1C;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,SAAiB;IAClD,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9D,kFAAkF;QAClF,gDAAgD;QAChD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,YAAY,WAAW,CAClD,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,SAAS,GAAG;IAChB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACrB,CAAC;AAEX,SAAgB,kBAAkB;IAChC,OAAO,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type BrowserSession } from "../scraper/session-shared";
2
+ /**
3
+ * Spins up one Steel cloud browser session with residential proxies +
4
+ * the configured Stagehand LLM, connected via Steel's CDP endpoint.
5
+ *
6
+ * Why residential proxies: many target sites are more reliably reachable
7
+ * from residential IPs; datacenter ranges are commonly flagged.
8
+ *
9
+ * Why serverCache=true: Stagehand's server-side cache skips LLM inference on
10
+ * replay. After the first run against a page structure, subsequent `act()`
11
+ * calls complete in milliseconds. When the target page UI changes and a cached
12
+ * action fails, retry.ts wraps the next attempt — that's our recovery layer.
13
+ *
14
+ * Why selfHeal=false: Stagehand's built-in self-heal only fires on Playwright
15
+ * throws (element-not-found / intercepted / timeout). It does NOT catch the
16
+ * silent-semantic-miss case ("clicked the wrong thing, returned success"), it
17
+ * has open variable-loss / cache-write bugs on `main`, and the docs themselves
18
+ * default it off and steer production users toward observe → act. Recon-browser
19
+ * owns its own verify-and-retry cascade; the runtime path uses retry.ts. Keeping
20
+ * this off makes failure semantics clean — `act()` throws or succeeds, and our
21
+ * code decides what to do next.
22
+ *
23
+ * Why `env: "LOCAL"`: Steel sessions connect via a CDP URL, not Stagehand's
24
+ * first-party Browserbase integration. This means several Stagehand code paths
25
+ * gated on `env === "BROWSERBASE"` (file upload payload injection, tuned CDP
26
+ * timeouts, session recovery, event-window timing) stay inactive — accept this
27
+ * trade-off as the cost of Steel support. Switch to the Browserbase provider
28
+ * to activate those paths.
29
+ */
30
+ export declare function createSteelBrowserSession(): Promise<BrowserSession>;
31
+ //# sourceMappingURL=session-steel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-steel.d.ts","sourceRoot":"","sources":["../../src/scraper/session-steel.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,0BAA0B,CAAC;AAKlC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,cAAc,CAAC,CAsGzE"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSteelBrowserSession = createSteelBrowserSession;
7
+ const stagehand_1 = require("@browserbasehq/stagehand");
8
+ const steel_sdk_1 = __importDefault(require("steel-sdk"));
9
+ const config_1 = require("../config");
10
+ const bedrock_1 = require("../lib/bedrock");
11
+ const errors_1 = require("../lib/errors");
12
+ const logging_1 = require("../lib/logging");
13
+ const session_shared_1 = require("../scraper/session-shared");
14
+ const throttle_1 = require("../scraper/throttle");
15
+ const logger = (0, logging_1.getLogger)({ name: "scraper/session-steel" });
16
+ /**
17
+ * Spins up one Steel cloud browser session with residential proxies +
18
+ * the configured Stagehand LLM, connected via Steel's CDP endpoint.
19
+ *
20
+ * Why residential proxies: many target sites are more reliably reachable
21
+ * from residential IPs; datacenter ranges are commonly flagged.
22
+ *
23
+ * Why serverCache=true: Stagehand's server-side cache skips LLM inference on
24
+ * replay. After the first run against a page structure, subsequent `act()`
25
+ * calls complete in milliseconds. When the target page UI changes and a cached
26
+ * action fails, retry.ts wraps the next attempt — that's our recovery layer.
27
+ *
28
+ * Why selfHeal=false: Stagehand's built-in self-heal only fires on Playwright
29
+ * throws (element-not-found / intercepted / timeout). It does NOT catch the
30
+ * silent-semantic-miss case ("clicked the wrong thing, returned success"), it
31
+ * has open variable-loss / cache-write bugs on `main`, and the docs themselves
32
+ * default it off and steer production users toward observe → act. Recon-browser
33
+ * owns its own verify-and-retry cascade; the runtime path uses retry.ts. Keeping
34
+ * this off makes failure semantics clean — `act()` throws or succeeds, and our
35
+ * code decides what to do next.
36
+ *
37
+ * Why `env: "LOCAL"`: Steel sessions connect via a CDP URL, not Stagehand's
38
+ * first-party Browserbase integration. This means several Stagehand code paths
39
+ * gated on `env === "BROWSERBASE"` (file upload payload injection, tuned CDP
40
+ * timeouts, session recovery, event-window timing) stay inactive — accept this
41
+ * trade-off as the cost of Steel support. Switch to the Browserbase provider
42
+ * to activate those paths.
43
+ */
44
+ async function createSteelBrowserSession() {
45
+ if (!config_1.config.scraper.steelApiKey) {
46
+ throw new Error("STEEL_API_KEY is required for the steel provider");
47
+ }
48
+ if (!config_1.config.scraper.useBedrock && !config_1.config.scraper.anthropicApiKey) {
49
+ throw new Error("ANTHROPIC_API_KEY is required for the Stagehand LLM client");
50
+ }
51
+ const steel = new steel_sdk_1.default({ steelAPIKey: config_1.config.scraper.steelApiKey });
52
+ const viewport = (0, session_shared_1.pickRandomViewport)();
53
+ const session = await steel.sessions.create({
54
+ timeout: config_1.config.scraper.steelSessionTimeoutMs,
55
+ // Lowercase the env value so SCRAPER_PROXY_TYPE="Residential" /
56
+ // "RESIDENTIAL" don't silently turn the proxy off.
57
+ useProxy: config_1.config.scraper.proxyType.toLowerCase() === "residential",
58
+ solveCaptcha: config_1.config.scraper.solveCaptcha,
59
+ dimensions: viewport,
60
+ });
61
+ // Once `sessions.create` resolves, Steel is billing for the remote session.
62
+ // Any failure between here and a successful return must release the session
63
+ // explicitly — otherwise a Stagehand init crash or Stagehand CDP connection
64
+ // failure leaves a live session burning minutes until Steel's own timeout.
65
+ let stagehand;
66
+ try {
67
+ // Steel's websocketUrl is `wss://connect.steel.dev?sessionId=…`. Stagehand's
68
+ // V3 CDP connector requires the apiKey as a query parameter too — without it
69
+ // the connection returns a 502 before the CDP handshake completes.
70
+ const cdpUrl = session.websocketUrl.includes("apiKey=")
71
+ ? session.websocketUrl
72
+ : `${session.websocketUrl}&apiKey=${encodeURIComponent(config_1.config.scraper.steelApiKey)}`;
73
+ logger.info(`created steel session ${session.id} viewport=${viewport.width}x${viewport.height}`);
74
+ if (config_1.config.scraper.useBedrock) {
75
+ logger.info(`using bedrock model ${config_1.config.bedrock.model} in region ${config_1.config.bedrock.region}`);
76
+ }
77
+ const llmClient = config_1.config.scraper.useBedrock
78
+ ? new stagehand_1.AISdkClient({ model: (0, bedrock_1.createBedrockModel)(config_1.config.bedrock) })
79
+ : undefined;
80
+ stagehand = new stagehand_1.Stagehand({
81
+ env: "LOCAL",
82
+ model: config_1.config.scraper.useBedrock
83
+ ? undefined
84
+ : {
85
+ modelName: config_1.config.scraper.model,
86
+ apiKey: config_1.config.scraper.anthropicApiKey,
87
+ // @ai-sdk/anthropic has no `timeout` option; inject timeout at the fetch layer.
88
+ fetch: (0, session_shared_1.createTimeoutFetch)(config_1.config.scraper.anthropicTimeoutMs),
89
+ },
90
+ llmClient,
91
+ serverCache: true,
92
+ selfHeal: false,
93
+ localBrowserLaunchOptions: { cdpUrl },
94
+ verbose: 0,
95
+ });
96
+ await stagehand.init();
97
+ }
98
+ catch (err) {
99
+ // Best-effort cleanup; swallow secondary failures so the original
100
+ // error surfaces to the caller.
101
+ try {
102
+ if (stagehand)
103
+ await stagehand.close();
104
+ }
105
+ catch (closeErr) {
106
+ logger.warn(`stagehand close during failed init: ${(0, errors_1.toErrorMessage)(closeErr)}`);
107
+ }
108
+ try {
109
+ await steel.sessions.release(session.id);
110
+ }
111
+ catch (releaseErr) {
112
+ logger.warn(`steel release during failed init for ${session.id}: ${(0, errors_1.toErrorMessage)(releaseErr)}`);
113
+ }
114
+ throw err;
115
+ }
116
+ const limiter = (0, throttle_1.createSessionLimiter)();
117
+ const close = async () => {
118
+ try {
119
+ await stagehand.close();
120
+ }
121
+ catch (err) {
122
+ logger.warn(`stagehand close failed for session ${session.id}: ${(0, errors_1.toErrorMessage)(err)}`);
123
+ }
124
+ try {
125
+ await steel.sessions.release(session.id);
126
+ }
127
+ catch (err) {
128
+ logger.warn(`steel release failed for session ${session.id}: ${(0, errors_1.toErrorMessage)(err)}`);
129
+ }
130
+ await limiter.stop({ dropWaitingJobs: true });
131
+ };
132
+ return {
133
+ stagehand,
134
+ limiter,
135
+ sessionId: session.id,
136
+ provider: "steel",
137
+ close,
138
+ };
139
+ }
140
+ //# sourceMappingURL=session-steel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-steel.js","sourceRoot":"","sources":["../../src/scraper/session-steel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Generic retrying browser-session runner. Acquires a fresh session from
3
+ * `sessionFactory`, runs `callback(session)`, guarantees `session.close()` in
4
+ * every code path, and retries up to `retryOptions.retries + 1` attempts with
5
+ * the caller-supplied pRetry options. On exhaustion, wraps the last error in
6
+ * the caller-supplied `exhaustionError`.
7
+ *
8
+ * Extracted from appcast/tokens/warmup.ts so any future recon→generate warmup
9
+ * flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
10
+ * finally-close + error-mapping each time.
11
+ */
12
+ import { type Options as PRetryOptions } from "p-retry";
13
+ import type { BrowserSession } from "../scraper/session-shared";
14
+ export interface SessionWarmupOptions {
15
+ /** pRetry options forwarded verbatim. The caller controls retries, timeouts, and onFailedAttempt. */
16
+ retryOptions: PRetryOptions;
17
+ /**
18
+ * Invoked with the last-thrown error when all attempts are exhausted. Return
19
+ * the error that `withBrowserSession` should throw (typically a domain-specific
20
+ * error type the caller's dispatch layer understands).
21
+ */
22
+ mapExhaustionError: (err: unknown) => Error;
23
+ }
24
+ /**
25
+ * Runs `callback` inside a fresh browser session on every attempt. Guarantees
26
+ * that `session.close()` is called regardless of whether the callback succeeds
27
+ * or throws. On exhaustion, calls `opts.mapExhaustionError` with the last pRetry
28
+ * error and throws whatever it returns.
29
+ */
30
+ export declare function withBrowserSession<T>(sessionFactory: () => Promise<BrowserSession>, callback: (session: BrowserSession, attemptNumber: number) => Promise<T>, opts: SessionWarmupOptions): Promise<T>;
31
+ //# sourceMappingURL=session-warmup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-warmup.d.ts","sourceRoot":"","sources":["../../src/scraper/session-warmup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAe,EAAE,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,MAAM,WAAW,oBAAoB;IACnC,qGAAqG;IACrG,YAAY,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,EAC7C,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACxE,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * Generic retrying browser-session runner. Acquires a fresh session from
4
+ * `sessionFactory`, runs `callback(session)`, guarantees `session.close()` in
5
+ * every code path, and retries up to `retryOptions.retries + 1` attempts with
6
+ * the caller-supplied pRetry options. On exhaustion, wraps the last error in
7
+ * the caller-supplied `exhaustionError`.
8
+ *
9
+ * Extracted from appcast/tokens/warmup.ts so any future recon→generate warmup
10
+ * flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
11
+ * finally-close + error-mapping each time.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.withBrowserSession = withBrowserSession;
18
+ const p_retry_1 = __importDefault(require("p-retry"));
19
+ const errors_1 = require("../lib/errors");
20
+ const logging_1 = require("../lib/logging");
21
+ const logger = (0, logging_1.getLogger)({ name: "scraper/session-warmup" });
22
+ /**
23
+ * Runs `callback` inside a fresh browser session on every attempt. Guarantees
24
+ * that `session.close()` is called regardless of whether the callback succeeds
25
+ * or throws. On exhaustion, calls `opts.mapExhaustionError` with the last pRetry
26
+ * error and throws whatever it returns.
27
+ */
28
+ async function withBrowserSession(sessionFactory, callback, opts) {
29
+ try {
30
+ return await (0, p_retry_1.default)(async (attemptNumber) => {
31
+ const session = await sessionFactory();
32
+ try {
33
+ return await callback(session, attemptNumber);
34
+ }
35
+ finally {
36
+ await session.close().catch((closeErr) => {
37
+ logger.warn(`session-warmup: close failed for ${session.sessionId}: ${(0, errors_1.toErrorMessage)(closeErr)}`);
38
+ });
39
+ }
40
+ }, opts.retryOptions);
41
+ }
42
+ catch (err) {
43
+ throw opts.mapExhaustionError(err);
44
+ }
45
+ }
46
+ //# sourceMappingURL=session-warmup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-warmup.js","sourceRoot":"","sources":["../../src/scraper/session-warmup.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AA2BH,gDAqBC;AA9CD,sDAAgE;AAEhE,yCAA8C;AAC9C,2CAA0C;AAG1C,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAa7D;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CACtC,cAA6C,EAC7C,QAAwE,EACxE,IAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,iBAAM,EAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAChD,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvC,MAAM,CAAC,IAAI,CACT,oCAAoC,OAAO,CAAC,SAAS,KAAK,IAAA,uBAAc,EAAC,QAAQ,CAAC,EAAE,CACrF,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { BrowserSession, ProviderName } from "../scraper/session-shared";
2
+ export type { BrowserSession, ProviderName } from "../scraper/session-shared";
3
+ /**
4
+ * Spins up one browser session via the configured provider. Browserbase is the
5
+ * default; Steel is an opt-in fallback.
6
+ *
7
+ * Provider selection (in order of precedence):
8
+ * 1. Explicit `opts.provider` (per-call override; CLI flags forward here)
9
+ * 2. `SCRAPER_PROVIDER` env var resolved at module load into `config.scraper.provider`
10
+ * 3. Hardcoded default ("browserbase")
11
+ *
12
+ * `advancedStealth` opts into Browserbase's Scale Plan stealth profile (uses a
13
+ * stronger fingerprint mitigation pipeline + forces a Windows desktop
14
+ * fingerprint per Browserbase's DataDome guidance). No-op when the provider
15
+ * is Steel — that path uses its own stealth defaults.
16
+ */
17
+ export declare function createBrowserSession(opts?: {
18
+ provider?: ProviderName;
19
+ advancedStealth?: boolean;
20
+ }): Promise<BrowserSession>;
21
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/scraper/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7E,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAChD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAM1B"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBrowserSession = createBrowserSession;
4
+ const config_1 = require("../config");
5
+ const session_browserbase_1 = require("../scraper/session-browserbase");
6
+ const session_steel_1 = require("../scraper/session-steel");
7
+ /**
8
+ * Spins up one browser session via the configured provider. Browserbase is the
9
+ * default; Steel is an opt-in fallback.
10
+ *
11
+ * Provider selection (in order of precedence):
12
+ * 1. Explicit `opts.provider` (per-call override; CLI flags forward here)
13
+ * 2. `SCRAPER_PROVIDER` env var resolved at module load into `config.scraper.provider`
14
+ * 3. Hardcoded default ("browserbase")
15
+ *
16
+ * `advancedStealth` opts into Browserbase's Scale Plan stealth profile (uses a
17
+ * stronger fingerprint mitigation pipeline + forces a Windows desktop
18
+ * fingerprint per Browserbase's DataDome guidance). No-op when the provider
19
+ * is Steel — that path uses its own stealth defaults.
20
+ */
21
+ async function createBrowserSession(opts) {
22
+ const provider = opts?.provider ?? config_1.config.scraper.provider;
23
+ if (provider === "browserbase") {
24
+ return (0, session_browserbase_1.createBrowserbaseBrowserSession)({ advancedStealth: opts?.advancedStealth });
25
+ }
26
+ return (0, session_steel_1.createSteelBrowserSession)();
27
+ }
28
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/scraper/session.ts"],"names":[],"mappings":";;AAqBA,oDASC;AA9BD,qCAAkC;AAClC,uEAAgF;AAEhF,2DAAoE;AAIpE;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,oBAAoB,CAAC,IAG1C;IACC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC3D,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,IAAA,qDAA+B,EAAC,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,IAAA,yCAAyB,GAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Schema-enforcing wrappers around Stagehand's `act`, `observe`, and
3
+ * `extract`. Every Stagehand SDK call in the codebase routes through these
4
+ * so the engine has a single chokepoint for return-envelope validation +
5
+ * telemetry capture.
6
+ *
7
+ * Two enforcement modes by primitive:
8
+ *
9
+ * - `act` and `observe`: Stagehand owns the underlying LLM call and does
10
+ * not expose a caller-provided schema field on `ActOptions` /
11
+ * `ObserveOptions`. The strictest enforcement Stagehand's API allows is
12
+ * caller-side `safeParse` of the RETURN ENVELOPE against Zod mirrors of
13
+ * Stagehand's public types (`ActResult`, `Action`). On envelope drift
14
+ * (a Stagehand SDK upgrade that widens the shape, or a Stagehand bug
15
+ * that emits malformed JSON), the wrapper throws
16
+ * `StagehandSchemaError` and records a `failureKind:
17
+ * "schema-validation-failed"` entry to the NDJSON sink, matching the
18
+ * failure taxonomy of our direct Anthropic SDK callers.
19
+ *
20
+ * - `extract`: Stagehand's 3-arg overload accepts a caller-provided Zod
21
+ * schema and routes structured output through the LLM the same way our
22
+ * `messages.parse + zodOutputFormat` calls do. Stagehand `safeParse`s
23
+ * server-side; we `safeParse` again caller-side as defense in depth
24
+ * against SDK contract drift (and to log identical telemetry).
25
+ *
26
+ * Telemetry: every wrapper call lands in `calls.ndjson` regardless of
27
+ * outcome (per user directive — full parity with our Anthropic SDK call
28
+ * telemetry). Volume is dominated by `act`: hundreds of calls per job
29
+ * across the cascade attempts ≈ thousands of entries per sweep. The
30
+ * NDJSON sink is append-only and per-URL partitioned (see
31
+ * `src/lib/telemetry/telemetry-paths.ts`) so this scale is intentional.
32
+ *
33
+ * Stagehand Zod compat: as of `@browserbasehq/stagehand@3.4.0`,
34
+ * `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` — both Zod v3 and v4
35
+ * schemas pass through cleanly (confirmed in
36
+ * `node_modules/@browserbasehq/stagehand/dist/esm/lib/v3/zodCompat.d.ts`).
37
+ * Barnacle uses Zod v4 via the `zod/v4` subpath export; that's compatible.
38
+ */
39
+ import type { Action, ActOptions, ActResult, ExtractOptions, ObserveOptions, Stagehand } from "@browserbasehq/stagehand";
40
+ import { z } from "zod/v4";
41
+ import { type LlmCallInput } from "../lib/telemetry/call-capture";
42
+ /**
43
+ * Injectable capture function — matches `captureLlmCall`'s signature. Same
44
+ * shape as `JudgeCaptureFn` in `@/lib/llm/judge`. Lets each guard call route
45
+ * its telemetry into the caller's per-run NDJSON sink instead of the global
46
+ * default in `captureLlmCall`. Without this, every Stagehand guard entry
47
+ * lands in `.barnacle/calls.ndjson` instead of the per-URL run partition.
48
+ */
49
+ export type StagehandCaptureFn = (input: LlmCallInput) => Promise<void>;
50
+ /**
51
+ * Zod mirror of Stagehand's public `Action` shape (from
52
+ * `@browserbasehq/stagehand/.../public/methods.d.ts`):
53
+ *
54
+ * interface Action {
55
+ * selector: string;
56
+ * description: string;
57
+ * method?: string;
58
+ * arguments?: string[];
59
+ * }
60
+ *
61
+ * If Stagehand widens this shape in a future minor version, our `safeParse`
62
+ * fails closed — we'd rather see a `schema-validation-failed` entry in
63
+ * telemetry than have downstream code silently consume drift.
64
+ */
65
+ export declare const ACTION_SCHEMA: z.ZodObject<{
66
+ selector: z.ZodString;
67
+ description: z.ZodString;
68
+ method: z.ZodOptional<z.ZodString>;
69
+ arguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
70
+ }, z.core.$strip>;
71
+ /**
72
+ * Zod mirror of Stagehand's public `ActResult` shape. The `actions` array
73
+ * is sometimes empty when Stagehand acted via a path that doesn't echo the
74
+ * action back; the cascade's resolvedAction fallback already handles that
75
+ * case. We accept empty arrays here as valid per the SDK contract.
76
+ */
77
+ export declare const ACT_RESULT_SCHEMA: z.ZodObject<{
78
+ success: z.ZodBoolean;
79
+ message: z.ZodString;
80
+ actionDescription: z.ZodString;
81
+ actions: z.ZodArray<z.ZodObject<{
82
+ selector: z.ZodString;
83
+ description: z.ZodString;
84
+ method: z.ZodOptional<z.ZodString>;
85
+ arguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
86
+ }, z.core.$strip>>;
87
+ cacheStatus: z.ZodOptional<z.ZodEnum<{
88
+ HIT: "HIT";
89
+ MISS: "MISS";
90
+ }>>;
91
+ }, z.core.$strip>;
92
+ /**
93
+ * Thrown by any guarded* wrapper when Stagehand's return value doesn't
94
+ * `safeParse` against the schema. The `kind` is always
95
+ * `"schema-validation-failed"` — same string the Anthropic SDK callers use
96
+ * — so `classifyLlmCallFailure` routes it to the same NDJSON failureKind
97
+ * bucket without any string-matching changes.
98
+ */
99
+ export declare class StagehandSchemaError extends Error {
100
+ readonly kind: "schema-validation-failed";
101
+ readonly primitive: "act" | "observe" | "extract";
102
+ readonly zodError: z.ZodError;
103
+ readonly rawResponse: unknown;
104
+ constructor(primitive: "act" | "observe" | "extract", zodError: z.ZodError, rawResponse: unknown);
105
+ }
106
+ /**
107
+ * Schema-guarded wrapper around Stagehand's `act`. Same signature as the
108
+ * underlying call: accepts either an instruction string or a structured
109
+ * `Action` (from a prior `observe`). On the happy path, returns Stagehand's
110
+ * `ActResult` verbatim. On envelope drift, throws `StagehandSchemaError`
111
+ * and logs `failureKind: "schema-validation-failed"`.
112
+ */
113
+ export declare function guardedAct(stagehand: Stagehand, input: string | Action, options?: ActOptions, captureFn?: StagehandCaptureFn): Promise<ActResult>;
114
+ /**
115
+ * Schema-guarded wrapper around Stagehand's `observe`. Mirrors the
116
+ * Stagehand overloads: no args, options-only, instruction-only,
117
+ * instruction + options. On envelope drift (the `Action[]` shape changes),
118
+ * throws `StagehandSchemaError`.
119
+ */
120
+ export declare function guardedObserve(stagehand: Stagehand, instruction?: string, options?: ObserveOptions, captureFn?: StagehandCaptureFn): Promise<Action[]>;
121
+ /**
122
+ * Schema-guarded wrapper around Stagehand's `extract` 3-arg overload. The
123
+ * caller's Zod schema is what Stagehand asks the LLM to satisfy AND what we
124
+ * `safeParse` against caller-side. Refuse the 1-arg / 2-arg defaults; every
125
+ * extract call in the codebase must enforce a schema.
126
+ */
127
+ export declare function guardedExtract<T extends z.ZodTypeAny>(stagehand: Stagehand, instruction: string, schema: T, options?: ExtractOptions, captureFn?: StagehandCaptureFn): Promise<z.infer<T>>;
128
+ //# sourceMappingURL=stagehand-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagehand-guard.d.ts","sourceRoot":"","sources":["../../src/scraper/stagehand-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AAOtC;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa;;;;;iBAKxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAM5B,CAAC;AAEH;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,0BAA0B,CAAU;IACpD,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,SAAS,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,EACxC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,WAAW,EAAE,OAAO;CAQvB;AAoBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,CAAC,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,SAAS,CAAC,CAqEpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkEnB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACzD,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAsErB"}