@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,337 @@
1
+ "use strict";
2
+ /**
3
+ * Schema-enforcing wrappers around Stagehand's `act`, `observe`, and
4
+ * `extract`. Every Stagehand SDK call in the codebase routes through these
5
+ * so the engine has a single chokepoint for return-envelope validation +
6
+ * telemetry capture.
7
+ *
8
+ * Two enforcement modes by primitive:
9
+ *
10
+ * - `act` and `observe`: Stagehand owns the underlying LLM call and does
11
+ * not expose a caller-provided schema field on `ActOptions` /
12
+ * `ObserveOptions`. The strictest enforcement Stagehand's API allows is
13
+ * caller-side `safeParse` of the RETURN ENVELOPE against Zod mirrors of
14
+ * Stagehand's public types (`ActResult`, `Action`). On envelope drift
15
+ * (a Stagehand SDK upgrade that widens the shape, or a Stagehand bug
16
+ * that emits malformed JSON), the wrapper throws
17
+ * `StagehandSchemaError` and records a `failureKind:
18
+ * "schema-validation-failed"` entry to the NDJSON sink, matching the
19
+ * failure taxonomy of our direct Anthropic SDK callers.
20
+ *
21
+ * - `extract`: Stagehand's 3-arg overload accepts a caller-provided Zod
22
+ * schema and routes structured output through the LLM the same way our
23
+ * `messages.parse + zodOutputFormat` calls do. Stagehand `safeParse`s
24
+ * server-side; we `safeParse` again caller-side as defense in depth
25
+ * against SDK contract drift (and to log identical telemetry).
26
+ *
27
+ * Telemetry: every wrapper call lands in `calls.ndjson` regardless of
28
+ * outcome (per user directive — full parity with our Anthropic SDK call
29
+ * telemetry). Volume is dominated by `act`: hundreds of calls per job
30
+ * across the cascade attempts ≈ thousands of entries per sweep. The
31
+ * NDJSON sink is append-only and per-URL partitioned (see
32
+ * `src/lib/telemetry/telemetry-paths.ts`) so this scale is intentional.
33
+ *
34
+ * Stagehand Zod compat: as of `@browserbasehq/stagehand@3.4.0`,
35
+ * `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` — both Zod v3 and v4
36
+ * schemas pass through cleanly (confirmed in
37
+ * `node_modules/@browserbasehq/stagehand/dist/esm/lib/v3/zodCompat.d.ts`).
38
+ * Barnacle uses Zod v4 via the `zod/v4` subpath export; that's compatible.
39
+ */
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.StagehandSchemaError = exports.ACT_RESULT_SCHEMA = exports.ACTION_SCHEMA = void 0;
42
+ exports.guardedAct = guardedAct;
43
+ exports.guardedObserve = guardedObserve;
44
+ exports.guardedExtract = guardedExtract;
45
+ const node_crypto_1 = require("node:crypto");
46
+ const v4_1 = require("zod/v4");
47
+ const call_capture_1 = require("../lib/telemetry/call-capture");
48
+ const call_types_1 = require("../lib/telemetry/call-types");
49
+ /**
50
+ * Zod mirror of Stagehand's public `Action` shape (from
51
+ * `@browserbasehq/stagehand/.../public/methods.d.ts`):
52
+ *
53
+ * interface Action {
54
+ * selector: string;
55
+ * description: string;
56
+ * method?: string;
57
+ * arguments?: string[];
58
+ * }
59
+ *
60
+ * If Stagehand widens this shape in a future minor version, our `safeParse`
61
+ * fails closed — we'd rather see a `schema-validation-failed` entry in
62
+ * telemetry than have downstream code silently consume drift.
63
+ */
64
+ exports.ACTION_SCHEMA = v4_1.z.object({
65
+ selector: v4_1.z.string(),
66
+ description: v4_1.z.string(),
67
+ method: v4_1.z.string().optional(),
68
+ arguments: v4_1.z.array(v4_1.z.string()).optional(),
69
+ });
70
+ /**
71
+ * Zod mirror of Stagehand's public `ActResult` shape. The `actions` array
72
+ * is sometimes empty when Stagehand acted via a path that doesn't echo the
73
+ * action back; the cascade's resolvedAction fallback already handles that
74
+ * case. We accept empty arrays here as valid per the SDK contract.
75
+ */
76
+ exports.ACT_RESULT_SCHEMA = v4_1.z.object({
77
+ success: v4_1.z.boolean(),
78
+ message: v4_1.z.string(),
79
+ actionDescription: v4_1.z.string(),
80
+ actions: v4_1.z.array(exports.ACTION_SCHEMA),
81
+ cacheStatus: v4_1.z.enum(["HIT", "MISS"]).optional(),
82
+ });
83
+ /**
84
+ * Thrown by any guarded* wrapper when Stagehand's return value doesn't
85
+ * `safeParse` against the schema. The `kind` is always
86
+ * `"schema-validation-failed"` — same string the Anthropic SDK callers use
87
+ * — so `classifyLlmCallFailure` routes it to the same NDJSON failureKind
88
+ * bucket without any string-matching changes.
89
+ */
90
+ class StagehandSchemaError extends Error {
91
+ kind = "schema-validation-failed";
92
+ primitive;
93
+ zodError;
94
+ rawResponse;
95
+ constructor(primitive, zodError, rawResponse) {
96
+ super(`stagehand ${primitive} envelope failed schema validation: ${zodError.message}`);
97
+ this.name = "StagehandSchemaError";
98
+ this.primitive = primitive;
99
+ this.zodError = zodError;
100
+ this.rawResponse = rawResponse;
101
+ }
102
+ }
103
+ exports.StagehandSchemaError = StagehandSchemaError;
104
+ /**
105
+ * Stringify a possibly-circular value safely; used to populate
106
+ * `responseContent` in telemetry without risking a `TypeError` on circular
107
+ * Stagehand internals.
108
+ */
109
+ function safeStringify(value, cap = 4000) {
110
+ try {
111
+ return JSON.stringify(value).slice(0, cap);
112
+ }
113
+ catch {
114
+ return String(value).slice(0, cap);
115
+ }
116
+ }
117
+ /** Pluck the bare instruction string from either form of `act` input. */
118
+ function actInstructionOf(input) {
119
+ return typeof input === "string" ? input : input.description;
120
+ }
121
+ /**
122
+ * Schema-guarded wrapper around Stagehand's `act`. Same signature as the
123
+ * underlying call: accepts either an instruction string or a structured
124
+ * `Action` (from a prior `observe`). On the happy path, returns Stagehand's
125
+ * `ActResult` verbatim. On envelope drift, throws `StagehandSchemaError`
126
+ * and logs `failureKind: "schema-validation-failed"`.
127
+ */
128
+ async function guardedAct(stagehand, input, options, captureFn) {
129
+ const callId = (0, node_crypto_1.randomUUID)();
130
+ const userContent = actInstructionOf(input);
131
+ const t0 = performance.now();
132
+ try {
133
+ // Stagehand's `act` has two overloads (string and Action) that share the
134
+ // same runtime implementation (dispatch is via `isObserveResult` inside
135
+ // Stagehand). The two branches LOOK identical but TS can't resolve the
136
+ // union against the overload set without splitting them — and assigning
137
+ // `stagehand.act` to a variable then calling it as a standalone function
138
+ // loses `this` in strict mode, which crashes inside Stagehand's
139
+ // `withInstanceLogContext(this.instanceId, ...)` wrapper on entry.
140
+ const raw = typeof input === "string"
141
+ ? await stagehand.act(input, options)
142
+ : await stagehand.act(input, options);
143
+ const latencyMs = performance.now() - t0;
144
+ const parsed = exports.ACT_RESULT_SCHEMA.safeParse(raw);
145
+ if (!parsed.success) {
146
+ await captureCall({
147
+ callId,
148
+ callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
149
+ userContent,
150
+ responseContent: safeStringify(raw),
151
+ latencyMs,
152
+ success: false,
153
+ parsedOk: false,
154
+ errorMessage: `act envelope failed schema validation: ${parsed.error.message}`,
155
+ failureKind: "schema-validation-failed",
156
+ }, captureFn);
157
+ throw new StagehandSchemaError("act", parsed.error, raw);
158
+ }
159
+ await captureCall({
160
+ callId,
161
+ callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
162
+ userContent,
163
+ responseContent: safeStringify(parsed.data),
164
+ latencyMs,
165
+ success: parsed.data.success,
166
+ parsedOk: true,
167
+ errorMessage: null,
168
+ failureKind: null,
169
+ }, captureFn);
170
+ return parsed.data;
171
+ }
172
+ catch (err) {
173
+ if (err instanceof StagehandSchemaError)
174
+ throw err;
175
+ const latencyMs = performance.now() - t0;
176
+ await captureCall({
177
+ callId,
178
+ callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
179
+ userContent,
180
+ responseContent: null,
181
+ latencyMs,
182
+ success: false,
183
+ parsedOk: false,
184
+ errorMessage: err instanceof Error ? err.message : String(err),
185
+ failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
186
+ }, captureFn);
187
+ throw err;
188
+ }
189
+ }
190
+ /**
191
+ * Schema-guarded wrapper around Stagehand's `observe`. Mirrors the
192
+ * Stagehand overloads: no args, options-only, instruction-only,
193
+ * instruction + options. On envelope drift (the `Action[]` shape changes),
194
+ * throws `StagehandSchemaError`.
195
+ */
196
+ async function guardedObserve(stagehand, instruction, options, captureFn) {
197
+ const callId = (0, node_crypto_1.randomUUID)();
198
+ const userContent = instruction ?? "";
199
+ const t0 = performance.now();
200
+ try {
201
+ // Match Stagehand's overloads: pass instruction only when defined, so
202
+ // the SDK falls through to its no-arg/options-only path otherwise.
203
+ const raw = instruction === undefined
204
+ ? options === undefined
205
+ ? await stagehand.observe()
206
+ : await stagehand.observe(options)
207
+ : await stagehand.observe(instruction, options);
208
+ const latencyMs = performance.now() - t0;
209
+ const parsed = v4_1.z.array(exports.ACTION_SCHEMA).safeParse(raw);
210
+ if (!parsed.success) {
211
+ await captureCall({
212
+ callId,
213
+ callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
214
+ userContent,
215
+ responseContent: safeStringify(raw),
216
+ latencyMs,
217
+ success: false,
218
+ parsedOk: false,
219
+ errorMessage: `observe envelope failed schema validation: ${parsed.error.message}`,
220
+ failureKind: "schema-validation-failed",
221
+ }, captureFn);
222
+ throw new StagehandSchemaError("observe", parsed.error, raw);
223
+ }
224
+ await captureCall({
225
+ callId,
226
+ callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
227
+ userContent,
228
+ responseContent: safeStringify(parsed.data),
229
+ latencyMs,
230
+ success: true,
231
+ parsedOk: true,
232
+ errorMessage: null,
233
+ failureKind: null,
234
+ }, captureFn);
235
+ return parsed.data;
236
+ }
237
+ catch (err) {
238
+ if (err instanceof StagehandSchemaError)
239
+ throw err;
240
+ const latencyMs = performance.now() - t0;
241
+ await captureCall({
242
+ callId,
243
+ callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
244
+ userContent,
245
+ responseContent: null,
246
+ latencyMs,
247
+ success: false,
248
+ parsedOk: false,
249
+ errorMessage: err instanceof Error ? err.message : String(err),
250
+ failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
251
+ }, captureFn);
252
+ throw err;
253
+ }
254
+ }
255
+ /**
256
+ * Schema-guarded wrapper around Stagehand's `extract` 3-arg overload. The
257
+ * caller's Zod schema is what Stagehand asks the LLM to satisfy AND what we
258
+ * `safeParse` against caller-side. Refuse the 1-arg / 2-arg defaults; every
259
+ * extract call in the codebase must enforce a schema.
260
+ */
261
+ async function guardedExtract(stagehand, instruction, schema, options, captureFn) {
262
+ const callId = (0, node_crypto_1.randomUUID)();
263
+ const t0 = performance.now();
264
+ try {
265
+ // Widening cast: caller's `z.ZodTypeAny` (Zod v4) is one branch of
266
+ // Stagehand's `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` union,
267
+ // which Stagehand's extract overload-2 expects. We can't reference
268
+ // `StagehandZodSchema` directly because it's a deep import not exported
269
+ // from the package root; `Parameters<typeof stagehand.extract>[1]` is
270
+ // the cleanest public-API way to express "whatever overload-2 expects."
271
+ // The `as unknown` step is needed because TS won't accept a single
272
+ // direct cast across the entire overload set.
273
+ const raw = await stagehand.extract(instruction, schema, options);
274
+ const latencyMs = performance.now() - t0;
275
+ const parsed = schema.safeParse(raw);
276
+ if (!parsed.success) {
277
+ await captureCall({
278
+ callId,
279
+ callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
280
+ userContent: instruction,
281
+ responseContent: safeStringify(raw),
282
+ latencyMs,
283
+ success: false,
284
+ parsedOk: false,
285
+ errorMessage: `extract envelope failed schema validation: ${parsed.error.message}`,
286
+ failureKind: "schema-validation-failed",
287
+ }, captureFn);
288
+ throw new StagehandSchemaError("extract", parsed.error, raw);
289
+ }
290
+ await captureCall({
291
+ callId,
292
+ callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
293
+ userContent: instruction,
294
+ responseContent: safeStringify(parsed.data),
295
+ latencyMs,
296
+ success: true,
297
+ parsedOk: true,
298
+ errorMessage: null,
299
+ failureKind: null,
300
+ }, captureFn);
301
+ return parsed.data;
302
+ }
303
+ catch (err) {
304
+ if (err instanceof StagehandSchemaError)
305
+ throw err;
306
+ const latencyMs = performance.now() - t0;
307
+ await captureCall({
308
+ callId,
309
+ callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
310
+ userContent: instruction,
311
+ responseContent: null,
312
+ latencyMs,
313
+ success: false,
314
+ parsedOk: false,
315
+ errorMessage: err instanceof Error ? err.message : String(err),
316
+ failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
317
+ }, captureFn);
318
+ throw err;
319
+ }
320
+ }
321
+ /**
322
+ * Internal helper: fills the constant `model` / `systemPrompt` /
323
+ * `inputTokens` / `outputTokens` fields Stagehand doesn't expose. The
324
+ * underlying LLM call inside `act`/`observe` uses Stagehand-owned tokens
325
+ * we don't have visibility into; we record `null` per the existing
326
+ * `LlmCallInput` contract (which already supports null for those fields).
327
+ */
328
+ async function captureCall(partial, captureFn = call_capture_1.captureLlmCall) {
329
+ await captureFn({
330
+ ...partial,
331
+ model: "stagehand-internal",
332
+ systemPrompt: null,
333
+ inputTokens: null,
334
+ outputTokens: null,
335
+ });
336
+ }
337
+ //# sourceMappingURL=stagehand-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagehand-guard.js","sourceRoot":"","sources":["../../src/scraper/stagehand-guard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;;;AAyHH,gCA0EC;AAQD,wCAuEC;AAQD,wCA4EC;AApWD,6CAAyC;AAUzC,+BAA2B;AAE3B,+DAIsC;AACtC,2DAIoC;AAWpC;;;;;;;;;;;;;;GAcG;AACU,QAAA,aAAa,GAAG,MAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAC,CAAC,MAAM,EAAE;IACpB,WAAW,EAAE,MAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,MAAC,CAAC,KAAK,CAAC,MAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,iBAAiB,GAAG,MAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,MAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,MAAC,CAAC,MAAM,EAAE;IACnB,iBAAiB,EAAE,MAAC,CAAC,MAAM,EAAE;IAC7B,OAAO,EAAE,MAAC,CAAC,KAAK,CAAC,qBAAa,CAAC;IAC/B,WAAW,EAAE,MAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAa,oBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAG,0BAAmC,CAAC;IAC3C,SAAS,CAAgC;IACzC,QAAQ,CAAa;IACrB,WAAW,CAAU;IAE9B,YACE,SAAwC,EACxC,QAAoB,EACpB,WAAoB;QAEpB,KAAK,CAAC,aAAa,SAAS,uCAAuC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAjBD,oDAiBC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAc,EAAE,GAAG,GAAG,IAAI;IAC/C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,UAAU,CAC9B,SAAoB,EACpB,KAAsB,EACtB,OAAoB,EACpB,SAA8B;IAE9B,MAAM,MAAM,GAAG,IAAA,wBAAU,GAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,gEAAgE;QAChE,mEAAmE;QACnE,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ;YACvB,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;YACrC,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,yBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,WAAW,CACf;gBACE,MAAM;gBACN,QAAQ,EAAE,oCAAuB;gBACjC,WAAW;gBACX,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC;gBACnC,SAAS;gBACT,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,0CAA0C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC9E,WAAW,EAAE,0BAA0B;aACxC,EACD,SAAS,CACV,CAAC;YACF,MAAM,IAAI,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,oCAAuB;YACjC,WAAW;YACX,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;YAC3C,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;YAC5B,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,EACD,SAAS,CACV,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB;YAAE,MAAM,GAAG,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,oCAAuB;YACjC,WAAW;YACX,eAAe,EAAE,IAAI;YACrB,SAAS;YACT,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9D,WAAW,EAAE,IAAA,qCAAsB,EAAC,GAAG,CAAC;SACzC,EACD,SAAS,CACV,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,SAAoB,EACpB,WAAoB,EACpB,OAAwB,EACxB,SAA8B;IAE9B,MAAM,MAAM,GAAG,IAAA,wBAAU,GAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,WAAW,IAAI,EAAE,CAAC;IACtC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,sEAAsE;QACtE,mEAAmE;QACnE,MAAM,GAAG,GACP,WAAW,KAAK,SAAS;YACvB,CAAC,CAAC,OAAO,KAAK,SAAS;gBACrB,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE;gBAC3B,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAC,CAAC,KAAK,CAAC,qBAAa,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,WAAW,CACf;gBACE,MAAM;gBACN,QAAQ,EAAE,wCAA2B;gBACrC,WAAW;gBACX,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC;gBACnC,SAAS;gBACT,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,8CAA8C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAClF,WAAW,EAAE,0BAA0B;aACxC,EACD,SAAS,CACV,CAAC;YACF,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,wCAA2B;YACrC,WAAW;YACX,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;YAC3C,SAAS;YACT,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,EACD,SAAS,CACV,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB;YAAE,MAAM,GAAG,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,wCAA2B;YACrC,WAAW;YACX,eAAe,EAAE,IAAI;YACrB,SAAS;YACT,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9D,WAAW,EAAE,IAAA,qCAAsB,EAAC,GAAG,CAAC;SACzC,EACD,SAAS,CACV,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAClC,SAAoB,EACpB,WAAmB,EACnB,MAAS,EACT,OAAwB,EACxB,SAA8B;IAE9B,MAAM,MAAM,GAAG,IAAA,wBAAU,GAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,mEAAmE;QACnE,wEAAwE;QACxE,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,wEAAwE;QACxE,mEAAmE;QACnE,8CAA8C;QAC9C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CACjC,WAAW,EACX,MAA4D,EAC5D,OAAO,CACR,CAAC;QACF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,WAAW,CACf;gBACE,MAAM;gBACN,QAAQ,EAAE,wCAA2B;gBACrC,WAAW,EAAE,WAAW;gBACxB,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC;gBACnC,SAAS;gBACT,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,8CAA8C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAClF,WAAW,EAAE,0BAA0B;aACxC,EACD,SAAS,CACV,CAAC;YACF,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,wCAA2B;YACrC,WAAW,EAAE,WAAW;YACxB,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;YAC3C,SAAS;YACT,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,EACD,SAAS,CACV,CAAC;QACF,OAAO,MAAM,CAAC,IAAkB,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,oBAAoB;YAAE,MAAM,GAAG,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,MAAM,WAAW,CACf;YACE,MAAM;YACN,QAAQ,EAAE,wCAA2B;YACrC,WAAW,EAAE,WAAW;YACxB,eAAe,EAAE,IAAI;YACrB,SAAS;YACT,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9D,WAAW,EAAE,IAAA,qCAAsB,EAAC,GAAG,CAAC;SACzC,EACD,SAAS,CACV,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CACxB,OAWC,EACD,YAAgC,6BAAc;IAE9C,MAAM,SAAS,CAAC;QACd,GAAG,OAAO;QACV,KAAK,EAAE,oBAAoB;QAC3B,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import Bottleneck from "bottleneck";
2
+ /**
3
+ * Creates a Bottleneck limiter scoped to a single scraper session.
4
+ *
5
+ * Why Bottleneck: battle-tested (used by GitHub's Octokit), handles min-
6
+ * time-between-jobs, max-concurrent, and graceful drain. We don't invent
7
+ * any delay logic on top — every `stagehand.act()` or `stagehand.extract()` goes
8
+ * through `limiter.schedule(() => stagehand.act(...))` and Bottleneck enforces
9
+ * the cadence.
10
+ *
11
+ * How to apply: the pool grabs one limiter per session; concurrency
12
+ * across sessions is managed by the outer p-queue in pool.ts.
13
+ */
14
+ export declare function createSessionLimiter(): Bottleneck;
15
+ /**
16
+ * Schedules a scraper action through the limiter with an additional jitter
17
+ * window so consecutive calls don't look metronomic. Returns the awaited
18
+ * result of `fn`.
19
+ */
20
+ export declare function scheduleAction<T>(limiter: Bottleneck, fn: () => Promise<T>): Promise<T>;
21
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/scraper/throttle.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAKpC;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,CAKjD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAS7F"}
@@ -0,0 +1,45 @@
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.createSessionLimiter = createSessionLimiter;
7
+ exports.scheduleAction = scheduleAction;
8
+ const bottleneck_1 = __importDefault(require("bottleneck"));
9
+ const config_1 = require("../config");
10
+ const random_1 = require("../lib/random");
11
+ /**
12
+ * Creates a Bottleneck limiter scoped to a single scraper session.
13
+ *
14
+ * Why Bottleneck: battle-tested (used by GitHub's Octokit), handles min-
15
+ * time-between-jobs, max-concurrent, and graceful drain. We don't invent
16
+ * any delay logic on top — every `stagehand.act()` or `stagehand.extract()` goes
17
+ * through `limiter.schedule(() => stagehand.act(...))` and Bottleneck enforces
18
+ * the cadence.
19
+ *
20
+ * How to apply: the pool grabs one limiter per session; concurrency
21
+ * across sessions is managed by the outer p-queue in pool.ts.
22
+ */
23
+ function createSessionLimiter() {
24
+ return new bottleneck_1.default({
25
+ maxConcurrent: 1,
26
+ minTime: config_1.config.scraper.minActionDelayMs,
27
+ });
28
+ }
29
+ /**
30
+ * Schedules a scraper action through the limiter with an additional jitter
31
+ * window so consecutive calls don't look metronomic. Returns the awaited
32
+ * result of `fn`.
33
+ */
34
+ async function scheduleAction(limiter, fn) {
35
+ const jitter = (0, random_1.randomIntInclusive)(0, config_1.config.scraper.maxActionDelayMs - config_1.config.scraper.minActionDelayMs - 1);
36
+ return limiter.schedule({ weight: 1, priority: 5 }, async () => {
37
+ if (jitter > 0)
38
+ await sleep(jitter);
39
+ return fn();
40
+ });
41
+ }
42
+ function sleep(ms) {
43
+ return new Promise((resolve) => setTimeout(resolve, ms));
44
+ }
45
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../src/scraper/throttle.ts"],"names":[],"mappings":";;;;;AAiBA,oDAKC;AAOD,wCASC;AAtCD,4DAAoC;AAEpC,qCAAkC;AAClC,yCAAkD;AAElD;;;;;;;;;;;GAWG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAI,oBAAU,CAAC;QACpB,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,eAAM,CAAC,OAAO,CAAC,gBAAgB;KACzC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAI,OAAmB,EAAE,EAAoB;IAC/E,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAC/B,CAAC,EACD,eAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,eAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CACtE,CAAC;IACF,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Standalone confirmation-email poller for the HCA batch — DECOUPLED from the
3
+ * live-verify run so it never slows a submission. Reads the batch log, extracts
4
+ * every SUBMITTED job's testmail inbox (`{jobId, address, tag, timestampFrom}`),
5
+ * and polls each inbox for a confirmation email. Idempotent + re-runnable: pass
6
+ * the same `--out` file across runs and it only polls inboxes not yet confirmed,
7
+ * so it can be run repeatedly as emails trickle in (HCA/Talemetry may email
8
+ * minutes-to-hours after submit, or not at all — this measures which).
9
+ *
10
+ * Usage:
11
+ * pnpm tsx --env-file=.env src/scripts/hca-inbox-poll.ts \
12
+ * [--log <batch.log>] [--out <results.json>] [--timeout-ms <per-inbox budget>]
13
+ *
14
+ * "SUBMITTED" is already the authoritative in-band success signal (Talemetry
15
+ * completed=true + thank-you URL); this is an ADDITIONAL out-of-band check to
16
+ * learn whether HCA actually delivers a confirmation email.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=hca-inbox-poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hca-inbox-poll.d.ts","sourceRoot":"","sources":["../../src/scripts/hca-inbox-poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * Standalone confirmation-email poller for the HCA batch — DECOUPLED from the
4
+ * live-verify run so it never slows a submission. Reads the batch log, extracts
5
+ * every SUBMITTED job's testmail inbox (`{jobId, address, tag, timestampFrom}`),
6
+ * and polls each inbox for a confirmation email. Idempotent + re-runnable: pass
7
+ * the same `--out` file across runs and it only polls inboxes not yet confirmed,
8
+ * so it can be run repeatedly as emails trickle in (HCA/Talemetry may email
9
+ * minutes-to-hours after submit, or not at all — this measures which).
10
+ *
11
+ * Usage:
12
+ * pnpm tsx --env-file=.env src/scripts/hca-inbox-poll.ts \
13
+ * [--log <batch.log>] [--out <results.json>] [--timeout-ms <per-inbox budget>]
14
+ *
15
+ * "SUBMITTED" is already the authoritative in-band success signal (Talemetry
16
+ * completed=true + thank-you URL); this is an ADDITIONAL out-of-band check to
17
+ * learn whether HCA actually delivers a confirmation email.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const node_fs_1 = require("node:fs");
21
+ const config_1 = require("../config");
22
+ const logging_1 = require("../lib/logging");
23
+ const client_1 = require("../testmail/client");
24
+ const logger = (0, logging_1.getLogger)({ name: "hca-inbox-poll" });
25
+ const DEFAULT_LOG = "/private/tmp/claude-501/-Users-andres-src-vivian-barnacle/2c51c4a7-1a01-4e80-a3ad-8c8d02045529/scratchpad/hca-allvalid.log";
26
+ const DEFAULT_OUT = "/private/tmp/claude-501/-Users-andres-src-vivian-barnacle/2c51c4a7-1a01-4e80-a3ad-8c8d02045529/scratchpad/hca-inbox-results.json";
27
+ function parseArgs() {
28
+ const args = process.argv.slice(2);
29
+ const logPaths = [];
30
+ let outPath = DEFAULT_OUT;
31
+ let timeoutMs = 15_000;
32
+ for (let i = 0; i < args.length; i++) {
33
+ if (args[i] === "--log" && args[i + 1])
34
+ logPaths.push(args[++i]);
35
+ else if (args[i] === "--out" && args[i + 1])
36
+ outPath = args[++i];
37
+ else if (args[i] === "--timeout-ms" && args[i + 1])
38
+ timeoutMs = Number(args[++i]);
39
+ }
40
+ return { logPaths: logPaths.length > 0 ? logPaths : [DEFAULT_LOG], outPath, timeoutMs };
41
+ }
42
+ /**
43
+ * Reconstruct each SUBMITTED job's inbox from the batch log. A "starting" line
44
+ * carries `job=<id> email=<namespace>.<tag>@inbox.testmail.app` + a timestamp;
45
+ * a later `job=<id> SUBMITTED` line confirms it applied. The address yields the
46
+ * tag; the starting line's clock is a safe `timestampFrom` lower bound.
47
+ */
48
+ function parseSubmittedInboxes(log) {
49
+ const byJob = new Map();
50
+ const lines = log.split("\n");
51
+ for (const line of lines) {
52
+ const m = /\[(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)[^\]]*\].*job=(\d+) email=([^ ]+@inbox\.testmail\.app)/.exec(line);
53
+ if (!m)
54
+ continue;
55
+ const [, clock, jobId, address] = m;
56
+ const tag = address.split("@")[0].split(".").slice(1).join(".");
57
+ // The starting clock (local time) → Unix ms lower bound for received-after.
58
+ const timestampFrom = new Date(clock.replace(" ", "T")).getTime();
59
+ byJob.set(jobId, { address: address, tag, timestampFrom });
60
+ }
61
+ const submitted = new Set();
62
+ for (const m of log.matchAll(/job=(\d+) SUBMITTED/g)) {
63
+ submitted.add(m[1]);
64
+ }
65
+ const out = [];
66
+ for (const jobId of submitted) {
67
+ const info = byJob.get(jobId);
68
+ if (info)
69
+ out.push({ jobId, ...info });
70
+ }
71
+ return out;
72
+ }
73
+ function loadPriorResults(outPath) {
74
+ try {
75
+ const arr = JSON.parse((0, node_fs_1.readFileSync)(outPath, "utf8"));
76
+ return new Map(arr.map((r) => [r.jobId, r]));
77
+ }
78
+ catch {
79
+ return new Map();
80
+ }
81
+ }
82
+ /**
83
+ * Poll every not-yet-confirmed submitted inbox once and persist results. Exists
84
+ * as a discrete script so it can run on its own cadence beside the live batch.
85
+ */
86
+ async function main() {
87
+ const { logPaths, outPath, timeoutMs } = parseArgs();
88
+ if (!config_1.config.testmail.namespace) {
89
+ throw new Error("TESTMAIL_NAMESPACE not set — cannot poll inboxes");
90
+ }
91
+ // Merge submitted inboxes from every log (original batch + any resume runs),
92
+ // deduped by jobId so re-run jobs don't double-poll.
93
+ const byJob = new Map();
94
+ for (const p of logPaths) {
95
+ let text;
96
+ try {
97
+ text = (0, node_fs_1.readFileSync)(p, "utf8");
98
+ }
99
+ catch {
100
+ continue;
101
+ }
102
+ for (const inb of parseSubmittedInboxes(text))
103
+ byJob.set(inb.jobId, inb);
104
+ }
105
+ const inboxes = [...byJob.values()];
106
+ const prior = loadPriorResults(outPath);
107
+ const pending = inboxes.filter((x) => prior.get(x.jobId)?.confirmed !== true);
108
+ logger.info(`hca-inbox-poll: ${inboxes.length} submitted inbox(es); ${prior.size} prior result(s); polling ${pending.length} not-yet-confirmed`);
109
+ const results = new Map(prior);
110
+ let newlyConfirmed = 0;
111
+ for (const inb of pending) {
112
+ try {
113
+ const msg = await (0, client_1.pollTestmailInbox)({
114
+ inbox: { address: inb.address, tag: inb.tag, timestampFrom: inb.timestampFrom },
115
+ timeoutMs,
116
+ });
117
+ results.set(inb.jobId, {
118
+ jobId: inb.jobId,
119
+ address: inb.address,
120
+ confirmed: true,
121
+ subject: msg.subject,
122
+ from: msg.from,
123
+ checkedAt: new Date().toISOString(),
124
+ });
125
+ newlyConfirmed++;
126
+ logger.info(`hca-inbox-poll: job ${inb.jobId} CONFIRMED — from="${msg.from}" subject="${msg.subject}"`);
127
+ }
128
+ catch (err) {
129
+ // Any throw (timeout = no email within budget, or a transient API error)
130
+ // → not confirmed THIS pass; a later re-run retries it.
131
+ results.set(inb.jobId, {
132
+ jobId: inb.jobId,
133
+ address: inb.address,
134
+ confirmed: false,
135
+ subject: null,
136
+ from: null,
137
+ checkedAt: new Date().toISOString(),
138
+ });
139
+ logger.info(`hca-inbox-poll: job ${inb.jobId} no confirmation (${err instanceof Error ? err.constructor.name : "error"})`);
140
+ }
141
+ }
142
+ const all = [...results.values()];
143
+ (0, node_fs_1.writeFileSync)(outPath, JSON.stringify(all, null, 2));
144
+ const confirmed = all.filter((r) => r.confirmed).length;
145
+ logger.info(`hca-inbox-poll: DONE — ${confirmed}/${all.length} confirmed (${newlyConfirmed} new this run). Results: ${outPath}`);
146
+ }
147
+ main().catch((err) => {
148
+ logger.error(`hca-inbox-poll: fatal — ${err instanceof Error ? err.message : String(err)}`);
149
+ process.exit(1);
150
+ });
151
+ //# sourceMappingURL=hca-inbox-poll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hca-inbox-poll.js","sourceRoot":"","sources":["../../src/scripts/hca-inbox-poll.ts"],"names":[],"mappings":"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"}