@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,98 @@
1
+ /**
2
+ * LLM batch judge: reads a calls.ndjson capture file, filters by callType,
3
+ * scores each sample on a three-dimensional rubric (schema adherence, factual
4
+ * grounding, hallucination-freeness), aggregates the results, and writes a
5
+ * schema-valid verdict JSON to the judge-out directory.
6
+ *
7
+ * Usage:
8
+ * pnpm judge:llm \
9
+ * --calls-ndjson .barnacle/calls.ndjson \
10
+ * --call-type act \
11
+ * --batch-index 0 \
12
+ * --judge-model claude-sonnet-4-6
13
+ *
14
+ * Knobs (all optional):
15
+ * --out-dir <path> default judge-out
16
+ * --dry-run stubs the scorer (CI mode, no API calls)
17
+ * --batch-index <N> default 0; disambiguates multiple verdict files
18
+ */
19
+ import Anthropic from "@anthropic-ai/sdk";
20
+ import { type JudgeAggregate, type JudgeVerdict, type JudgeVerdictEntry, type LlmCallSample } from "../api/schemas/telemetry";
21
+ /** Raw scoring dimensions returned by the scorer for a single sample. */
22
+ export interface SampleScore {
23
+ schemaOk: boolean;
24
+ schemaRationale: string;
25
+ factuallyGrounded: boolean;
26
+ factualRationale: string;
27
+ hallucinationFree: boolean;
28
+ hallucinationRationale: string;
29
+ worstOffender?: string;
30
+ }
31
+ /**
32
+ * Injectable scorer — real implementation calls the LLM; dry-run stub
33
+ * returns deterministic values. Mirrors recon-heal's requestPatchFn injection
34
+ * so the deterministic core (parse/aggregate/write) is fully unit-testable.
35
+ */
36
+ export type ScorerFn = (sample: LlmCallSample) => Promise<SampleScore>;
37
+ /**
38
+ * Reads an NDJSON file and returns the lines parsed as LlmCallSample objects.
39
+ * Lines that fail JSON parsing or Zod validation are returned with
40
+ * parsedOk=false so they auto-fail schema adherence in the judge pass.
41
+ */
42
+ export declare function parseSamples(ndjsonContent: string): LlmCallSample[];
43
+ /**
44
+ * Filters samples to only those matching the requested callType.
45
+ */
46
+ export declare function filterByCallType(samples: LlmCallSample[], callType: string): LlmCallSample[];
47
+ /**
48
+ * Derives a JudgeVerdictEntry from a sample and its score. Enforces the rule
49
+ * that parsedOk=false automatically fails schema adherence regardless of what
50
+ * the scorer returns.
51
+ */
52
+ export declare function computeVerdict(sample: LlmCallSample, score: SampleScore): JudgeVerdictEntry;
53
+ /**
54
+ * Computes aggregate counts over a set of verdict entries.
55
+ */
56
+ export declare function aggregate(verdicts: JudgeVerdictEntry[]): JudgeAggregate;
57
+ /**
58
+ * Validates and writes the verdict object as JSON to the judge-out directory.
59
+ * Returns the written file path.
60
+ */
61
+ export declare function writeVerdict(params: {
62
+ outDir: string;
63
+ verdict: JudgeVerdict;
64
+ }): string;
65
+ /**
66
+ * Dry-run scorer: marks every dimension true with a placeholder rationale.
67
+ * Used in CI and tests to exercise the full pipeline without any API call.
68
+ */
69
+ export declare function makeDryRunScorer(): ScorerFn;
70
+ /**
71
+ * Real LLM scorer: sends each sample to the Anthropic API for judgment.
72
+ * Defaults to the configured scraper model (respects STAGEHAND_MODEL env var)
73
+ * unless overridden by `judgeModel`.
74
+ */
75
+ export declare function makeAnthropicScorer(client: Anthropic, judgeModel?: string): ScorerFn;
76
+ /** Parameters accepted by `runJudge`. */
77
+ export interface JudgeParams {
78
+ callsNdjsonPath: string;
79
+ callType: string;
80
+ batchIndex?: number;
81
+ judgeModel?: string;
82
+ outDir?: string;
83
+ dryRun?: boolean;
84
+ /** Injectable scorer for unit tests. */
85
+ scorerFn?: ScorerFn;
86
+ }
87
+ /** Return value of `runJudge`. */
88
+ export interface JudgeResult {
89
+ verdictPath: string;
90
+ verdict: JudgeVerdict;
91
+ }
92
+ /**
93
+ * Drives the full parse → filter → score → aggregate → write pipeline for a
94
+ * single batch. Accepts an injectable `scorerFn` so tests exercise the full
95
+ * pipeline without any live model call.
96
+ */
97
+ export declare function runJudge(params: JudgeParams): Promise<JudgeResult>;
98
+ //# sourceMappingURL=judge-llm-batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-llm-batch.d.ts","sourceRoot":"","sources":["../../src/scripts/judge-llm-batch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAcjC,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIvE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE,CAyBnE;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAmB3F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,cAAc,CAevE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,MAAM,CAatF;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAS3C;AAuBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CA4CpF;AAeD,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAqExE"}
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * LLM batch judge: reads a calls.ndjson capture file, filters by callType,
4
+ * scores each sample on a three-dimensional rubric (schema adherence, factual
5
+ * grounding, hallucination-freeness), aggregates the results, and writes a
6
+ * schema-valid verdict JSON to the judge-out directory.
7
+ *
8
+ * Usage:
9
+ * pnpm judge:llm \
10
+ * --calls-ndjson .barnacle/calls.ndjson \
11
+ * --call-type act \
12
+ * --batch-index 0 \
13
+ * --judge-model claude-sonnet-4-6
14
+ *
15
+ * Knobs (all optional):
16
+ * --out-dir <path> default judge-out
17
+ * --dry-run stubs the scorer (CI mode, no API calls)
18
+ * --batch-index <N> default 0; disambiguates multiple verdict files
19
+ */
20
+ var __importDefault = (this && this.__importDefault) || function (mod) {
21
+ return (mod && mod.__esModule) ? mod : { "default": mod };
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.parseSamples = parseSamples;
25
+ exports.filterByCallType = filterByCallType;
26
+ exports.computeVerdict = computeVerdict;
27
+ exports.aggregate = aggregate;
28
+ exports.writeVerdict = writeVerdict;
29
+ exports.makeDryRunScorer = makeDryRunScorer;
30
+ exports.makeAnthropicScorer = makeAnthropicScorer;
31
+ exports.runJudge = runJudge;
32
+ const node_fs_1 = require("node:fs");
33
+ const node_path_1 = require("node:path");
34
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
35
+ const zod_1 = require("@anthropic-ai/sdk/helpers/zod");
36
+ const date_fns_1 = require("date-fns");
37
+ const telemetry_1 = require("../api/schemas/telemetry");
38
+ const config_1 = require("../config");
39
+ const schemas_1 = require("../lib/llm/schemas");
40
+ const logging_1 = require("../lib/logging");
41
+ const logger = (0, logging_1.getScriptLogger)("judge-llm-batch");
42
+ // ── defaults ──────────────────────────────────────────────────────────────────
43
+ const DEFAULT_OUT_DIR = "judge-out";
44
+ const DEFAULT_BATCH_INDEX = 0;
45
+ // ── pure core ─────────────────────────────────────────────────────────────────
46
+ /**
47
+ * Reads an NDJSON file and returns the lines parsed as LlmCallSample objects.
48
+ * Lines that fail JSON parsing or Zod validation are returned with
49
+ * parsedOk=false so they auto-fail schema adherence in the judge pass.
50
+ */
51
+ function parseSamples(ndjsonContent) {
52
+ const samples = [];
53
+ for (const raw of ndjsonContent.split("\n")) {
54
+ const line = raw.trim();
55
+ if (line.length === 0)
56
+ continue;
57
+ let parsed;
58
+ try {
59
+ parsed = JSON.parse(line);
60
+ }
61
+ catch {
62
+ samples.push(makeMalformedSample(line));
63
+ continue;
64
+ }
65
+ const result = telemetry_1.llmCallSampleSchema.safeParse(parsed);
66
+ if (!result.success) {
67
+ samples.push(makeMalformedSample(line));
68
+ continue;
69
+ }
70
+ samples.push(result.data);
71
+ }
72
+ return samples;
73
+ }
74
+ function makeMalformedSample(raw) {
75
+ return {
76
+ callId: `malformed-${raw.slice(0, 16)}`,
77
+ callType: "unknown",
78
+ model: "unknown",
79
+ systemPrompt: null,
80
+ userContent: raw.slice(0, 256),
81
+ responseContent: null,
82
+ parsedOk: false,
83
+ inputTokens: null,
84
+ outputTokens: null,
85
+ latencyMs: null,
86
+ success: false,
87
+ errorMessage: null,
88
+ failureKind: null,
89
+ ts: (0, date_fns_1.formatISO)(new Date()),
90
+ };
91
+ }
92
+ /**
93
+ * Filters samples to only those matching the requested callType.
94
+ */
95
+ function filterByCallType(samples, callType) {
96
+ return samples.filter((s) => s.callType === callType);
97
+ }
98
+ /**
99
+ * Derives a JudgeVerdictEntry from a sample and its score. Enforces the rule
100
+ * that parsedOk=false automatically fails schema adherence regardless of what
101
+ * the scorer returns.
102
+ */
103
+ function computeVerdict(sample, score) {
104
+ const schemaOk = sample.parsedOk ? score.schemaOk : false;
105
+ const schemaRationale = sample.parsedOk
106
+ ? score.schemaRationale
107
+ : "parsedOk=false: response could not be parsed as the expected schema";
108
+ const pass = schemaOk && score.factuallyGrounded && score.hallucinationFree;
109
+ return {
110
+ callId: sample.callId,
111
+ schemaOk,
112
+ schemaRationale,
113
+ factuallyGrounded: score.factuallyGrounded,
114
+ factualRationale: score.factualRationale,
115
+ hallucinationFree: score.hallucinationFree,
116
+ hallucinationRationale: score.hallucinationRationale,
117
+ ...(score.worstOffender !== undefined ? { worstOffender: score.worstOffender } : {}),
118
+ pass,
119
+ };
120
+ }
121
+ /**
122
+ * Computes aggregate counts over a set of verdict entries.
123
+ */
124
+ function aggregate(verdicts) {
125
+ const n = verdicts.length;
126
+ let schemaPass = 0;
127
+ let factualPass = 0;
128
+ let hallucinationFreePass = 0;
129
+ let overallPass = 0;
130
+ for (const v of verdicts) {
131
+ if (v.schemaOk)
132
+ schemaPass++;
133
+ if (v.factuallyGrounded)
134
+ factualPass++;
135
+ if (v.hallucinationFree)
136
+ hallucinationFreePass++;
137
+ if (v.pass)
138
+ overallPass++;
139
+ }
140
+ return { n, schemaPass, factualPass, hallucinationFreePass, overallPass };
141
+ }
142
+ /**
143
+ * Validates and writes the verdict object as JSON to the judge-out directory.
144
+ * Returns the written file path.
145
+ */
146
+ function writeVerdict(params) {
147
+ const { outDir, verdict } = params;
148
+ const parsed = telemetry_1.judgeVerdictSchema.safeParse(verdict);
149
+ if (!parsed.success) {
150
+ throw new Error(`verdict does not satisfy judgeVerdictSchema: ${parsed.error.message}`);
151
+ }
152
+ (0, node_fs_1.mkdirSync)(outDir, { recursive: true });
153
+ const fileName = `verdict-${verdict.callType}-${verdict.batchIndex}.json`;
154
+ const filePath = (0, node_path_1.join)(outDir, fileName);
155
+ (0, node_fs_1.writeFileSync)(filePath, JSON.stringify(verdict, null, 2));
156
+ return filePath;
157
+ }
158
+ // ── scorer implementations ────────────────────────────────────────────────────
159
+ /**
160
+ * Dry-run scorer: marks every dimension true with a placeholder rationale.
161
+ * Used in CI and tests to exercise the full pipeline without any API call.
162
+ */
163
+ function makeDryRunScorer() {
164
+ return async () => ({
165
+ schemaOk: true,
166
+ schemaRationale: "dry-run: schema adherence assumed",
167
+ factuallyGrounded: true,
168
+ factualRationale: "dry-run: factual grounding assumed",
169
+ hallucinationFree: true,
170
+ hallucinationRationale: "dry-run: hallucination-free assumed",
171
+ });
172
+ }
173
+ function anthropicModelName() {
174
+ const raw = config_1.config.scraper.model;
175
+ return raw.startsWith("anthropic/") ? raw.slice("anthropic/".length) : raw;
176
+ }
177
+ const SCORE_SYSTEM_PROMPT = `You are a quality judge for LLM call outputs. Evaluate each sample on three dimensions:
178
+
179
+ 1. SCHEMA_OK: Did the model's response match the expected output structure?
180
+ - true if responseContent is valid JSON that matches the callType's expected schema
181
+ - false if malformed, missing required fields, or has unexpected structure
182
+
183
+ 2. FACTUALLY_GROUNDED: Is the response factually grounded given the input?
184
+ - true if all factual claims in the response are consistent with the userContent context
185
+ - false if the response contradicts or ignores facts present in the userContent
186
+
187
+ 3. HALLUCINATION_FREE: Does the response avoid hallucinating content?
188
+ - true if the response contains no fabricated facts, URLs, entities, or values
189
+ - false if it invents information not implied by the prompt
190
+
191
+ Set worstOffender to one of "schema", "factual", or "hallucination" naming the worst-failing dimension, or null when all three pass. Each rationale is one short sentence.`;
192
+ /**
193
+ * Real LLM scorer: sends each sample to the Anthropic API for judgment.
194
+ * Defaults to the configured scraper model (respects STAGEHAND_MODEL env var)
195
+ * unless overridden by `judgeModel`.
196
+ */
197
+ function makeAnthropicScorer(client, judgeModel) {
198
+ const model = judgeModel ?? anthropicModelName();
199
+ return async (sample) => {
200
+ const userMessage = [
201
+ `callType: ${sample.callType}`,
202
+ `model: ${sample.model}`,
203
+ `parsedOk: ${sample.parsedOk}`,
204
+ `systemPrompt: ${sample.systemPrompt ?? "(none)"}`,
205
+ `userContent: ${sample.userContent}`,
206
+ `responseContent: ${sample.responseContent ?? "(null)"}`,
207
+ ].join("\n");
208
+ try {
209
+ const response = await client.messages.parse({
210
+ model,
211
+ max_tokens: 512,
212
+ system: SCORE_SYSTEM_PROMPT,
213
+ messages: [{ role: "user", content: userMessage }],
214
+ output_config: {
215
+ format: (0, zod_1.zodOutputFormat)(schemas_1.JUDGE_VERDICT_SCHEMA),
216
+ },
217
+ });
218
+ const parsed = response.parsed_output;
219
+ if (parsed === null) {
220
+ return fallbackScore("structured-output enabled but parsed_output is null");
221
+ }
222
+ return {
223
+ schemaOk: parsed.schemaOk,
224
+ schemaRationale: parsed.schemaRationale,
225
+ factuallyGrounded: parsed.factuallyGrounded,
226
+ factualRationale: parsed.factualRationale,
227
+ hallucinationFree: parsed.hallucinationFree,
228
+ hallucinationRationale: parsed.hallucinationRationale,
229
+ ...(typeof parsed.worstOffender === "string"
230
+ ? { worstOffender: parsed.worstOffender }
231
+ : {}),
232
+ };
233
+ }
234
+ catch (err) {
235
+ return fallbackScore(`API call threw an error: ${err instanceof Error ? err.message : String(err)}`);
236
+ }
237
+ };
238
+ }
239
+ function fallbackScore(reason) {
240
+ return {
241
+ schemaOk: false,
242
+ schemaRationale: `judge error: ${reason}`,
243
+ factuallyGrounded: false,
244
+ factualRationale: `judge error: ${reason}`,
245
+ hallucinationFree: false,
246
+ hallucinationRationale: `judge error: ${reason}`,
247
+ };
248
+ }
249
+ /**
250
+ * Drives the full parse → filter → score → aggregate → write pipeline for a
251
+ * single batch. Accepts an injectable `scorerFn` so tests exercise the full
252
+ * pipeline without any live model call.
253
+ */
254
+ async function runJudge(params) {
255
+ const { callsNdjsonPath, callType, batchIndex = DEFAULT_BATCH_INDEX, judgeModel, outDir = DEFAULT_OUT_DIR, dryRun = false, } = params;
256
+ let scorerFn = params.scorerFn;
257
+ if (!scorerFn) {
258
+ if (dryRun) {
259
+ scorerFn = makeDryRunScorer();
260
+ }
261
+ else {
262
+ if (!config_1.config.scraper.anthropicApiKey) {
263
+ throw new Error("judge:llm requires ANTHROPIC_API_KEY");
264
+ }
265
+ const client = new sdk_1.default({ apiKey: config_1.config.scraper.anthropicApiKey });
266
+ scorerFn = makeAnthropicScorer(client, judgeModel);
267
+ }
268
+ }
269
+ const resolvedJudgeModel = judgeModel ?? (dryRun ? "dry-run" : anthropicModelName());
270
+ logger.info(`judge-llm-batch: reading ${callsNdjsonPath}`);
271
+ let ndjsonContent;
272
+ try {
273
+ ndjsonContent = (0, node_fs_1.readFileSync)(callsNdjsonPath, "utf-8");
274
+ }
275
+ catch (err) {
276
+ throw new Error(`judge-llm-batch: cannot read ${callsNdjsonPath}: ${String(err)}`);
277
+ }
278
+ const allSamples = parseSamples(ndjsonContent);
279
+ logger.info(`judge-llm-batch: parsed ${allSamples.length} total samples`);
280
+ const samples = filterByCallType(allSamples, callType);
281
+ logger.info(`judge-llm-batch: ${samples.length} samples for callType="${callType}"`);
282
+ const verdicts = [];
283
+ for (const sample of samples) {
284
+ logger.info(`judge-llm-batch: scoring callId=${sample.callId}`);
285
+ const score = await scorerFn(sample);
286
+ const entry = computeVerdict(sample, score);
287
+ verdicts.push(entry);
288
+ logger.info(`judge-llm-batch: callId=${sample.callId} pass=${entry.pass} schema=${entry.schemaOk} factual=${entry.factuallyGrounded} halluc=${entry.hallucinationFree}`);
289
+ }
290
+ const agg = aggregate(verdicts);
291
+ logger.info(`judge-llm-batch: aggregate n=${agg.n} schemaPass=${agg.schemaPass} factualPass=${agg.factualPass} hallucinationFreePass=${agg.hallucinationFreePass} overallPass=${agg.overallPass}`);
292
+ const verdict = {
293
+ callType,
294
+ batchIndex,
295
+ judgedAt: (0, date_fns_1.formatISO)(new Date()),
296
+ judgeModel: resolvedJudgeModel,
297
+ verdicts,
298
+ aggregate: agg,
299
+ };
300
+ const verdictPath = writeVerdict({ outDir, verdict });
301
+ logger.info(`judge-llm-batch: verdict written to ${verdictPath}`);
302
+ return { verdictPath, verdict };
303
+ }
304
+ // ── CLI ───────────────────────────────────────────────────────────────────────
305
+ /**
306
+ * Parses CLI args and exits with a usage message when required args are absent.
307
+ */
308
+ function parseCli() {
309
+ const args = process.argv.slice(2);
310
+ let callsNdjsonPath = "";
311
+ let callType = "";
312
+ let batchIndex = DEFAULT_BATCH_INDEX;
313
+ let judgeModel;
314
+ let outDir = DEFAULT_OUT_DIR;
315
+ let dryRun = false;
316
+ for (let i = 0; i < args.length; i++) {
317
+ if (args[i] === "--calls-ndjson" && args[i + 1])
318
+ callsNdjsonPath = args[++i];
319
+ else if (args[i] === "--call-type" && args[i + 1])
320
+ callType = args[++i];
321
+ else if (args[i] === "--batch-index" && args[i + 1])
322
+ batchIndex = Number(args[++i]);
323
+ else if (args[i] === "--judge-model" && args[i + 1])
324
+ judgeModel = args[++i];
325
+ else if (args[i] === "--out-dir" && args[i + 1])
326
+ outDir = args[++i];
327
+ else if (args[i] === "--dry-run")
328
+ dryRun = true;
329
+ }
330
+ if (!callsNdjsonPath || !callType) {
331
+ logger.error("usage: judge-llm-batch.ts --calls-ndjson <path> --call-type <type> " +
332
+ "[--batch-index N] [--judge-model <model>] [--out-dir <path>] [--dry-run]");
333
+ process.exit(1);
334
+ }
335
+ return { callsNdjsonPath, callType, batchIndex, judgeModel, outDir, dryRun };
336
+ }
337
+ async function main() {
338
+ const cliArgs = parseCli();
339
+ const { verdictPath, verdict } = await runJudge(cliArgs);
340
+ logger.info(`judge-llm-batch complete: verdict written to ${verdictPath}`);
341
+ logger.info(`judge-llm-batch: n=${verdict.aggregate.n} overallPass=${verdict.aggregate.overallPass}`);
342
+ }
343
+ if (process.argv[1] !== undefined &&
344
+ (process.argv[1].endsWith("judge-llm-batch.ts") || process.argv[1].endsWith("judge-llm-batch.js"))) {
345
+ main().catch((err) => {
346
+ logger.error(`judge-llm-batch failed: ${String(err)}`);
347
+ process.exit(1);
348
+ });
349
+ }
350
+ //# sourceMappingURL=judge-llm-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-llm-batch.js","sourceRoot":"","sources":["../../src/scripts/judge-llm-batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * LLM prompt-template self-heal harness: given a judge verdict file containing
3
+ * failing samples for a callType, iterate — run a baseline pass rate, ask the
4
+ * patch generator to propose a minimal edit to the prompt template, replay the
5
+ * patched prompt against the captured user_content, score, and check convergence.
6
+ * Writes a healing-<callType>.md report for human review and manual apply.
7
+ * Production prompts in src/prompts/ are NEVER modified.
8
+ *
9
+ * Usage:
10
+ * pnpm heal:llm \
11
+ * --verdict-path judge-out/verdict-act-0.json \
12
+ * --call-type act
13
+ *
14
+ * Knobs (all optional):
15
+ * --max-iterations <N> default 5
16
+ * --n-replays <N> default 5
17
+ * --success-threshold <0..1> default 0.9
18
+ * --plateau-delta <0..1> default 0.03
19
+ * --plateau-window <N> default 3
20
+ * --out-dir <path> default llm-heal-out
21
+ * --judge-model <model> override the judge model
22
+ * --dry-run stubs the scorer (CI mode, no API calls)
23
+ */
24
+ import Anthropic from "@anthropic-ai/sdk";
25
+ import { type LlmCallSample } from "../api/schemas/telemetry";
26
+ import { buildAnthropicClient } from "../lib/llm/anthropic-client";
27
+ import { type LlmCallInput } from "../lib/telemetry/call-capture";
28
+ import { type ScorerFn } from "../scripts/judge-llm-batch";
29
+ import { type FlowPatch, type HealVerdict, type IterationRecord } from "../scripts/recon-heal";
30
+ /**
31
+ * Persistent state written after each iteration so the operator can inspect
32
+ * progress. Mirrors recon-heal's HealState but scoped to prompt-template arms.
33
+ */
34
+ export interface LlmHealState {
35
+ callType: string;
36
+ baselinePassRate: number;
37
+ history: IterationRecord[];
38
+ bestPassRate: number;
39
+ bestPatch: FlowPatch | null;
40
+ bestIterN: number;
41
+ }
42
+ /** Injectable replay runner — real or dry-run stub. */
43
+ export type ReplayFn = (params: {
44
+ samples: LlmCallSample[];
45
+ promptTemplate: string;
46
+ scorerFn: ScorerFn;
47
+ nReplays: number;
48
+ }) => Promise<{
49
+ passRate: number;
50
+ passCount: number;
51
+ failCount: number;
52
+ }>;
53
+ /** Injectable patch-request function for unit tests. */
54
+ export type RequestPromptPatchFn = (params: {
55
+ client: Anthropic;
56
+ callType: string;
57
+ promptTemplate: string;
58
+ failingSamples: LlmCallSample[];
59
+ iterN: number;
60
+ priorAttempts: Array<{
61
+ iter: number;
62
+ anchor: string;
63
+ replacement: string;
64
+ strategy: string;
65
+ outcome: "improved" | "no_change" | "regressed";
66
+ }>;
67
+ captureFn?: (input: LlmCallInput) => Promise<void>;
68
+ }) => Promise<FlowPatch | null>;
69
+ /** Parameters accepted by `phaseLlmHeal`. */
70
+ export interface LlmHealParams {
71
+ verdictPath: string;
72
+ callType: string;
73
+ maxIterations?: number;
74
+ nReplays?: number;
75
+ successThreshold?: number;
76
+ plateauDelta?: number;
77
+ plateauWindow?: number;
78
+ outDir?: string;
79
+ judgeModel?: string;
80
+ dryRun?: boolean;
81
+ replayFn?: ReplayFn;
82
+ requestPatchFn?: RequestPromptPatchFn;
83
+ scorerFn?: ScorerFn;
84
+ }
85
+ /** Return value of `phaseLlmHeal`. */
86
+ export interface LlmHealResult {
87
+ verdict: HealVerdict;
88
+ reportPath: string;
89
+ state: LlmHealState;
90
+ }
91
+ export { buildAnthropicClient };
92
+ /**
93
+ * Asks the model to propose a minimal patch to the prompt template, following
94
+ * the same anchor/replacement discipline as recon-flow-patch-generator but
95
+ * applied to a natural-language system or user prompt string.
96
+ */
97
+ export declare function requestPromptPatch(params: {
98
+ client: Anthropic;
99
+ callType: string;
100
+ promptTemplate: string;
101
+ failingSamples: LlmCallSample[];
102
+ iterN: number;
103
+ priorAttempts: Array<{
104
+ iter: number;
105
+ anchor: string;
106
+ replacement: string;
107
+ strategy: string;
108
+ outcome: "improved" | "no_change" | "regressed";
109
+ }>;
110
+ captureFn?: (input: LlmCallInput) => Promise<void>;
111
+ }): Promise<FlowPatch | null>;
112
+ /**
113
+ * Scores each failing sample with the given scorer, treating the patched
114
+ * prompt as the system prompt context. Repeats nReplays times per sample and
115
+ * averages the pass rate — accounts for LLM non-determinism on borderline cases.
116
+ */
117
+ export declare function replayPromptArm(params: {
118
+ samples: LlmCallSample[];
119
+ promptTemplate: string;
120
+ scorerFn: ScorerFn;
121
+ nReplays: number;
122
+ }): Promise<{
123
+ passRate: number;
124
+ passCount: number;
125
+ failCount: number;
126
+ }>;
127
+ /**
128
+ * Dry-run replay runner: marks every sample as passing without calling the
129
+ * scorer. Used in CI to verify the loop mechanics without any API calls.
130
+ */
131
+ export declare function makeDryRunReplayFn(passRate?: number): ReplayFn;
132
+ /**
133
+ * Writes the current heal state to llm-heal-out/<callType>/state.json so the
134
+ * operator can inspect progress across interruptions.
135
+ */
136
+ export declare function writeLlmHealState(outDir: string, callType: string, state: LlmHealState): void;
137
+ /**
138
+ * Persists per-iteration inputs and outputs for audit.
139
+ */
140
+ export declare function writeLlmIterationArtifacts(params: {
141
+ outDir: string;
142
+ callType: string;
143
+ iterN: number;
144
+ patch: FlowPatch | null;
145
+ patchedPrompt: string;
146
+ passRate: number;
147
+ passCount: number;
148
+ failCount: number;
149
+ }): void;
150
+ /**
151
+ * Writes the healing report markdown and returns its path.
152
+ */
153
+ export declare function writeLlmHealReport(params: {
154
+ outDir: string;
155
+ callType: string;
156
+ state: LlmHealState;
157
+ verdict: HealVerdict;
158
+ }): string;
159
+ /**
160
+ * Drives the full baseline → patch → replay → converge loop for a single
161
+ * callType's failing prompt. Accepts injectable `replayFn`, `requestPatchFn`,
162
+ * and `scorerFn` so tests can stub LLM calls and scoring.
163
+ */
164
+ export declare function phaseLlmHeal(params: LlmHealParams): Promise<LlmHealResult>;
165
+ //# sourceMappingURL=llm-heal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-heal.d.ts","sourceRoot":"","sources":["../../src/scripts/llm-heal.ts"],"names":[],"mappings":"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"}