@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,239 @@
1
+ "use strict";
2
+ /**
3
+ * Zod schemas for every Anthropic LLM call site's structured output. Every
4
+ * call in the engine goes through `client.messages.parse` + `zodOutputFormat`
5
+ * (or equivalent) so the SDK throws on schema violation rather than handing
6
+ * back malformed text the caller has to defensively parse. Co-locating the
7
+ * schemas here keeps the contracts visible in one file instead of buried
8
+ * inside ~4500-line scripts.
9
+ *
10
+ * Naming: each schema corresponds 1:1 to a `CALL_TYPE_*` constant in
11
+ * `src/lib/telemetry/call-types.ts`.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.SELECT_OPTION_SCHEMA = exports.ERROR_MESSAGES_SCHEMA = exports.MODAL_PRIORITY_SCHEMA = exports.INVALID_FIELDS_SCHEMA = exports.SUBMIT_VERDICT_SCHEMA = exports.JUDGE_VERDICT_SCHEMA = exports.PATCH_RESPONSE_SCHEMA = exports.REPHRASE_RESPONSE_SCHEMA = exports.REPLAN_RESPONSE_SCHEMA = exports.RECON_FLOW_STEP_SCHEMA = exports.REPLAN_MAX_STEPS = void 0;
15
+ const v4_1 = require("zod/v4");
16
+ /**
17
+ * Cap on per-replan step list size. Anything beyond this is almost certainly
18
+ * the LLM hallucinating an entire flow from scratch instead of writing the
19
+ * minimum bridge needed to unstick the cascade. Matches the existing pre-move
20
+ * constant value so call-site behavior is identical.
21
+ */
22
+ exports.REPLAN_MAX_STEPS = 30;
23
+ /**
24
+ * Flow step shape consumed by every recon-flow consumer (file parsing,
25
+ * replanner output, normalizer). A bare string is a required step; the
26
+ * object form supports `optional` and `upload` flags.
27
+ *
28
+ * Moved here from recon-browser.ts so REPLAN_RESPONSE_SCHEMA can be defined
29
+ * alongside it without recon-browser.ts having to re-export both.
30
+ */
31
+ exports.RECON_FLOW_STEP_SCHEMA = v4_1.z.union([
32
+ v4_1.z.string().min(1),
33
+ v4_1.z.object({
34
+ step: v4_1.z.string().min(1),
35
+ optional: v4_1.z.boolean().default(false),
36
+ upload: v4_1.z.boolean().default(false),
37
+ /**
38
+ * When true, the step is treated as the canonical submit click for the
39
+ * `submitEndpointPattern` verifier even when its position in the flow
40
+ * is not the last index. The pre-2026-06-15 implementation gated the
41
+ * pre-submit DOM probe on `isFinalStep` only, but real AppCast flows
42
+ * put the submit click in the middle of the step list (UVA Verona's
43
+ * Submit was at index 55/328) and follow it with post-submit
44
+ * verification steps. With this flag set, the probe + verifier fire
45
+ * at the actual submit click, not at the unrelated last step.
46
+ */
47
+ submitStep: v4_1.z.boolean().default(false),
48
+ /**
49
+ * Optional payload-field override for the generator's splicer. When set,
50
+ * `resolveStepPayloadField` returns this field name verbatim instead of
51
+ * inferring one from the instruction's English label — lets a flow author
52
+ * pin a step to a specific `payload.<field>` reference in the generated
53
+ * browser-flow. Ignored by the recon runtime; consumed only by
54
+ * recon-generate.ts.
55
+ */
56
+ payloadField: v4_1.z.string().optional(),
57
+ /**
58
+ * Optional opt-out for the generator's splicer. When true, the generator
59
+ * leaves the instruction literal even if its label would otherwise match a
60
+ * candidate payload field. Ignored by the recon runtime.
61
+ */
62
+ payloadFieldNone: v4_1.z.boolean().optional(),
63
+ }),
64
+ ]);
65
+ /**
66
+ * Replanner response. Discriminated union on `outcome`. When the cascade has
67
+ * exhausted all per-step healing attempts, the replanner either proposes a
68
+ * bridge sequence (`replan` outcome) or admits the page state is
69
+ * unrecoverable (`impossible`). The single-action constraint on each step is
70
+ * enforced by the caller's normalizer, not the schema (the LLM emits
71
+ * arbitrary text inside `step`; we trust the caller's downstream parse).
72
+ */
73
+ exports.REPLAN_RESPONSE_SCHEMA = v4_1.z.discriminatedUnion("outcome", [
74
+ v4_1.z.object({
75
+ outcome: v4_1.z.literal("replan"),
76
+ steps: v4_1.z.array(exports.RECON_FLOW_STEP_SCHEMA).min(1).max(exports.REPLAN_MAX_STEPS),
77
+ }),
78
+ v4_1.z.object({
79
+ outcome: v4_1.z.literal("impossible"),
80
+ reason: v4_1.z.string().min(1),
81
+ }),
82
+ ]);
83
+ /**
84
+ * Rephrase response. Discriminated union on `outcome`. The pre-schema
85
+ * contract was free text plus the magic string "IMPOSSIBLE" — fragile and
86
+ * easy for the LLM to emit prose around. The schema makes the contract
87
+ * explicit and parses on the API side.
88
+ */
89
+ exports.REPHRASE_RESPONSE_SCHEMA = v4_1.z.discriminatedUnion("outcome", [
90
+ v4_1.z.object({
91
+ outcome: v4_1.z.literal("rewrite"),
92
+ instruction: v4_1.z.string().min(1).max(400),
93
+ }),
94
+ v4_1.z.object({
95
+ outcome: v4_1.z.literal("impossible"),
96
+ reason: v4_1.z.string().min(1).max(200),
97
+ }),
98
+ ]);
99
+ /**
100
+ * Patch generator response shape. Shared between `recon-flow-patch` and
101
+ * `llm-prompt-patch` — both follow the same anchor/replacement/strategy
102
+ * minimal-change discipline. The contract was identical at the prose level
103
+ * before this schema; making it shared explicit Zod cleans up two parallel
104
+ * `JSON.parse` ladders.
105
+ *
106
+ * Cross-field validation (anchor must exist in the artifact being patched)
107
+ * stays at the caller because the artifact isn't known to the schema.
108
+ */
109
+ exports.PATCH_RESPONSE_SCHEMA = v4_1.z.object({
110
+ anchor: v4_1.z.string().min(1),
111
+ replacement: v4_1.z.string(),
112
+ strategy: v4_1.z.string().min(1).max(120),
113
+ pivot_reason: v4_1.z.string().nullable(),
114
+ });
115
+ /**
116
+ * Judge verdict shape. The existing judge prompt already specifies this
117
+ * structure in prose; moving it to a Zod schema makes the contract enforced
118
+ * by the SDK and removes the manual try/catch JSON-parse ladder.
119
+ */
120
+ exports.JUDGE_VERDICT_SCHEMA = v4_1.z.object({
121
+ schemaOk: v4_1.z.boolean(),
122
+ schemaRationale: v4_1.z.string().min(1).max(400),
123
+ factuallyGrounded: v4_1.z.boolean(),
124
+ factualRationale: v4_1.z.string().min(1).max(400),
125
+ hallucinationFree: v4_1.z.boolean(),
126
+ hallucinationRationale: v4_1.z.string().min(1).max(400),
127
+ worstOffender: v4_1.z.enum(["schema", "factual", "hallucination"]).nullable().optional(),
128
+ });
129
+ /**
130
+ * Submit-verification verdict. Replaces the per-site `submitEndpointPattern`
131
+ * regex. Discriminated union forces the LLM to commit to verified=true|false
132
+ * — no in-between "maybe" state.
133
+ *
134
+ * The verified=true branch requires populating three signal fields (any can
135
+ * be null but at least one of dom_signal / url_signal SHOULD be non-null per
136
+ * the strict system prompt). The verifier's `rationale` must cite the
137
+ * strongest signal — keeps Haiku honest about why it ruled success.
138
+ *
139
+ * The verified=false branch requires a reason — keeps Haiku from waving
140
+ * failures away without explanation, and gives the rephrase prompt
141
+ * downstream a structured signal about what to look for.
142
+ *
143
+ * Empirically validated 2026-06-11 on two real production failure dumps
144
+ * (one wrongly-flagged-as-fail, one genuinely-stuck) — both verdicts
145
+ * correct, both rationale fields coherent.
146
+ */
147
+ exports.SUBMIT_VERDICT_SCHEMA = v4_1.z.discriminatedUnion("verified", [
148
+ v4_1.z.object({
149
+ verified: v4_1.z.literal(true),
150
+ network_signal: v4_1.z
151
+ .object({
152
+ url: v4_1.z.string().max(2048),
153
+ status: v4_1.z.number(),
154
+ method: v4_1.z.string().max(16),
155
+ })
156
+ .nullable(),
157
+ dom_signal: v4_1.z.string().max(200).nullable(),
158
+ url_signal: v4_1.z.string().max(200).nullable(),
159
+ rationale: v4_1.z.string().min(1).max(400),
160
+ }),
161
+ v4_1.z.object({
162
+ verified: v4_1.z.literal(false),
163
+ reason: v4_1.z.string().min(1).max(400),
164
+ }),
165
+ ]);
166
+ /**
167
+ * Invalid-field detection verdict. Replaces INVALID_CLASS_RX regex.
168
+ * `present` is the top-level boolean so a downstream consumer can
169
+ * short-circuit on "no invalid fields here" without iterating `fields`.
170
+ * `fields` carries the discovered structural markers per-container so
171
+ * the rephrase prompt can build its INTERACTIVE TARGETS section.
172
+ *
173
+ * Strict prompting requires: structural marker (class containing
174
+ * "invalid", aria-invalid="true", data-invalid, or visible error
175
+ * container near input). Visual-only styling does NOT count.
176
+ */
177
+ exports.INVALID_FIELDS_SCHEMA = v4_1.z.object({
178
+ present: v4_1.z.boolean(),
179
+ fields: v4_1.z
180
+ .array(v4_1.z.object({
181
+ containerXpath: v4_1.z.string().min(1),
182
+ label: v4_1.z.string().nullable(),
183
+ markerKind: v4_1.z.enum(["class", "aria", "data", "error-container", "other"]),
184
+ framework: v4_1.z.enum(["angular", "react", "vue", "mantine", "chakra", "bootstrap", "other"]),
185
+ }))
186
+ .max(50),
187
+ });
188
+ /**
189
+ * Modal-priority verdict. Replaces MODAL_PRIORITY_RX keyword regex over
190
+ * Stagehand's English description strings. Returns indices into the
191
+ * caller-supplied unfocused-observe array — the engine just re-sorts
192
+ * its own list, the LLM doesn't see selectors or have to echo them
193
+ * back.
194
+ *
195
+ * Strict prompting requires: structurally blocking the form. Cookie
196
+ * banners and welcome modals ARE priority. Always-visible panels and
197
+ * sidebars are NOT.
198
+ */
199
+ exports.MODAL_PRIORITY_SCHEMA = v4_1.z.object({
200
+ priorityIndices: v4_1.z.array(v4_1.z.number().int().min(0)).max(50),
201
+ rationale: v4_1.z.string().min(1).max(400),
202
+ });
203
+ /**
204
+ * Visible-error-message extraction verdict. Replaces `errorPattern`
205
+ * regex. Each entry carries the text, an optional field-name hint,
206
+ * and a severity ranking — the rephrase prompt today renders these as
207
+ * the VISIBLE ERROR / REQUIRED-FIELD MESSAGES section.
208
+ *
209
+ * Strict prompting: structurally-marked error containers + visible text
210
+ * only. Skip placeholder text, help text, and inactive tooltips.
211
+ */
212
+ exports.ERROR_MESSAGES_SCHEMA = v4_1.z.object({
213
+ messages: v4_1.z
214
+ .array(v4_1.z.object({
215
+ text: v4_1.z.string().min(1).max(400),
216
+ fieldHint: v4_1.z.string().nullable(),
217
+ severity: v4_1.z.enum(["error", "warning", "info"]),
218
+ }))
219
+ .max(50),
220
+ });
221
+ /**
222
+ * Select-option picker verdict. When a flow step's hardcoded dropdown answer
223
+ * doesn't exist in a given requisition's option list (per-req variance —
224
+ * e.g. an ER-flavored answer on a Cardiac job), this judge picks the most
225
+ * plausible AVAILABLE option so the required question can be answered and the
226
+ * wizard advances. `selectIndex` picks which candidate dropdown answers the
227
+ * question (or null when none does); `optionIndex` picks the option within that
228
+ * dropdown (null when `selectIndex` is null).
229
+ */
230
+ exports.SELECT_OPTION_SCHEMA = v4_1.z.object({
231
+ /** Index into the caller-supplied candidate dropdowns — which dropdown on the
232
+ * page answers the question. Null when none does. */
233
+ selectIndex: v4_1.z.number().int().min(0).nullable(),
234
+ /** Index into that dropdown's options — which option to choose. Null when
235
+ * selectIndex is null. */
236
+ optionIndex: v4_1.z.number().int().min(0).nullable(),
237
+ reason: v4_1.z.string().min(1).max(400),
238
+ });
239
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/lib/llm/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import pino from "pino";
2
+ import type { Logger } from "../types/logging";
3
+ /**
4
+ * Splits a message that exceeds CloudWatch's 256KB per-event cap. Prefers
5
+ * newline / space boundaries so chunks stay readable; falls back to a
6
+ * UTF-8-safe byte boundary so we don't slice through a multi-byte char.
7
+ *
8
+ * Exported for direct testing — the runtime emit path runs through a
9
+ * silent pino in NODE_ENV=test, so chunking is otherwise unobservable.
10
+ * Callers outside this module should use the logger methods instead.
11
+ */
12
+ export declare function splitLargeMessage(message: string, maxSize?: number): string[];
13
+ /**
14
+ * Wraps a pino logger with the project's extended Logger interface: CloudWatch
15
+ * message splitting on every level method, and `errorWithStack` for one-line
16
+ * error logs that include the stack inline. Used internally by `getLogger` and
17
+ * exported so callers with an existing pino instance (e.g. `request.log`) can
18
+ * promote it to the full Logger contract without creating a new logger.
19
+ */
20
+ export declare function extendLogger(logger: pino.Logger): Logger;
21
+ /**
22
+ * Returns a pino logger for one-shot CLI scripts. Uses pino-pretty in
23
+ * development (where the devDependency is installed) and falls back to raw
24
+ * JSON elsewhere, mirroring `getLogger`'s gating — `pino-pretty` is pruned
25
+ * from production images, so an unconditional transport crashes on module
26
+ * load in prod (see the pino-pretty prod-crash incident).
27
+ */
28
+ export declare function getScriptLogger(name: string): Logger;
29
+ /**
30
+ * Creates a named pino logger with the project's standard wiring:
31
+ * pino-pretty transport in dev, JSON in prod, silent in test, secrets
32
+ * redacted, and every string message auto-chunked under CloudWatch's
33
+ * 256KB event cap. `name` appears as `{appName}://{name}` on every line.
34
+ */
35
+ export declare function getLogger({ name, level }: {
36
+ name: string;
37
+ level?: string;
38
+ }): Logger;
39
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/lib/logging.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA4D9C;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAyB,GAAG,MAAM,EAAE,CAY/F;AA4DD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAiCxD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA0BnF"}
@@ -0,0 +1,219 @@
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.splitLargeMessage = splitLargeMessage;
7
+ exports.extendLogger = extendLogger;
8
+ exports.getScriptLogger = getScriptLogger;
9
+ exports.getLogger = getLogger;
10
+ const date_fns_1 = require("date-fns");
11
+ const pino_1 = __importDefault(require("pino"));
12
+ const datadog_1 = require("../lib/datadog");
13
+ const env_1 = require("../lib/env");
14
+ const nodeEnv = (0, env_1.getNodeEnv)();
15
+ const isDevelopment = nodeEnv === "development";
16
+ const isTest = nodeEnv === "test";
17
+ const defaultLoggingLevel = process.env.LOG_LEVEL ?? (process.env.DEBUG ? "debug" : "info");
18
+ const defaultAppName = process.env.APP_NAME || "barnacle";
19
+ const ddEnabled = (0, env_1.getBoolEnv)("DD_TRACE_ENABLED", false);
20
+ /**
21
+ * CloudWatch Logs has a hard limit of 256KB per log event.
22
+ * We split messages that exceed this limit to ensure all logs are captured.
23
+ */
24
+ const CLOUDWATCH_MAX_LOG_SIZE = 256 * 1024;
25
+ const MESSAGE_SPLIT_OVERHEAD = 2 * 1024;
26
+ const MAX_MESSAGE_SIZE = CLOUDWATCH_MAX_LOG_SIZE - MESSAGE_SPLIT_OVERHEAD;
27
+ const textEncoder = new TextEncoder();
28
+ const transport = isDevelopment
29
+ ? {
30
+ target: "pino-pretty",
31
+ options: {
32
+ colorize: true,
33
+ translateTime: "SYS:standard",
34
+ ignore: "pid,hostname",
35
+ },
36
+ }
37
+ : undefined;
38
+ function getTimestamp() {
39
+ return `,"time":"${(0, date_fns_1.formatISO)(new Date())}"`;
40
+ }
41
+ const redactPaths = [
42
+ "password",
43
+ "token",
44
+ "apiKey",
45
+ "secret",
46
+ "authorization",
47
+ "cookie",
48
+ "*.password",
49
+ "*.token",
50
+ "*.apiKey",
51
+ "*.secret",
52
+ "*.authorization",
53
+ "req.headers.authorization",
54
+ "req.headers.cookie",
55
+ ];
56
+ // Emit `level` as its string label rather than pino's numeric default;
57
+ // log aggregators (Datadog, CloudWatch Insights) filter on strings.
58
+ const formatters = {
59
+ level: (label) => {
60
+ return { level: label };
61
+ },
62
+ };
63
+ /**
64
+ * Splits a message that exceeds CloudWatch's 256KB per-event cap. Prefers
65
+ * newline / space boundaries so chunks stay readable; falls back to a
66
+ * UTF-8-safe byte boundary so we don't slice through a multi-byte char.
67
+ *
68
+ * Exported for direct testing — the runtime emit path runs through a
69
+ * silent pino in NODE_ENV=test, so chunking is otherwise unobservable.
70
+ * Callers outside this module should use the logger methods instead.
71
+ */
72
+ function splitLargeMessage(message, maxSize = MAX_MESSAGE_SIZE) {
73
+ const messageSize = textEncoder.encode(message).length;
74
+ if (messageSize <= maxSize) {
75
+ return [message];
76
+ }
77
+ const splitPoint = findSplitPoint(message, maxSize);
78
+ const firstChunk = message.slice(0, splitPoint);
79
+ const remainingMessage = message.slice(splitPoint);
80
+ return [firstChunk, ...splitLargeMessage(remainingMessage, maxSize)];
81
+ }
82
+ function findSplitPoint(message, maxSize) {
83
+ const newlineIndex = message.lastIndexOf("\n", maxSize);
84
+ const spaceIndex = message.lastIndexOf(" ", maxSize);
85
+ const halfMax = maxSize / 2;
86
+ if (newlineIndex > halfMax) {
87
+ return newlineIndex + 1;
88
+ }
89
+ if (spaceIndex > halfMax) {
90
+ return spaceIndex + 1;
91
+ }
92
+ return findCharacterBoundary(message, maxSize);
93
+ }
94
+ function findCharacterBoundary(message, maxSize) {
95
+ // Iterate by full code points (not UTF-16 code units) so surrogate
96
+ // pairs stay intact. `message[i]` returns a code unit — for emoji
97
+ // like 🎉 that's the high surrogate alone, which TextEncoder encodes
98
+ // as the 3-byte U+FFFD replacement character. A per-code-unit split
99
+ // could land between the pair and corrupt the character in the log.
100
+ let lastSafeCodeUnitIndex = 0;
101
+ let byteCount = 0;
102
+ let cuIndex = 0;
103
+ for (const char of message) {
104
+ const charCode = char.codePointAt(0) ?? 0;
105
+ const charSize = charCode < 128 ? 1 : textEncoder.encode(char).length;
106
+ if (byteCount + charSize > maxSize) {
107
+ break;
108
+ }
109
+ byteCount += charSize;
110
+ cuIndex += char.length;
111
+ lastSafeCodeUnitIndex = cuIndex;
112
+ }
113
+ return lastSafeCodeUnitIndex || 1;
114
+ }
115
+ function getChunkPrefix(index, totalChunks) {
116
+ return totalChunks > 1 ? `[${index + 1}/${totalChunks}] ` : "";
117
+ }
118
+ function logWithSplitting(originalLogFn, obj, ...args) {
119
+ if (typeof obj === "string") {
120
+ const chunks = splitLargeMessage(obj);
121
+ chunks.forEach((chunk, index) => {
122
+ const prefix = getChunkPrefix(index, chunks.length);
123
+ originalLogFn(`${prefix}${chunk}`, ...args);
124
+ });
125
+ }
126
+ else {
127
+ originalLogFn(obj, ...args);
128
+ }
129
+ }
130
+ function getLogName(name, appName) {
131
+ return `${appName}://${name}`;
132
+ }
133
+ /**
134
+ * Wraps a pino logger with the project's extended Logger interface: CloudWatch
135
+ * message splitting on every level method, and `errorWithStack` for one-line
136
+ * error logs that include the stack inline. Used internally by `getLogger` and
137
+ * exported so callers with an existing pino instance (e.g. `request.log`) can
138
+ * promote it to the full Logger contract without creating a new logger.
139
+ */
140
+ function extendLogger(logger) {
141
+ const extendedLogger = logger;
142
+ const originalInfo = extendedLogger.info.bind(extendedLogger);
143
+ const originalError = extendedLogger.error.bind(extendedLogger);
144
+ const originalWarn = extendedLogger.warn.bind(extendedLogger);
145
+ const originalDebug = extendedLogger.debug.bind(extendedLogger);
146
+ extendedLogger.info = (obj, ...args) => {
147
+ logWithSplitting(originalInfo, obj, ...args);
148
+ };
149
+ extendedLogger.error = (obj, ...args) => {
150
+ logWithSplitting(originalError, obj, ...args);
151
+ };
152
+ extendedLogger.warn = (obj, ...args) => {
153
+ logWithSplitting(originalWarn, obj, ...args);
154
+ };
155
+ extendedLogger.debug = (obj, ...args) => {
156
+ logWithSplitting(originalDebug, obj, ...args);
157
+ };
158
+ extendedLogger.errorWithStack = (error, msg) => {
159
+ const message = error instanceof Error
160
+ ? `${msg || error.message}: ${error.stack}`
161
+ : `${msg || JSON.stringify(error)}`;
162
+ logWithSplitting(originalError, message);
163
+ };
164
+ return extendedLogger;
165
+ }
166
+ /**
167
+ * Returns a pino logger for one-shot CLI scripts. Uses pino-pretty in
168
+ * development (where the devDependency is installed) and falls back to raw
169
+ * JSON elsewhere, mirroring `getLogger`'s gating — `pino-pretty` is pruned
170
+ * from production images, so an unconditional transport crashes on module
171
+ * load in prod (see the pino-pretty prod-crash incident).
172
+ */
173
+ function getScriptLogger(name) {
174
+ return extendLogger((0, pino_1.default)({
175
+ name: getLogName(name, defaultAppName),
176
+ level: process.env.LOG_LEVEL ?? "info",
177
+ transport,
178
+ }));
179
+ }
180
+ /**
181
+ * Creates a named pino logger with the project's standard wiring:
182
+ * pino-pretty transport in dev, JSON in prod, silent in test, secrets
183
+ * redacted, and every string message auto-chunked under CloudWatch's
184
+ * 256KB event cap. `name` appears as `{appName}://{name}` on every line.
185
+ */
186
+ function getLogger({ name, level }) {
187
+ const options = {
188
+ name: getLogName(name, defaultAppName),
189
+ level: isTest ? "silent" : level || defaultLoggingLevel,
190
+ base: {
191
+ appName: defaultAppName,
192
+ env: nodeEnv,
193
+ ...(ddEnabled && {
194
+ dd: {
195
+ service: (0, env_1.getEnv)("DD_SERVICE", "barnacle"),
196
+ version: (0, env_1.getEnv)("DD_VERSION", "0.1.0"),
197
+ env: (0, env_1.getEnv)("DD_ENV", nodeEnv),
198
+ },
199
+ }),
200
+ },
201
+ timestamp: getTimestamp,
202
+ formatters,
203
+ mixin: ddEnabled ? ddMixin : undefined,
204
+ redact: {
205
+ paths: redactPaths,
206
+ censor: "[REDACTED]",
207
+ },
208
+ transport,
209
+ };
210
+ return extendLogger((0, pino_1.default)(options));
211
+ }
212
+ function ddMixin() {
213
+ const span = datadog_1.tracer.scope().active();
214
+ if (!span)
215
+ return {};
216
+ const ctx = span.context();
217
+ return { "dd.trace_id": ctx.toTraceId(), "dd.span_id": ctx.toSpanId() };
218
+ }
219
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/lib/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * RFC 7578 multipart/form-data byte-assembly primitives.
3
+ *
4
+ * Site-agnostic helpers for hand-building multipart bodies without the
5
+ * browser FormData API. Boundary generation follows WebKit's convention
6
+ * (`----WebKitFormBoundary` + 16 lowercase hex chars) so servers that
7
+ * parse the Content-Type boundary token recognise it as a browser upload.
8
+ */
9
+ /**
10
+ * Generate a fresh multipart boundary using the WebKit convention.
11
+ * The prefix makes the boundary recognisable to parsers that inspect
12
+ * the User-Agent, and the 8 random bytes (16 hex chars) make collisions
13
+ * astronomically unlikely within a single request body.
14
+ */
15
+ export declare function makeBoundary(): string;
16
+ /**
17
+ * Append a `name=value` text part to the running parts list.
18
+ * Separating each part into a discrete push keeps the buffer assembly
19
+ * testable and avoids string-concatenating binary-adjacent content.
20
+ */
21
+ export declare function appendTextPart(parts: Buffer[], boundary: string, name: string, value: string): void;
22
+ /**
23
+ * Append a file part to the running parts list. The `filename=` token
24
+ * on the Content-Disposition header is what distinguishes a file part
25
+ * from a plain text part per RFC 7578 §4.2.
26
+ */
27
+ export declare function appendFilePart(parts: Buffer[], boundary: string, name: string, filename: string, contentType: string, bytes: Buffer): void;
28
+ /**
29
+ * Append the RFC 7578 §4.1 closing boundary marker (`--boundary--\r\n`).
30
+ * The trailing `--` after the boundary value is load-bearing: parsers
31
+ * that stream the body will wait for more parts if it is absent.
32
+ */
33
+ export declare function appendClosingBoundary(parts: Buffer[], boundary: string): void;
34
+ //# sourceMappingURL=multipart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../../src/lib/multipart.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,IAAI,CAQN;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7E"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * RFC 7578 multipart/form-data byte-assembly primitives.
4
+ *
5
+ * Site-agnostic helpers for hand-building multipart bodies without the
6
+ * browser FormData API. Boundary generation follows WebKit's convention
7
+ * (`----WebKitFormBoundary` + 16 lowercase hex chars) so servers that
8
+ * parse the Content-Type boundary token recognise it as a browser upload.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.makeBoundary = makeBoundary;
12
+ exports.appendTextPart = appendTextPart;
13
+ exports.appendFilePart = appendFilePart;
14
+ exports.appendClosingBoundary = appendClosingBoundary;
15
+ const node_crypto_1 = require("node:crypto");
16
+ /**
17
+ * Generate a fresh multipart boundary using the WebKit convention.
18
+ * The prefix makes the boundary recognisable to parsers that inspect
19
+ * the User-Agent, and the 8 random bytes (16 hex chars) make collisions
20
+ * astronomically unlikely within a single request body.
21
+ */
22
+ function makeBoundary() {
23
+ return `----WebKitFormBoundary${(0, node_crypto_1.randomBytes)(8).toString("hex")}`;
24
+ }
25
+ /**
26
+ * Append a `name=value` text part to the running parts list.
27
+ * Separating each part into a discrete push keeps the buffer assembly
28
+ * testable and avoids string-concatenating binary-adjacent content.
29
+ */
30
+ function appendTextPart(parts, boundary, name, value) {
31
+ parts.push(Buffer.from(`--${boundary}\r\n`));
32
+ parts.push(Buffer.from(`Content-Disposition: form-data; name="${name}"\r\n\r\n`));
33
+ parts.push(Buffer.from(`${value}\r\n`));
34
+ }
35
+ /**
36
+ * Append a file part to the running parts list. The `filename=` token
37
+ * on the Content-Disposition header is what distinguishes a file part
38
+ * from a plain text part per RFC 7578 §4.2.
39
+ */
40
+ function appendFilePart(parts, boundary, name, filename, contentType, bytes) {
41
+ parts.push(Buffer.from(`--${boundary}\r\n`));
42
+ parts.push(Buffer.from(`Content-Disposition: form-data; name="${name}"; filename="${filename}"\r\n`));
43
+ parts.push(Buffer.from(`Content-Type: ${contentType}\r\n\r\n`));
44
+ parts.push(bytes);
45
+ parts.push(Buffer.from("\r\n"));
46
+ }
47
+ /**
48
+ * Append the RFC 7578 §4.1 closing boundary marker (`--boundary--\r\n`).
49
+ * The trailing `--` after the boundary value is load-bearing: parsers
50
+ * that stream the body will wait for more parts if it is absent.
51
+ */
52
+ function appendClosingBoundary(parts, boundary) {
53
+ parts.push(Buffer.from(`--${boundary}--\r\n`));
54
+ }
55
+ //# sourceMappingURL=multipart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipart.js","sourceRoot":"","sources":["../../src/lib/multipart.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAUH,oCAEC;AAOD,wCASC;AAOD,wCAeC;AAOD,sDAEC;AAzDD,6CAA0C;AAE1C;;;;;GAKG;AACH,SAAgB,YAAY;IAC1B,OAAO,yBAAyB,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,KAAe,EACf,QAAgB,EAChB,IAAY,EACZ,KAAa;IAEb,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,WAAW,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,KAAe,EACf,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,WAAmB,EACnB,KAAa;IAEb,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,gBAAgB,QAAQ,OAAO,CAAC,CAC1F,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,WAAW,UAAU,CAAC,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,KAAe,EAAE,QAAgB;IACrE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Known synonyms keyed by their canonical option value (lowercased).
3
+ * When a payload sends a synonym, we return the canonical option.
4
+ */
5
+ export declare const SEMANTIC_EQUIVALENCES: Record<string, string[]>;
6
+ /**
7
+ * Match a raw value against a question's allowed options. Dropdown questions
8
+ * on ATS forms require the submitted value to be one of the declared options —
9
+ * sending an out-of-list value typically causes a server error.
10
+ *
11
+ * Matching cascade: exact → case-insensitive → US state name→abbrev →
12
+ * semantic equivalence → substring containment → fallback to first option.
13
+ */
14
+ export declare function matchToOptions(rawValue: string, options: unknown[]): string;
15
+ //# sourceMappingURL=option-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-matcher.d.ts","sourceRoot":"","sources":["../../src/lib/option-matcher.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAe1D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAmC3E"}