@tangle-network/agent-eval 0.216.0 → 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.
- package/CHANGELOG.md +39 -0
- package/dist/adapters/http.d.ts +3 -3
- package/dist/{agent-profile-CIA2Atnt.d.ts → agent-profile-VFcQncbW.d.ts} +5 -5
- package/dist/{agent-profile-CIA2Atnt.d.ts.map → agent-profile-VFcQncbW.d.ts.map} +1 -1
- package/dist/{agent-profile-cell-BYc0bxsL.js → agent-profile-cell-BK8mlqlq.js} +3 -3
- package/dist/{agent-profile-cell-BYc0bxsL.js.map → agent-profile-cell-BK8mlqlq.js.map} +1 -1
- package/dist/{agreement-irr-DsTURxdr.js → agreement-irr-BEWLIF3_.js} +3 -3
- package/dist/{agreement-irr-DsTURxdr.js.map → agreement-irr-BEWLIF3_.js.map} +1 -1
- package/dist/analyst/index.d.ts +14 -14
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +15 -15
- package/dist/{analyze-runs-3xpby3p2.js → analyze-runs-C84irm4i.js} +608 -604
- package/dist/analyze-runs-C84irm4i.js.map +1 -0
- package/dist/{analyze-runs-CSDAh8A7.d.ts → analyze-runs-D68fd-su.d.ts} +17 -15
- package/dist/analyze-runs-D68fd-su.d.ts.map +1 -0
- package/dist/{baseline-Dm8966du.js → baseline-Udi_PLuT.js} +5 -5
- package/dist/{baseline-Dm8966du.js.map → baseline-Udi_PLuT.js.map} +1 -1
- package/dist/{benchmark-BywPeAUo.js → benchmark-CXmVVHH2.js} +2 -2
- package/dist/{benchmark-BywPeAUo.js.map → benchmark-CXmVVHH2.js.map} +1 -1
- package/dist/{benchmark-command-CByl9dxG.js → benchmark-command-By0vh8q7.js} +62 -45
- package/dist/benchmark-command-By0vh8q7.js.map +1 -0
- package/dist/benchmarks/index.d.ts +5 -5
- package/dist/benchmarks/index.js +3 -3
- package/dist/builder-eval/index.js +2 -2
- package/dist/campaign/index.d.ts +7 -7
- package/dist/campaign/index.js +13 -13
- package/dist/{campaign-BQ-Jujuj.js → campaign-BudZ70zo.js} +245 -247
- package/dist/campaign-BudZ70zo.js.map +1 -0
- package/dist/{campaign-evidence-OcUciD-N.js → campaign-evidence-Clrn4hBV.js} +8 -8
- package/dist/campaign-evidence-Clrn4hBV.js.map +1 -0
- package/dist/{canonical-BsZVgBhW.js → canonical-B2RqLofv.js} +2 -2
- package/dist/{canonical-BsZVgBhW.js.map → canonical-B2RqLofv.js.map} +1 -1
- package/dist/{chat-client-DthPOYGd.js → chat-client-l-MVDlDk.js} +2 -2
- package/dist/{chat-client-DthPOYGd.js.map → chat-client-l-MVDlDk.js.map} +1 -1
- package/dist/{chat-json-call-BrKsyspg.js → chat-json-call-puMArmtW.js} +2 -2
- package/dist/{chat-json-call-BrKsyspg.js.map → chat-json-call-puMArmtW.js.map} +1 -1
- package/dist/{claim-BXcZw-jo.js → claim-q4HQhK1G.js} +4 -4
- package/dist/claim-q4HQhK1G.js.map +1 -0
- package/dist/cli.js +9 -9
- package/dist/cli.js.map +1 -1
- package/dist/{cluster-bootstrap-B3JywQQn.js → cluster-bootstrap-qcUWYFl-.js} +3 -3
- package/dist/{cluster-bootstrap-B3JywQQn.js.map → cluster-bootstrap-qcUWYFl-.js.map} +1 -1
- package/dist/contract/index.d.ts +11 -11
- package/dist/contract/index.js +1022 -1078
- package/dist/contract/index.js.map +1 -1
- package/dist/{cost-ledger-D2FnJPBF.js → cost-ledger-BP8V4kUQ.js} +835 -816
- package/dist/cost-ledger-BP8V4kUQ.js.map +1 -0
- package/dist/{cost-ledger-CO7UyEcQ.d.ts → cost-ledger-Jk62OBfF.d.ts} +12 -47
- package/dist/cost-ledger-Jk62OBfF.d.ts.map +1 -0
- package/dist/{counterfactual-DtMWvn7D.js → counterfactual-Dn3veueY.js} +2 -2
- package/dist/{counterfactual-DtMWvn7D.js.map → counterfactual-Dn3veueY.js.map} +1 -1
- package/dist/{default-registry-Cn1LQ2Ve.js → default-registry-COhk9g36.js} +5 -5
- package/dist/{default-registry-Cn1LQ2Ve.js.map → default-registry-COhk9g36.js.map} +1 -1
- package/dist/{default-registry-BrWh62zf.d.ts → default-registry-DzHiGruW.d.ts} +6 -6
- package/dist/{default-registry-BrWh62zf.d.ts.map → default-registry-DzHiGruW.d.ts.map} +1 -1
- package/dist/{define-agent-eval-Ch3MWX6k.js → define-agent-eval-CNTPzIkp.js} +10 -10
- package/dist/define-agent-eval-CNTPzIkp.js.map +1 -0
- package/dist/{define-agent-eval-CEWkX5wZ.d.ts → define-agent-eval-WSck0CZJ.d.ts} +8 -8
- package/dist/{define-agent-eval-CEWkX5wZ.d.ts.map → define-agent-eval-WSck0CZJ.d.ts.map} +1 -1
- package/dist/{descriptive-CnU8Yq29.js → descriptive-DboxPZrG.js} +2 -2
- package/dist/{descriptive-CnU8Yq29.js.map → descriptive-DboxPZrG.js.map} +1 -1
- package/dist/diagnosis/index.d.ts +3 -3
- package/dist/diagnosis/index.js +4 -4
- package/dist/{dspy-rlm-engine-D-KX_e64.js → dspy-rlm-engine-LRCu61m5.js} +3 -3
- package/dist/{dspy-rlm-engine-D-KX_e64.js.map → dspy-rlm-engine-LRCu61m5.js.map} +1 -1
- package/dist/{effect-sizes-DiH8MGOH.js → effect-sizes-BhzEpXMc.js} +2 -2
- package/dist/{effect-sizes-DiH8MGOH.js.map → effect-sizes-BhzEpXMc.js.map} +1 -1
- package/dist/{engine-C_zNWfM8.d.ts → engine-3A_4jOlI.d.ts} +5 -5
- package/dist/{engine-C_zNWfM8.d.ts.map → engine-3A_4jOlI.d.ts.map} +1 -1
- package/dist/{equal-terms-Blx9Zk5I.js → equal-terms-BtdXayCJ.js} +2 -2
- package/dist/{equal-terms-Blx9Zk5I.js.map → equal-terms-BtdXayCJ.js.map} +1 -1
- package/dist/{errors-Dngq5h35.js → errors-DVZiqS7K.js} +6 -2
- package/dist/{errors-Dngq5h35.js.map → errors-DVZiqS7K.js.map} +1 -1
- package/dist/{eval-campaign-4byTtqrf.js → eval-campaign-90jeaCAI.js} +6 -6
- package/dist/{eval-campaign-4byTtqrf.js.map → eval-campaign-90jeaCAI.js.map} +1 -1
- package/dist/{evaluation-Cn2dRZIz.d.ts → evaluation-6Yoi74gM.d.ts} +4 -4
- package/dist/{evaluation-Cn2dRZIz.d.ts.map → evaluation-6Yoi74gM.d.ts.map} +1 -1
- package/dist/evaluation.d.ts +1 -1
- package/dist/evaluation.js +1 -1
- package/dist/{exact-types-CD0lf5Qd.d.ts → exact-types-ClugMJfI.d.ts} +2 -2
- package/dist/{exact-types-CD0lf5Qd.d.ts.map → exact-types-ClugMJfI.d.ts.map} +1 -1
- package/dist/experiment/index.d.ts +404 -3
- package/dist/experiment/index.d.ts.map +1 -1
- package/dist/experiment/index.js +313 -19
- package/dist/experiment/index.js.map +1 -1
- package/dist/{external-optimizer-process-nnsY5D_4.js → external-optimizer-process-BjMGUuds.js} +3 -3
- package/dist/{external-optimizer-process-nnsY5D_4.js.map → external-optimizer-process-BjMGUuds.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-DcerlZSG.js → external-optimizer-subprocess-BqW0hHcI.js} +548 -548
- package/dist/external-optimizer-subprocess-BqW0hHcI.js.map +1 -0
- package/dist/{feedback-trajectory-DkaDj0dj.d.ts → feedback-trajectory-C4EG0nNH.d.ts} +5 -8
- package/dist/feedback-trajectory-C4EG0nNH.d.ts.map +1 -0
- package/dist/fuzz.d.ts +1 -1
- package/dist/fuzz.js +3 -3
- package/dist/hosted/index.js +1 -1
- package/dist/{index-CPJJr98o.d.ts → index-BFRO6chs.d.ts} +3 -2
- package/dist/index-BFRO6chs.d.ts.map +1 -0
- package/dist/{index-Ch9VxCpK.d.ts → index-BO41eGj5.d.ts} +2 -2
- package/dist/{index-Ch9VxCpK.d.ts.map → index-BO41eGj5.d.ts.map} +1 -1
- package/dist/{index-NvGBiO8H.d.ts → index-CyszSg4O.d.ts} +165 -162
- package/dist/index-CyszSg4O.d.ts.map +1 -0
- package/dist/{index-DlH0Y9gI.d.ts → index-DPcngtwt.d.ts} +30 -17
- package/dist/index-DPcngtwt.d.ts.map +1 -0
- package/dist/{index-oQ4aHziK.d.ts → index-DV-jSzxF.d.ts} +8 -8
- package/dist/{index-oQ4aHziK.d.ts.map → index-DV-jSzxF.d.ts.map} +1 -1
- package/dist/index.d.ts +1969 -1871
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +161 -201
- package/dist/index.js.map +1 -1
- package/dist/{integrity-BvnVARVl.js → integrity-BXOsAb3i.js} +2 -2
- package/dist/{integrity-BvnVARVl.js.map → integrity-BXOsAb3i.js.map} +1 -1
- package/dist/{integrity-CCAxGVK6.d.ts → integrity-DAMEDFaC.d.ts} +2 -2
- package/dist/{integrity-CCAxGVK6.d.ts.map → integrity-DAMEDFaC.d.ts.map} +1 -1
- package/dist/{integrity-BV1ZDf42.js → integrity-dLiDe2kD.js} +2 -5
- package/dist/integrity-dLiDe2kD.js.map +1 -0
- package/dist/{internal-CRHwS9iz.js → internal-Epl-YBZW.js} +3 -3
- package/dist/{internal-CRHwS9iz.js.map → internal-Epl-YBZW.js.map} +1 -1
- package/dist/interval-CELpye1n.js +219 -0
- package/dist/interval-CELpye1n.js.map +1 -0
- package/dist/interval-ohuOJurX.d.ts +47 -0
- package/dist/interval-ohuOJurX.d.ts.map +1 -0
- package/dist/{journal-DvKCvjty.js → journal-DfRz9kps.js} +2 -2
- package/dist/{journal-DvKCvjty.js.map → journal-DfRz9kps.js.map} +1 -1
- package/dist/{judge-calibration-N44V04Se.js → judge-calibration-BpCy5XQl.js} +3 -3
- package/dist/{judge-calibration-N44V04Se.js.map → judge-calibration-BpCy5XQl.js.map} +1 -1
- package/dist/{judge-gate-DNcUrRFA.d.ts → judge-gate-CE7CQAgt.d.ts} +3 -3
- package/dist/{judge-gate-DNcUrRFA.d.ts.map → judge-gate-CE7CQAgt.d.ts.map} +1 -1
- package/dist/{judge-gate-B1qYnkpi.js → judge-gate-iY9s4L44.js} +3 -3
- package/dist/judge-gate-iY9s4L44.js.map +1 -0
- package/dist/{kind-factory-CbZ-6tvu.js → kind-factory-BobI5Jy3.js} +4 -4
- package/dist/{kind-factory-CbZ-6tvu.js.map → kind-factory-BobI5Jy3.js.map} +1 -1
- package/dist/ledger-core/index.js +3 -3
- package/dist/{ledger-core-B2hahzrt.js → ledger-core-Gq7yp8lP.js} +4 -4
- package/dist/{ledger-core-B2hahzrt.js.map → ledger-core-Gq7yp8lP.js.map} +1 -1
- package/dist/{llm-client-DQveoxSM.js → llm-client-CyBAoYiX.js} +192 -219
- package/dist/llm-client-CyBAoYiX.js.map +1 -0
- package/dist/{llm-judge-PXV7Xljl.js → llm-judge-CG12SQJq.js} +499 -921
- package/dist/llm-judge-CG12SQJq.js.map +1 -0
- package/dist/matrix/index.d.ts +2 -2
- package/dist/matrix/index.js +1 -1
- package/dist/{matrix-CHMiebFx.d.ts → matrix-DSrSxjjy.d.ts} +4 -4
- package/dist/{matrix-CHMiebFx.d.ts.map → matrix-DSrSxjjy.d.ts.map} +1 -1
- package/dist/{matrix-_BV9-Lk5.js → matrix-Dm0BQW7U.js} +7 -11
- package/dist/matrix-Dm0BQW7U.js.map +1 -0
- package/dist/{paired-tests-jbwPdSz5.js → mean-DHoMiudD.js} +11 -5
- package/dist/mean-DHoMiudD.js.map +1 -0
- package/dist/meta-eval/index.d.ts +3 -3
- package/dist/meta-eval/index.js +9 -9
- package/dist/meta-eval/index.js.map +1 -1
- package/dist/mint-DNU8QPG4.d.ts +81 -0
- package/dist/mint-DNU8QPG4.d.ts.map +1 -0
- package/dist/{mint-Csor1BLJ.js → mint-QaD5cA0u.js} +3 -3
- package/dist/{mint-Csor1BLJ.js.map → mint-QaD5cA0u.js.map} +1 -1
- package/dist/{multiplicity-D9cjmStq.js → multiplicity-DQUFcbW4.js} +2 -2
- package/dist/{multiplicity-D9cjmStq.js.map → multiplicity-DQUFcbW4.js.map} +1 -1
- package/dist/multishot/golden/index.d.ts +1 -1
- package/dist/multishot/golden/index.d.ts.map +1 -1
- package/dist/multishot/golden/index.js +3 -6
- package/dist/multishot/golden/index.js.map +1 -1
- package/dist/multishot/index.d.ts +2 -2
- package/dist/multishot/index.js +1 -1
- package/dist/nonnegative-number-DvdMxg_f.js +9 -0
- package/dist/nonnegative-number-DvdMxg_f.js.map +1 -0
- package/dist/openapi.json +1 -1
- package/dist/{otel-spans-C8YIJWy1.js → otel-spans-B9tUXRHF.js} +3 -3
- package/dist/{otel-spans-C8YIJWy1.js.map → otel-spans-B9tUXRHF.js.map} +1 -1
- package/dist/{paired-arms-DzKn0TfY.js → paired-arms-CwMGJsrS.js} +5 -5
- package/dist/{paired-arms-DzKn0TfY.js.map → paired-arms-CwMGJsrS.js.map} +1 -1
- package/dist/{paired-binary-Q36bhn2R.js → paired-binary-CvpFHfKZ.js} +2 -2
- package/dist/{paired-binary-Q36bhn2R.js.map → paired-binary-CvpFHfKZ.js.map} +1 -1
- package/dist/{paired-promotion-decision-BN6IQTiu.js → paired-promotion-decision-DsAPYGCm.js} +3 -3
- package/dist/{paired-promotion-decision-BN6IQTiu.js.map → paired-promotion-decision-DsAPYGCm.js.map} +1 -1
- package/dist/{search-kernel-BztlERLv.js → pareto-Cm6ndrWN.js} +883 -861
- package/dist/pareto-Cm6ndrWN.js.map +1 -0
- package/dist/pipelines/index.d.ts +2 -2
- package/dist/pipelines/index.js +3 -3
- package/dist/{power-and-mde-fK5Qocwo.js → power-and-mde-Hj2ubb4B.js} +2 -2
- package/dist/{power-and-mde-fK5Qocwo.js.map → power-and-mde-Hj2ubb4B.js.map} +1 -1
- package/dist/predicate-FdKmElA_.js +38 -0
- package/dist/predicate-FdKmElA_.js.map +1 -0
- package/dist/{prime-protocol-DcAK9pC8.js → prime-protocol-CHKgA3a6.js} +2 -2
- package/dist/{prime-protocol-DcAK9pC8.js.map → prime-protocol-CHKgA3a6.js.map} +1 -1
- package/dist/{prime-protocol-CEE4BR9N.d.ts → prime-protocol-HiB9HX7E.d.ts} +3 -3
- package/dist/{prime-protocol-CEE4BR9N.d.ts.map → prime-protocol-HiB9HX7E.d.ts.map} +1 -1
- package/dist/{produced-state-ZCtDBxAE.js → produced-state-BsDmnwxc.js} +8 -8
- package/dist/{produced-state-ZCtDBxAE.js.map → produced-state-BsDmnwxc.js.map} +1 -1
- package/dist/profile-cell.js +1 -1
- package/dist/{release-confidence-BK2QCB5M.d.ts → promotion-gate-BawrdPYr.d.ts} +102 -102
- package/dist/promotion-gate-BawrdPYr.d.ts.map +1 -0
- package/dist/{promotion-policy-CWW35UWq.js → promotion-policy-KO57gbyV.js} +4 -4
- package/dist/{promotion-policy-CWW35UWq.js.map → promotion-policy-KO57gbyV.js.map} +1 -1
- package/dist/{proposal-findings-BZiMTzAF.js → proposal-findings-CY1xKn_a.js} +2 -2
- package/dist/{proposal-findings-BZiMTzAF.js.map → proposal-findings-CY1xKn_a.js.map} +1 -1
- package/dist/{query-B1D1qp2Z.js → query-BUCZCK7F.js} +3 -3
- package/dist/{query-B1D1qp2Z.js.map → query-BUCZCK7F.js.map} +1 -1
- package/dist/{random-Dn5fPWkt.js → random-ByUSnV9w.js} +2 -2
- package/dist/{random-Dn5fPWkt.js.map → random-ByUSnV9w.js.map} +1 -1
- package/dist/{raw-provider-sink-rB2DYxr6.js → raw-provider-sink-DoHz4JNG.js} +2 -2
- package/dist/{raw-provider-sink-rB2DYxr6.js.map → raw-provider-sink-DoHz4JNG.js.map} +1 -1
- package/dist/{redact-Dk1ZdJEm.js → redact-B5xXKqQ3.js} +97 -98
- package/dist/redact-B5xXKqQ3.js.map +1 -0
- package/dist/{redact-Cveoq6fJ.d.ts → redact-mtCCcT8z.d.ts} +4 -20
- package/dist/redact-mtCCcT8z.d.ts.map +1 -0
- package/dist/{registry-JYfPxcVz.d.ts → registry-D7_hm2fK.d.ts} +5 -5
- package/dist/{registry-JYfPxcVz.d.ts.map → registry-D7_hm2fK.d.ts.map} +1 -1
- package/dist/{release-confidence-Dbe9AS_X.js → release-confidence-CpuP65S5.js} +5 -5
- package/dist/{release-confidence-Dbe9AS_X.js.map → release-confidence-CpuP65S5.js.map} +1 -1
- package/dist/{report-command-y8H6RSX8.js → report-command-SC9nqb4M.js} +106 -171
- package/dist/report-command-SC9nqb4M.js.map +1 -0
- package/dist/reporting-html-Kvlc8oMt.js +100 -0
- package/dist/reporting-html-Kvlc8oMt.js.map +1 -0
- package/dist/reporting.d.ts +3 -3
- package/dist/reporting.js +6 -6
- package/dist/{researcher-f6mZhh58.d.ts → researcher-CEcfku-T.d.ts} +5 -5
- package/dist/{researcher-f6mZhh58.d.ts.map → researcher-CEcfku-T.d.ts.map} +1 -1
- package/dist/reward-CpCmAM8L.d.ts +78 -0
- package/dist/reward-CpCmAM8L.d.ts.map +1 -0
- package/dist/{reward-hacking-BFcQgkux.js → reward-hacking-E0d-WVcP.js} +2 -2
- package/dist/{reward-hacking-BFcQgkux.js.map → reward-hacking-E0d-WVcP.js.map} +1 -1
- package/dist/{reward-hacking-DHA7c1l8.d.ts → reward-hacking-RVdZ6Kkt.d.ts} +2 -2
- package/dist/{reward-hacking-DHA7c1l8.d.ts.map → reward-hacking-RVdZ6Kkt.d.ts.map} +1 -1
- package/dist/rl.d.ts +8 -8
- package/dist/rl.js +14 -14
- package/dist/rollout/index.d.ts +3 -2
- package/dist/rollout/index.js +2 -2
- package/dist/{rollout-D9bKKBnZ.js → rollout-DZV1t2Wg.js} +2 -2
- package/dist/{rollout-D9bKKBnZ.js.map → rollout-DZV1t2Wg.js.map} +1 -1
- package/dist/round-decimal-COrKglMh.js +10 -0
- package/dist/round-decimal-COrKglMh.js.map +1 -0
- package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts → rubric-predictive-validity-C03EC7ZE.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts.map → rubric-predictive-validity-C03EC7ZE.d.ts.map} +1 -1
- package/dist/{rubric-predictive-validity-BsgkBfT0.js → rubric-predictive-validity-DaFW70y9.js} +3 -3
- package/dist/{rubric-predictive-validity-BsgkBfT0.js.map → rubric-predictive-validity-DaFW70y9.js.map} +1 -1
- package/dist/{run-record-DlTZ_lqe.js → run-record-Boc5IUTp.js} +4 -4
- package/dist/{run-record-DlTZ_lqe.js.map → run-record-Boc5IUTp.js.map} +1 -1
- package/dist/{run-record-D1Hw-Jml.d.ts → run-record-C1E24G2A.d.ts} +2 -2
- package/dist/{run-record-D1Hw-Jml.d.ts.map → run-record-C1E24G2A.d.ts.map} +1 -1
- package/dist/{run-record-ES07wfz9.js → run-record-C5e7FjhJ.js} +3 -5
- package/dist/run-record-C5e7FjhJ.js.map +1 -0
- package/dist/search/index.d.ts +46 -32
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +3 -3
- package/dist/{search-kernel-CpcKH5Ih.d.ts → search-kernel-DyNEa6IU.d.ts} +14 -10
- package/dist/search-kernel-DyNEa6IU.d.ts.map +1 -0
- package/dist/{search-ledger-d7V8o9Lk.js → search-ledger-CVUGLDZp.js} +189 -199
- package/dist/search-ledger-CVUGLDZp.js.map +1 -0
- package/dist/{search-ledger-file-BqOo-bVo.js → search-ledger-file-DDQUgvCg.js} +4 -4
- package/dist/{search-ledger-file-BqOo-bVo.js.map → search-ledger-file-DDQUgvCg.js.map} +1 -1
- package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +1 -1
- package/dist/{search-shipper-er4pK5_Y.js → search-shipper-BOSD46qv.js} +3 -3
- package/dist/{search-shipper-er4pK5_Y.js.map → search-shipper-BOSD46qv.js.map} +1 -1
- package/dist/{search-summary-CBvz3u_S.js → search-summary-BQCSWf1g.js} +5 -5
- package/dist/{search-summary-CBvz3u_S.js.map → search-summary-BQCSWf1g.js.map} +1 -1
- package/dist/{semantic-concept-judge-zQBG9hHU.js → semantic-concept-judge-BQF8te0T.js} +12 -14
- package/dist/semantic-concept-judge-BQF8te0T.js.map +1 -0
- package/dist/{sequential-D-1PPCmM.js → sequential-Bf_pbE50.js} +5 -5
- package/dist/{sequential-D-1PPCmM.js.map → sequential-Bf_pbE50.js.map} +1 -1
- package/dist/{sequential-eprocess-D1jKoihe.js → sequential-eprocess-DM_qENCl.js} +2 -2
- package/dist/{sequential-eprocess-D1jKoihe.js.map → sequential-eprocess-DM_qENCl.js.map} +1 -1
- package/dist/{server-DbcC7xMl.js → server-e9oWO_bN.js} +4 -4
- package/dist/{server-DbcC7xMl.js.map → server-e9oWO_bN.js.map} +1 -1
- package/dist/{single-run-lock-fVu3MZWH.js → single-run-lock-CV9Eyd_q.js} +2 -2
- package/dist/{single-run-lock-fVu3MZWH.js.map → single-run-lock-CV9Eyd_q.js.map} +1 -1
- package/dist/{skillopt-optimization-method-CCtzralq.js → skillopt-optimization-method-BiwA8nfX.js} +427 -12
- package/dist/skillopt-optimization-method-BiwA8nfX.js.map +1 -0
- package/dist/{spans-D9_ehFuk.d.ts → spans-BHAUXMGN.d.ts} +2 -2
- package/dist/{spans-D9_ehFuk.d.ts.map → spans-BHAUXMGN.d.ts.map} +1 -1
- package/dist/{statistical-heldout-1Gbmex7v.js → statistical-heldout-42NlCNDe.js} +3 -3
- package/dist/{statistical-heldout-1Gbmex7v.js.map → statistical-heldout-42NlCNDe.js.map} +1 -1
- package/dist/{statistical-heldout-BeR4bOdg.d.ts → statistical-heldout-CYpGaoDH.d.ts} +3 -3
- package/dist/{statistical-heldout-BeR4bOdg.d.ts.map → statistical-heldout-CYpGaoDH.d.ts.map} +1 -1
- package/dist/{store-otlp-DtB4Slsr.js → store-otlp-DJ9dtA5x.js} +135 -132
- package/dist/store-otlp-DJ9dtA5x.js.map +1 -0
- package/dist/{store-tool-spans-fZIigrpP.js → store-tool-spans-CIX5arAG.js} +7 -7
- package/dist/{store-tool-spans-fZIigrpP.js.map → store-tool-spans-CIX5arAG.js.map} +1 -1
- package/dist/{store-tool-spans-DR1SrCLK.d.ts → store-tool-spans-DdCSPa7C.d.ts} +162 -161
- package/dist/store-tool-spans-DdCSPa7C.d.ts.map +1 -0
- package/dist/storyboard/index.d.ts.map +1 -1
- package/dist/storyboard/index.js +20 -3
- package/dist/storyboard/index.js.map +1 -1
- package/dist/{student-t-BQeKJx2N.js → student-t-DVPW7CdL.js} +2 -2
- package/dist/{student-t-BQeKJx2N.js.map → student-t-DVPW7CdL.js.map} +1 -1
- package/dist/{summary-report-DtdRucM0.js → summary-report-V_JACR4Y.js} +526 -614
- package/dist/summary-report-V_JACR4Y.js.map +1 -0
- package/dist/{summary-report-C-CtItCN.d.ts → summary-report-bdFDXq0b.d.ts} +10 -5
- package/dist/summary-report-bdFDXq0b.d.ts.map +1 -0
- package/dist/supervisor-run/index.d.ts +153 -149
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +65 -3
- package/dist/supervisor-run/index.js.map +1 -1
- package/dist/{systemone-CpTLAlqb.d.ts → systemone-BomhHr2c.d.ts} +6 -6
- package/dist/{systemone-CpTLAlqb.d.ts.map → systemone-BomhHr2c.d.ts.map} +1 -1
- package/dist/systemone-protocol.js +1 -1
- package/dist/{systemone-review-B_yo1xsd.d.ts → systemone-review-CUVcQJu6.d.ts} +2 -2
- package/dist/{systemone-review-B_yo1xsd.d.ts.map → systemone-review-CUVcQJu6.d.ts.map} +1 -1
- package/dist/{systemone-review-BZWfrtq1.js → systemone-review-D7sXwsqq.js} +2 -2
- package/dist/{systemone-review-BZWfrtq1.js.map → systemone-review-D7sXwsqq.js.map} +1 -1
- package/dist/systemone.d.ts +3 -3
- package/dist/systemone.js +4 -4
- package/dist/{task-failure-attributes-DngaLdE4.js → task-failure-attributes-hEmASjix.js} +2 -2
- package/dist/{task-failure-attributes-DngaLdE4.js.map → task-failure-attributes-hEmASjix.js.map} +1 -1
- package/dist/{terminal-record-BHocwFw1.js → terminal-record-DZyQZ3pz.js} +14 -10
- package/dist/terminal-record-DZyQZ3pz.js.map +1 -0
- package/dist/{tool-groups-mcxOXVlb.d.ts → tool-groups-C3NEcdCM.d.ts} +3 -3
- package/dist/tool-groups-C3NEcdCM.d.ts.map +1 -0
- package/dist/{tool-waste-Wi4g6Ekb.d.ts → tool-waste-BKgvd-TP.d.ts} +30 -30
- package/dist/tool-waste-BKgvd-TP.d.ts.map +1 -0
- package/dist/{tool-waste-D52PqU9Q.js → tool-waste-BlesqTqW.js} +4 -4
- package/dist/{tool-waste-D52PqU9Q.js.map → tool-waste-BlesqTqW.js.map} +1 -1
- package/dist/{trace-questions-DG7nqLQ7.d.ts → trace-questions-CM2CAocU.d.ts} +4 -4
- package/dist/{trace-questions-DG7nqLQ7.d.ts.map → trace-questions-CM2CAocU.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +3 -3
- package/dist/trace-repair/index.d.ts.map +1 -1
- package/dist/trace-repair/index.js +7 -13
- package/dist/trace-repair/index.js.map +1 -1
- package/dist/traces.d.ts +76 -58
- package/dist/traces.d.ts.map +1 -1
- package/dist/traces.js +9 -9
- package/dist/trajectory-replay/index.js +3 -3
- package/dist/{tree-rXLW3M_4.js → tree-C1XYeXvy.js} +2277 -2339
- package/dist/tree-C1XYeXvy.js.map +1 -0
- package/dist/{types-DBZ7keha.d.ts → types-C02qtnG8.d.ts} +4 -46
- package/dist/types-C02qtnG8.d.ts.map +1 -0
- package/dist/{types-oKRhQAde.d.ts → types-C1tnkEgM.d.ts} +4 -4
- package/dist/{types-oKRhQAde.d.ts.map → types-C1tnkEgM.d.ts.map} +1 -1
- package/dist/{types-CfZMIzB_.d.ts → types-Cbe2fWBa.d.ts} +3 -3
- package/dist/{types-CfZMIzB_.d.ts.map → types-Cbe2fWBa.d.ts.map} +1 -1
- package/dist/{types-B4C5nFw6.d.ts → types-Cq8mSbq8.d.ts} +78 -72
- package/dist/types-Cq8mSbq8.d.ts.map +1 -0
- package/dist/{verdict-DhPoXApk.js → verdict-Dl0tiT1X.js} +2 -2
- package/dist/{verdict-DhPoXApk.js.map → verdict-Dl0tiT1X.js.map} +1 -1
- package/dist/{verdict-cache-BQEsVy9n.js → verdict-cache-Bm8EKL2s.js} +2 -2
- package/dist/{verdict-cache-BQEsVy9n.js.map → verdict-cache-Bm8EKL2s.js.map} +1 -1
- package/dist/wire/index.d.ts +3 -3
- package/dist/wire/index.js +1 -1
- package/docs/design/mlbenchmarks-book-review.md +1 -1
- package/docs/design/mlbenchmarks-review/probes.mts +23 -31
- package/docs/experiment.md +1 -1
- package/package.json +1 -1
- package/dist/analyze-runs-3xpby3p2.js.map +0 -1
- package/dist/analyze-runs-CSDAh8A7.d.ts.map +0 -1
- package/dist/ast-DJ6Bc7ab.js +0 -558
- package/dist/ast-DJ6Bc7ab.js.map +0 -1
- package/dist/ast-hI-vjW6J.d.ts +0 -457
- package/dist/ast-hI-vjW6J.d.ts.map +0 -1
- package/dist/benchmark-command-CByl9dxG.js.map +0 -1
- package/dist/campaign-BQ-Jujuj.js.map +0 -1
- package/dist/campaign-evidence-OcUciD-N.js.map +0 -1
- package/dist/claim-BXcZw-jo.js.map +0 -1
- package/dist/cost-ledger-CO7UyEcQ.d.ts.map +0 -1
- package/dist/cost-ledger-D2FnJPBF.js.map +0 -1
- package/dist/define-agent-eval-Ch3MWX6k.js.map +0 -1
- package/dist/external-optimizer-subprocess-DcerlZSG.js.map +0 -1
- package/dist/feedback-trajectory-DkaDj0dj.d.ts.map +0 -1
- package/dist/index-CPJJr98o.d.ts.map +0 -1
- package/dist/index-DlH0Y9gI.d.ts.map +0 -1
- package/dist/index-NvGBiO8H.d.ts.map +0 -1
- package/dist/integrity-BV1ZDf42.js.map +0 -1
- package/dist/judge-gate-B1qYnkpi.js.map +0 -1
- package/dist/llm-client-DQveoxSM.js.map +0 -1
- package/dist/llm-judge-PXV7Xljl.js.map +0 -1
- package/dist/matrix-_BV9-Lk5.js.map +0 -1
- package/dist/mint-DCGoBYhB.d.ts +0 -155
- package/dist/mint-DCGoBYhB.d.ts.map +0 -1
- package/dist/paired-tests-jbwPdSz5.js.map +0 -1
- package/dist/redact-Cveoq6fJ.d.ts.map +0 -1
- package/dist/redact-Dk1ZdJEm.js.map +0 -1
- package/dist/release-confidence-BK2QCB5M.d.ts.map +0 -1
- package/dist/report-command-y8H6RSX8.js.map +0 -1
- package/dist/run-record-ES07wfz9.js.map +0 -1
- package/dist/search-kernel-BztlERLv.js.map +0 -1
- package/dist/search-kernel-CpcKH5Ih.d.ts.map +0 -1
- package/dist/search-ledger-d7V8o9Lk.js.map +0 -1
- package/dist/semantic-concept-judge-zQBG9hHU.js.map +0 -1
- package/dist/skillopt-optimization-method-CCtzralq.js.map +0 -1
- package/dist/store-otlp-DtB4Slsr.js.map +0 -1
- package/dist/store-tool-spans-DR1SrCLK.d.ts.map +0 -1
- package/dist/summary-report-C-CtItCN.d.ts.map +0 -1
- package/dist/summary-report-DtdRucM0.js.map +0 -1
- package/dist/terminal-record-BHocwFw1.js.map +0 -1
- package/dist/tool-groups-mcxOXVlb.d.ts.map +0 -1
- package/dist/tool-waste-Wi4g6Ekb.d.ts.map +0 -1
- package/dist/tree-rXLW3M_4.js.map +0 -1
- package/dist/types-B4C5nFw6.d.ts.map +0 -1
- package/dist/types-DBZ7keha.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-
|
|
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-
|
|
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-
|
|
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-
|
|
2
|
-
import { t as LEDGER_HASH_PATTERN } from "./canonical-
|
|
3
|
-
import "./journal-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAM,eAAe;AACrB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,UAAU,IAAI,YAAY;;AAGhC,MAAa,oBAAgC,4BAAY,IAAI,WAAW,CAAC,CAAC;;AAG1E,SAAgB,aAAqB;CACnC,OAAO,MAAM,WAAW,OAAO,gCAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AACpE;;;;;AAMA,SAAgB,eAAe,SAA8B,MAA2B;CACtF,MAAM,QAAQ,OAAO,YAAY,WAAW,QAAQ,OAAO,OAAO,IAAI;CACtE,IAAI,SAAS,KAAA,GAAW,OAAO,OAAO,aAAa,KAAK;CACxD,IAAI,CAAC,aAAa,KAAK,IAAI,GACzB,MAAM,IAAI,gBAAgB,6DAA6D;CAEzF,OAAO,OAAO,aAAa,QAAQ,IAAI,GAAG,KAAK;AACjD;;AAGA,SAAgB,WAAW,QAA2C;CACpE,MAAM,QAAQ,aAAa,MAAM;CACjC,OAAO,MAAM,WAAW,IAAI,oBAAoB,aAAa,YAAY,OAAO,GAAG,MAAM,MAAM,CAAC;AAClG;;AAGA,SAAgB,qBACd,QACA,WACsB;CACtB,MAAM,QAAQ,aAAa,MAAM;CACjC,IAAI,CAAC,OAAO,cAAc,SAAS,KAAK,YAAY,KAAK,aAAa,MAAM,QAC1E,MAAM,IAAI,gBACR,qBAAqB,UAAU,wBAAwB,MAAM,OAAO,QACtE;CAEF,MAAM,OAAqB,CAAC;CAC5B,cAAc,OAAO,WAAW,GAAG,MAAM,QAAQ,IAAI;CACrD,OAAO;EAAE;EAAW,UAAU,MAAM;EAAQ,MAAM,KAAK,IAAI,YAAY;CAAE;AAC3E;;;;;AAMA,SAAgB,uBACd,QACA,SACwB;CACxB,MAAM,QAAQ,aAAa,MAAM;CACjC,IAAI,CAAC,OAAO,cAAc,OAAO,KAAK,UAAU,KAAK,UAAU,MAAM,QACnE,MAAM,IAAI,gBACR,mBAAmB,QAAQ,wBAAwB,MAAM,OAAO,QAClE;CAEF,MAAM,OAAqB,CAAC;CAC5B,IAAI,UAAU,KAAK,UAAU,MAAM,QAAQ,SAAS,OAAO,SAAS,GAAG,MAAM,QAAQ,MAAM,IAAI;CAC/F,OAAO;EAAE;EAAS,SAAS,MAAM;EAAQ,MAAM,KAAK,IAAI,YAAY;CAAE;AACxE;;AAGA,SAAgB,sBACd,MACA,OACA,MACoB;CACpB,MAAM,EAAE,WAAW,aAAa;CAChC,IAAI,CAAC,OAAO,QAAQ,KAAK,CAAC,OAAO,SAAS,KAAK,aAAa,UAC1D,OAAO,QAAQ,cAAc,UAAU,wBAAwB,SAAS,QAAQ;CAElF,MAAM,UAAU,UAAU;EAAC;EAAM;EAAM,GAAG,MAAM;CAAI,CAAC;CACrD,IAAI,YAAY,KAAA,GAAW,OAAO,QAAQ,gCAAgC;CAC1E,MAAM,CAAC,WAAW,WAAW,GAAG,QAAQ;CACxC,IAAI,KAAK;CACT,IAAI,KAAK,WAAW;CACpB,IAAI,IAAI;CACR,KAAK,MAAM,KAAK,MAAM;EACpB,IAAI,OAAO,GAAG,OAAO,QAAQ,4CAA4C;EACzE,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI;GAC7B,IAAI,KAAK,GAAG,CAAC;GACb,IAAI,KAAK,MAAM,GACb,OAAO,KAAK,MAAM,KAAK,OAAO,GAAG;IAC/B,KAAK,KAAK,MAAM,KAAK,CAAC;IACtB,KAAK,KAAK,MAAM,KAAK,CAAC;GACxB;EAEJ,OACE,IAAI,KAAK,GAAG,CAAC;EAEf,KAAK,KAAK,MAAM,KAAK,CAAC;EACtB,KAAK,KAAK,MAAM,KAAK,CAAC;CACxB;CACA,IAAI,OAAO,GAAG,OAAO,QAAQ,6CAA6C;CAC1E,OAAO,MAAM,GAAG,SAAS,IAAI,EAAE,UAAU,KAAK,IAAI,QAAQ,gCAAgC;AAC5F;;AAGA,SAAgB,wBACd,OACA,SACA,SACoB;CACpB,MAAM,EAAE,SAAS,YAAY;CAC7B,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC,OAAO,OAAO,KAAK,UAAU,SACpD,OAAO,QAAQ,YAAY,QAAQ,6BAA6B,SAAS;CAE3E,MAAM,UAAU,UAAU;EAAC;EAAS;EAAS,GAAG,MAAM;CAAI,CAAC;CAC3D,IAAI,YAAY,KAAA,GAAW,OAAO,QAAQ,gCAAgC;CAC1E,MAAM,CAAC,UAAU,UAAU,GAAG,SAAS;CACvC,IAAI,YAAY,KAAK,YAAY,SAAS;EACxC,IAAI,MAAM,WAAW,GAAG,OAAO,QAAQ,2CAA2C;EAClF,IAAI,YAAY,GACd,OAAO,YAAY,oBACf,EAAE,UAAU,KAAK,IACjB,QAAQ,qCAAqC;EAEnD,OAAO,MAAM,UAAU,QAAQ,IAC3B,EAAE,UAAU,KAAK,IACjB,QAAQ,kCAAkC;CAChD;CACA,MAAM,OAAO,aAAa,OAAO,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI;CAC5D,IAAI,KAAK,WAAW,GAAG,OAAO,QAAQ,4BAA4B;CAClE,IAAI,KAAK,UAAU;CACnB,IAAI,KAAK,UAAU;CACnB,OAAO,KAAK,MAAM,GAAG;EACnB,KAAK,KAAK,MAAM,KAAK,CAAC;EACtB,KAAK,KAAK,MAAM,KAAK,CAAC;CACxB;CACA,IAAI,KAAK,KAAK;CACd,IAAI,KAAK;CACT,KAAK,MAAM,KAAK,KAAK,MAAM,CAAC,GAAG;EAC7B,IAAI,OAAO,GAAG,OAAO,QAAQ,4CAA4C;EACzE,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI;GAC7B,KAAK,KAAK,GAAG,EAAE;GACf,KAAK,KAAK,GAAG,EAAE;GACf,IAAI,KAAK,MAAM,GACb,OAAO,KAAK,MAAM,KAAK,OAAO,GAAG;IAC/B,KAAK,KAAK,MAAM,KAAK,CAAC;IACtB,KAAK,KAAK,MAAM,KAAK,CAAC;GACxB;EAEJ,OACE,KAAK,KAAK,IAAI,CAAC;EAEjB,KAAK,KAAK,MAAM,KAAK,CAAC;EACtB,KAAK,KAAK,MAAM,KAAK,CAAC;CACxB;CACA,IAAI,OAAO,GAAG,OAAO,QAAQ,6CAA6C;CAC1E,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,OAAO,QAAQ,qCAAqC;CAC9E,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,OAAO,QAAQ,qCAAqC;CAC9E,OAAO,EAAE,UAAU,KAAK;AAC1B;AAEA,SAAS,YAAY,OAA8B,OAAe,KAAyB;CACzF,IAAI,MAAM,UAAU,GAAG,OAAO,MAAM;CACpC,MAAM,IAAI,uBAAuB,MAAM,KAAK;CAC5C,OAAO,KAAK,YAAY,OAAO,OAAO,QAAQ,CAAC,GAAG,YAAY,OAAO,QAAQ,GAAG,GAAG,CAAC;AACtF;AAEA,SAAS,cACP,OACA,OACA,OACA,KACA,MACM;CACN,IAAI,MAAM,UAAU,GAAG;CACvB,MAAM,IAAI,uBAAuB,MAAM,KAAK;CAC5C,IAAI,QAAQ,QAAQ,GAAG;EACrB,cAAc,OAAO,OAAO,OAAO,QAAQ,GAAG,IAAI;EAClD,KAAK,KAAK,YAAY,OAAO,QAAQ,GAAG,GAAG,CAAC;CAC9C,OAAO;EACL,cAAc,OAAO,OAAO,QAAQ,GAAG,KAAK,IAAI;EAChD,KAAK,KAAK,YAAY,OAAO,OAAO,QAAQ,CAAC,CAAC;CAChD;AACF;AAEA,SAAS,SACP,OACA,SACA,OACA,KACA,UACA,MACM;CACN,IAAI,MAAM,UAAU,SAAS;EAC3B,IAAI,CAAC,UAAU,KAAK,KAAK,YAAY,OAAO,OAAO,GAAG,CAAC;EACvD;CACF;CACA,MAAM,IAAI,uBAAuB,MAAM,KAAK;CAC5C,IAAI,WAAW,GAAG;EAChB,SAAS,OAAO,SAAS,OAAO,QAAQ,GAAG,UAAU,IAAI;EACzD,KAAK,KAAK,YAAY,OAAO,QAAQ,GAAG,GAAG,CAAC;CAC9C,OAAO;EACL,SAAS,OAAO,UAAU,GAAG,QAAQ,GAAG,KAAK,OAAO,IAAI;EACxD,KAAK,KAAK,YAAY,OAAO,OAAO,QAAQ,CAAC,CAAC;CAChD;AACF;AAEA,SAAS,KAAK,MAAkB,OAA+B;CAC7D,OAAO,QAAQ,OAAO,aAAa,MAAM,KAAK,CAAC,CAAC,MAAM,CAAgB,CAAC;AACzE;AAEA,SAAS,OAAO,QAAgB,GAAG,OAAiC;CAClE,MAAM,SAAS,MAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK,QAAQ,CAAC;CACnE,MAAM,QAAQ,IAAI,WAAW,MAAM;CACnC,MAAM,KAAK;CACX,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,IAAI,MAAM,MAAM;EACtB,UAAU,KAAK;CACjB;CACA,OAAO,YAAY,KAAK;AAC1B;AAEA,SAAS,aAAa,QAA6C;CACjE,MAAM,UAAU,UAAU,MAAM;CAChC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,gBAAgB,wDAAwD;CAEpF,OAAO;AACT;AAEA,SAAS,UAAU,QAAqD;CACtE,MAAM,MAAoB,CAAC;CAC3B,KAAK,MAAM,QAAQ,QAAQ;EACzB,IAAI,OAAO,SAAS,YAAY,CAAC,oBAAoB,KAAK,IAAI,GAAG,OAAO,KAAA;EACxE,IAAI,KAAK,QAAQ,KAAK,MAAM,CAAgB,CAAC,CAAC;CAChD;CACA,OAAO;AACT;AAEA,SAAS,aAAa,OAA+B;CACnD,OAAO,UAAU,MAAM,KAAK;AAC9B;AAEA,SAAS,uBAAuB,GAAmB;CACjD,IAAI,IAAI;CACR,OAAO,IAAI,IAAI,GAAG,KAAK;CACvB,OAAO;AACT;AAEA,SAAS,aAAa,GAAoB;CACxC,IAAI,IAAI,GAAG,OAAO;CAClB,IAAI,IAAI;CACR,OAAO,IAAI,MAAM,GAAG,KAAK;CACzB,OAAO,MAAM;AACf;AAEA,SAAS,OAAO,GAAoB;CAClC,OAAO,OAAO,cAAc,CAAC,KAAK,KAAK;AACzC;AAEA,SAAS,MAAM,GAAe,GAAwB;CACpD,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO;CAClC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO;CAC7D,OAAO;AACT;AAEA,SAAS,QAAQ,QAAoC;CACnD,OAAO;EAAE,UAAU;EAAO;CAAO;AACnC;AAEA,SAAS,MAAM,OAA2B;CACxC,OAAO,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAChF;AAEA,SAAS,QAAQ,KAAyB;CACxC,MAAM,QAAQ,IAAI,WAAW,IAAI,SAAS,CAAC;CAC3C,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;CACjG,OAAO;AACT"}
|
|
@@ -1,7 +1,110 @@
|
|
|
1
|
-
import { t as AgentEvalError } from "./errors-
|
|
2
|
-
import { c as costForTokenPricing } from "./cost-ledger-
|
|
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-
|
|
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
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
}
|
|
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
|
-
*
|
|
638
|
-
*
|
|
639
|
-
*
|
|
640
|
-
*/
|
|
641
|
-
function
|
|
642
|
-
const
|
|
643
|
-
const
|
|
644
|
-
|
|
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
|
|
647
|
-
const
|
|
648
|
-
|
|
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
|
-
|
|
666
|
-
|
|
667
|
-
|
|
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 {
|
|
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-
|
|
1023
|
+
//# sourceMappingURL=llm-client-CyBAoYiX.js.map
|