@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,595 @@
1
+ "use strict";
2
+ /**
3
+ * LLM prompt-template self-heal harness: given a judge verdict file containing
4
+ * failing samples for a callType, iterate — run a baseline pass rate, ask the
5
+ * patch generator to propose a minimal edit to the prompt template, replay the
6
+ * patched prompt against the captured user_content, score, and check convergence.
7
+ * Writes a healing-<callType>.md report for human review and manual apply.
8
+ * Production prompts in src/prompts/ are NEVER modified.
9
+ *
10
+ * Usage:
11
+ * pnpm heal:llm \
12
+ * --verdict-path judge-out/verdict-act-0.json \
13
+ * --call-type act
14
+ *
15
+ * Knobs (all optional):
16
+ * --max-iterations <N> default 5
17
+ * --n-replays <N> default 5
18
+ * --success-threshold <0..1> default 0.9
19
+ * --plateau-delta <0..1> default 0.03
20
+ * --plateau-window <N> default 3
21
+ * --out-dir <path> default llm-heal-out
22
+ * --judge-model <model> override the judge model
23
+ * --dry-run stubs the scorer (CI mode, no API calls)
24
+ */
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.buildAnthropicClient = void 0;
30
+ exports.requestPromptPatch = requestPromptPatch;
31
+ exports.replayPromptArm = replayPromptArm;
32
+ exports.makeDryRunReplayFn = makeDryRunReplayFn;
33
+ exports.writeLlmHealState = writeLlmHealState;
34
+ exports.writeLlmIterationArtifacts = writeLlmIterationArtifacts;
35
+ exports.writeLlmHealReport = writeLlmHealReport;
36
+ exports.phaseLlmHeal = phaseLlmHeal;
37
+ const node_crypto_1 = require("node:crypto");
38
+ const node_fs_1 = require("node:fs");
39
+ const node_path_1 = require("node:path");
40
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
41
+ const zod_1 = require("@anthropic-ai/sdk/helpers/zod");
42
+ const date_fns_1 = require("date-fns");
43
+ const telemetry_1 = require("../api/schemas/telemetry");
44
+ const config_1 = require("../config");
45
+ const anthropic_client_1 = require("../lib/llm/anthropic-client");
46
+ Object.defineProperty(exports, "buildAnthropicClient", { enumerable: true, get: function () { return anthropic_client_1.buildAnthropicClient; } });
47
+ const schemas_1 = require("../lib/llm/schemas");
48
+ const logging_1 = require("../lib/logging");
49
+ const call_capture_1 = require("../lib/telemetry/call-capture");
50
+ const call_types_1 = require("../lib/telemetry/call-types");
51
+ const judge_llm_batch_1 = require("../scripts/judge-llm-batch");
52
+ const recon_heal_1 = require("../scripts/recon-heal");
53
+ const logger = (0, logging_1.getScriptLogger)("llm-heal");
54
+ // ── defaults ──────────────────────────────────────────────────────────────────
55
+ const DEFAULT_MAX_ITERATIONS = 5;
56
+ const DEFAULT_N_REPLAYS = 5;
57
+ const DEFAULT_SUCCESS_THRESHOLD = 0.9;
58
+ const DEFAULT_PLATEAU_DELTA = 0.03;
59
+ const DEFAULT_PLATEAU_WINDOW = 3;
60
+ const DEFAULT_OUT_DIR = "llm-heal-out";
61
+ function anthropicModelName(judgeModel) {
62
+ if (judgeModel)
63
+ return judgeModel;
64
+ const raw = config_1.config.scraper.model;
65
+ return raw.startsWith("anthropic/") ? raw.slice("anthropic/".length) : raw;
66
+ }
67
+ // ── patch generator ───────────────────────────────────────────────────────────
68
+ /**
69
+ * System prompt carrying the minimal-change patch discipline for prompt-
70
+ * template healing. Same shape as the recon-flow-patch system prompt but
71
+ * applied to a prompt template (string) instead of a step-array JSON.
72
+ */
73
+ const LLM_PATCH_SYSTEM_PROMPT = `You propose minimal patches to an LLM prompt template that has been failing judge review. Apply the minimise-change principle:
74
+ - The anchor must be a verbatim substring of the current prompt template; copy-paste it exactly.
75
+ - The replacement is the new text to substitute in place of the anchor.
76
+ - Prefer clarifying ambiguous instructions over rewriting clear ones.
77
+ - Add explicit output format constraints to reduce hallucination.
78
+ - Do not anchor on text that appears in multiple places unless intentional.
79
+ - Do not repeat a strategy already in PRIOR ITERATION HISTORY.
80
+ - If history shows no_change or regressed, pivot to a fundamentally different approach and explain in pivot_reason.`;
81
+ /**
82
+ * Asks the model to propose a minimal patch to the prompt template, following
83
+ * the same anchor/replacement discipline as recon-flow-patch-generator but
84
+ * applied to a natural-language system or user prompt string.
85
+ */
86
+ async function requestPromptPatch(params) {
87
+ const { client, callType, promptTemplate, failingSamples, iterN, priorAttempts, captureFn = call_capture_1.captureLlmCall, } = params;
88
+ const failingExamples = failingSamples
89
+ .slice(0, 3)
90
+ .map((s, i) => ` ${i + 1}. userContent: ${s.userContent.slice(0, 200)}\n responseContent: ${(s.responseContent ?? "(null)").slice(0, 200)}`)
91
+ .join("\n");
92
+ const historySection = priorAttempts.length > 0
93
+ ? priorAttempts
94
+ .map((a) => ` iter ${a.iter}: anchor="${a.anchor}" replacement="${a.replacement}" strategy="${a.strategy}" outcome=${a.outcome}`)
95
+ .join("\n")
96
+ : " (no prior attempts)";
97
+ const userContent = `This is iteration ${iterN} for callType="${callType}".
98
+
99
+ ## CURRENT PROMPT TEMPLATE
100
+ ${promptTemplate}
101
+
102
+ ## FAILING SAMPLE EXAMPLES (up to 3)
103
+ ${failingExamples}
104
+
105
+ ## PRIOR ITERATION HISTORY
106
+ ${historySection}
107
+
108
+ Propose a patch to exactly ONE part of the prompt template. Set pivot_reason to null on the first iteration; otherwise set it to one sentence explaining the pivot from the last failed attempt.`;
109
+ const model = anthropicModelName();
110
+ const t0 = performance.now();
111
+ try {
112
+ const response = await client.messages.parse({
113
+ model,
114
+ max_tokens: 500,
115
+ system: LLM_PATCH_SYSTEM_PROMPT,
116
+ messages: [{ role: "user", content: userContent }],
117
+ output_config: {
118
+ format: (0, zod_1.zodOutputFormat)(schemas_1.PATCH_RESPONSE_SCHEMA),
119
+ },
120
+ });
121
+ const latencyMs = performance.now() - t0;
122
+ const parsed = response.parsed_output;
123
+ if (parsed === null) {
124
+ throw new Error("structured-output enabled but parsed_output is null");
125
+ }
126
+ const textBlock = response.content.find((b) => b.type === "text");
127
+ const rawText = textBlock?.type === "text" ? textBlock.text : "";
128
+ const patch = {
129
+ anchor: parsed.anchor,
130
+ replacement: parsed.replacement,
131
+ strategy: parsed.strategy,
132
+ pivot_reason: parsed.pivot_reason,
133
+ };
134
+ if (!promptTemplate.includes(patch.anchor)) {
135
+ logger.warn(`llm-heal: patch anchor not found in prompt template: "${patch.anchor}"`);
136
+ await captureFn({
137
+ callId: (0, node_crypto_1.randomUUID)(),
138
+ callType: call_types_1.CALL_TYPE_LLM_PROMPT_PATCH,
139
+ model,
140
+ systemPrompt: LLM_PATCH_SYSTEM_PROMPT,
141
+ userContent,
142
+ responseContent: rawText,
143
+ parsedOk: false,
144
+ inputTokens: response.usage?.input_tokens ?? null,
145
+ outputTokens: response.usage?.output_tokens ?? null,
146
+ latencyMs,
147
+ success: false,
148
+ errorMessage: `patch anchor not found in prompt template: ${patch.anchor.slice(0, 80)}`,
149
+ failureKind: "schema-validation-failed",
150
+ });
151
+ return null;
152
+ }
153
+ await captureFn({
154
+ callId: (0, node_crypto_1.randomUUID)(),
155
+ callType: call_types_1.CALL_TYPE_LLM_PROMPT_PATCH,
156
+ model,
157
+ systemPrompt: LLM_PATCH_SYSTEM_PROMPT,
158
+ userContent,
159
+ responseContent: rawText,
160
+ parsedOk: true,
161
+ inputTokens: response.usage?.input_tokens ?? null,
162
+ outputTokens: response.usage?.output_tokens ?? null,
163
+ latencyMs,
164
+ success: true,
165
+ errorMessage: null,
166
+ failureKind: null,
167
+ });
168
+ return patch;
169
+ }
170
+ catch (err) {
171
+ await captureFn({
172
+ callId: (0, node_crypto_1.randomUUID)(),
173
+ callType: call_types_1.CALL_TYPE_LLM_PROMPT_PATCH,
174
+ model,
175
+ systemPrompt: LLM_PATCH_SYSTEM_PROMPT,
176
+ userContent,
177
+ responseContent: null,
178
+ parsedOk: false,
179
+ inputTokens: null,
180
+ outputTokens: null,
181
+ latencyMs: performance.now() - t0,
182
+ success: false,
183
+ errorMessage: err instanceof Error ? err.message : String(err),
184
+ failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
185
+ });
186
+ return null;
187
+ }
188
+ }
189
+ // ── replay runner ─────────────────────────────────────────────────────────────
190
+ /**
191
+ * Scores each failing sample with the given scorer, treating the patched
192
+ * prompt as the system prompt context. Repeats nReplays times per sample and
193
+ * averages the pass rate — accounts for LLM non-determinism on borderline cases.
194
+ */
195
+ async function replayPromptArm(params) {
196
+ const { samples, promptTemplate, scorerFn, nReplays } = params;
197
+ if (samples.length === 0) {
198
+ return { passRate: 0, passCount: 0, failCount: 0 };
199
+ }
200
+ let totalPass = 0;
201
+ let totalFail = 0;
202
+ for (const sample of samples) {
203
+ const patchedSample = {
204
+ ...sample,
205
+ systemPrompt: promptTemplate,
206
+ };
207
+ for (let r = 0; r < nReplays; r++) {
208
+ const score = await scorerFn(patchedSample);
209
+ const pass = score.schemaOk && score.factuallyGrounded && score.hallucinationFree;
210
+ if (pass) {
211
+ totalPass++;
212
+ }
213
+ else {
214
+ totalFail++;
215
+ }
216
+ }
217
+ }
218
+ const total = totalPass + totalFail;
219
+ return {
220
+ passRate: total > 0 ? totalPass / total : 0,
221
+ passCount: totalPass,
222
+ failCount: totalFail,
223
+ };
224
+ }
225
+ /**
226
+ * Dry-run replay runner: marks every sample as passing without calling the
227
+ * scorer. Used in CI to verify the loop mechanics without any API calls.
228
+ */
229
+ function makeDryRunReplayFn(passRate = 1.0) {
230
+ return async ({ samples, nReplays, }) => {
231
+ const total = samples.length * nReplays;
232
+ const passCount = Math.round(total * passRate);
233
+ const failCount = total - passCount;
234
+ return { passRate: total > 0 ? passCount / total : 0, passCount, failCount };
235
+ };
236
+ }
237
+ // ── state persistence ─────────────────────────────────────────────────────────
238
+ /**
239
+ * Writes the current heal state to llm-heal-out/<callType>/state.json so the
240
+ * operator can inspect progress across interruptions.
241
+ */
242
+ function writeLlmHealState(outDir, callType, state) {
243
+ const dir = (0, node_path_1.join)(outDir, callType);
244
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
245
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "state.json"), JSON.stringify(state, null, 2));
246
+ }
247
+ /**
248
+ * Persists per-iteration inputs and outputs for audit.
249
+ */
250
+ function writeLlmIterationArtifacts(params) {
251
+ const { outDir, callType, iterN, patch, patchedPrompt, passRate, passCount, failCount } = params;
252
+ const dir = (0, node_path_1.join)(outDir, callType, `iter-${iterN}`);
253
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
254
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "patch-response.json"), JSON.stringify(patch, null, 2));
255
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "patched-prompt.txt"), patchedPrompt);
256
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "scores.json"), JSON.stringify({ iterN, passRate, passCount, failCount }, null, 2));
257
+ }
258
+ // ── report ────────────────────────────────────────────────────────────────────
259
+ /**
260
+ * Writes the healing report markdown and returns its path.
261
+ */
262
+ function writeLlmHealReport(params) {
263
+ const { outDir, callType, state, verdict } = params;
264
+ const dir = (0, node_path_1.join)(outDir, callType);
265
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
266
+ const historyRows = [
267
+ `| iter | pass_rate | delta |`,
268
+ `|------|-----------|-------|`,
269
+ `| 0 (baseline) | ${(state.baselinePassRate * 100).toFixed(0)}% | — |`,
270
+ ...state.history.map((h, idx) => {
271
+ const prev = idx === 0 ? state.baselinePassRate : state.history[idx - 1].passRate;
272
+ const delta = h.passRate - prev;
273
+ const deltaStr = `${(delta >= 0 ? "+" : "") + (delta * 100).toFixed(0)}%`;
274
+ return `| ${h.iterN} | ${(h.passRate * 100).toFixed(0)}% | ${deltaStr} |`;
275
+ }),
276
+ ].join("\n");
277
+ const bestPatchBlock = state.bestPatch !== null
278
+ ? [
279
+ `**Anchor:**`,
280
+ `\`\`\``,
281
+ state.bestPatch.anchor,
282
+ `\`\`\``,
283
+ ``,
284
+ `**Replacement:**`,
285
+ `\`\`\``,
286
+ state.bestPatch.replacement,
287
+ `\`\`\``,
288
+ ``,
289
+ `**Strategy:** ${state.bestPatch.strategy}`,
290
+ ].join("\n")
291
+ : "(no patch improved the baseline)";
292
+ const report = [
293
+ `# Heal report: ${callType}`,
294
+ ``,
295
+ `**Verdict:** ${verdict}`,
296
+ `**Iterations run:** ${state.history.length}`,
297
+ `**Baseline pass rate:** ${(state.baselinePassRate * 100).toFixed(0)}%`,
298
+ `**Best pass rate:** ${(state.bestPassRate * 100).toFixed(0)}% (iter ${state.bestIterN})`,
299
+ ``,
300
+ `## Best patch`,
301
+ ``,
302
+ bestPatchBlock,
303
+ ``,
304
+ `## Iteration history`,
305
+ ``,
306
+ historyRows,
307
+ ``,
308
+ `---`,
309
+ `_Generated by llm-heal at ${(0, date_fns_1.formatISO)(new Date())}_`,
310
+ `_Production prompt templates were NOT modified. Apply the patch above manually after review._`,
311
+ ].join("\n");
312
+ const reportPath = (0, node_path_1.join)(dir, `healing-${callType}.md`);
313
+ (0, node_fs_1.writeFileSync)(reportPath, report);
314
+ return reportPath;
315
+ }
316
+ // ── main heal loop ────────────────────────────────────────────────────────────
317
+ /**
318
+ * Drives the full baseline → patch → replay → converge loop for a single
319
+ * callType's failing prompt. Accepts injectable `replayFn`, `requestPatchFn`,
320
+ * and `scorerFn` so tests can stub LLM calls and scoring.
321
+ */
322
+ async function phaseLlmHeal(params) {
323
+ const { verdictPath, callType, maxIterations = DEFAULT_MAX_ITERATIONS, nReplays = DEFAULT_N_REPLAYS, successThreshold = DEFAULT_SUCCESS_THRESHOLD, plateauDelta = DEFAULT_PLATEAU_DELTA, plateauWindow = DEFAULT_PLATEAU_WINDOW, outDir = DEFAULT_OUT_DIR, judgeModel, dryRun = false, } = params;
324
+ // ── load verdict ────────────────────────────────────────────────────────────
325
+ logger.info(`llm-heal: loading verdict from ${verdictPath}`);
326
+ let rawVerdict;
327
+ try {
328
+ rawVerdict = JSON.parse((0, node_fs_1.readFileSync)(verdictPath, "utf-8"));
329
+ }
330
+ catch (err) {
331
+ throw new Error(`llm-heal: cannot read verdict file: ${String(err)}`);
332
+ }
333
+ const verdictResult = telemetry_1.judgeVerdictSchema.safeParse(rawVerdict);
334
+ if (!verdictResult.success) {
335
+ throw new Error(`llm-heal: verdict file does not satisfy judgeVerdictSchema: ${verdictResult.error.message}`);
336
+ }
337
+ const judgeVerdictData = verdictResult.data;
338
+ // Extract failing samples from the verdict. The verdict contains entries but
339
+ // not the original call content — the samples come from the verdict's callId
340
+ // references. Since we have pass/fail entries, we reconstruct minimal samples
341
+ // from the verdict data for prompt replay scoring.
342
+ const failingCallIds = new Set(judgeVerdictData.verdicts.filter((v) => !v.pass).map((v) => v.callId));
343
+ logger.info(`llm-heal: callType=${callType} total=${judgeVerdictData.verdicts.length} failing=${failingCallIds.size}`);
344
+ if (failingCallIds.size === 0) {
345
+ logger.info("llm-heal: no failing samples — nothing to heal, exiting SUCCESS");
346
+ const state = {
347
+ callType,
348
+ baselinePassRate: 1.0,
349
+ history: [],
350
+ bestPassRate: 1.0,
351
+ bestPatch: null,
352
+ bestIterN: 0,
353
+ };
354
+ const reportPath = writeLlmHealReport({ outDir, callType, state, verdict: "SUCCESS" });
355
+ return { verdict: "SUCCESS", reportPath, state };
356
+ }
357
+ // Build minimal LlmCallSample objects from the verdict entries so the scorer
358
+ // can evaluate them with a patched prompt template substituted as systemPrompt.
359
+ const failingSamples = judgeVerdictData.verdicts
360
+ .filter((v) => !v.pass)
361
+ .map((v) => ({
362
+ callId: v.callId,
363
+ callType,
364
+ model: judgeVerdictData.judgeModel,
365
+ systemPrompt: null,
366
+ userContent: v.worstOffender ?? `callId=${v.callId} failed: ${v.schemaRationale}`,
367
+ responseContent: null,
368
+ parsedOk: false,
369
+ inputTokens: null,
370
+ outputTokens: null,
371
+ latencyMs: null,
372
+ success: false,
373
+ errorMessage: null,
374
+ failureKind: null,
375
+ ts: judgeVerdictData.judgedAt,
376
+ }));
377
+ // ── scorer setup ────────────────────────────────────────────────────────────
378
+ let resolvedScorerFn;
379
+ if (params.scorerFn) {
380
+ resolvedScorerFn = params.scorerFn;
381
+ }
382
+ else if (dryRun) {
383
+ resolvedScorerFn = (0, judge_llm_batch_1.makeDryRunScorer)();
384
+ }
385
+ else {
386
+ if (!config_1.config.scraper.anthropicApiKey) {
387
+ throw new Error("llm-heal requires ANTHROPIC_API_KEY");
388
+ }
389
+ const client = new sdk_1.default({ apiKey: config_1.config.scraper.anthropicApiKey });
390
+ resolvedScorerFn = (0, judge_llm_batch_1.makeAnthropicScorer)(client, judgeModel);
391
+ }
392
+ // ── replay fn setup ─────────────────────────────────────────────────────────
393
+ const replayFn = params.replayFn ?? replayPromptArm;
394
+ // ── patch fn setup ──────────────────────────────────────────────────────────
395
+ // Determine the Anthropic client for the patch generator. Not needed when
396
+ // a requestPatchFn is injected (tests) or in dry-run without injection.
397
+ let patchClient = null;
398
+ if (!params.requestPatchFn && !dryRun) {
399
+ patchClient = (0, anthropic_client_1.buildAnthropicClient)();
400
+ if (!patchClient) {
401
+ throw new Error("llm-heal requires ANTHROPIC_API_KEY — Bedrock-only deployments are not supported");
402
+ }
403
+ }
404
+ const resolvedRequestPatchFn = params.requestPatchFn ?? requestPromptPatch;
405
+ // The "prompt template" being healed is the verdict's judgeModel info combined
406
+ // with the callType. In practice, callers inject the prompt template; when not
407
+ // injected we synthesise a representative template from the failing rationales.
408
+ // The anchor/replacement mechanism still applies: the healer proposes patches
409
+ // to the text of this template string.
410
+ const initialPromptTemplate = [
411
+ `You are evaluating callType=${callType} responses.`,
412
+ `Judge each response on schema adherence, factual grounding, and hallucination-freeness.`,
413
+ `Return structured JSON with pass/fail verdicts.`,
414
+ ].join("\n");
415
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(outDir, callType), { recursive: true });
416
+ // ── baseline ────────────────────────────────────────────────────────────────
417
+ logger.info(`llm-heal: baseline (n_replays=${nReplays})`);
418
+ const baselineResult = await replayFn({
419
+ samples: failingSamples,
420
+ promptTemplate: initialPromptTemplate,
421
+ scorerFn: resolvedScorerFn,
422
+ nReplays,
423
+ });
424
+ const baselinePassRate = baselineResult.passRate;
425
+ logger.info(`llm-heal: baseline pass_rate=${(baselinePassRate * 100).toFixed(0)}%`);
426
+ const state = {
427
+ callType,
428
+ baselinePassRate,
429
+ history: [],
430
+ bestPassRate: baselinePassRate,
431
+ bestPatch: null,
432
+ bestIterN: 0,
433
+ };
434
+ writeLlmHealState(outDir, callType, state);
435
+ if (baselinePassRate >= successThreshold) {
436
+ logger.info("llm-heal: baseline already meets threshold — exiting SUCCESS");
437
+ const reportPath = writeLlmHealReport({ outDir, callType, state, verdict: "SUCCESS" });
438
+ return { verdict: "SUCCESS", reportPath, state };
439
+ }
440
+ // ── iteration loop ──────────────────────────────────────────────────────────
441
+ let currentPromptTemplate = initialPromptTemplate;
442
+ const priorAttempts = [];
443
+ let convergeResult = "CONTINUE";
444
+ while (convergeResult === "CONTINUE") {
445
+ const iterN = state.history.length + 1;
446
+ logger.info(`llm-heal: iteration ${iterN}/${maxIterations}`);
447
+ // When in dry-run with no injected patch fn, there is no Anthropic client —
448
+ // skip patch generation so the loop converges to BUDGET_EXHAUSTED.
449
+ if (!patchClient && !params.requestPatchFn) {
450
+ logger.warn(`llm-heal: iter ${iterN} — dry-run with no injected patch fn, stopping`);
451
+ convergeResult = "BUDGET_EXHAUSTED";
452
+ break;
453
+ }
454
+ const patch = await resolvedRequestPatchFn({
455
+ client: patchClient,
456
+ callType,
457
+ promptTemplate: currentPromptTemplate,
458
+ failingSamples,
459
+ iterN,
460
+ priorAttempts,
461
+ });
462
+ if (!patch) {
463
+ logger.warn(`llm-heal: iter ${iterN} — patch generator returned null, stopping`);
464
+ convergeResult = "BUDGET_EXHAUSTED";
465
+ break;
466
+ }
467
+ const patchedPrompt = (0, recon_heal_1.applyPatch)([currentPromptTemplate], patch)[0] ?? currentPromptTemplate;
468
+ const armResult = await replayFn({
469
+ samples: failingSamples,
470
+ promptTemplate: patchedPrompt,
471
+ scorerFn: resolvedScorerFn,
472
+ nReplays,
473
+ });
474
+ const passRate = armResult.passRate;
475
+ const prevBest = state.bestPassRate;
476
+ const record = { iterN, passRate, patch };
477
+ state.history.push(record);
478
+ if (passRate > state.bestPassRate) {
479
+ state.bestPassRate = passRate;
480
+ state.bestPatch = patch;
481
+ state.bestIterN = iterN;
482
+ currentPromptTemplate = patchedPrompt;
483
+ }
484
+ const outcome = passRate > prevBest + plateauDelta
485
+ ? "improved"
486
+ : passRate < prevBest - plateauDelta
487
+ ? "regressed"
488
+ : "no_change";
489
+ priorAttempts.push({
490
+ iter: iterN,
491
+ anchor: patch.anchor,
492
+ replacement: patch.replacement,
493
+ strategy: patch.strategy,
494
+ outcome,
495
+ });
496
+ writeLlmIterationArtifacts({
497
+ outDir,
498
+ callType,
499
+ iterN,
500
+ patch,
501
+ patchedPrompt,
502
+ passRate,
503
+ passCount: armResult.passCount,
504
+ failCount: armResult.failCount,
505
+ });
506
+ writeLlmHealState(outDir, callType, state);
507
+ logger.info(`llm-heal: iter ${iterN} pass_rate=${(passRate * 100).toFixed(0)}% ` +
508
+ `best=${(state.bestPassRate * 100).toFixed(0)}% outcome=${outcome}`);
509
+ convergeResult = (0, recon_heal_1.checkConvergence)({
510
+ history: state.history,
511
+ bestPassRate: state.bestPassRate,
512
+ maxIterations,
513
+ successThreshold,
514
+ plateauDelta,
515
+ plateauWindow,
516
+ });
517
+ }
518
+ const finalVerdict = convergeResult;
519
+ const reportPath = writeLlmHealReport({ outDir, callType, state, verdict: finalVerdict });
520
+ logger.info(`llm-heal: verdict=${finalVerdict} report=${reportPath}`);
521
+ return { verdict: finalVerdict, reportPath, state };
522
+ }
523
+ // ── CLI ───────────────────────────────────────────────────────────────────────
524
+ /**
525
+ * Parses CLI args and exits with a usage message when required args are absent.
526
+ */
527
+ function parseCli() {
528
+ const args = process.argv.slice(2);
529
+ let verdictPath = "";
530
+ let callType = "";
531
+ let maxIterations = DEFAULT_MAX_ITERATIONS;
532
+ let nReplays = DEFAULT_N_REPLAYS;
533
+ let successThreshold = DEFAULT_SUCCESS_THRESHOLD;
534
+ let plateauDelta = DEFAULT_PLATEAU_DELTA;
535
+ let plateauWindow = DEFAULT_PLATEAU_WINDOW;
536
+ let outDir = DEFAULT_OUT_DIR;
537
+ let judgeModel;
538
+ let dryRun = false;
539
+ for (let i = 0; i < args.length; i++) {
540
+ if (args[i] === "--verdict-path" && args[i + 1])
541
+ verdictPath = args[++i];
542
+ else if (args[i] === "--call-type" && args[i + 1])
543
+ callType = args[++i];
544
+ else if (args[i] === "--max-iterations" && args[i + 1])
545
+ maxIterations = Number(args[++i]);
546
+ else if (args[i] === "--n-replays" && args[i + 1])
547
+ nReplays = Number(args[++i]);
548
+ else if (args[i] === "--success-threshold" && args[i + 1])
549
+ successThreshold = Number(args[++i]);
550
+ else if (args[i] === "--plateau-delta" && args[i + 1])
551
+ plateauDelta = Number(args[++i]);
552
+ else if (args[i] === "--plateau-window" && args[i + 1])
553
+ plateauWindow = Number(args[++i]);
554
+ else if (args[i] === "--out-dir" && args[i + 1])
555
+ outDir = args[++i];
556
+ else if (args[i] === "--judge-model" && args[i + 1])
557
+ judgeModel = args[++i];
558
+ else if (args[i] === "--dry-run")
559
+ dryRun = true;
560
+ }
561
+ if (!verdictPath || !callType) {
562
+ logger.error("usage: llm-heal.ts --verdict-path <path> --call-type <type> " +
563
+ "[--max-iterations N] [--n-replays N] [--success-threshold 0..1] " +
564
+ "[--plateau-delta 0..1] [--plateau-window N] [--out-dir <path>] " +
565
+ "[--judge-model <model>] [--dry-run]");
566
+ process.exit(1);
567
+ }
568
+ return {
569
+ verdictPath,
570
+ callType,
571
+ maxIterations,
572
+ nReplays,
573
+ successThreshold,
574
+ plateauDelta,
575
+ plateauWindow,
576
+ outDir,
577
+ judgeModel,
578
+ dryRun,
579
+ };
580
+ }
581
+ async function main() {
582
+ const cliArgs = parseCli();
583
+ const { verdict, reportPath, state } = await phaseLlmHeal(cliArgs);
584
+ logger.info(`llm-heal complete: verdict=${verdict}`);
585
+ logger.info(`llm-heal: best_pass_rate=${(state.bestPassRate * 100).toFixed(0)}%`);
586
+ logger.info(`llm-heal: report written to ${reportPath}`);
587
+ }
588
+ if (process.argv[1] !== undefined &&
589
+ (process.argv[1].endsWith("llm-heal.ts") || process.argv[1].endsWith("llm-heal.js"))) {
590
+ main().catch((err) => {
591
+ logger.error(`llm-heal failed: ${String(err)}`);
592
+ process.exit(1);
593
+ });
594
+ }
595
+ //# sourceMappingURL=llm-heal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-heal.js","sourceRoot":"","sources":["../../src/scripts/llm-heal.ts"],"names":[],"mappings":"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"}