@tangle-network/agent-eval 0.215.1 → 0.216.1

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 (400) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/adapters/http.d.ts +3 -3
  3. package/dist/{agent-profile-DmzL8KaJ.d.ts → agent-profile-VFcQncbW.d.ts} +5 -5
  4. package/dist/{agent-profile-DmzL8KaJ.d.ts.map → agent-profile-VFcQncbW.d.ts.map} +1 -1
  5. package/dist/{agent-profile-cell-BYc0bxsL.js → agent-profile-cell-BK8mlqlq.js} +3 -3
  6. package/dist/{agent-profile-cell-BYc0bxsL.js.map → agent-profile-cell-BK8mlqlq.js.map} +1 -1
  7. package/dist/agreement-irr-BEWLIF3_.js +186 -0
  8. package/dist/agreement-irr-BEWLIF3_.js.map +1 -0
  9. package/dist/analyst/index.d.ts +487 -14
  10. package/dist/analyst/index.d.ts.map +1 -1
  11. package/dist/analyst/index.js +1547 -12
  12. package/dist/analyst/index.js.map +1 -1
  13. package/dist/{analyze-runs-3xpby3p2.js → analyze-runs-C84irm4i.js} +608 -604
  14. package/dist/analyze-runs-C84irm4i.js.map +1 -0
  15. package/dist/{analyze-runs-BhFLOztS.d.ts → analyze-runs-D68fd-su.d.ts} +17 -15
  16. package/dist/analyze-runs-D68fd-su.d.ts.map +1 -0
  17. package/dist/{baseline-Dm8966du.js → baseline-Udi_PLuT.js} +5 -5
  18. package/dist/{baseline-Dm8966du.js.map → baseline-Udi_PLuT.js.map} +1 -1
  19. package/dist/{benchmark-BywPeAUo.js → benchmark-CXmVVHH2.js} +2 -2
  20. package/dist/{benchmark-BywPeAUo.js.map → benchmark-CXmVVHH2.js.map} +1 -1
  21. package/dist/{benchmark-command-CgpGi7vY.js → benchmark-command-By0vh8q7.js} +71 -70
  22. package/dist/benchmark-command-By0vh8q7.js.map +1 -0
  23. package/dist/benchmarks/index.d.ts +5 -5
  24. package/dist/benchmarks/index.js +3 -3
  25. package/dist/builder-eval/index.js +2 -2
  26. package/dist/campaign/index.d.ts +7 -7
  27. package/dist/campaign/index.js +14 -14
  28. package/dist/{campaign-CpnsCgfz.js → campaign-BudZ70zo.js} +245 -247
  29. package/dist/campaign-BudZ70zo.js.map +1 -0
  30. package/dist/{campaign-evidence-OcUciD-N.js → campaign-evidence-Clrn4hBV.js} +8 -8
  31. package/dist/campaign-evidence-Clrn4hBV.js.map +1 -0
  32. package/dist/{canonical-BsZVgBhW.js → canonical-B2RqLofv.js} +2 -2
  33. package/dist/{canonical-BsZVgBhW.js.map → canonical-B2RqLofv.js.map} +1 -1
  34. package/dist/{chat-client-DthPOYGd.js → chat-client-l-MVDlDk.js} +2 -2
  35. package/dist/{chat-client-DthPOYGd.js.map → chat-client-l-MVDlDk.js.map} +1 -1
  36. package/dist/{chat-json-call-BrKsyspg.js → chat-json-call-puMArmtW.js} +2 -2
  37. package/dist/{chat-json-call-BrKsyspg.js.map → chat-json-call-puMArmtW.js.map} +1 -1
  38. package/dist/{claim-BXcZw-jo.js → claim-q4HQhK1G.js} +4 -4
  39. package/dist/claim-q4HQhK1G.js.map +1 -0
  40. package/dist/cli.js +9 -9
  41. package/dist/cli.js.map +1 -1
  42. package/dist/cluster-bootstrap-qcUWYFl-.js +66 -0
  43. package/dist/cluster-bootstrap-qcUWYFl-.js.map +1 -0
  44. package/dist/contract/index.d.ts +11 -11
  45. package/dist/contract/index.js +1023 -1079
  46. package/dist/contract/index.js.map +1 -1
  47. package/dist/{cost-ledger-D2FnJPBF.js → cost-ledger-BP8V4kUQ.js} +835 -816
  48. package/dist/cost-ledger-BP8V4kUQ.js.map +1 -0
  49. package/dist/{cost-ledger-CO7UyEcQ.d.ts → cost-ledger-Jk62OBfF.d.ts} +12 -47
  50. package/dist/cost-ledger-Jk62OBfF.d.ts.map +1 -0
  51. package/dist/{counterfactual-DtMWvn7D.js → counterfactual-Dn3veueY.js} +2 -2
  52. package/dist/{counterfactual-DtMWvn7D.js.map → counterfactual-Dn3veueY.js.map} +1 -1
  53. package/dist/{default-registry-KP4-Tolz.js → default-registry-COhk9g36.js} +744 -759
  54. package/dist/default-registry-COhk9g36.js.map +1 -0
  55. package/dist/{default-registry-B4B7GMvI.d.ts → default-registry-DzHiGruW.d.ts} +6 -6
  56. package/dist/{default-registry-B4B7GMvI.d.ts.map → default-registry-DzHiGruW.d.ts.map} +1 -1
  57. package/dist/{define-agent-eval-BdfnqXeP.js → define-agent-eval-CNTPzIkp.js} +10 -10
  58. package/dist/define-agent-eval-CNTPzIkp.js.map +1 -0
  59. package/dist/{define-agent-eval-DfXvNho5.d.ts → define-agent-eval-WSck0CZJ.d.ts} +8 -8
  60. package/dist/{define-agent-eval-DfXvNho5.d.ts.map → define-agent-eval-WSck0CZJ.d.ts.map} +1 -1
  61. package/dist/{descriptive-CnU8Yq29.js → descriptive-DboxPZrG.js} +2 -2
  62. package/dist/{descriptive-CnU8Yq29.js.map → descriptive-DboxPZrG.js.map} +1 -1
  63. package/dist/diagnosis/index.d.ts +3 -3
  64. package/dist/diagnosis/index.js +4 -4
  65. package/dist/{dspy-rlm-engine-DZfHM7kT.js → dspy-rlm-engine-LRCu61m5.js} +3 -3
  66. package/dist/{dspy-rlm-engine-DZfHM7kT.js.map → dspy-rlm-engine-LRCu61m5.js.map} +1 -1
  67. package/dist/{effect-sizes-DiH8MGOH.js → effect-sizes-BhzEpXMc.js} +2 -2
  68. package/dist/{effect-sizes-DiH8MGOH.js.map → effect-sizes-BhzEpXMc.js.map} +1 -1
  69. package/dist/{engine-C37HS2kr.d.ts → engine-3A_4jOlI.d.ts} +5 -5
  70. package/dist/{engine-C37HS2kr.d.ts.map → engine-3A_4jOlI.d.ts.map} +1 -1
  71. package/dist/{equal-terms-Blx9Zk5I.js → equal-terms-BtdXayCJ.js} +2 -2
  72. package/dist/{equal-terms-Blx9Zk5I.js.map → equal-terms-BtdXayCJ.js.map} +1 -1
  73. package/dist/{errors-Dngq5h35.js → errors-DVZiqS7K.js} +6 -2
  74. package/dist/{errors-Dngq5h35.js.map → errors-DVZiqS7K.js.map} +1 -1
  75. package/dist/{eval-campaign-4byTtqrf.js → eval-campaign-90jeaCAI.js} +6 -6
  76. package/dist/{eval-campaign-4byTtqrf.js.map → eval-campaign-90jeaCAI.js.map} +1 -1
  77. package/dist/evaluation-6Yoi74gM.d.ts +75 -0
  78. package/dist/evaluation-6Yoi74gM.d.ts.map +1 -0
  79. package/dist/evaluation.d.ts +2 -74
  80. package/dist/evaluation.js +1 -1
  81. package/dist/{exact-types-Dlb73wN4.d.ts → exact-types-ClugMJfI.d.ts} +2 -2
  82. package/dist/{exact-types-Dlb73wN4.d.ts.map → exact-types-ClugMJfI.d.ts.map} +1 -1
  83. package/dist/experiment/index.d.ts +404 -3
  84. package/dist/experiment/index.d.ts.map +1 -1
  85. package/dist/experiment/index.js +313 -19
  86. package/dist/experiment/index.js.map +1 -1
  87. package/dist/{external-optimizer-process-GngofQML.js → external-optimizer-process-BjMGUuds.js} +3 -3
  88. package/dist/{external-optimizer-process-GngofQML.js.map → external-optimizer-process-BjMGUuds.js.map} +1 -1
  89. package/dist/{external-optimizer-subprocess-BUxifb8g.js → external-optimizer-subprocess-BqW0hHcI.js} +791 -532
  90. package/dist/external-optimizer-subprocess-BqW0hHcI.js.map +1 -0
  91. package/dist/{feedback-trajectory-BLN_6fEs.d.ts → feedback-trajectory-C4EG0nNH.d.ts} +5 -8
  92. package/dist/feedback-trajectory-C4EG0nNH.d.ts.map +1 -0
  93. package/dist/fuzz.d.ts +1 -1
  94. package/dist/fuzz.js +3 -3
  95. package/dist/hosted/index.js +1 -1
  96. package/dist/{index-CPJJr98o.d.ts → index-BFRO6chs.d.ts} +3 -2
  97. package/dist/index-BFRO6chs.d.ts.map +1 -0
  98. package/dist/{index-Ch9VxCpK.d.ts → index-BO41eGj5.d.ts} +2 -2
  99. package/dist/{index-Ch9VxCpK.d.ts.map → index-BO41eGj5.d.ts.map} +1 -1
  100. package/dist/{index-B3WBm953.d.ts → index-CyszSg4O.d.ts} +165 -162
  101. package/dist/index-CyszSg4O.d.ts.map +1 -0
  102. package/dist/{index-B7m2uzJL.d.ts → index-DPcngtwt.d.ts} +30 -17
  103. package/dist/index-DPcngtwt.d.ts.map +1 -0
  104. package/dist/{index-tYLUvk_w.d.ts → index-DV-jSzxF.d.ts} +9 -9
  105. package/dist/{index-tYLUvk_w.d.ts.map → index-DV-jSzxF.d.ts.map} +1 -1
  106. package/dist/index.d.ts +1969 -1871
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +162 -201
  109. package/dist/index.js.map +1 -1
  110. package/dist/{integrity-BvnVARVl.js → integrity-BXOsAb3i.js} +2 -2
  111. package/dist/{integrity-BvnVARVl.js.map → integrity-BXOsAb3i.js.map} +1 -1
  112. package/dist/{integrity-CCAxGVK6.d.ts → integrity-DAMEDFaC.d.ts} +2 -2
  113. package/dist/{integrity-CCAxGVK6.d.ts.map → integrity-DAMEDFaC.d.ts.map} +1 -1
  114. package/dist/{integrity-BV1ZDf42.js → integrity-dLiDe2kD.js} +2 -5
  115. package/dist/integrity-dLiDe2kD.js.map +1 -0
  116. package/dist/{internal-CRHwS9iz.js → internal-Epl-YBZW.js} +3 -3
  117. package/dist/{internal-CRHwS9iz.js.map → internal-Epl-YBZW.js.map} +1 -1
  118. package/dist/interval-CELpye1n.js +219 -0
  119. package/dist/interval-CELpye1n.js.map +1 -0
  120. package/dist/interval-ohuOJurX.d.ts +47 -0
  121. package/dist/interval-ohuOJurX.d.ts.map +1 -0
  122. package/dist/{journal-DvKCvjty.js → journal-DfRz9kps.js} +2 -2
  123. package/dist/{journal-DvKCvjty.js.map → journal-DfRz9kps.js.map} +1 -1
  124. package/dist/{judge-calibration-N44V04Se.js → judge-calibration-BpCy5XQl.js} +3 -3
  125. package/dist/{judge-calibration-N44V04Se.js.map → judge-calibration-BpCy5XQl.js.map} +1 -1
  126. package/dist/{judge-gate-DNcUrRFA.d.ts → judge-gate-CE7CQAgt.d.ts} +3 -3
  127. package/dist/{judge-gate-DNcUrRFA.d.ts.map → judge-gate-CE7CQAgt.d.ts.map} +1 -1
  128. package/dist/{judge-gate-B1qYnkpi.js → judge-gate-iY9s4L44.js} +3 -3
  129. package/dist/judge-gate-iY9s4L44.js.map +1 -0
  130. package/dist/{kind-factory-AaEhUADH.js → kind-factory-BobI5Jy3.js} +5 -5
  131. package/dist/{kind-factory-AaEhUADH.js.map → kind-factory-BobI5Jy3.js.map} +1 -1
  132. package/dist/ledger-core/index.js +3 -3
  133. package/dist/{ledger-core-B2hahzrt.js → ledger-core-Gq7yp8lP.js} +4 -4
  134. package/dist/{ledger-core-B2hahzrt.js.map → ledger-core-Gq7yp8lP.js.map} +1 -1
  135. package/dist/{llm-client-DQveoxSM.js → llm-client-CyBAoYiX.js} +192 -219
  136. package/dist/llm-client-CyBAoYiX.js.map +1 -0
  137. package/dist/{llm-judge-Cd5s5Ei6.js → llm-judge-CG12SQJq.js} +499 -921
  138. package/dist/llm-judge-CG12SQJq.js.map +1 -0
  139. package/dist/matrix/index.d.ts +2 -2
  140. package/dist/matrix/index.js +1 -1
  141. package/dist/{matrix-DXVAJMLD.d.ts → matrix-DSrSxjjy.d.ts} +4 -4
  142. package/dist/{matrix-DXVAJMLD.d.ts.map → matrix-DSrSxjjy.d.ts.map} +1 -1
  143. package/dist/{matrix-_BV9-Lk5.js → matrix-Dm0BQW7U.js} +7 -11
  144. package/dist/matrix-Dm0BQW7U.js.map +1 -0
  145. package/dist/{paired-tests-jbwPdSz5.js → mean-DHoMiudD.js} +11 -5
  146. package/dist/mean-DHoMiudD.js.map +1 -0
  147. package/dist/meta-eval/index.d.ts +3 -3
  148. package/dist/meta-eval/index.js +9 -70
  149. package/dist/meta-eval/index.js.map +1 -1
  150. package/dist/mint-DNU8QPG4.d.ts +81 -0
  151. package/dist/mint-DNU8QPG4.d.ts.map +1 -0
  152. package/dist/{mint-Csor1BLJ.js → mint-QaD5cA0u.js} +3 -3
  153. package/dist/{mint-Csor1BLJ.js.map → mint-QaD5cA0u.js.map} +1 -1
  154. package/dist/{multiplicity-D9cjmStq.js → multiplicity-DQUFcbW4.js} +2 -2
  155. package/dist/{multiplicity-D9cjmStq.js.map → multiplicity-DQUFcbW4.js.map} +1 -1
  156. package/dist/multishot/golden/index.d.ts +1 -1
  157. package/dist/multishot/golden/index.d.ts.map +1 -1
  158. package/dist/multishot/golden/index.js +3 -6
  159. package/dist/multishot/golden/index.js.map +1 -1
  160. package/dist/multishot/index.d.ts +2 -2
  161. package/dist/multishot/index.js +1 -1
  162. package/dist/nonnegative-number-DvdMxg_f.js +9 -0
  163. package/dist/nonnegative-number-DvdMxg_f.js.map +1 -0
  164. package/dist/openapi.json +1 -1
  165. package/dist/{otel-spans-C8YIJWy1.js → otel-spans-B9tUXRHF.js} +3 -3
  166. package/dist/{otel-spans-C8YIJWy1.js.map → otel-spans-B9tUXRHF.js.map} +1 -1
  167. package/dist/{paired-arms-DzKn0TfY.js → paired-arms-CwMGJsrS.js} +5 -5
  168. package/dist/{paired-arms-DzKn0TfY.js.map → paired-arms-CwMGJsrS.js.map} +1 -1
  169. package/dist/{paired-binary-Q36bhn2R.js → paired-binary-CvpFHfKZ.js} +2 -2
  170. package/dist/{paired-binary-Q36bhn2R.js.map → paired-binary-CvpFHfKZ.js.map} +1 -1
  171. package/dist/{paired-promotion-decision-BN6IQTiu.js → paired-promotion-decision-DsAPYGCm.js} +3 -3
  172. package/dist/{paired-promotion-decision-BN6IQTiu.js.map → paired-promotion-decision-DsAPYGCm.js.map} +1 -1
  173. package/dist/{search-kernel-BztlERLv.js → pareto-Cm6ndrWN.js} +883 -861
  174. package/dist/pareto-Cm6ndrWN.js.map +1 -0
  175. package/dist/pipelines/index.d.ts +2 -2
  176. package/dist/pipelines/index.js +3 -3
  177. package/dist/{power-and-mde-fK5Qocwo.js → power-and-mde-Hj2ubb4B.js} +2 -2
  178. package/dist/{power-and-mde-fK5Qocwo.js.map → power-and-mde-Hj2ubb4B.js.map} +1 -1
  179. package/dist/predicate-FdKmElA_.js +38 -0
  180. package/dist/predicate-FdKmElA_.js.map +1 -0
  181. package/dist/{prime-protocol-DcAK9pC8.js → prime-protocol-CHKgA3a6.js} +2 -2
  182. package/dist/{prime-protocol-DcAK9pC8.js.map → prime-protocol-CHKgA3a6.js.map} +1 -1
  183. package/dist/{prime-protocol-BHia9vDz.d.ts → prime-protocol-HiB9HX7E.d.ts} +3 -3
  184. package/dist/{prime-protocol-BHia9vDz.d.ts.map → prime-protocol-HiB9HX7E.d.ts.map} +1 -1
  185. package/dist/{produced-state-BGp4BX8t.js → produced-state-BsDmnwxc.js} +8 -8
  186. package/dist/{produced-state-BGp4BX8t.js.map → produced-state-BsDmnwxc.js.map} +1 -1
  187. package/dist/profile-cell.js +1 -1
  188. package/dist/{release-confidence-BK2QCB5M.d.ts → promotion-gate-BawrdPYr.d.ts} +102 -102
  189. package/dist/promotion-gate-BawrdPYr.d.ts.map +1 -0
  190. package/dist/{promotion-policy-CWW35UWq.js → promotion-policy-KO57gbyV.js} +4 -4
  191. package/dist/{promotion-policy-CWW35UWq.js.map → promotion-policy-KO57gbyV.js.map} +1 -1
  192. package/dist/{proposal-findings-CXblsskH.js → proposal-findings-CY1xKn_a.js} +2 -36
  193. package/dist/proposal-findings-CY1xKn_a.js.map +1 -0
  194. package/dist/{query-B1D1qp2Z.js → query-BUCZCK7F.js} +3 -3
  195. package/dist/{query-B1D1qp2Z.js.map → query-BUCZCK7F.js.map} +1 -1
  196. package/dist/{random-Dn5fPWkt.js → random-ByUSnV9w.js} +2 -2
  197. package/dist/{random-Dn5fPWkt.js.map → random-ByUSnV9w.js.map} +1 -1
  198. package/dist/{raw-provider-sink-rB2DYxr6.js → raw-provider-sink-DoHz4JNG.js} +2 -2
  199. package/dist/{raw-provider-sink-rB2DYxr6.js.map → raw-provider-sink-DoHz4JNG.js.map} +1 -1
  200. package/dist/{redact-Dk1ZdJEm.js → redact-B5xXKqQ3.js} +97 -98
  201. package/dist/redact-B5xXKqQ3.js.map +1 -0
  202. package/dist/{redact-Cveoq6fJ.d.ts → redact-mtCCcT8z.d.ts} +4 -20
  203. package/dist/redact-mtCCcT8z.d.ts.map +1 -0
  204. package/dist/{registry-CMYIaDgS.d.ts → registry-D7_hm2fK.d.ts} +11 -13
  205. package/dist/registry-D7_hm2fK.d.ts.map +1 -0
  206. package/dist/{release-confidence-Dbe9AS_X.js → release-confidence-CpuP65S5.js} +5 -5
  207. package/dist/{release-confidence-Dbe9AS_X.js.map → release-confidence-CpuP65S5.js.map} +1 -1
  208. package/dist/{report-command-CtIIsQKP.js → report-command-SC9nqb4M.js} +128 -177
  209. package/dist/report-command-SC9nqb4M.js.map +1 -0
  210. package/dist/reporting-html-Kvlc8oMt.js +100 -0
  211. package/dist/reporting-html-Kvlc8oMt.js.map +1 -0
  212. package/dist/reporting.d.ts +3 -3
  213. package/dist/reporting.js +6 -6
  214. package/dist/{researcher-f6mZhh58.d.ts → researcher-CEcfku-T.d.ts} +5 -5
  215. package/dist/{researcher-f6mZhh58.d.ts.map → researcher-CEcfku-T.d.ts.map} +1 -1
  216. package/dist/reward-CpCmAM8L.d.ts +78 -0
  217. package/dist/reward-CpCmAM8L.d.ts.map +1 -0
  218. package/dist/{reward-hacking-BFcQgkux.js → reward-hacking-E0d-WVcP.js} +2 -2
  219. package/dist/{reward-hacking-BFcQgkux.js.map → reward-hacking-E0d-WVcP.js.map} +1 -1
  220. package/dist/{reward-hacking-DHA7c1l8.d.ts → reward-hacking-RVdZ6Kkt.d.ts} +2 -2
  221. package/dist/{reward-hacking-DHA7c1l8.d.ts.map → reward-hacking-RVdZ6Kkt.d.ts.map} +1 -1
  222. package/dist/rl.d.ts +8 -8
  223. package/dist/rl.js +14 -14
  224. package/dist/rollout/index.d.ts +3 -2
  225. package/dist/rollout/index.js +2 -2
  226. package/dist/{rollout-D9bKKBnZ.js → rollout-DZV1t2Wg.js} +2 -2
  227. package/dist/{rollout-D9bKKBnZ.js.map → rollout-DZV1t2Wg.js.map} +1 -1
  228. package/dist/round-decimal-COrKglMh.js +10 -0
  229. package/dist/round-decimal-COrKglMh.js.map +1 -0
  230. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts → rubric-predictive-validity-C03EC7ZE.d.ts} +2 -2
  231. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts.map → rubric-predictive-validity-C03EC7ZE.d.ts.map} +1 -1
  232. package/dist/{rubric-predictive-validity-BsgkBfT0.js → rubric-predictive-validity-DaFW70y9.js} +3 -3
  233. package/dist/{rubric-predictive-validity-BsgkBfT0.js.map → rubric-predictive-validity-DaFW70y9.js.map} +1 -1
  234. package/dist/{run-record-DlTZ_lqe.js → run-record-Boc5IUTp.js} +4 -4
  235. package/dist/{run-record-DlTZ_lqe.js.map → run-record-Boc5IUTp.js.map} +1 -1
  236. package/dist/{run-record-D1Hw-Jml.d.ts → run-record-C1E24G2A.d.ts} +2 -2
  237. package/dist/{run-record-D1Hw-Jml.d.ts.map → run-record-C1E24G2A.d.ts.map} +1 -1
  238. package/dist/{run-record-ES07wfz9.js → run-record-C5e7FjhJ.js} +3 -5
  239. package/dist/run-record-C5e7FjhJ.js.map +1 -0
  240. package/dist/search/index.d.ts +46 -32
  241. package/dist/search/index.d.ts.map +1 -1
  242. package/dist/search/index.js +3 -3
  243. package/dist/{search-kernel-BqyBZ9Wm.d.ts → search-kernel-DyNEa6IU.d.ts} +14 -10
  244. package/dist/search-kernel-DyNEa6IU.d.ts.map +1 -0
  245. package/dist/{search-ledger-d7V8o9Lk.js → search-ledger-CVUGLDZp.js} +189 -199
  246. package/dist/search-ledger-CVUGLDZp.js.map +1 -0
  247. package/dist/{search-ledger-file-BqOo-bVo.js → search-ledger-file-DDQUgvCg.js} +4 -4
  248. package/dist/{search-ledger-file-BqOo-bVo.js.map → search-ledger-file-DDQUgvCg.js.map} +1 -1
  249. package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +1 -1
  250. package/dist/{search-shipper-er4pK5_Y.js → search-shipper-BOSD46qv.js} +3 -3
  251. package/dist/{search-shipper-er4pK5_Y.js.map → search-shipper-BOSD46qv.js.map} +1 -1
  252. package/dist/{search-summary-CBvz3u_S.js → search-summary-BQCSWf1g.js} +5 -5
  253. package/dist/{search-summary-CBvz3u_S.js.map → search-summary-BQCSWf1g.js.map} +1 -1
  254. package/dist/{semantic-concept-judge-BPqbwIVs.js → semantic-concept-judge-BQF8te0T.js} +12 -14
  255. package/dist/semantic-concept-judge-BQF8te0T.js.map +1 -0
  256. package/dist/{sequential-D-1PPCmM.js → sequential-Bf_pbE50.js} +5 -5
  257. package/dist/{sequential-D-1PPCmM.js.map → sequential-Bf_pbE50.js.map} +1 -1
  258. package/dist/{sequential-eprocess-D1jKoihe.js → sequential-eprocess-DM_qENCl.js} +2 -2
  259. package/dist/{sequential-eprocess-D1jKoihe.js.map → sequential-eprocess-DM_qENCl.js.map} +1 -1
  260. package/dist/{server-DbcC7xMl.js → server-e9oWO_bN.js} +4 -4
  261. package/dist/{server-DbcC7xMl.js.map → server-e9oWO_bN.js.map} +1 -1
  262. package/dist/{single-run-lock-fVu3MZWH.js → single-run-lock-CV9Eyd_q.js} +2 -2
  263. package/dist/{single-run-lock-fVu3MZWH.js.map → single-run-lock-CV9Eyd_q.js.map} +1 -1
  264. package/dist/{skillopt-optimization-method-Dcepr6QL.js → skillopt-optimization-method-BiwA8nfX.js} +427 -12
  265. package/dist/skillopt-optimization-method-BiwA8nfX.js.map +1 -0
  266. package/dist/{spans-D9_ehFuk.d.ts → spans-BHAUXMGN.d.ts} +2 -2
  267. package/dist/{spans-D9_ehFuk.d.ts.map → spans-BHAUXMGN.d.ts.map} +1 -1
  268. package/dist/{statistical-heldout-1Gbmex7v.js → statistical-heldout-42NlCNDe.js} +3 -3
  269. package/dist/{statistical-heldout-1Gbmex7v.js.map → statistical-heldout-42NlCNDe.js.map} +1 -1
  270. package/dist/{statistical-heldout-CJTj2EoS.d.ts → statistical-heldout-CYpGaoDH.d.ts} +3 -3
  271. package/dist/{statistical-heldout-CJTj2EoS.d.ts.map → statistical-heldout-CYpGaoDH.d.ts.map} +1 -1
  272. package/dist/{store-otlp-DWVhUgEj.js → store-otlp-DJ9dtA5x.js} +135 -132
  273. package/dist/store-otlp-DJ9dtA5x.js.map +1 -0
  274. package/dist/{store-tool-spans-BNICrhsb.js → store-tool-spans-CIX5arAG.js} +7 -7
  275. package/dist/{store-tool-spans-BNICrhsb.js.map → store-tool-spans-CIX5arAG.js.map} +1 -1
  276. package/dist/{store-tool-spans-BNzls3OD.d.ts → store-tool-spans-DdCSPa7C.d.ts} +162 -161
  277. package/dist/store-tool-spans-DdCSPa7C.d.ts.map +1 -0
  278. package/dist/storyboard/index.d.ts.map +1 -1
  279. package/dist/storyboard/index.js +20 -3
  280. package/dist/storyboard/index.js.map +1 -1
  281. package/dist/{student-t-BQeKJx2N.js → student-t-DVPW7CdL.js} +2 -2
  282. package/dist/{student-t-BQeKJx2N.js.map → student-t-DVPW7CdL.js.map} +1 -1
  283. package/dist/{summary-report-DtdRucM0.js → summary-report-V_JACR4Y.js} +526 -614
  284. package/dist/summary-report-V_JACR4Y.js.map +1 -0
  285. package/dist/{summary-report-C-CtItCN.d.ts → summary-report-bdFDXq0b.d.ts} +10 -5
  286. package/dist/summary-report-bdFDXq0b.d.ts.map +1 -0
  287. package/dist/supervisor-run/index.d.ts +154 -150
  288. package/dist/supervisor-run/index.d.ts.map +1 -1
  289. package/dist/supervisor-run/index.js +65 -3
  290. package/dist/supervisor-run/index.js.map +1 -1
  291. package/dist/systemone-BomhHr2c.d.ts +135 -0
  292. package/dist/systemone-BomhHr2c.d.ts.map +1 -0
  293. package/dist/systemone-protocol.js +1 -1
  294. package/dist/{systemone-review-C4dZgrgN.d.ts → systemone-review-CUVcQJu6.d.ts} +2 -2
  295. package/dist/{systemone-review-C4dZgrgN.d.ts.map → systemone-review-CUVcQJu6.d.ts.map} +1 -1
  296. package/dist/{systemone-review-DTClwgmE.js → systemone-review-D7sXwsqq.js} +3 -3
  297. package/dist/{systemone-review-DTClwgmE.js.map → systemone-review-D7sXwsqq.js.map} +1 -1
  298. package/dist/systemone.d.ts +4 -134
  299. package/dist/systemone.js +4 -4
  300. package/dist/{task-failure-attributes-DngaLdE4.js → task-failure-attributes-hEmASjix.js} +2 -2
  301. package/dist/{task-failure-attributes-DngaLdE4.js.map → task-failure-attributes-hEmASjix.js.map} +1 -1
  302. package/dist/{terminal-record-BHocwFw1.js → terminal-record-DZyQZ3pz.js} +14 -10
  303. package/dist/terminal-record-DZyQZ3pz.js.map +1 -0
  304. package/dist/{tool-groups-BKRrtqy4.d.ts → tool-groups-C3NEcdCM.d.ts} +3 -3
  305. package/dist/tool-groups-C3NEcdCM.d.ts.map +1 -0
  306. package/dist/{tool-waste-Wi4g6Ekb.d.ts → tool-waste-BKgvd-TP.d.ts} +30 -30
  307. package/dist/tool-waste-BKgvd-TP.d.ts.map +1 -0
  308. package/dist/{tool-waste-BYt5rdt8.js → tool-waste-BlesqTqW.js} +5 -158
  309. package/dist/tool-waste-BlesqTqW.js.map +1 -0
  310. package/dist/{trace-questions-CLx8vt6t.d.ts → trace-questions-CM2CAocU.d.ts} +4 -4
  311. package/dist/{trace-questions-CLx8vt6t.d.ts.map → trace-questions-CM2CAocU.d.ts.map} +1 -1
  312. package/dist/trace-repair/index.d.ts +3 -3
  313. package/dist/trace-repair/index.d.ts.map +1 -1
  314. package/dist/trace-repair/index.js +7 -13
  315. package/dist/trace-repair/index.js.map +1 -1
  316. package/dist/traces.d.ts +76 -58
  317. package/dist/traces.d.ts.map +1 -1
  318. package/dist/traces.js +9 -9
  319. package/dist/trajectory-replay/index.js +3 -3
  320. package/dist/{tree-rXLW3M_4.js → tree-C1XYeXvy.js} +2277 -2339
  321. package/dist/tree-C1XYeXvy.js.map +1 -0
  322. package/dist/{types-DjOMwGY_.d.ts → types-BqkVmHfv.d.ts} +7 -1
  323. package/dist/types-BqkVmHfv.d.ts.map +1 -0
  324. package/dist/{types-DBZ7keha.d.ts → types-C02qtnG8.d.ts} +4 -46
  325. package/dist/types-C02qtnG8.d.ts.map +1 -0
  326. package/dist/{types-DHb5TI36.d.ts → types-C1tnkEgM.d.ts} +347 -6
  327. package/dist/types-C1tnkEgM.d.ts.map +1 -0
  328. package/dist/{types-DinHtRJp.d.ts → types-Cbe2fWBa.d.ts} +3 -3
  329. package/dist/{types-DinHtRJp.d.ts.map → types-Cbe2fWBa.d.ts.map} +1 -1
  330. package/dist/{types-CGEmVYOk.d.ts → types-Cq8mSbq8.d.ts} +78 -72
  331. package/dist/types-Cq8mSbq8.d.ts.map +1 -0
  332. package/dist/{types-CW5b90JH.js → types-IXD2HJzu.js} +16 -3
  333. package/dist/types-IXD2HJzu.js.map +1 -0
  334. package/dist/{verdict-DhPoXApk.js → verdict-Dl0tiT1X.js} +2 -2
  335. package/dist/{verdict-DhPoXApk.js.map → verdict-Dl0tiT1X.js.map} +1 -1
  336. package/dist/{verdict-cache-BQEsVy9n.js → verdict-cache-Bm8EKL2s.js} +2 -2
  337. package/dist/{verdict-cache-BQEsVy9n.js.map → verdict-cache-Bm8EKL2s.js.map} +1 -1
  338. package/dist/wire/index.d.ts +3 -3
  339. package/dist/wire/index.js +1 -1
  340. package/docs/concepts.md +1 -0
  341. package/docs/design/mlbenchmarks-book-review.md +1 -1
  342. package/docs/design/mlbenchmarks-review/probes.mts +23 -31
  343. package/docs/experiment.md +1 -1
  344. package/docs/finding-layers.md +69 -0
  345. package/package.json +1 -1
  346. package/dist/analyze-runs-3xpby3p2.js.map +0 -1
  347. package/dist/analyze-runs-BhFLOztS.d.ts.map +0 -1
  348. package/dist/ast-DJ6Bc7ab.js +0 -558
  349. package/dist/ast-DJ6Bc7ab.js.map +0 -1
  350. package/dist/ast-hI-vjW6J.d.ts +0 -457
  351. package/dist/ast-hI-vjW6J.d.ts.map +0 -1
  352. package/dist/benchmark-command-CgpGi7vY.js.map +0 -1
  353. package/dist/campaign-CpnsCgfz.js.map +0 -1
  354. package/dist/campaign-evidence-OcUciD-N.js.map +0 -1
  355. package/dist/claim-BXcZw-jo.js.map +0 -1
  356. package/dist/cost-ledger-CO7UyEcQ.d.ts.map +0 -1
  357. package/dist/cost-ledger-D2FnJPBF.js.map +0 -1
  358. package/dist/default-registry-KP4-Tolz.js.map +0 -1
  359. package/dist/define-agent-eval-BdfnqXeP.js.map +0 -1
  360. package/dist/evaluation.d.ts.map +0 -1
  361. package/dist/external-optimizer-subprocess-BUxifb8g.js.map +0 -1
  362. package/dist/feedback-trajectory-BLN_6fEs.d.ts.map +0 -1
  363. package/dist/index-B3WBm953.d.ts.map +0 -1
  364. package/dist/index-B7m2uzJL.d.ts.map +0 -1
  365. package/dist/index-CPJJr98o.d.ts.map +0 -1
  366. package/dist/integrity-BV1ZDf42.js.map +0 -1
  367. package/dist/judge-gate-B1qYnkpi.js.map +0 -1
  368. package/dist/llm-client-DQveoxSM.js.map +0 -1
  369. package/dist/llm-judge-Cd5s5Ei6.js.map +0 -1
  370. package/dist/matrix-_BV9-Lk5.js.map +0 -1
  371. package/dist/mint-DCGoBYhB.d.ts +0 -155
  372. package/dist/mint-DCGoBYhB.d.ts.map +0 -1
  373. package/dist/paired-tests-jbwPdSz5.js.map +0 -1
  374. package/dist/proposal-findings-CXblsskH.js.map +0 -1
  375. package/dist/redact-Cveoq6fJ.d.ts.map +0 -1
  376. package/dist/redact-Dk1ZdJEm.js.map +0 -1
  377. package/dist/registry-CMYIaDgS.d.ts.map +0 -1
  378. package/dist/release-confidence-BK2QCB5M.d.ts.map +0 -1
  379. package/dist/report-command-CtIIsQKP.js.map +0 -1
  380. package/dist/run-record-ES07wfz9.js.map +0 -1
  381. package/dist/search-kernel-BqyBZ9Wm.d.ts.map +0 -1
  382. package/dist/search-kernel-BztlERLv.js.map +0 -1
  383. package/dist/search-ledger-d7V8o9Lk.js.map +0 -1
  384. package/dist/semantic-concept-judge-BPqbwIVs.js.map +0 -1
  385. package/dist/skillopt-optimization-method-Dcepr6QL.js.map +0 -1
  386. package/dist/store-otlp-DWVhUgEj.js.map +0 -1
  387. package/dist/store-tool-spans-BNzls3OD.d.ts.map +0 -1
  388. package/dist/summary-report-C-CtItCN.d.ts.map +0 -1
  389. package/dist/summary-report-DtdRucM0.js.map +0 -1
  390. package/dist/systemone.d.ts.map +0 -1
  391. package/dist/terminal-record-BHocwFw1.js.map +0 -1
  392. package/dist/tool-groups-BKRrtqy4.d.ts.map +0 -1
  393. package/dist/tool-waste-BYt5rdt8.js.map +0 -1
  394. package/dist/tool-waste-Wi4g6Ekb.d.ts.map +0 -1
  395. package/dist/tree-rXLW3M_4.js.map +0 -1
  396. package/dist/types-CGEmVYOk.d.ts.map +0 -1
  397. package/dist/types-CW5b90JH.js.map +0 -1
  398. package/dist/types-DBZ7keha.d.ts.map +0 -1
  399. package/dist/types-DHb5TI36.d.ts.map +0 -1
  400. package/dist/types-DjOMwGY_.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as hashCanonical, n as LedgerCanonicalizationError, o as jsonDocument, r as canonicalString, t as LEDGER_HASH_PATTERN } from "../canonical-BsZVgBhW.js";
2
- import { _ as probeAtomicFileLock, a as trustedHeadPathFor, c as readProjectorSnapshotFile, d as withLedgerFileLock, f as writeLedgerFileAtomically, g as AtomicFileLockError, i as readTrustedHeadFile, l as appendLedgerLine, n as MemoryLedgerJournal, o as verifyEntriesAgainstTrustedHead, r as replayLedgerText, s as projectorSnapshotPathFor, t as FileLedgerJournal, u as tryWithLedgerFileLock, v as tryAcquireAtomicFileLock } from "../journal-DvKCvjty.js";
3
- import { a as merkleRoot, c as verifyMerkleInclusion, i as merkleLeafHash, n as merkleConsistencyProof, o as merkleSalt, r as merkleInclusionProof, s as verifyMerkleConsistency, t as MERKLE_EMPTY_ROOT } from "../ledger-core-B2hahzrt.js";
1
+ import { a as hashCanonical, n as LedgerCanonicalizationError, o as jsonDocument, r as canonicalString, t as LEDGER_HASH_PATTERN } from "../canonical-B2RqLofv.js";
2
+ import { _ as probeAtomicFileLock, a as trustedHeadPathFor, c as readProjectorSnapshotFile, d as withLedgerFileLock, f as writeLedgerFileAtomically, g as AtomicFileLockError, i as readTrustedHeadFile, l as appendLedgerLine, n as MemoryLedgerJournal, o as verifyEntriesAgainstTrustedHead, r as replayLedgerText, s as projectorSnapshotPathFor, t as FileLedgerJournal, u as tryWithLedgerFileLock, v as tryAcquireAtomicFileLock } from "../journal-DfRz9kps.js";
3
+ import { a as merkleRoot, c as verifyMerkleInclusion, i as merkleLeafHash, n as merkleConsistencyProof, o as merkleSalt, r as merkleInclusionProof, s as verifyMerkleConsistency, t as MERKLE_EMPTY_ROOT } from "../ledger-core-Gq7yp8lP.js";
4
4
  export { AtomicFileLockError, FileLedgerJournal, LEDGER_HASH_PATTERN, LedgerCanonicalizationError, MERKLE_EMPTY_ROOT, MemoryLedgerJournal, appendLedgerLine, canonicalString, hashCanonical, jsonDocument, merkleConsistencyProof, merkleInclusionProof, merkleLeafHash, merkleRoot, merkleSalt, probeAtomicFileLock, projectorSnapshotPathFor, readProjectorSnapshotFile, readTrustedHeadFile, replayLedgerText, trustedHeadPathFor, tryAcquireAtomicFileLock, tryWithLedgerFileLock, verifyEntriesAgainstTrustedHead, verifyMerkleConsistency, verifyMerkleInclusion, withLedgerFileLock, writeLedgerFileAtomically };
@@ -1,6 +1,6 @@
1
- import { s as ValidationError } from "./errors-Dngq5h35.js";
2
- import { t as LEDGER_HASH_PATTERN } from "./canonical-BsZVgBhW.js";
3
- import "./journal-DvKCvjty.js";
1
+ import { s as ValidationError } from "./errors-DVZiqS7K.js";
2
+ import { t as LEDGER_HASH_PATTERN } from "./canonical-B2RqLofv.js";
3
+ import "./journal-DfRz9kps.js";
4
4
  import { sha256Bytes } from "@tangle-network/agent-interface";
5
5
  //#region src/ledger-core/merkle.ts
6
6
  /**
@@ -245,4 +245,4 @@ function fromHex(hex) {
245
245
  //#endregion
246
246
  export { merkleRoot as a, verifyMerkleInclusion as c, merkleLeafHash as i, merkleConsistencyProof as n, merkleSalt as o, merkleInclusionProof as r, verifyMerkleConsistency as s, MERKLE_EMPTY_ROOT as t };
247
247
 
248
- //# sourceMappingURL=ledger-core-B2hahzrt.js.map
248
+ //# sourceMappingURL=ledger-core-Gq7yp8lP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-core-B2hahzrt.js","names":[],"sources":["../src/ledger-core/merkle.ts"],"sourcesContent":["/**\n * Merkle proofs over an append-only list of leaves (RFC 9162 §2.1, the\n * Certificate Transparency tree).\n *\n * A hash chain proves a whole log against its head, but proving one entry means\n * replaying everything before it. This tree proves any one leaf against a root\n * with ⌈log₂ n⌉ hashes (inclusion), and proves that a larger tree only appended\n * to a smaller one (consistency). A verifier holding a root can therefore check\n * a single event, or that a later checkpoint extends an earlier one, without\n * reading the rest of the log.\n *\n * Leaves and interior nodes are domain-separated (0x00 and 0x01 prefixes), so a\n * leaf can never be presented as an interior node. Content that may later be\n * redacted takes a random 32-byte salt: a verifier then needs only the leaf's\n * hash, and short content cannot be guessed back from that hash. The salt must\n * be stored apart from anything that is shared after redaction.\n *\n * Builders refuse malformed input by throwing; verifiers never throw and return\n * a typed outcome, because a proof is external evidence and a bad one is a\n * finding, not a crash.\n */\nimport { sha256Bytes } from '@tangle-network/agent-interface'\nimport { ValidationError } from '../errors'\nimport { LEDGER_HASH_PATTERN, type LedgerHash } from './canonical'\n\n/** Proof that one leaf is at `leafIndex` in a tree of `treeSize` leaves. */\nexport interface MerkleInclusionProof {\n readonly leafIndex: number\n readonly treeSize: number\n readonly path: readonly LedgerHash[]\n}\n\n/** Proof that the first `oldSize` leaves of a `newSize` tree are unchanged. */\nexport interface MerkleConsistencyProof {\n readonly oldSize: number\n readonly newSize: number\n readonly path: readonly LedgerHash[]\n}\n\nexport type MerkleVerification =\n | { readonly verified: true }\n | { readonly verified: false; readonly reason: string }\n\nconst SALT_PATTERN = /^[a-f0-9]{64}$/\nconst LEAF_PREFIX = 0x00\nconst NODE_PREFIX = 0x01\nconst encoder = new TextEncoder()\n\n/** Root of the empty tree: SHA-256 of no bytes. */\nexport const MERKLE_EMPTY_ROOT: LedgerHash = sha256Bytes(new Uint8Array(0)) as LedgerHash\n\n/** A fresh random salt for {@link merkleLeafHash}: 32 bytes as 64 lowercase hex characters. */\nexport function merkleSalt(): string {\n return toHex(globalThis.crypto.getRandomValues(new Uint8Array(32)))\n}\n\n/**\n * Leaf hash of `content`: SHA-256(0x00 ‖ salt ‖ content). Without a salt this is\n * exactly the RFC 9162 leaf hash. Strings are hashed as UTF-8.\n */\nexport function merkleLeafHash(content: Uint8Array | string, salt?: string): LedgerHash {\n const bytes = typeof content === 'string' ? encoder.encode(content) : content\n if (salt === undefined) return digest(LEAF_PREFIX, bytes)\n if (!SALT_PATTERN.test(salt)) {\n throw new ValidationError('merkle salt must be 32 bytes as 64 lowercase hex characters')\n }\n return digest(LEAF_PREFIX, fromHex(salt), bytes)\n}\n\n/** Root over leaf hashes, in order. The empty list has {@link MERKLE_EMPTY_ROOT}. */\nexport function merkleRoot(leaves: readonly LedgerHash[]): LedgerHash {\n const nodes = decodeLeaves(leaves)\n return nodes.length === 0 ? MERKLE_EMPTY_ROOT : toLedgerHash(subtreeRoot(nodes, 0, nodes.length))\n}\n\n/** Inclusion proof for the leaf at `leafIndex` (RFC 9162 §2.1.3.1). */\nexport function merkleInclusionProof(\n leaves: readonly LedgerHash[],\n leafIndex: number,\n): MerkleInclusionProof {\n const nodes = decodeLeaves(leaves)\n if (!Number.isSafeInteger(leafIndex) || leafIndex < 0 || leafIndex >= nodes.length) {\n throw new ValidationError(\n `merkle leaf index ${leafIndex} is outside a tree of ${nodes.length} leaves`,\n )\n }\n const path: Uint8Array[] = []\n inclusionPath(nodes, leafIndex, 0, nodes.length, path)\n return { leafIndex, treeSize: nodes.length, path: path.map(toLedgerHash) }\n}\n\n/**\n * Consistency proof that the first `oldSize` leaves are the tree of that size\n * (RFC 9162 §2.1.4.1). Sizes 0 and `leaves.length` need no path.\n */\nexport function merkleConsistencyProof(\n leaves: readonly LedgerHash[],\n oldSize: number,\n): MerkleConsistencyProof {\n const nodes = decodeLeaves(leaves)\n if (!Number.isSafeInteger(oldSize) || oldSize < 0 || oldSize > nodes.length) {\n throw new ValidationError(\n `merkle old size ${oldSize} is outside a tree of ${nodes.length} leaves`,\n )\n }\n const path: Uint8Array[] = []\n if (oldSize > 0 && oldSize < nodes.length) subproof(nodes, oldSize, 0, nodes.length, true, path)\n return { oldSize, newSize: nodes.length, path: path.map(toLedgerHash) }\n}\n\n/** Check that `leaf` is in the tree with `root` at the proof's index (RFC 9162 §2.1.3.2). */\nexport function verifyMerkleInclusion(\n leaf: LedgerHash,\n proof: MerkleInclusionProof,\n root: LedgerHash,\n): MerkleVerification {\n const { leafIndex, treeSize } = proof\n if (!isSize(treeSize) || !isSize(leafIndex) || leafIndex >= treeSize) {\n return refused(`leaf index ${leafIndex} is outside a tree of ${treeSize} leaves`)\n }\n const decoded = decodeAll([leaf, root, ...proof.path])\n if (decoded === undefined) return refused('proof carries a malformed hash')\n const [leafBytes, rootBytes, ...path] = decoded as [Uint8Array, Uint8Array, ...Uint8Array[]]\n let fn = leafIndex\n let sn = treeSize - 1\n let r = leafBytes\n for (const p of path) {\n if (sn === 0) return refused('proof path is longer than the tree is deep')\n if (fn % 2 === 1 || fn === sn) {\n r = node(p, r)\n if (fn % 2 === 0) {\n while (fn % 2 === 0 && fn !== 0) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n }\n } else {\n r = node(r, p)\n }\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n if (sn !== 0) return refused('proof path is shorter than the tree is deep')\n return equal(r, rootBytes) ? { verified: true } : refused('leaf does not hash to the root')\n}\n\n/** Check that the tree with `newRoot` extends the tree with `oldRoot` (RFC 9162 §2.1.4.2). */\nexport function verifyMerkleConsistency(\n proof: MerkleConsistencyProof,\n oldRoot: LedgerHash,\n newRoot: LedgerHash,\n): MerkleVerification {\n const { oldSize, newSize } = proof\n if (!isSize(oldSize) || !isSize(newSize) || oldSize > newSize) {\n return refused(`old size ${oldSize} does not precede new size ${newSize}`)\n }\n const decoded = decodeAll([oldRoot, newRoot, ...proof.path])\n if (decoded === undefined) return refused('proof carries a malformed hash')\n const [oldBytes, newBytes, ...given] = decoded as [Uint8Array, Uint8Array, ...Uint8Array[]]\n if (oldSize === 0 || oldSize === newSize) {\n if (given.length !== 0) return refused('a trivial consistency proof must be empty')\n if (oldSize === 0) {\n return oldRoot === MERKLE_EMPTY_ROOT\n ? { verified: true }\n : refused('the empty tree has a different root')\n }\n return equal(oldBytes, newBytes)\n ? { verified: true }\n : refused('equal sizes with different roots')\n }\n const path = isPowerOfTwo(oldSize) ? [oldBytes, ...given] : given\n if (path.length === 0) return refused('consistency proof is empty')\n let fn = oldSize - 1\n let sn = newSize - 1\n while (fn % 2 === 1) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n let fr = path[0] as Uint8Array\n let sr = fr\n for (const c of path.slice(1)) {\n if (sn === 0) return refused('proof path is longer than the tree is deep')\n if (fn % 2 === 1 || fn === sn) {\n fr = node(c, fr)\n sr = node(c, sr)\n if (fn % 2 === 0) {\n while (fn % 2 === 0 && fn !== 0) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n }\n } else {\n sr = node(sr, c)\n }\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n if (sn !== 0) return refused('proof path is shorter than the tree is deep')\n if (!equal(fr, oldBytes)) return refused('proof does not rebuild the old root')\n if (!equal(sr, newBytes)) return refused('proof does not rebuild the new root')\n return { verified: true }\n}\n\nfunction subtreeRoot(nodes: readonly Uint8Array[], start: number, end: number): Uint8Array {\n if (end - start === 1) return nodes[start] as Uint8Array\n const k = largestPowerOfTwoBelow(end - start)\n return node(subtreeRoot(nodes, start, start + k), subtreeRoot(nodes, start + k, end))\n}\n\nfunction inclusionPath(\n nodes: readonly Uint8Array[],\n index: number,\n start: number,\n end: number,\n path: Uint8Array[],\n): void {\n if (end - start === 1) return\n const k = largestPowerOfTwoBelow(end - start)\n if (index < start + k) {\n inclusionPath(nodes, index, start, start + k, path)\n path.push(subtreeRoot(nodes, start + k, end))\n } else {\n inclusionPath(nodes, index, start + k, end, path)\n path.push(subtreeRoot(nodes, start, start + k))\n }\n}\n\nfunction subproof(\n nodes: readonly Uint8Array[],\n oldSize: number,\n start: number,\n end: number,\n complete: boolean,\n path: Uint8Array[],\n): void {\n if (end - start === oldSize) {\n if (!complete) path.push(subtreeRoot(nodes, start, end))\n return\n }\n const k = largestPowerOfTwoBelow(end - start)\n if (oldSize <= k) {\n subproof(nodes, oldSize, start, start + k, complete, path)\n path.push(subtreeRoot(nodes, start + k, end))\n } else {\n subproof(nodes, oldSize - k, start + k, end, false, path)\n path.push(subtreeRoot(nodes, start, start + k))\n }\n}\n\nfunction node(left: Uint8Array, right: Uint8Array): Uint8Array {\n return fromHex(digest(NODE_PREFIX, left, right).slice('sha256:'.length))\n}\n\nfunction digest(prefix: number, ...parts: Uint8Array[]): LedgerHash {\n const length = parts.reduce((total, part) => total + part.length, 1)\n const bytes = new Uint8Array(length)\n bytes[0] = prefix\n let offset = 1\n for (const part of parts) {\n bytes.set(part, offset)\n offset += part.length\n }\n return sha256Bytes(bytes) as LedgerHash\n}\n\nfunction decodeLeaves(leaves: readonly LedgerHash[]): Uint8Array[] {\n const decoded = decodeAll(leaves)\n if (decoded === undefined) {\n throw new ValidationError('merkle leaves must be sha256:<64 lowercase hex> hashes')\n }\n return decoded\n}\n\nfunction decodeAll(hashes: readonly string[]): Uint8Array[] | undefined {\n const out: Uint8Array[] = []\n for (const hash of hashes) {\n if (typeof hash !== 'string' || !LEDGER_HASH_PATTERN.test(hash)) return undefined\n out.push(fromHex(hash.slice('sha256:'.length)))\n }\n return out\n}\n\nfunction toLedgerHash(bytes: Uint8Array): LedgerHash {\n return `sha256:${toHex(bytes)}`\n}\n\nfunction largestPowerOfTwoBelow(n: number): number {\n let k = 1\n while (k * 2 < n) k *= 2\n return k\n}\n\nfunction isPowerOfTwo(n: number): boolean {\n if (n < 1) return false\n let m = n\n while (m % 2 === 0) m /= 2\n return m === 1\n}\n\nfunction isSize(n: number): boolean {\n return Number.isSafeInteger(n) && n >= 0\n}\n\nfunction equal(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\n return true\n}\n\nfunction refused(reason: string): MerkleVerification {\n return { verified: false, reason }\n}\n\nfunction toHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction fromHex(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2)\n for (let i = 0; i < bytes.length; i++) bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16)\n return bytes\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ledger-core-Gq7yp8lP.js","names":[],"sources":["../src/ledger-core/merkle.ts"],"sourcesContent":["/**\n * Merkle proofs over an append-only list of leaves (RFC 9162 §2.1, the\n * Certificate Transparency tree).\n *\n * A hash chain proves a whole log against its head, but proving one entry means\n * replaying everything before it. This tree proves any one leaf against a root\n * with ⌈log₂ n⌉ hashes (inclusion), and proves that a larger tree only appended\n * to a smaller one (consistency). A verifier holding a root can therefore check\n * a single event, or that a later checkpoint extends an earlier one, without\n * reading the rest of the log.\n *\n * Leaves and interior nodes are domain-separated (0x00 and 0x01 prefixes), so a\n * leaf can never be presented as an interior node. Content that may later be\n * redacted takes a random 32-byte salt: a verifier then needs only the leaf's\n * hash, and short content cannot be guessed back from that hash. The salt must\n * be stored apart from anything that is shared after redaction.\n *\n * Builders refuse malformed input by throwing; verifiers never throw and return\n * a typed outcome, because a proof is external evidence and a bad one is a\n * finding, not a crash.\n */\nimport { sha256Bytes } from '@tangle-network/agent-interface'\nimport { ValidationError } from '../errors'\nimport { LEDGER_HASH_PATTERN, type LedgerHash } from './canonical'\n\n/** Proof that one leaf is at `leafIndex` in a tree of `treeSize` leaves. */\nexport interface MerkleInclusionProof {\n readonly leafIndex: number\n readonly treeSize: number\n readonly path: readonly LedgerHash[]\n}\n\n/** Proof that the first `oldSize` leaves of a `newSize` tree are unchanged. */\nexport interface MerkleConsistencyProof {\n readonly oldSize: number\n readonly newSize: number\n readonly path: readonly LedgerHash[]\n}\n\nexport type MerkleVerification =\n | { readonly verified: true }\n | { readonly verified: false; readonly reason: string }\n\nconst SALT_PATTERN = /^[a-f0-9]{64}$/\nconst LEAF_PREFIX = 0x00\nconst NODE_PREFIX = 0x01\nconst encoder = new TextEncoder()\n\n/** Root of the empty tree: SHA-256 of no bytes. */\nexport const MERKLE_EMPTY_ROOT: LedgerHash = sha256Bytes(new Uint8Array(0)) as LedgerHash\n\n/** A fresh random salt for {@link merkleLeafHash}: 32 bytes as 64 lowercase hex characters. */\nexport function merkleSalt(): string {\n return toHex(globalThis.crypto.getRandomValues(new Uint8Array(32)))\n}\n\n/**\n * Leaf hash of `content`: SHA-256(0x00 ‖ salt ‖ content). Without a salt this is\n * exactly the RFC 9162 leaf hash. Strings are hashed as UTF-8.\n */\nexport function merkleLeafHash(content: Uint8Array | string, salt?: string): LedgerHash {\n const bytes = typeof content === 'string' ? encoder.encode(content) : content\n if (salt === undefined) return digest(LEAF_PREFIX, bytes)\n if (!SALT_PATTERN.test(salt)) {\n throw new ValidationError('merkle salt must be 32 bytes as 64 lowercase hex characters')\n }\n return digest(LEAF_PREFIX, fromHex(salt), bytes)\n}\n\n/** Root over leaf hashes, in order. The empty list has {@link MERKLE_EMPTY_ROOT}. */\nexport function merkleRoot(leaves: readonly LedgerHash[]): LedgerHash {\n const nodes = decodeLeaves(leaves)\n return nodes.length === 0 ? MERKLE_EMPTY_ROOT : toLedgerHash(subtreeRoot(nodes, 0, nodes.length))\n}\n\n/** Inclusion proof for the leaf at `leafIndex` (RFC 9162 §2.1.3.1). */\nexport function merkleInclusionProof(\n leaves: readonly LedgerHash[],\n leafIndex: number,\n): MerkleInclusionProof {\n const nodes = decodeLeaves(leaves)\n if (!Number.isSafeInteger(leafIndex) || leafIndex < 0 || leafIndex >= nodes.length) {\n throw new ValidationError(\n `merkle leaf index ${leafIndex} is outside a tree of ${nodes.length} leaves`,\n )\n }\n const path: Uint8Array[] = []\n inclusionPath(nodes, leafIndex, 0, nodes.length, path)\n return { leafIndex, treeSize: nodes.length, path: path.map(toLedgerHash) }\n}\n\n/**\n * Consistency proof that the first `oldSize` leaves are the tree of that size\n * (RFC 9162 §2.1.4.1). Sizes 0 and `leaves.length` need no path.\n */\nexport function merkleConsistencyProof(\n leaves: readonly LedgerHash[],\n oldSize: number,\n): MerkleConsistencyProof {\n const nodes = decodeLeaves(leaves)\n if (!Number.isSafeInteger(oldSize) || oldSize < 0 || oldSize > nodes.length) {\n throw new ValidationError(\n `merkle old size ${oldSize} is outside a tree of ${nodes.length} leaves`,\n )\n }\n const path: Uint8Array[] = []\n if (oldSize > 0 && oldSize < nodes.length) subproof(nodes, oldSize, 0, nodes.length, true, path)\n return { oldSize, newSize: nodes.length, path: path.map(toLedgerHash) }\n}\n\n/** Check that `leaf` is in the tree with `root` at the proof's index (RFC 9162 §2.1.3.2). */\nexport function verifyMerkleInclusion(\n leaf: LedgerHash,\n proof: MerkleInclusionProof,\n root: LedgerHash,\n): MerkleVerification {\n const { leafIndex, treeSize } = proof\n if (!isSize(treeSize) || !isSize(leafIndex) || leafIndex >= treeSize) {\n return refused(`leaf index ${leafIndex} is outside a tree of ${treeSize} leaves`)\n }\n const decoded = decodeAll([leaf, root, ...proof.path])\n if (decoded === undefined) return refused('proof carries a malformed hash')\n const [leafBytes, rootBytes, ...path] = decoded as [Uint8Array, Uint8Array, ...Uint8Array[]]\n let fn = leafIndex\n let sn = treeSize - 1\n let r = leafBytes\n for (const p of path) {\n if (sn === 0) return refused('proof path is longer than the tree is deep')\n if (fn % 2 === 1 || fn === sn) {\n r = node(p, r)\n if (fn % 2 === 0) {\n while (fn % 2 === 0 && fn !== 0) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n }\n } else {\n r = node(r, p)\n }\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n if (sn !== 0) return refused('proof path is shorter than the tree is deep')\n return equal(r, rootBytes) ? { verified: true } : refused('leaf does not hash to the root')\n}\n\n/** Check that the tree with `newRoot` extends the tree with `oldRoot` (RFC 9162 §2.1.4.2). */\nexport function verifyMerkleConsistency(\n proof: MerkleConsistencyProof,\n oldRoot: LedgerHash,\n newRoot: LedgerHash,\n): MerkleVerification {\n const { oldSize, newSize } = proof\n if (!isSize(oldSize) || !isSize(newSize) || oldSize > newSize) {\n return refused(`old size ${oldSize} does not precede new size ${newSize}`)\n }\n const decoded = decodeAll([oldRoot, newRoot, ...proof.path])\n if (decoded === undefined) return refused('proof carries a malformed hash')\n const [oldBytes, newBytes, ...given] = decoded as [Uint8Array, Uint8Array, ...Uint8Array[]]\n if (oldSize === 0 || oldSize === newSize) {\n if (given.length !== 0) return refused('a trivial consistency proof must be empty')\n if (oldSize === 0) {\n return oldRoot === MERKLE_EMPTY_ROOT\n ? { verified: true }\n : refused('the empty tree has a different root')\n }\n return equal(oldBytes, newBytes)\n ? { verified: true }\n : refused('equal sizes with different roots')\n }\n const path = isPowerOfTwo(oldSize) ? [oldBytes, ...given] : given\n if (path.length === 0) return refused('consistency proof is empty')\n let fn = oldSize - 1\n let sn = newSize - 1\n while (fn % 2 === 1) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n let fr = path[0] as Uint8Array\n let sr = fr\n for (const c of path.slice(1)) {\n if (sn === 0) return refused('proof path is longer than the tree is deep')\n if (fn % 2 === 1 || fn === sn) {\n fr = node(c, fr)\n sr = node(c, sr)\n if (fn % 2 === 0) {\n while (fn % 2 === 0 && fn !== 0) {\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n }\n } else {\n sr = node(sr, c)\n }\n fn = Math.floor(fn / 2)\n sn = Math.floor(sn / 2)\n }\n if (sn !== 0) return refused('proof path is shorter than the tree is deep')\n if (!equal(fr, oldBytes)) return refused('proof does not rebuild the old root')\n if (!equal(sr, newBytes)) return refused('proof does not rebuild the new root')\n return { verified: true }\n}\n\nfunction subtreeRoot(nodes: readonly Uint8Array[], start: number, end: number): Uint8Array {\n if (end - start === 1) return nodes[start] as Uint8Array\n const k = largestPowerOfTwoBelow(end - start)\n return node(subtreeRoot(nodes, start, start + k), subtreeRoot(nodes, start + k, end))\n}\n\nfunction inclusionPath(\n nodes: readonly Uint8Array[],\n index: number,\n start: number,\n end: number,\n path: Uint8Array[],\n): void {\n if (end - start === 1) return\n const k = largestPowerOfTwoBelow(end - start)\n if (index < start + k) {\n inclusionPath(nodes, index, start, start + k, path)\n path.push(subtreeRoot(nodes, start + k, end))\n } else {\n inclusionPath(nodes, index, start + k, end, path)\n path.push(subtreeRoot(nodes, start, start + k))\n }\n}\n\nfunction subproof(\n nodes: readonly Uint8Array[],\n oldSize: number,\n start: number,\n end: number,\n complete: boolean,\n path: Uint8Array[],\n): void {\n if (end - start === oldSize) {\n if (!complete) path.push(subtreeRoot(nodes, start, end))\n return\n }\n const k = largestPowerOfTwoBelow(end - start)\n if (oldSize <= k) {\n subproof(nodes, oldSize, start, start + k, complete, path)\n path.push(subtreeRoot(nodes, start + k, end))\n } else {\n subproof(nodes, oldSize - k, start + k, end, false, path)\n path.push(subtreeRoot(nodes, start, start + k))\n }\n}\n\nfunction node(left: Uint8Array, right: Uint8Array): Uint8Array {\n return fromHex(digest(NODE_PREFIX, left, right).slice('sha256:'.length))\n}\n\nfunction digest(prefix: number, ...parts: Uint8Array[]): LedgerHash {\n const length = parts.reduce((total, part) => total + part.length, 1)\n const bytes = new Uint8Array(length)\n bytes[0] = prefix\n let offset = 1\n for (const part of parts) {\n bytes.set(part, offset)\n offset += part.length\n }\n return sha256Bytes(bytes) as LedgerHash\n}\n\nfunction decodeLeaves(leaves: readonly LedgerHash[]): Uint8Array[] {\n const decoded = decodeAll(leaves)\n if (decoded === undefined) {\n throw new ValidationError('merkle leaves must be sha256:<64 lowercase hex> hashes')\n }\n return decoded\n}\n\nfunction decodeAll(hashes: readonly string[]): Uint8Array[] | undefined {\n const out: Uint8Array[] = []\n for (const hash of hashes) {\n if (typeof hash !== 'string' || !LEDGER_HASH_PATTERN.test(hash)) return undefined\n out.push(fromHex(hash.slice('sha256:'.length)))\n }\n return out\n}\n\nfunction toLedgerHash(bytes: Uint8Array): LedgerHash {\n return `sha256:${toHex(bytes)}`\n}\n\nfunction largestPowerOfTwoBelow(n: number): number {\n let k = 1\n while (k * 2 < n) k *= 2\n return k\n}\n\nfunction isPowerOfTwo(n: number): boolean {\n if (n < 1) return false\n let m = n\n while (m % 2 === 0) m /= 2\n return m === 1\n}\n\nfunction isSize(n: number): boolean {\n return Number.isSafeInteger(n) && n >= 0\n}\n\nfunction equal(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false\n return true\n}\n\nfunction refused(reason: string): MerkleVerification {\n return { verified: false, reason }\n}\n\nfunction toHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\nfunction fromHex(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2)\n for (let i = 0; i < bytes.length; i++) bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16)\n return bytes\n}\n"],"mappings":"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"}
@@ -1,7 +1,110 @@
1
- import { t as AgentEvalError } from "./errors-Dngq5h35.js";
2
- import { c as costForTokenPricing } from "./cost-ledger-D2FnJPBF.js";
1
+ import { t as AgentEvalError } from "./errors-DVZiqS7K.js";
2
+ import { c as costForTokenPricing } from "./cost-ledger-BP8V4kUQ.js";
3
3
  import { t as newRecordId } from "./record-id-DUgsK5qp.js";
4
- import { a as providerFromBaseUrl, i as defaultProviderRedactor } from "./raw-provider-sink-rB2DYxr6.js";
4
+ import { a as providerFromBaseUrl, i as defaultProviderRedactor } from "./raw-provider-sink-DoHz4JNG.js";
5
+ //#region src/llm-client/errors.ts
6
+ var LlmCallError = class extends AgentEvalError {
7
+ status;
8
+ body;
9
+ model;
10
+ constructor(message, status, body, model) {
11
+ super("judge", message);
12
+ this.status = status;
13
+ this.body = body;
14
+ this.model = model;
15
+ }
16
+ };
17
+ /** A provider response completed and incurred measurable usage, but its content
18
+ * could not satisfy the caller's response contract. The response envelope is
19
+ * retained so accounting can commit the receipt before the error propagates. */
20
+ var LlmResponseError = class extends AgentEvalError {
21
+ result;
22
+ constructor(message, result, options) {
23
+ super("judge", message, options);
24
+ this.result = result;
25
+ }
26
+ };
27
+ //#endregion
28
+ //#region src/llm-client/json.ts
29
+ /**
30
+ * Strip a ```json / ``` code fence if the model emitted one.
31
+ * Idempotent for naked JSON. Some models (claude-code via router, certain
32
+ * deepseek models) wrap output even under json_object.
33
+ */
34
+ function stripFencedJson(raw) {
35
+ const trimmed = raw.trim();
36
+ const m = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```\s*$/);
37
+ return m ? m[1].trim() : trimmed;
38
+ }
39
+ function extractJsonPayload(raw) {
40
+ const stripped = stripFencedJson(raw);
41
+ try {
42
+ JSON.parse(stripped);
43
+ return stripped;
44
+ } catch {
45
+ if (stripped.startsWith("{") || stripped.startsWith("[")) return stripped;
46
+ }
47
+ const starts = [...stripped.matchAll(/[[{]/g)].map((match) => match.index).filter((index) => index != null);
48
+ for (const start of starts) {
49
+ const candidate = extractBalancedJson(stripped, start);
50
+ if (!candidate) continue;
51
+ try {
52
+ JSON.parse(candidate);
53
+ return candidate;
54
+ } catch {}
55
+ }
56
+ return stripped;
57
+ }
58
+ function extractBalancedJson(input, start) {
59
+ const opener = input[start];
60
+ const closer = opener === "{" ? "}" : opener === "[" ? "]" : null;
61
+ if (!closer) return null;
62
+ const stack = [closer];
63
+ let isInString = false;
64
+ let isEscaped = false;
65
+ for (let i = start + 1; i < input.length; i++) {
66
+ const char = input[i];
67
+ if (isEscaped) {
68
+ isEscaped = false;
69
+ continue;
70
+ }
71
+ if (char === "\\") {
72
+ isEscaped = isInString;
73
+ continue;
74
+ }
75
+ if (char === "\"") {
76
+ isInString = !isInString;
77
+ continue;
78
+ }
79
+ if (isInString) continue;
80
+ if (char === "{") stack.push("}");
81
+ else if (char === "[") stack.push("]");
82
+ else if (char === stack[stack.length - 1]) {
83
+ stack.pop();
84
+ if (stack.length === 0) return input.slice(start, i + 1);
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ function parseJsonResult(result, jsonPayloadMode) {
90
+ try {
91
+ if (result.finishReason === "length") throw new Error(`LLM returned truncated JSON content (model=${result.model}, finishReason=length)`);
92
+ return parseJsonSafely(result.content, result.model, jsonPayloadMode);
93
+ } catch (error) {
94
+ if (error instanceof LlmResponseError) throw error;
95
+ const cause = error instanceof Error ? error : new Error(String(error));
96
+ throw new LlmResponseError(cause.message, result, { cause });
97
+ }
98
+ }
99
+ function parseJsonSafely(content, model, jsonPayloadMode) {
100
+ const payload = jsonPayloadMode === "exact" ? content : extractJsonPayload(content);
101
+ try {
102
+ return JSON.parse(payload);
103
+ } catch {
104
+ throw new Error(`LLM returned non-JSON content (model=${model})`);
105
+ }
106
+ }
107
+ //#endregion
5
108
  //#region src/abort-signal.ts
6
109
  /** Combine active cancellation sources without wrapping a single source. */
7
110
  function combineAbortSignals(...signals) {
@@ -285,112 +388,7 @@ function assertCrossFamilyServed(pairs, opts = {}) {
285
388
  return list;
286
389
  }
287
390
  //#endregion
288
- //#region src/llm-client.ts
289
- /**
290
- * OpenAI-compatible client. The CLASS is internal; one transport now drives it
291
- * for public callers.
292
- *
293
- * agent-eval never goes looking for a credential — it reads no environment
294
- * variable to find one — and this module is still not reachable through any
295
- * export subpath. What reaches a consumer is `createChatClient({ transport:
296
- * 'openai-compatible', baseUrl, apiKey })`, the sanctioned public route, which
297
- * constructs this client from an endpoint and a credential the caller passed as
298
- * values. Anything richer than that transport's options stays in-repo.
299
- *
300
- * Three in-repo callers hold the class directly:
301
- * - `src/analyst/chat-client.ts`, the public transport above;
302
- * - the `agent-eval` binary (`src/cli-config.ts`), a deployed server whose
303
- * caller is a JSON-RPC client in another language and which therefore
304
- * configures its own endpoint from its own environment;
305
- * - the loopback optimizer proxy path (`src/analyst/benchmark-public-model.ts`,
306
- * `src/analyst/dspy-rlm-engine.ts`), which targets `http://127.0.0.1:<port>/v1`
307
- * with an ephemeral token and executes nothing itself.
308
- *
309
- * The canonical request/result TYPES it defines ARE public — they are the
310
- * contract every caller-owned transport speaks.
311
- *
312
- * OpenAI-compatible `/v1/chat/completions` client with:
313
- * - Exponential-backoff retry on 429 + 5xx gateway errors (502/503/504).
314
- * - Retry on transient network errors (fetch failed, AbortError, ECONNRESET).
315
- * - One retry at temperature 1 when a model explicitly requires it.
316
- * - Graceful json_schema → json_object degrade on 400 with schema-reject body.
317
- * - Fenced-JSON stripping (```json ... ```) for models that wrap structured output.
318
- * - Configurable base URL + api key / bearer, works with LiteLLM proxies, OpenAI
319
- * directly, cli-bridge subscriptions, and any router that speaks the spec.
320
- *
321
- * Usage:
322
- * const { value, result } = await callLlmJson<MyType>(
323
- * { model: 'gpt-4o', messages: [...], jsonSchema: { name: 'x', schema: {...} } },
324
- * { baseUrl: process.env.AGENT_EVAL_LLM_BASE_URL, apiKey: process.env.AGENT_EVAL_LLM_API_KEY },
325
- * )
326
- *
327
- */
328
- function maximumChargeForLlmRequest(request, options = {}) {
329
- if (request.maxTokens === void 0) return void 0;
330
- if (!Number.isInteger(request.maxTokens) || request.maxTokens <= 0) throw new RangeError(`maximumChargeForLlmRequest: maxTokens must be a positive integer`);
331
- if (request.messages.some((message) => Array.isArray(message.content) && message.content.some((part) => part.type === "image_url"))) return;
332
- const attempts = resolveMaximumAttempts(options.maximumAttempts);
333
- const forceJsonObject = options.jsonSchemaTransport === "json-object";
334
- const usage = {
335
- inputTokens: new TextEncoder().encode(JSON.stringify(buildBody(request, forceJsonObject, options.thinking))).byteLength * attempts,
336
- outputTokens: request.maxTokens * attempts
337
- };
338
- return options.customTokenPricing ? {
339
- customTokenPricing: options.customTokenPricing,
340
- ...usage
341
- } : {
342
- model: request.model,
343
- ...usage
344
- };
345
- }
346
- /** Convert a provider result into the canonical paid-call receipt input.
347
- * The receipt is JSON-clean: absent optional fields are omitted, never carried
348
- * as explicit-undefined keys. Receipts cross JSON boundaries (the external
349
- * optimizer's loopback proxy validates them with `assertJsonValue`), where an
350
- * explicit-undefined value is rejected as non-serializable. */
351
- function costReceiptFromLlm(result, customTokenPricing) {
352
- const cachedTokens = result.usage.cachedPromptTokens ?? 0;
353
- const inputTokens = Math.max(0, result.usage.promptTokens - cachedTokens);
354
- const providerCostUsd = providerReportedCost(result.raw);
355
- return {
356
- model: result.model,
357
- inputTokens,
358
- outputTokens: result.usage.completionTokens,
359
- ...result.usage.reasoningTokens === void 0 ? {} : { reasoningTokens: result.usage.reasoningTokens },
360
- ...cachedTokens > 0 ? { cachedTokens } : {},
361
- ...providerCostUsd === void 0 ? customTokenPricing && result.usage.captured !== false ? { customTokenPricing } : result.costUsd === null ? {} : { estimatedCostUsd: result.costUsd } : { actualCostUsd: providerCostUsd },
362
- usageUnknown: result.usage.captured === false
363
- };
364
- }
365
- function providerReportedCost(raw) {
366
- const value = raw._response_cost ?? raw.cost_usd;
367
- return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
368
- }
369
- /** Structured-response failures retain their completed provider receipt. */
370
- function costReceiptFromLlmError(error, customTokenPricing) {
371
- return error instanceof LlmResponseError ? costReceiptFromLlm(error.result, customTokenPricing) : void 0;
372
- }
373
- var LlmCallError = class extends AgentEvalError {
374
- status;
375
- body;
376
- model;
377
- constructor(message, status, body, model) {
378
- super("judge", message);
379
- this.status = status;
380
- this.body = body;
381
- this.model = model;
382
- }
383
- };
384
- /** A provider response completed and incurred measurable usage, but its content
385
- * could not satisfy the caller's response contract. The response envelope is
386
- * retained so accounting can commit the receipt before the error propagates. */
387
- var LlmResponseError = class extends AgentEvalError {
388
- result;
389
- constructor(message, result, options) {
390
- super("judge", message, options);
391
- this.result = result;
392
- }
393
- };
391
+ //#region src/llm-client/resilience.ts
394
392
  const DEFAULT_TIMEOUT_MS = Number(process.env.TANGLE_LLM_TIMEOUT_MS) || 3e5;
395
393
  const DEFAULT_MAXIMUM_ATTEMPTS = process.env.TANGLE_LLM_MAXIMUM_ATTEMPTS === void 0 ? 6 : Number(process.env.TANGLE_LLM_MAXIMUM_ATTEMPTS);
396
394
  function resolveMaximumAttempts(configured) {
@@ -412,9 +410,6 @@ function pacingStateFor(opts) {
412
410
  }
413
411
  return state;
414
412
  }
415
- function providerTokenCount(value) {
416
- return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0;
417
- }
418
413
  const RETRYABLE_STATUS = /* @__PURE__ */ new Set([
419
414
  429,
420
415
  502,
@@ -489,6 +484,35 @@ function parseRetryAfter(headers) {
489
484
  function backoffMs(attempt) {
490
485
  return Math.min(500 * 2 ** attempt, 16e3);
491
486
  }
487
+ /** Backoff belongs to the caller's operation and must stop when it is cancelled. */
488
+ async function sleep(ms, signal) {
489
+ do {
490
+ signal?.throwIfAborted();
491
+ const chunk = Math.min(Math.ceil(ms), 2147483647);
492
+ await new Promise((resolve, reject) => {
493
+ const onAbort = () => {
494
+ clearTimeout(timer);
495
+ signal?.removeEventListener("abort", onAbort);
496
+ reject(signal?.reason);
497
+ };
498
+ const timer = setTimeout(() => {
499
+ signal?.removeEventListener("abort", onAbort);
500
+ resolve();
501
+ }, chunk);
502
+ signal?.addEventListener("abort", onAbort, { once: true });
503
+ });
504
+ ms -= chunk;
505
+ } while (ms > 0);
506
+ }
507
+ /** True once the cross-attempt wall-clock budget (if any) is exhausted. */
508
+ function deadlineExceeded(start, deadlineMs) {
509
+ return deadlineMs != null && Date.now() - start >= deadlineMs;
510
+ }
511
+ //#endregion
512
+ //#region src/llm-client/wire.ts
513
+ function providerTokenCount(value) {
514
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0;
515
+ }
492
516
  function buildHeaders(opts) {
493
517
  const headers = {
494
518
  "Content-Type": "application/json",
@@ -609,90 +633,55 @@ function parseWireToolCalls(value, model) {
609
633
  };
610
634
  });
611
635
  }
612
- /** Backoff belongs to the caller's operation and must stop when it is cancelled. */
613
- async function sleep(ms, signal) {
614
- do {
615
- signal?.throwIfAborted();
616
- const chunk = Math.min(Math.ceil(ms), 2147483647);
617
- await new Promise((resolve, reject) => {
618
- const onAbort = () => {
619
- clearTimeout(timer);
620
- signal?.removeEventListener("abort", onAbort);
621
- reject(signal?.reason);
622
- };
623
- const timer = setTimeout(() => {
624
- signal?.removeEventListener("abort", onAbort);
625
- resolve();
626
- }, chunk);
627
- signal?.addEventListener("abort", onAbort, { once: true });
628
- });
629
- ms -= chunk;
630
- } while (ms > 0);
631
- }
632
- /** True once the cross-attempt wall-clock budget (if any) is exhausted. */
633
- function deadlineExceeded(start, deadlineMs) {
634
- return deadlineMs != null && Date.now() - start >= deadlineMs;
636
+ //#endregion
637
+ //#region src/llm-client/accounting.ts
638
+ function maximumChargeForLlmRequest(request, options = {}) {
639
+ if (request.maxTokens === void 0) return void 0;
640
+ if (!Number.isInteger(request.maxTokens) || request.maxTokens <= 0) throw new RangeError(`maximumChargeForLlmRequest: maxTokens must be a positive integer`);
641
+ if (request.messages.some((message) => Array.isArray(message.content) && message.content.some((part) => part.type === "image_url"))) return;
642
+ const attempts = resolveMaximumAttempts(options.maximumAttempts);
643
+ const forceJsonObject = options.jsonSchemaTransport === "json-object";
644
+ const usage = {
645
+ inputTokens: new TextEncoder().encode(JSON.stringify(buildBody(request, forceJsonObject, options.thinking))).byteLength * attempts,
646
+ outputTokens: request.maxTokens * attempts
647
+ };
648
+ return options.customTokenPricing ? {
649
+ customTokenPricing: options.customTokenPricing,
650
+ ...usage
651
+ } : {
652
+ model: request.model,
653
+ ...usage
654
+ };
635
655
  }
636
- /**
637
- * Strip a ```json / ``` code fence if the model emitted one.
638
- * Idempotent for naked JSON. Some models (claude-code via router, certain
639
- * deepseek models) wrap output even under json_object.
640
- */
641
- function stripFencedJson(raw) {
642
- const trimmed = raw.trim();
643
- const m = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```\s*$/);
644
- return m ? m[1].trim() : trimmed;
656
+ /** Convert a provider result into the canonical paid-call receipt input.
657
+ * The receipt is JSON-clean: absent optional fields are omitted, never carried
658
+ * as explicit-undefined keys. Receipts cross JSON boundaries (the external
659
+ * optimizer's loopback proxy validates them with `assertJsonValue`), where an
660
+ * explicit-undefined value is rejected as non-serializable. */
661
+ function costReceiptFromLlm(result, customTokenPricing) {
662
+ const cachedTokens = result.usage.cachedPromptTokens ?? 0;
663
+ const inputTokens = Math.max(0, result.usage.promptTokens - cachedTokens);
664
+ const providerCostUsd = providerReportedCost(result.raw);
665
+ return {
666
+ model: result.model,
667
+ inputTokens,
668
+ outputTokens: result.usage.completionTokens,
669
+ ...result.usage.reasoningTokens === void 0 ? {} : { reasoningTokens: result.usage.reasoningTokens },
670
+ ...cachedTokens > 0 ? { cachedTokens } : {},
671
+ ...providerCostUsd === void 0 ? customTokenPricing && result.usage.captured !== false ? { customTokenPricing } : result.costUsd === null ? {} : { estimatedCostUsd: result.costUsd } : { actualCostUsd: providerCostUsd },
672
+ usageUnknown: result.usage.captured === false
673
+ };
645
674
  }
646
- function extractJsonPayload(raw) {
647
- const stripped = stripFencedJson(raw);
648
- try {
649
- JSON.parse(stripped);
650
- return stripped;
651
- } catch {
652
- if (stripped.startsWith("{") || stripped.startsWith("[")) return stripped;
653
- }
654
- const starts = [...stripped.matchAll(/[[{]/g)].map((match) => match.index).filter((index) => index != null);
655
- for (const start of starts) {
656
- const candidate = extractBalancedJson(stripped, start);
657
- if (!candidate) continue;
658
- try {
659
- JSON.parse(candidate);
660
- return candidate;
661
- } catch {}
662
- }
663
- return stripped;
675
+ function providerReportedCost(raw) {
676
+ const value = raw._response_cost ?? raw.cost_usd;
677
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
664
678
  }
665
- function extractBalancedJson(input, start) {
666
- const opener = input[start];
667
- const closer = opener === "{" ? "}" : opener === "[" ? "]" : null;
668
- if (!closer) return null;
669
- const stack = [closer];
670
- let isInString = false;
671
- let isEscaped = false;
672
- for (let i = start + 1; i < input.length; i++) {
673
- const char = input[i];
674
- if (isEscaped) {
675
- isEscaped = false;
676
- continue;
677
- }
678
- if (char === "\\") {
679
- isEscaped = isInString;
680
- continue;
681
- }
682
- if (char === "\"") {
683
- isInString = !isInString;
684
- continue;
685
- }
686
- if (isInString) continue;
687
- if (char === "{") stack.push("}");
688
- else if (char === "[") stack.push("]");
689
- else if (char === stack[stack.length - 1]) {
690
- stack.pop();
691
- if (stack.length === 0) return input.slice(start, i + 1);
692
- }
693
- }
694
- return null;
679
+ /** Structured-response failures retain their completed provider receipt. */
680
+ function costReceiptFromLlmError(error, customTokenPricing) {
681
+ return error instanceof LlmResponseError ? costReceiptFromLlm(error.result, customTokenPricing) : void 0;
695
682
  }
683
+ //#endregion
684
+ //#region src/llm-client/request.ts
696
685
  /**
697
686
  * Low-level call. Returns raw content + usage + cost. Retries on transient
698
687
  * failures; does NOT degrade schema here — callers that want graceful
@@ -977,6 +966,15 @@ function headersToObject(h) {
977
966
  });
978
967
  return out;
979
968
  }
969
+ /** Shared schema-to-JSON-mode fallback that preserves the raw result. */
970
+ async function callLlmStructured(req, opts = {}) {
971
+ return callLlmAttempts({
972
+ ...req,
973
+ jsonMode: req.jsonMode ?? !req.jsonSchema
974
+ }, opts, true);
975
+ }
976
+ //#endregion
977
+ //#region src/llm-client.ts
980
978
  /**
981
979
  * Structured-output call. Returns parsed JSON plus the raw result envelope.
982
980
  * Degrades `jsonSchema` → `jsonMode` on a 400 that names the schema param —
@@ -990,31 +988,6 @@ async function callLlmJson(req, opts = {}) {
990
988
  result
991
989
  };
992
990
  }
993
- /** Shared schema-to-JSON-mode fallback that preserves the raw result. */
994
- async function callLlmStructured(req, opts = {}) {
995
- return callLlmAttempts({
996
- ...req,
997
- jsonMode: req.jsonMode ?? !req.jsonSchema
998
- }, opts, true);
999
- }
1000
- function parseJsonResult(result, jsonPayloadMode) {
1001
- try {
1002
- if (result.finishReason === "length") throw new Error(`LLM returned truncated JSON content (model=${result.model}, finishReason=length)`);
1003
- return parseJsonSafely(result.content, result.model, jsonPayloadMode);
1004
- } catch (error) {
1005
- if (error instanceof LlmResponseError) throw error;
1006
- const cause = error instanceof Error ? error : new Error(String(error));
1007
- throw new LlmResponseError(cause.message, result, { cause });
1008
- }
1009
- }
1010
- function parseJsonSafely(content, model, jsonPayloadMode) {
1011
- const payload = jsonPayloadMode === "exact" ? content : extractJsonPayload(content);
1012
- try {
1013
- return JSON.parse(payload);
1014
- } catch {
1015
- throw new Error(`LLM returned non-JSON content (model=${model})`);
1016
- }
1017
- }
1018
991
  /**
1019
992
  * Stateful client — construct once with defaults, call many times.
1020
993
  * Thin wrapper around the free functions; exists for callers that want
@@ -1045,6 +1018,6 @@ var LlmClient = class {
1045
1018
  }
1046
1019
  };
1047
1020
  //#endregion
1048
- export { combineAbortSignals as C, judgeFamily as S, assertServedModels as _, callLlmJson as a, CrossFamilyError as b, extractJsonPayload as c, stripFencedJson as d, ModelSubstitutionError as f, assertServedModelPolicy as g, assertServedModel as h, backoffMs as i, isTransientLlmError as l, assertCrossFamilyServed as m, LlmClient as n, costReceiptFromLlm as o, ServedCrossFamilyError as p, LlmResponseError as r, costReceiptFromLlmError as s, LlmCallError as t, maximumChargeForLlmRequest as u, checkServedModel as v, assertCrossFamily as x, servedModelAcceptable as y };
1021
+ export { LlmResponseError as C, LlmCallError as S, assertCrossFamily as _, maximumChargeForLlmRequest as a, extractJsonPayload as b, ModelSubstitutionError as c, assertServedModel as d, assertServedModelPolicy as f, CrossFamilyError as g, servedModelAcceptable as h, costReceiptFromLlmError as i, ServedCrossFamilyError as l, checkServedModel as m, callLlmJson as n, backoffMs as o, assertServedModels as p, costReceiptFromLlm as r, isTransientLlmError as s, LlmClient as t, assertCrossFamilyServed as u, judgeFamily as v, stripFencedJson as x, combineAbortSignals as y };
1049
1022
 
1050
- //# sourceMappingURL=llm-client-DQveoxSM.js.map
1023
+ //# sourceMappingURL=llm-client-CyBAoYiX.js.map