@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,377 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 2–3 recon: replays every capture from recon-browser.ts via plain
4
+ * Node fetch() — no browser, no AI — to prove endpoints work standalone.
5
+ *
6
+ * Also runs:
7
+ * - GraphQL introspection probe on each unique GraphQL endpoint
8
+ * - Auxiliary endpoint probe: downloads static JSON fixtures (markets, currencies, etc.)
9
+ * - Rate-limit probe (1 → 3 → 5 rps, stops at first 429/403)
10
+ *
11
+ * Usage:
12
+ * pnpm tsx src/scripts/recon-http.ts [--captures-dir /tmp/recon/graphql]
13
+ *
14
+ * Outputs:
15
+ * /tmp/recon/replays/<filename>.json — one replay result per unique capture
16
+ * /tmp/recon/aux/<basename>.json — downloaded static fixture per auxiliary endpoint
17
+ * /tmp/recon/replays/rate-limit.json — rate-limit probe findings
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const node_fs_1 = require("node:fs");
21
+ const node_path_1 = require("node:path");
22
+ const errors_1 = require("../lib/errors");
23
+ const http_1 = require("../lib/http");
24
+ const logging_1 = require("../lib/logging");
25
+ (0, http_1.configureHttpDispatcher)();
26
+ const logger = (0, logging_1.getScriptLogger)("recon-http");
27
+ const CAPTURES_DIR = "/tmp/recon/graphql";
28
+ const REPLAYS_DIR = "/tmp/recon/replays";
29
+ /** Load-bearing headers — minimal set that proves the endpoint works standalone. */
30
+ const RC_HEADERS = {
31
+ "Content-Type": "application/json",
32
+ Accept: "application/json, */*",
33
+ Origin: "",
34
+ Referer: "",
35
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
36
+ };
37
+ function loadCaptures(dir) {
38
+ let files;
39
+ try {
40
+ files = (0, node_fs_1.readdirSync)(dir)
41
+ .filter((f) => f.endsWith(".json") && !f.endsWith(".decoded.json"))
42
+ .sort();
43
+ }
44
+ catch {
45
+ logger.error(`captures directory not found: ${dir}`);
46
+ logger.error("run recon-browser.ts first");
47
+ process.exit(1);
48
+ }
49
+ return files.map((filename) => {
50
+ const raw = (0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, filename), "utf8");
51
+ return { filename, capture: JSON.parse(raw) };
52
+ });
53
+ }
54
+ function deduplicateCaptures(captures) {
55
+ const seen = new Set();
56
+ return captures.filter(({ capture }) => {
57
+ const key = `${capture.url}|${capture.operationName ?? ""}|${JSON.stringify(capture.variables ?? {})}`;
58
+ if (seen.has(key))
59
+ return false;
60
+ seen.add(key);
61
+ return true;
62
+ });
63
+ }
64
+ async function replayCapture(filename, capture) {
65
+ const origin = new URL(capture.url).origin;
66
+ const headers = {
67
+ ...RC_HEADERS,
68
+ Origin: origin,
69
+ Referer: `${origin}/`,
70
+ };
71
+ let requestBody = null;
72
+ if (capture.operationName && capture.query) {
73
+ requestBody = JSON.stringify({
74
+ operationName: capture.operationName,
75
+ query: capture.query,
76
+ variables: capture.variables ?? {},
77
+ });
78
+ }
79
+ else if (capture.requestPostData) {
80
+ requestBody = capture.requestPostData;
81
+ }
82
+ try {
83
+ const response = await fetch(capture.url, {
84
+ method: capture.method,
85
+ headers,
86
+ body: requestBody ?? undefined,
87
+ });
88
+ const replayHeaders = {};
89
+ response.headers.forEach((v, k) => {
90
+ replayHeaders[k] = v;
91
+ });
92
+ let replayBody = null;
93
+ try {
94
+ const text = await response.text();
95
+ try {
96
+ replayBody = JSON.parse(text);
97
+ }
98
+ catch {
99
+ replayBody = text;
100
+ }
101
+ }
102
+ catch {
103
+ // consumed
104
+ }
105
+ const success = response.status >= 200 && response.status < 300;
106
+ if (!success) {
107
+ logger.warn(`[${response.status}] ${capture.method} ${capture.url}`);
108
+ if (response.status === 403)
109
+ logger.warn(" → 403: try adding more headers; if persistent, accept Stagehand-only production");
110
+ if (response.status === 401)
111
+ logger.warn(" → 401: endpoint requires auth — capture token, determine lifetime, build refresh strategy");
112
+ }
113
+ else {
114
+ const bodyStr = JSON.stringify(replayBody);
115
+ if (bodyStr === "{}" || bodyStr === "[]" || bodyStr === "null")
116
+ logger.warn(`[${response.status}] ${capture.method} ${capture.url} (empty body — check Origin/Referer)`);
117
+ else
118
+ logger.info(`[${response.status}] ${capture.method} ${capture.url}`);
119
+ }
120
+ return {
121
+ sourceCapture: filename,
122
+ url: capture.url,
123
+ method: capture.method,
124
+ operationName: capture.operationName,
125
+ requestBody,
126
+ replayStatus: response.status,
127
+ replayHeaders,
128
+ replayBody,
129
+ success,
130
+ error: null,
131
+ };
132
+ }
133
+ catch (err) {
134
+ logger.error(`[ERR] ${capture.method} ${capture.url}: ${(0, errors_1.toErrorMessage)(err)}`);
135
+ return {
136
+ sourceCapture: filename,
137
+ url: capture.url,
138
+ method: capture.method,
139
+ operationName: capture.operationName,
140
+ requestBody,
141
+ replayStatus: null,
142
+ replayHeaders: {},
143
+ replayBody: null,
144
+ success: false,
145
+ error: (0, errors_1.toErrorMessage)(err),
146
+ };
147
+ }
148
+ }
149
+ async function probeIntrospection(endpoint) {
150
+ logger.info(`introspection probe: ${endpoint}`);
151
+ const origin = new URL(endpoint).origin;
152
+ const headers = {
153
+ ...RC_HEADERS,
154
+ Origin: origin,
155
+ Referer: `${origin}/`,
156
+ };
157
+ try {
158
+ const response = await fetch(endpoint, {
159
+ method: "POST",
160
+ headers,
161
+ body: JSON.stringify({ query: "{ __schema { types { name } } }" }),
162
+ });
163
+ const body = (await response.json());
164
+ if (body.data) {
165
+ logger.info(" → introspection ENABLED — full schema available");
166
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(REPLAYS_DIR, "introspection-schema.json"), JSON.stringify(body, null, 2));
167
+ }
168
+ else {
169
+ logger.info(" → introspection DISABLED — write Zod schemas by hand from captured JSON");
170
+ }
171
+ }
172
+ catch (err) {
173
+ logger.error(` → introspection error: ${(0, errors_1.toErrorMessage)(err)}`);
174
+ }
175
+ }
176
+ const AUX_DIR = "/tmp/recon/aux";
177
+ /**
178
+ * Finds static JSON endpoints in successful replays (markets, currencies,
179
+ * labels, dictionaries, config) and downloads them as committed fixtures.
180
+ * These rarely change and are cheaper to serve from a snapshot than to
181
+ * re-fetch on every production call.
182
+ */
183
+ async function probeAuxiliaryEndpoints(replays) {
184
+ (0, node_fs_1.mkdirSync)(AUX_DIR, { recursive: true });
185
+ const writtenInRun = new Set();
186
+ const candidates = replays.filter((r) => {
187
+ if (!r.success || r.operationName !== null)
188
+ return false;
189
+ try {
190
+ const pathname = new URL(r.url).pathname.toLowerCase();
191
+ return (pathname.endsWith(".json") ||
192
+ /\/(markets|currencies|labels|dictionaries|config|locales|i18n)/.test(pathname));
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ });
198
+ if (candidates.length === 0) {
199
+ logger.info("no auxiliary endpoints detected");
200
+ return;
201
+ }
202
+ for (const candidate of candidates) {
203
+ const origin = new URL(candidate.url).origin;
204
+ const headers = {
205
+ ...RC_HEADERS,
206
+ Origin: origin,
207
+ Referer: `${origin}/`,
208
+ };
209
+ try {
210
+ const response = await fetch(candidate.url, { method: candidate.method, headers });
211
+ if (!response.ok) {
212
+ logger.warn(`[aux skip] ${candidate.url}: ${response.status} — not a fixture`);
213
+ continue;
214
+ }
215
+ const body = (await response.json());
216
+ const parsed = new URL(candidate.url);
217
+ const rawBase = parsed.pathname.split("/").pop() ?? "aux";
218
+ const base = rawBase.endsWith(".json") ? rawBase : `${rawBase}.json`;
219
+ const filename = writtenInRun.has(base) ? `${parsed.hostname}-${base}` : base;
220
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(AUX_DIR, filename), JSON.stringify(body, null, 2));
221
+ writtenInRun.add(base);
222
+ logger.info(`[fixture] ${candidate.url} → ${AUX_DIR}/${filename} — commit as static fixture`);
223
+ }
224
+ catch (err) {
225
+ logger.error(`[aux err] ${candidate.url}: ${(0, errors_1.toErrorMessage)(err)}`);
226
+ }
227
+ }
228
+ }
229
+ async function probeRateLimit(endpoint, method, body) {
230
+ logger.info(`rate-limit probe: ${endpoint} (1→3→5 rps, stops at 429/403)`);
231
+ const origin = new URL(endpoint).origin;
232
+ const headers = {
233
+ ...RC_HEADERS,
234
+ Origin: origin,
235
+ Referer: `${origin}/`,
236
+ };
237
+ const finding = {
238
+ endpoint,
239
+ safeRps: null,
240
+ triggerStatus: null,
241
+ triggerRps: null,
242
+ retryAfter: null,
243
+ xRateLimitHeaders: {},
244
+ };
245
+ const rpsCeilings = [1, 3, 5];
246
+ const requestsPerLevel = 20;
247
+ for (const rps of rpsCeilings) {
248
+ const delayMs = Math.floor(1000 / rps);
249
+ let triggered = false;
250
+ for (let i = 0; i < requestsPerLevel; i++) {
251
+ const before = Date.now();
252
+ try {
253
+ const response = await fetch(endpoint, {
254
+ method,
255
+ headers,
256
+ body: body ?? undefined,
257
+ });
258
+ const respHeaders = {};
259
+ response.headers.forEach((v, k) => {
260
+ const kl = k.toLowerCase();
261
+ if (kl.startsWith("x-ratelimit") ||
262
+ kl === "retry-after" ||
263
+ kl.startsWith("akamai") ||
264
+ kl.startsWith("cf-")) {
265
+ respHeaders[k] = v;
266
+ }
267
+ });
268
+ if (Object.keys(respHeaders).length > 0) {
269
+ finding.xRateLimitHeaders = { ...finding.xRateLimitHeaders, ...respHeaders };
270
+ }
271
+ if (response.status === 429 || response.status === 403) {
272
+ finding.triggerStatus = response.status;
273
+ finding.triggerRps = rps;
274
+ finding.retryAfter = response.headers.get("retry-after");
275
+ triggered = true;
276
+ logger.warn(` → triggered ${response.status} at ${rps} rps (request ${i + 1}/${requestsPerLevel})`);
277
+ break;
278
+ }
279
+ }
280
+ catch {
281
+ // network error — keep going
282
+ }
283
+ const elapsed = Date.now() - before;
284
+ const wait = Math.max(0, delayMs - elapsed);
285
+ if (wait > 0)
286
+ await new Promise((r) => setTimeout(r, wait));
287
+ }
288
+ if (triggered)
289
+ break;
290
+ finding.safeRps = rps;
291
+ logger.info(` → ${rps} rps: no trigger over ${requestsPerLevel} requests`);
292
+ }
293
+ if (finding.triggerRps !== null) {
294
+ finding.safeRps = rpsCeilings[rpsCeilings.indexOf(finding.triggerRps) - 1] ?? null;
295
+ logger.info(` → safe ceiling: ${finding.safeRps ?? "unknown"} rps (triggered at ${finding.triggerRps} rps)`);
296
+ }
297
+ return finding;
298
+ }
299
+ async function main() {
300
+ const args = process.argv.slice(2);
301
+ let capturesDir = CAPTURES_DIR;
302
+ for (let i = 0; i < args.length; i++) {
303
+ if (args[i] === "--captures-dir" && args[i + 1])
304
+ capturesDir = args[++i];
305
+ }
306
+ (0, node_fs_1.mkdirSync)(REPLAYS_DIR, { recursive: true });
307
+ logger.info("=== PHASE 2: HTTP REPLAY ===");
308
+ const all = loadCaptures(capturesDir);
309
+ const unique = deduplicateCaptures(all);
310
+ logger.info(`found ${all.length} captures, ${unique.length} unique`);
311
+ const replays = [];
312
+ for (const { filename, capture } of unique) {
313
+ const result = await replayCapture(filename, capture);
314
+ replays.push(result);
315
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(REPLAYS_DIR, filename), JSON.stringify(result, null, 2));
316
+ }
317
+ const passed = replays.filter((r) => r.success).length;
318
+ logger.info(`replay complete: ${passed}/${replays.length} passed`);
319
+ // GraphQL introspection probe
320
+ logger.info("=== PHASE 3A: INTROSPECTION PROBE ===");
321
+ const graphqlEndpoints = new Set(replays
322
+ .filter((r) => r.operationName !== null)
323
+ .map((r) => {
324
+ try {
325
+ const u = new URL(r.url);
326
+ return `${u.origin}${u.pathname}`;
327
+ }
328
+ catch {
329
+ return r.url;
330
+ }
331
+ }));
332
+ if (graphqlEndpoints.size === 0) {
333
+ logger.info("no GraphQL endpoints found in captures");
334
+ }
335
+ for (const endpoint of graphqlEndpoints) {
336
+ await probeIntrospection(endpoint);
337
+ }
338
+ // Auxiliary endpoint probe
339
+ logger.info("=== PHASE 3B: AUXILIARY ENDPOINTS ===");
340
+ await probeAuxiliaryEndpoints(replays);
341
+ // Rate-limit probe — runs last
342
+ logger.info("=== PHASE 3C: RATE-LIMIT PROBE (runs last — may trigger ban) ===");
343
+ const probeTargets = new Map();
344
+ for (const replay of replays) {
345
+ if (!replay.success)
346
+ continue;
347
+ try {
348
+ const u = new URL(replay.url);
349
+ if (u.protocol !== "http:" && u.protocol !== "https:")
350
+ continue;
351
+ const pathname = u.pathname.toLowerCase();
352
+ // Skip static fixture endpoints — probing them 60+ times could ban the CDN egress IP
353
+ if (pathname.endsWith(".json") ||
354
+ /\/(markets|currencies|labels|dictionaries|config|locales|i18n)/.test(pathname))
355
+ continue;
356
+ const key = `${u.origin}${u.pathname}`;
357
+ if (!probeTargets.has(key)) {
358
+ probeTargets.set(key, { method: replay.method, body: replay.requestBody });
359
+ }
360
+ }
361
+ catch {
362
+ // skip unparseable urls
363
+ }
364
+ }
365
+ const rateLimitFindings = [];
366
+ for (const [endpoint, { method, body }] of probeTargets) {
367
+ const finding = await probeRateLimit(endpoint, method, body);
368
+ rateLimitFindings.push(finding);
369
+ }
370
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(REPLAYS_DIR, "rate-limit.json"), JSON.stringify(rateLimitFindings, null, 2));
371
+ logger.info(`recon-http complete — replays in ${REPLAYS_DIR}`);
372
+ }
373
+ main().catch((err) => {
374
+ logger.error(`recon-http failed: ${(0, errors_1.toErrorMessage)(err)}`);
375
+ process.exit(1);
376
+ });
377
+ //# sourceMappingURL=recon-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recon-http.js","sourceRoot":"","sources":["../../src/scripts/recon-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Iterates a site's replay-jobs.json fixture and runs recon-browser once
3
+ * per job, allocating a fresh testmail inbox per run so the confirmation-
4
+ * email delivery is an independent end-to-end signal. Aggregates a
5
+ * per-job verdict (integrated_apply 200 captured? terminal URL? email
6
+ * received?) and prints a final report.
7
+ *
8
+ * Why a separate runner instead of vitest: each recon-browser run boots
9
+ * a real browser, executes the LLM-driven cascade, and writes to
10
+ * /tmp/recon/. Running them under vitest interleaves logs, blocks on
11
+ * fork-pool limits, and obscures per-run telemetry. A direct sequential
12
+ * driver gives cleaner per-job artifacts and a single aggregated report.
13
+ *
14
+ * Usage:
15
+ * pnpm tsx --env-file=.env src/scripts/recon-replay-jobs.ts \
16
+ * --jobs src/sites/appcast/fixtures/replay-jobs.json \
17
+ * --flow-file src/sites/appcast/recon-flow.json \
18
+ * --report /tmp/recon/replay-report.json
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=recon-replay-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recon-replay-jobs.d.ts","sourceRoot":"","sources":["../../src/scripts/recon-replay-jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ /**
3
+ * Iterates a site's replay-jobs.json fixture and runs recon-browser once
4
+ * per job, allocating a fresh testmail inbox per run so the confirmation-
5
+ * email delivery is an independent end-to-end signal. Aggregates a
6
+ * per-job verdict (integrated_apply 200 captured? terminal URL? email
7
+ * received?) and prints a final report.
8
+ *
9
+ * Why a separate runner instead of vitest: each recon-browser run boots
10
+ * a real browser, executes the LLM-driven cascade, and writes to
11
+ * /tmp/recon/. Running them under vitest interleaves logs, blocks on
12
+ * fork-pool limits, and obscures per-run telemetry. A direct sequential
13
+ * driver gives cleaner per-job artifacts and a single aggregated report.
14
+ *
15
+ * Usage:
16
+ * pnpm tsx --env-file=.env src/scripts/recon-replay-jobs.ts \
17
+ * --jobs src/sites/appcast/fixtures/replay-jobs.json \
18
+ * --flow-file src/sites/appcast/recon-flow.json \
19
+ * --report /tmp/recon/replay-report.json
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ const node_child_process_1 = require("node:child_process");
23
+ const node_fs_1 = require("node:fs");
24
+ const node_path_1 = require("node:path");
25
+ const promises_1 = require("node:timers/promises");
26
+ const logging_1 = require("../lib/logging");
27
+ const recon_browser_1 = require("../scripts/recon-browser");
28
+ const client_1 = require("../testmail/client");
29
+ const logger = (0, logging_1.getScriptLogger)("recon-replay-jobs");
30
+ function parseArgs() {
31
+ const args = process.argv.slice(2);
32
+ let jobsPath = null;
33
+ let flowFile = null;
34
+ let reportPath = "/tmp/recon/replay-report.json";
35
+ for (let i = 0; i < args.length; i++) {
36
+ if (args[i] === "--jobs" && args[i + 1])
37
+ jobsPath = (0, node_path_1.resolve)(args[++i]);
38
+ else if (args[i] === "--flow-file" && args[i + 1])
39
+ flowFile = (0, node_path_1.resolve)(args[++i]);
40
+ else if (args[i] === "--report" && args[i + 1])
41
+ reportPath = (0, node_path_1.resolve)(args[++i]);
42
+ }
43
+ if (!jobsPath || !flowFile) {
44
+ logger.error("usage: recon-replay-jobs.ts --jobs <jobs.json> --flow-file <flow.json> [--report <path>]");
45
+ process.exit(1);
46
+ }
47
+ return { jobsPath, flowFile, reportPath };
48
+ }
49
+ /**
50
+ * Spawns recon-browser as a child process with RECON_EMAIL pre-bound in
51
+ * the child's env. The flow-file's `${RECON_EMAIL}` token resolves to
52
+ * this address via the engine's existing substituteFlowEnvVars step.
53
+ */
54
+ async function runReconForJob(url, flowFile, email) {
55
+ const capturesDir = "/tmp/recon/graphql";
56
+ (0, node_fs_1.mkdirSync)(capturesDir, { recursive: true });
57
+ const capturesBefore = new Set((0, node_fs_1.readdirSync)(capturesDir));
58
+ // Flow-file ENOENT retry. If the flow file is transiently unreadable
59
+ // (git stash mid-sweep, file system race), wait briefly and retry up
60
+ // to 3 times before giving up. Covers the 2026-06-09 sweep where
61
+ // recon-flow.json was missing for ~1 second between git operations,
62
+ // causing job 7 to fail with ENOENT in 2 minutes rather than getting
63
+ // a real verdict. Without this gate, transient file-system races
64
+ // produce false negatives in the per-job verdict.
65
+ const ENOENT_MAX_RETRIES = 3;
66
+ const ENOENT_RETRY_DELAY_MS = 5000;
67
+ for (let attempt = 0; attempt < ENOENT_MAX_RETRIES; attempt++) {
68
+ if ((0, node_fs_1.existsSync)(flowFile))
69
+ break;
70
+ if (attempt === ENOENT_MAX_RETRIES - 1) {
71
+ logger.error(`flow file '${flowFile}' missing after ${ENOENT_MAX_RETRIES} attempts (${(ENOENT_MAX_RETRIES - 1) * ENOENT_RETRY_DELAY_MS}ms total wait); spawning child anyway and letting it fail explicitly`);
72
+ break;
73
+ }
74
+ logger.warn(`flow file '${flowFile}' missing (attempt ${attempt + 1}/${ENOENT_MAX_RETRIES}); retrying in ${ENOENT_RETRY_DELAY_MS}ms`);
75
+ await (0, promises_1.setTimeout)(ENOENT_RETRY_DELAY_MS);
76
+ }
77
+ // Pipe stdio so the parent can scan stdout/stderr for the
78
+ // FATAL_BILLING marker the engine emits when Anthropic rejects a
79
+ // call due to credit exhaustion — there's no point continuing a
80
+ // multi-job sweep when every subsequent job will fail identically.
81
+ let billingError = false;
82
+ const exitCode = await new Promise((resolveExit) => {
83
+ const child = (0, node_child_process_1.spawn)("pnpm", [
84
+ "tsx",
85
+ "src/scripts/recon-browser.ts",
86
+ "--url",
87
+ url,
88
+ "--flow-file",
89
+ flowFile,
90
+ "--advanced-stealth",
91
+ ], {
92
+ stdio: ["inherit", "pipe", "pipe"],
93
+ env: { ...process.env, RECON_EMAIL: email },
94
+ });
95
+ const scan = (chunk, sink) => {
96
+ sink.write(chunk);
97
+ if (!billingError && /FATAL_BILLING/.test(chunk.toString())) {
98
+ billingError = true;
99
+ }
100
+ };
101
+ child.stdout?.on("data", (chunk) => scan(chunk, process.stdout));
102
+ child.stderr?.on("data", (chunk) => scan(chunk, process.stderr));
103
+ child.on("exit", (code) => resolveExit(code));
104
+ child.on("error", (err) => {
105
+ logger.error(`recon spawn failed: ${err.message}`);
106
+ resolveExit(null);
107
+ });
108
+ });
109
+ return { exitCode, capturesBefore, billingError };
110
+ }
111
+ /**
112
+ * Scans the recon's graphql capture directory for files written during
113
+ * this job's run, returning whether the AppCast integrated_apply
114
+ * endpoint captured a 200 and the SPA's terminal URL.
115
+ */
116
+ function readJobOutcome(capturesBefore) {
117
+ const capturesDir = "/tmp/recon/graphql";
118
+ const after = (0, node_fs_1.readdirSync)(capturesDir);
119
+ const newCaptures = after.filter((f) => !capturesBefore.has(f));
120
+ let integratedApply200 = false;
121
+ let serverRejected = false;
122
+ let serverRejectionReason = null;
123
+ let terminalUrl = null;
124
+ for (const f of newCaptures) {
125
+ try {
126
+ const data = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.resolve)(capturesDir, f), "utf8"));
127
+ if (typeof data.url === "string" &&
128
+ /\/api\/jobs\/\d+\/(integrated_apply|apply)(\?|$)/.test(data.url) &&
129
+ data.status === 200) {
130
+ integratedApply200 = true;
131
+ // Parse the response body to detect server-side rejection envelopes
132
+ // (AppCast `not_qualified`, Greenhouse `rejected`, Lever `qualified:
133
+ // false`, Workday `status: "rejected"`). HTTP 200 alone is not proof
134
+ // of acceptance — many ATSs use a "200 with rejection envelope"
135
+ // pattern. The capture writer at recon-browser.ts:240 stores
136
+ // responseBody as either an object (JSON success) or a string
137
+ // (JSON-parse failure fallback) — handle both shapes here.
138
+ let body = data.responseBody;
139
+ if (typeof body === "string") {
140
+ try {
141
+ body = JSON.parse(body);
142
+ }
143
+ catch {
144
+ body = null;
145
+ }
146
+ }
147
+ const rejection = (0, recon_browser_1.detectRejectionInResponseBody)(body);
148
+ if (rejection.rejected) {
149
+ serverRejected = true;
150
+ serverRejectionReason = rejection.reason;
151
+ }
152
+ }
153
+ if (typeof data.url === "string" && /\/applyboard\/applied/.test(data.url)) {
154
+ terminalUrl = data.url;
155
+ }
156
+ }
157
+ catch { }
158
+ }
159
+ return { integratedApply200, serverRejected, serverRejectionReason, terminalUrl };
160
+ }
161
+ async function main() {
162
+ const { jobsPath, flowFile, reportPath } = parseArgs();
163
+ const jobs = JSON.parse((0, node_fs_1.readFileSync)(jobsPath, "utf8"));
164
+ logger.info(`replay: ${jobs.length} jobs from ${jobsPath}, flow=${flowFile}`);
165
+ const verdicts = [];
166
+ for (let i = 0; i < jobs.length; i++) {
167
+ const job = jobs[i];
168
+ const inbox = (0, client_1.allocateTestmailInbox)();
169
+ const start = Date.now();
170
+ logger.info(`[${i + 1}/${jobs.length}] jobId=${job.jobId} inbox=${inbox.address}`);
171
+ const { exitCode, capturesBefore, billingError } = await runReconForJob(job.resolvedUrl, flowFile, inbox.address);
172
+ const { integratedApply200, serverRejected, serverRejectionReason, terminalUrl } = readJobOutcome(capturesBefore);
173
+ let emailReceived = false;
174
+ let emailSubject = null;
175
+ try {
176
+ const message = await (0, client_1.pollTestmailInbox)({ inbox, timeoutMs: 120_000 });
177
+ emailReceived = true;
178
+ emailSubject = message.subject;
179
+ }
180
+ catch (err) {
181
+ logger.warn(`[${i + 1}/${jobs.length}] inbox poll did not yield message: ${err.message}`);
182
+ }
183
+ const verdict = {
184
+ jobId: job.jobId,
185
+ url: job.resolvedUrl,
186
+ inboxAddress: inbox.address,
187
+ reconExitCode: exitCode,
188
+ integratedApply200,
189
+ serverRejected,
190
+ serverRejectionReason,
191
+ terminalUrl,
192
+ emailReceived,
193
+ emailSubject,
194
+ capturesDir: "/tmp/recon/graphql",
195
+ durationMs: Date.now() - start,
196
+ };
197
+ verdicts.push(verdict);
198
+ const rejectionSuffix = serverRejected
199
+ ? ` REJECTED="${serverRejectionReason ?? "(no reason)"}"`
200
+ : "";
201
+ logger.info(`[${i + 1}/${jobs.length}] verdict: exit=${exitCode} apply200=${integratedApply200} accepted=${integratedApply200 && !serverRejected}${rejectionSuffix} email=${emailReceived} subj=${emailSubject ?? "-"} dur=${Math.round(verdict.durationMs / 1000)}s`);
202
+ (0, node_fs_1.writeFileSync)(reportPath, `${JSON.stringify(verdicts, null, 2)}\n`);
203
+ if (billingError) {
204
+ // Hard short-circuit: every subsequent job's LLM-cascade will fail
205
+ // identically with the same billing error. Burning Browserbase
206
+ // sessions on them is pure waste — surface the gap loud and exit.
207
+ logger.error(`replay aborted: Anthropic API billing exhausted detected in job ${i + 1}/${jobs.length}; remaining ${jobs.length - i - 1} job(s) skipped. Top up at https://console.anthropic.com/billing then re-run.`);
208
+ break;
209
+ }
210
+ }
211
+ const httpAccepted = verdicts.filter((v) => v.integratedApply200 && !v.serverRejected).length;
212
+ const httpAcceptedWithEmail = verdicts.filter((v) => v.integratedApply200 && !v.serverRejected && v.emailReceived).length;
213
+ const httpRejected = verdicts.filter((v) => v.integratedApply200 && v.serverRejected).length;
214
+ logger.info(`replay complete: ${httpAccepted}/${verdicts.length} accepted (HTTP 200 + no rejection envelope); ${httpRejected} rejected by ATS qualification filter; ${httpAcceptedWithEmail} also received confirmation email`);
215
+ logger.info(`report: ${reportPath}`);
216
+ }
217
+ main().catch((err) => {
218
+ logger.error(`replay failed: ${err.stack ?? String(err)}`);
219
+ process.exit(1);
220
+ });
221
+ //# sourceMappingURL=recon-replay-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recon-replay-jobs.js","sourceRoot":"","sources":["../../src/scripts/recon-replay-jobs.ts"],"names":[],"mappings":"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"}