@tangle-network/agent-eval 0.128.2 → 0.130.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +279 -0
- package/README.md +19 -0
- package/dist/active-curriculum-C4mk67HP.js +214 -0
- package/dist/active-curriculum-C4mk67HP.js.map +1 -0
- package/dist/adversarial-smnADNFS.d.ts +21 -0
- package/dist/adversarial-smnADNFS.d.ts.map +1 -0
- package/dist/analyst/index.d.ts +83 -2932
- package/dist/analyst/index.d.ts.map +1 -0
- package/dist/analyst/index.js +319 -364
- package/dist/analyst/index.js.map +1 -1
- package/dist/analyst-BkTS3C58.d.ts +89 -0
- package/dist/analyst-BkTS3C58.d.ts.map +1 -0
- package/dist/analyst-LsnNpSkm.js +152 -0
- package/dist/analyst-LsnNpSkm.js.map +1 -0
- package/dist/analyze-runs-C1CavBMk.js +1067 -0
- package/dist/analyze-runs-C1CavBMk.js.map +1 -0
- package/dist/analyze-runs-FsgYCinh.d.ts +72 -0
- package/dist/analyze-runs-FsgYCinh.d.ts.map +1 -0
- package/dist/attribute-vocabulary-DLJ6303h.d.ts +54 -0
- package/dist/attribute-vocabulary-DLJ6303h.d.ts.map +1 -0
- package/dist/authenticity/index.d.ts +81 -79
- package/dist/authenticity/index.d.ts.map +1 -0
- package/dist/authenticity/index.js +209 -193
- package/dist/authenticity/index.js.map +1 -1
- package/dist/baseline-HsBvw_dk.js +550 -0
- package/dist/baseline-HsBvw_dk.js.map +1 -0
- package/dist/baseline-hG3K85h4.d.ts +125 -0
- package/dist/baseline-hG3K85h4.d.ts.map +1 -0
- package/dist/belief-state/index.d.ts +448 -1205
- package/dist/belief-state/index.d.ts.map +1 -0
- package/dist/belief-state/index.js +1617 -1710
- package/dist/belief-state/index.js.map +1 -1
- package/dist/benchmarks/index.d.ts +2 -894
- package/dist/benchmarks/index.js +2 -59
- package/dist/benchmarks-DviOvUNr.js +754 -0
- package/dist/benchmarks-DviOvUNr.js.map +1 -0
- package/dist/builder-eval/index.d.ts +150 -662
- package/dist/builder-eval/index.d.ts.map +1 -0
- package/dist/builder-eval/index.js +356 -345
- package/dist/builder-eval/index.js.map +1 -1
- package/dist/calibration-CNWWA6K8.js +94 -0
- package/dist/calibration-CNWWA6K8.js.map +1 -0
- package/dist/campaign/index.d.ts +5 -6390
- package/dist/campaign/index.js +3 -212
- package/dist/campaign-CBKZvQ1H.js +3885 -0
- package/dist/campaign-CBKZvQ1H.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +164 -174
- package/dist/cli.js.map +1 -1
- package/dist/client-C97NMzqi.d.ts +581 -0
- package/dist/client-C97NMzqi.d.ts.map +1 -0
- package/dist/client-CYzbdJOZ.js +637 -0
- package/dist/client-CYzbdJOZ.js.map +1 -0
- package/dist/code-agent-session-BjkMTQ7H.js +1390 -0
- package/dist/code-agent-session-BjkMTQ7H.js.map +1 -0
- package/dist/code-agent-session-DqqgOJaz.d.ts +143 -0
- package/dist/code-agent-session-DqqgOJaz.d.ts.map +1 -0
- package/dist/concurrency-DIxRZF_J.js +85 -0
- package/dist/concurrency-DIxRZF_J.js.map +1 -0
- package/dist/contract/index.d.ts +645 -5605
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +1730 -1937
- package/dist/contract/index.js.map +1 -1
- package/dist/control.d.ts +3 -1030
- package/dist/control.js +2 -32
- package/dist/cost-ledger-DIgQUFZZ.js +801 -0
- package/dist/cost-ledger-DIgQUFZZ.js.map +1 -0
- package/dist/cost-ledger-Dye6jCgg.d.ts +236 -0
- package/dist/cost-ledger-Dye6jCgg.d.ts.map +1 -0
- package/dist/dataset-BvtnC8Dc.d.ts +115 -0
- package/dist/dataset-BvtnC8Dc.d.ts.map +1 -0
- package/dist/default-registry-C-vFCSEc.js +2579 -0
- package/dist/default-registry-C-vFCSEc.js.map +1 -0
- package/dist/default-registry-CNPo-Vsb.d.ts +540 -0
- package/dist/default-registry-CNPo-Vsb.d.ts.map +1 -0
- package/dist/emitter-CPBAhxum.js +266 -0
- package/dist/emitter-CPBAhxum.js.map +1 -0
- package/dist/emitter-DGQGoLyj.d.ts +113 -0
- package/dist/emitter-DGQGoLyj.d.ts.map +1 -0
- package/dist/errors-8YnH8WlF.js +64 -0
- package/dist/errors-8YnH8WlF.js.map +1 -0
- package/dist/errors-CEk209JS.d.ts +76 -0
- package/dist/errors-CEk209JS.d.ts.map +1 -0
- package/dist/eval-campaign-DEm6c8ru.js +349 -0
- package/dist/eval-campaign-DEm6c8ru.js.map +1 -0
- package/dist/execution-tracks-CpgFPpS5.js +93 -0
- package/dist/execution-tracks-CpgFPpS5.js.map +1 -0
- package/dist/exporters-q9iL-2Jf.js +148 -0
- package/dist/exporters-q9iL-2Jf.js.map +1 -0
- package/dist/extract-usage-BrQ8mCLX.js +155 -0
- package/dist/extract-usage-BrQ8mCLX.js.map +1 -0
- package/dist/failure-cluster-CqcvCcdR.d.ts +59 -0
- package/dist/failure-cluster-CqcvCcdR.d.ts.map +1 -0
- package/dist/feedback-trajectory-CVaeREXV.d.ts +340 -0
- package/dist/feedback-trajectory-CVaeREXV.d.ts.map +1 -0
- package/dist/fuzz.d.ts +320 -646
- package/dist/fuzz.d.ts.map +1 -0
- package/dist/fuzz.js +670 -617
- package/dist/fuzz.js.map +1 -1
- package/dist/hf-dataset-DBJXXoY1.js +763 -0
- package/dist/hf-dataset-DBJXXoY1.js.map +1 -0
- package/dist/hosted/index.d.ts +11 -831
- package/dist/hosted/index.d.ts.map +1 -0
- package/dist/hosted/index.js +2 -37
- package/dist/index-2JJSA6-r2.d.ts +926 -0
- package/dist/index-2JJSA6-r2.d.ts.map +1 -0
- package/dist/index-6N0aYmpW.d.ts +217 -0
- package/dist/index-6N0aYmpW.d.ts.map +1 -0
- package/dist/index-BAvgST_9.d.ts +131 -0
- package/dist/index-BAvgST_9.d.ts.map +1 -0
- package/dist/index-BvnJuTGD.d.ts +68 -0
- package/dist/index-BvnJuTGD.d.ts.map +1 -0
- package/dist/index-C61Wi7yg.d.ts +547 -0
- package/dist/index-C61Wi7yg.d.ts.map +1 -0
- package/dist/index-CAPUUKaM.d.ts +335 -0
- package/dist/index-CAPUUKaM.d.ts.map +1 -0
- package/dist/index-DE5fb3EC.d.ts +2244 -0
- package/dist/index-DE5fb3EC.d.ts.map +1 -0
- package/dist/index-DSC51roc.d.ts +102 -0
- package/dist/index-DSC51roc.d.ts.map +1 -0
- package/dist/index.d.ts +3776 -15120
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11185 -11191
- package/dist/index.js.map +1 -1
- package/dist/integrity-BzRbCHzi.js +424 -0
- package/dist/integrity-BzRbCHzi.js.map +1 -0
- package/dist/integrity-rmVhXWA7.d.ts +61 -0
- package/dist/integrity-rmVhXWA7.d.ts.map +1 -0
- package/dist/judge-calibration-DFtEMlde.d.ts +146 -0
- package/dist/judge-calibration-DFtEMlde.d.ts.map +1 -0
- package/dist/ledger-core/index.d.ts +2 -0
- package/dist/ledger-core/index.js +2 -0
- package/dist/ledger-core-DtZz1RG0.js +388 -0
- package/dist/ledger-core-DtZz1RG0.js.map +1 -0
- package/dist/llm-client--GR4JbZE.js +687 -0
- package/dist/llm-client--GR4JbZE.js.map +1 -0
- package/dist/llm-client-B_nIBlYo.d.ts +290 -0
- package/dist/llm-client-B_nIBlYo.d.ts.map +1 -0
- package/dist/matrix/index.d.ts +3 -155
- package/dist/matrix/index.js +2 -8
- package/dist/matrix-BzQnu2S6.js +270 -0
- package/dist/matrix-BzQnu2S6.js.map +1 -0
- package/dist/meta-eval/index.d.ts +4 -1027
- package/dist/meta-eval/index.js +393 -390
- package/dist/meta-eval/index.js.map +1 -1
- package/dist/metrics-C9YY1OcL.js +239 -0
- package/dist/metrics-C9YY1OcL.js.map +1 -0
- package/dist/mint-yN2M2eh0.js +201 -0
- package/dist/mint-yN2M2eh0.js.map +1 -0
- package/dist/multi-layer-verifier-BHY1gWAc.d.ts +138 -0
- package/dist/multi-layer-verifier-BHY1gWAc.d.ts.map +1 -0
- package/dist/multishot/index.d.ts +273 -481
- package/dist/multishot/index.d.ts.map +1 -0
- package/dist/multishot/index.js +595 -548
- package/dist/multishot/index.js.map +1 -1
- package/dist/off-policy-DvgzvtIx.js +220 -0
- package/dist/off-policy-DvgzvtIx.js.map +1 -0
- package/dist/off-policy-mskQw8Mb.d.ts +153 -0
- package/dist/off-policy-mskQw8Mb.d.ts.map +1 -0
- package/dist/openapi.json +1 -1
- package/dist/opencode-sqlite-BGrHeDu3.js +318 -0
- package/dist/opencode-sqlite-BGrHeDu3.js.map +1 -0
- package/dist/outcome-store-BYHIuO0e.d.ts +65 -0
- package/dist/outcome-store-BYHIuO0e.d.ts.map +1 -0
- package/dist/outcome-store-ChBKlTd_.js +75 -0
- package/dist/outcome-store-ChBKlTd_.js.map +1 -0
- package/dist/paired-arms-D9D0wXj2.js +260 -0
- package/dist/paired-arms-D9D0wXj2.js.map +1 -0
- package/dist/pipelines/index.d.ts +95 -532
- package/dist/pipelines/index.d.ts.map +1 -0
- package/dist/pipelines/index.js +497 -478
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pre-registration-DakwTRXk.js +96 -0
- package/dist/pre-registration-DakwTRXk.js.map +1 -0
- package/dist/propose-review-control-LhIWGzHl.js +1458 -0
- package/dist/propose-review-control-LhIWGzHl.js.map +1 -0
- package/dist/query-CJ_DX8vl.d.ts +28 -0
- package/dist/query-CJ_DX8vl.d.ts.map +1 -0
- package/dist/query-Di7eEQ79.js +83 -0
- package/dist/query-Di7eEQ79.js.map +1 -0
- package/dist/raw-provider-sink-BQd7mzyT.js +201 -0
- package/dist/raw-provider-sink-BQd7mzyT.js.map +1 -0
- package/dist/raw-provider-sink-BU29Sh8h.d.ts +134 -0
- package/dist/raw-provider-sink-BU29Sh8h.d.ts.map +1 -0
- package/dist/redact-7Aq1ukl-.js +107 -0
- package/dist/redact-7Aq1ukl-.js.map +1 -0
- package/dist/release-report-Cz9NKH39.js +603 -0
- package/dist/release-report-Cz9NKH39.js.map +1 -0
- package/dist/release-report-mvB2G4_J.d.ts +244 -0
- package/dist/release-report-mvB2G4_J.d.ts.map +1 -0
- package/dist/replay-GnyotH0J.js +1741 -0
- package/dist/replay-GnyotH0J.js.map +1 -0
- package/dist/replay-OoidtG1E.d.ts +749 -0
- package/dist/replay-OoidtG1E.d.ts.map +1 -0
- package/dist/reporting.d.ts +6 -1298
- package/dist/reporting.js +6 -50
- package/dist/researcher-CwTdwXG1.d.ts +314 -0
- package/dist/researcher-CwTdwXG1.d.ts.map +1 -0
- package/dist/reward-hacking-eAnOsynk.d.ts +224 -0
- package/dist/reward-hacking-eAnOsynk.d.ts.map +1 -0
- package/dist/reward-hacking-qipEpKvY.js +596 -0
- package/dist/reward-hacking-qipEpKvY.js.map +1 -0
- package/dist/reward-nw2xZGZG.js +137 -0
- package/dist/reward-nw2xZGZG.js.map +1 -0
- package/dist/rl.d.ts +916 -3596
- package/dist/rl.d.ts.map +1 -0
- package/dist/rl.js +2362 -1751
- package/dist/rl.js.map +1 -1
- package/dist/rolldown-runtime-8H4AJuhK.js +14 -0
- package/dist/rollout/index.d.ts +3 -1048
- package/dist/rollout/index.js +8 -110
- package/dist/rollout-BOYjemfR.js +624 -0
- package/dist/rollout-BOYjemfR.js.map +1 -0
- package/dist/rubric-predictive-validity-B3xmbmS1.js +141 -0
- package/dist/rubric-predictive-validity-B3xmbmS1.js.map +1 -0
- package/dist/rubric-predictive-validity-Ku_clp_1.d.ts +74 -0
- package/dist/rubric-predictive-validity-Ku_clp_1.d.ts.map +1 -0
- package/dist/run-evidence-ClRX_8A9.d.ts +225 -0
- package/dist/run-evidence-ClRX_8A9.d.ts.map +1 -0
- package/dist/run-record-BuoE80Dq.js +467 -0
- package/dist/run-record-BuoE80Dq.js.map +1 -0
- package/dist/run-record-CnZu_gjl.d.ts +357 -0
- package/dist/run-record-CnZu_gjl.d.ts.map +1 -0
- package/dist/run-score-iEEAWiBY.js +41 -0
- package/dist/run-score-iEEAWiBY.js.map +1 -0
- package/dist/runtime-trajectory-1gyaTOoC.js +93 -0
- package/dist/runtime-trajectory-1gyaTOoC.js.map +1 -0
- package/dist/runtime-trajectory-BvSZcCHD.d.ts +50 -0
- package/dist/runtime-trajectory-BvSZcCHD.d.ts.map +1 -0
- package/dist/schema-BtVldJ3T.d.ts +206 -0
- package/dist/schema-BtVldJ3T.d.ts.map +1 -0
- package/dist/schema-C6DW4ZHR.js +821 -0
- package/dist/schema-C6DW4ZHR.js.map +1 -0
- package/dist/schema-CRhEY1SO.js +69 -0
- package/dist/schema-CRhEY1SO.js.map +1 -0
- package/dist/schema-Cef2cFmb.d.ts +408 -0
- package/dist/schema-Cef2cFmb.d.ts.map +1 -0
- package/dist/semantic-concept-judge-B6cWNJ2K.js +725 -0
- package/dist/semantic-concept-judge-B6cWNJ2K.js.map +1 -0
- package/dist/sequential-Br0mAPHA.js +148 -0
- package/dist/sequential-Br0mAPHA.js.map +1 -0
- package/dist/sequential-CYwq6Ff_.d.ts +141 -0
- package/dist/sequential-CYwq6Ff_.d.ts.map +1 -0
- package/dist/series-convergence-CjO2QdRW.js +43 -0
- package/dist/series-convergence-CjO2QdRW.js.map +1 -0
- package/dist/series-convergence-ofsqPWhs.d.ts +35 -0
- package/dist/series-convergence-ofsqPWhs.d.ts.map +1 -0
- package/dist/server-m5D9cvnG.js +1040 -0
- package/dist/server-m5D9cvnG.js.map +1 -0
- package/dist/skill-usage-C_pXm7lP.d.ts +534 -0
- package/dist/skill-usage-C_pXm7lP.d.ts.map +1 -0
- package/dist/skillopt-optimization-method-B7wX7XkF.d.ts +1739 -0
- package/dist/skillopt-optimization-method-B7wX7XkF.d.ts.map +1 -0
- package/dist/skillopt-optimization-method-D4ODwFVV.js +7712 -0
- package/dist/skillopt-optimization-method-D4ODwFVV.js.map +1 -0
- package/dist/statistics-Cmj6nynr.d.ts +514 -0
- package/dist/statistics-Cmj6nynr.d.ts.map +1 -0
- package/dist/statistics-CnnxdpOg.js +1437 -0
- package/dist/statistics-CnnxdpOg.js.map +1 -0
- package/dist/store-CT9YIIve.d.ts +117 -0
- package/dist/store-CT9YIIve.d.ts.map +1 -0
- package/dist/store-CxJry_cs.d.ts +229 -0
- package/dist/store-CxJry_cs.d.ts.map +1 -0
- package/dist/storyboard/index.d.ts +84 -203
- package/dist/storyboard/index.d.ts.map +1 -0
- package/dist/storyboard/index.js +609 -542
- package/dist/storyboard/index.js.map +1 -1
- package/dist/summary-report-BNs5nmXI.js +862 -0
- package/dist/summary-report-BNs5nmXI.js.map +1 -0
- package/dist/summary-report-Cj9gdw4i.d.ts +407 -0
- package/dist/summary-report-Cj9gdw4i.d.ts.map +1 -0
- package/dist/supervisor-run/index.d.ts +2 -849
- package/dist/supervisor-run/index.js +2 -64
- package/dist/supervisor-run-_lnTLM3z.js +1679 -0
- package/dist/supervisor-run-_lnTLM3z.js.map +1 -0
- package/dist/task-failure-attributes-CQZlB3et.js +311 -0
- package/dist/task-failure-attributes-CQZlB3et.js.map +1 -0
- package/dist/test-graded-scenario-BsqWLmPt.js +318 -0
- package/dist/test-graded-scenario-BsqWLmPt.js.map +1 -0
- package/dist/test-graded-scenario-D1TaI2va.d.ts +141 -0
- package/dist/test-graded-scenario-D1TaI2va.d.ts.map +1 -0
- package/dist/tools-BmuN627J.js +1085 -0
- package/dist/tools-BmuN627J.js.map +1 -0
- package/dist/trace-attributes.d.ts +2 -52
- package/dist/trace-attributes.js +131 -61
- package/dist/trace-attributes.js.map +1 -1
- package/dist/traces.d.ts +12 -2365
- package/dist/traces.js +12 -251
- package/dist/trajectory-D_7rLrvE.js +56 -0
- package/dist/trajectory-D_7rLrvE.js.map +1 -0
- package/dist/types-DGsxbAEd.d.ts +387 -0
- package/dist/types-DGsxbAEd.d.ts.map +1 -0
- package/dist/types-k9tZGKUg.d.ts +640 -0
- package/dist/types-k9tZGKUg.d.ts.map +1 -0
- package/dist/verdict-Dps8_okt.d.ts +37 -0
- package/dist/verdict-Dps8_okt.d.ts.map +1 -0
- package/dist/wire/index.d.ts +702 -1174
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +2 -81
- package/docs/feature-guide.md +1 -1
- package/docs/rollout.md +116 -2
- package/package.json +18 -10
- package/dist/benchmarks/index.js.map +0 -1
- package/dist/campaign/index.js.map +0 -1
- package/dist/chunk-2JX3CFMB.js +0 -695
- package/dist/chunk-2JX3CFMB.js.map +0 -1
- package/dist/chunk-2MKQIFS4.js +0 -183
- package/dist/chunk-2MKQIFS4.js.map +0 -1
- package/dist/chunk-3RF76KTD.js +0 -84
- package/dist/chunk-3RF76KTD.js.map +0 -1
- package/dist/chunk-5DTSBUL2.js +0 -159
- package/dist/chunk-5DTSBUL2.js.map +0 -1
- package/dist/chunk-7ZZMD7UK.js +0 -386
- package/dist/chunk-7ZZMD7UK.js.map +0 -1
- package/dist/chunk-BOD4O7OF.js +0 -40
- package/dist/chunk-BOD4O7OF.js.map +0 -1
- package/dist/chunk-BYT7ELPS.js +0 -1553
- package/dist/chunk-BYT7ELPS.js.map +0 -1
- package/dist/chunk-DJKY2TSY.js +0 -2428
- package/dist/chunk-DJKY2TSY.js.map +0 -1
- package/dist/chunk-DPUHNQLN.js +0 -232
- package/dist/chunk-DPUHNQLN.js.map +0 -1
- package/dist/chunk-DRYIUNWY.js +0 -622
- package/dist/chunk-DRYIUNWY.js.map +0 -1
- package/dist/chunk-EJGRPCO3.js +0 -617
- package/dist/chunk-EJGRPCO3.js.map +0 -1
- package/dist/chunk-EOSZT7PL.js +0 -2001
- package/dist/chunk-EOSZT7PL.js.map +0 -1
- package/dist/chunk-EZJEIH2R.js +0 -1559
- package/dist/chunk-EZJEIH2R.js.map +0 -1
- package/dist/chunk-GGE4NNQT.js +0 -65
- package/dist/chunk-GGE4NNQT.js.map +0 -1
- package/dist/chunk-HHWE3POT.js +0 -94
- package/dist/chunk-HHWE3POT.js.map +0 -1
- package/dist/chunk-IHQDPH7D.js +0 -171
- package/dist/chunk-IHQDPH7D.js.map +0 -1
- package/dist/chunk-JHCHEVET.js +0 -274
- package/dist/chunk-JHCHEVET.js.map +0 -1
- package/dist/chunk-K4DBDHLK.js +0 -158
- package/dist/chunk-K4DBDHLK.js.map +0 -1
- package/dist/chunk-K6N6XJJX.js +0 -306
- package/dist/chunk-K6N6XJJX.js.map +0 -1
- package/dist/chunk-MA6HLL3S.js +0 -65
- package/dist/chunk-MA6HLL3S.js.map +0 -1
- package/dist/chunk-MAZ26DC7.js +0 -99
- package/dist/chunk-MAZ26DC7.js.map +0 -1
- package/dist/chunk-MHELPNRP.js +0 -1212
- package/dist/chunk-MHELPNRP.js.map +0 -1
- package/dist/chunk-NACAGYSY.js +0 -1040
- package/dist/chunk-NACAGYSY.js.map +0 -1
- package/dist/chunk-NKAGIDE2.js +0 -7633
- package/dist/chunk-NKAGIDE2.js.map +0 -1
- package/dist/chunk-NPCTHQIO.js +0 -91
- package/dist/chunk-NPCTHQIO.js.map +0 -1
- package/dist/chunk-NYLOYM6N.js +0 -332
- package/dist/chunk-NYLOYM6N.js.map +0 -1
- package/dist/chunk-ONWEPEDO.js +0 -57
- package/dist/chunk-ONWEPEDO.js.map +0 -1
- package/dist/chunk-P5W7RQKK.js +0 -576
- package/dist/chunk-P5W7RQKK.js.map +0 -1
- package/dist/chunk-P6FYH6K4.js +0 -1161
- package/dist/chunk-P6FYH6K4.js.map +0 -1
- package/dist/chunk-PBE2LOSS.js +0 -669
- package/dist/chunk-PBE2LOSS.js.map +0 -1
- package/dist/chunk-PC4UYEBM.js +0 -166
- package/dist/chunk-PC4UYEBM.js.map +0 -1
- package/dist/chunk-PXE2VKMX.js +0 -140
- package/dist/chunk-PXE2VKMX.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- package/dist/chunk-RZTMDUO7.js +0 -49
- package/dist/chunk-RZTMDUO7.js.map +0 -1
- package/dist/chunk-S5YLIBFX.js +0 -136
- package/dist/chunk-S5YLIBFX.js.map +0 -1
- package/dist/chunk-SZLVEKMJ.js +0 -1446
- package/dist/chunk-SZLVEKMJ.js.map +0 -1
- package/dist/chunk-T4SQEITX.js +0 -95
- package/dist/chunk-T4SQEITX.js.map +0 -1
- package/dist/chunk-TBL77AUT.js +0 -355
- package/dist/chunk-TBL77AUT.js.map +0 -1
- package/dist/chunk-TSN7JT6D.js +0 -1646
- package/dist/chunk-TSN7JT6D.js.map +0 -1
- package/dist/chunk-TT4KNT67.js +0 -124
- package/dist/chunk-TT4KNT67.js.map +0 -1
- package/dist/chunk-UB2LOJ6Q.js +0 -4461
- package/dist/chunk-UB2LOJ6Q.js.map +0 -1
- package/dist/chunk-UWZZKKU7.js +0 -237
- package/dist/chunk-UWZZKKU7.js.map +0 -1
- package/dist/chunk-VBQ3CRKH.js +0 -291
- package/dist/chunk-VBQ3CRKH.js.map +0 -1
- package/dist/chunk-VGRCHJON.js +0 -163
- package/dist/chunk-VGRCHJON.js.map +0 -1
- package/dist/chunk-VI2UW6B6.js +0 -162
- package/dist/chunk-VI2UW6B6.js.map +0 -1
- package/dist/chunk-VLOATJQ2.js +0 -908
- package/dist/chunk-VLOATJQ2.js.map +0 -1
- package/dist/chunk-VQMK5FMP.js +0 -247
- package/dist/chunk-VQMK5FMP.js.map +0 -1
- package/dist/chunk-VZSRQ272.js +0 -149
- package/dist/chunk-VZSRQ272.js.map +0 -1
- package/dist/chunk-WGXIEX7P.js +0 -116
- package/dist/chunk-WGXIEX7P.js.map +0 -1
- package/dist/chunk-WS3NZZQQ.js +0 -929
- package/dist/chunk-WS3NZZQQ.js.map +0 -1
- package/dist/chunk-XDWDC2MP.js +0 -695
- package/dist/chunk-XDWDC2MP.js.map +0 -1
- package/dist/chunk-XPRT64IE.js +0 -766
- package/dist/chunk-XPRT64IE.js.map +0 -1
- package/dist/chunk-YJBNWCAA.js +0 -1056
- package/dist/chunk-YJBNWCAA.js.map +0 -1
- package/dist/chunk-ZET2UAYW.js +0 -89
- package/dist/chunk-ZET2UAYW.js.map +0 -1
- package/dist/chunk-ZUUWPZCV.js +0 -752
- package/dist/chunk-ZUUWPZCV.js.map +0 -1
- package/dist/control.js.map +0 -1
- package/dist/hosted/index.js.map +0 -1
- package/dist/matrix/index.js.map +0 -1
- package/dist/reporting.js.map +0 -1
- package/dist/rollout/index.js.map +0 -1
- package/dist/run-campaign-ISHFZ7FJ.js +0 -17
- package/dist/run-campaign-ISHFZ7FJ.js.map +0 -1
- package/dist/supervisor-run/index.js.map +0 -1
- package/dist/traces.js.map +0 -1
- package/dist/wire/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/trace-analyst/prompts.ts","../src/trace-analyst/analyst.ts"],"sourcesContent":["/** Ax RLM prompt for bounded trace discovery and evidence-backed analysis. */\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION = `You answer questions about an OTLP-shaped JSONL trace dataset using the trace tools provided in the \\`traces\\` namespace.\n\nDISCOVERY → NARROW → DEEP-READ protocol — follow exactly:\n\n1. ALWAYS call \\`traces.getDatasetOverview({})\\` FIRST without a regex_pattern. The result tells you total_traces, raw_jsonl_bytes, services, agents, models, and sample_trace_ids (real ids — never fabricate one).\n\n2. Use raw_jsonl_bytes to gauge how expensive raw scans will be. \\`filters.regex_pattern\\` is the one scan-heavy filter on getDatasetOverview / queryTraces / countTraces — narrow with indexed fields (has_errors, model_names, service_names, agent_names, time bounds) BEFORE adding a regex on a large dataset.\n\n3. To list more traces than the sample, call \\`traces.queryTraces({ filters?, limit, offset? })\\`. Each summary carries raw_jsonl_bytes — use it to choose between viewTrace and searchTrace BEFORE calling either.\n\n4. Per-trace inspection:\n - SMALL trace (raw_jsonl_bytes well under 150_000): call \\`traces.viewTrace({ trace_id })\\`. Returns all spans. Per-attribute payloads are head-capped at ~4KB; large \\`input.value\\` / \\`output.value\\` / \\`llm.input_messages\\` will show a \\`[trace-analyst truncated: N bytes]\\` marker.\n - LARGE trace (raw_jsonl_bytes near or above 150_000, or you saw an \\`oversized\\` response): use \\`traces.searchTrace({ trace_id, regex_pattern })\\` to get bounded SpanMatchRecords (span metadata + matched text + surrounding context). Then call \\`traces.viewSpans({ trace_id, span_ids: [...] })\\` for surgical reads (~16KB cap, 4× higher than discovery), or \\`traces.searchSpan({ trace_id, span_id, regex_pattern })\\` for one large span. Stays bounded regardless of trace size.\n - Useful regex patterns: \\`STATUS_CODE_ERROR\\` (failures), tool names like \\`grep\\` or \\`view_trace\\`, error strings like \\`MaxTurnsExceeded\\`, model names, attribute keys.\n\n5. ONLY call viewTrace / viewSpans / searchTrace / searchSpan with trace/span ids you have already seen in sample_trace_ids, a queryTraces page, or a previous search result. Never invent ids.\n\n5a. **Result-shape contract** — searchTrace and searchSpan return \\`{ trace_id, hits, total_matches, has_more }\\`. Iterate \\`result.hits\\` (NOT result.matches). Each hit has \\`{ span_id, span_name, span_kind, attribute_path, matched_text, context_before, context_after, match_offset }\\`. viewTrace returns \\`{ trace_id, spans }\\` (or \\`oversized\\`). viewSpans returns \\`{ trace_id, spans, missing_span_ids, truncated_attribute_count }\\`. Never assume a field name — log the result shape first if unsure.\n\n6. If viewTrace returns an \\`oversized\\` summary instead of \\`spans\\`, DO NOT retry the same call. Read the summary's top_span_names, span_count, span_response_bytes_max, error_span_count to plan a follow-up: switch to searchTrace (or searchSpan for one large span), then viewSpans on a smaller, surgical span_ids set.\n\n7. If searchTrace or searchSpan returns has_more=true, REFINE the regex to be more specific rather than blindly raising max_matches.\n\n8. If a tool errors (invalid regex, range error), STOP and reconsider — don't retry with a guessed id or argument. Use the discovery tools above to recover.\n\n9. If a ~4KB-truncated payload from viewTrace / searchTrace matters for your answer, first try viewSpans on that span id (~16KB cap). If a 16KB-truncated payload from viewSpans still matters, narrow further with searchSpan against a more specific regex rather than asking for the full payload again.\n\n10. If the question splits into independent reasoning branches, use bounded \\`llmQuery(...)\\` calls over evidence you already loaded. Subqueries cannot inspect the trace store, so pass the exact trace excerpts they need. Example:\n\n const reviews = await llmQuery([\n { query: 'Classify the failure mechanism in this excerpt.', context: traceAbcExcerpt },\n { query: 'Classify the failure mechanism in this excerpt.', context: traceDefExcerpt },\n ]);\n\nOBSERVABILITY rules:\n- Each discovery turn must emit at least one concise \\`console.log(...)\\` showing what evidence was learned.\n- Finish gathering evidence before submitting the analysis.\n- Reuse runtime variables across turns; don't recompute.\n\nOUTPUT contract — your final answer must include:\n- A clear prose conclusion answering the user's question.\n- Trace ids and span ids cited as evidence for each claim.\n- Failure modes named in the user's domain language, with frequency and concrete examples.\n- A concise findings array containing only claims supported by inspected evidence.\n\nDo NOT invent trace ids, span ids, error messages, or model names. Every fact must be traceable to a tool result.`\n\nexport const TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION = 'trace-analyst-actor-v6-2026-07-14'\n","import type { AxAgentActorTurnCallbackArgs, AxAIService, AxFunction } from '@ax-llm/ax'\nimport { runTraceAnalysisLoop, type TraceAnalysisLoopResult } from './loop'\nimport { TRACE_ANALYST_ACTOR_DESCRIPTION, TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION } from './prompts'\nimport type { TraceAnalysisStore } from './store'\nimport { OtlpFileTraceStore } from './store-otlp'\nimport { buildTraceAnalystTools } from './tools'\n\nexport interface AnalyzeTracesInput {\n /** The user-facing question. Domain framing belongs here, not in the\n * actor description. */\n question: string\n}\n\nexport interface AnalyzeTracesResult {\n /** The actor's submitted prose answer. */\n answer: string\n /** Bulleted findings from the actor's structured completion. */\n findings: string[]\n /** Per-turn snapshots captured via `actorTurnCallback`. */\n turns: AnalyzeTracesTurnSnapshot[]\n /** Total turns the actor took. */\n turnCount: number\n /** Token usage by role. */\n usage: TraceAnalystUsage\n /** Full system + assistant + tool message log by role. */\n chatLog: TraceAnalystChatLog\n /** Prompt version that produced this run. */\n actorPromptVersion: string\n}\n\nexport interface TraceAnalystUsage {\n actor: TraceAnalystUsageEntry[]\n responder: TraceAnalystUsageEntry[]\n}\n\nexport interface TraceAnalystUsageEntry {\n [key: string]: unknown\n}\n\nexport interface TraceAnalystChatLog {\n actor: TraceAnalystChatMessage[]\n responder: TraceAnalystChatMessage[]\n}\n\nexport interface TraceAnalystChatMessage {\n [key: string]: unknown\n}\n\nexport interface AnalyzeTracesTurnSnapshot {\n stage: AxAgentActorTurnCallbackArgs['stage']\n turn: number\n isError: boolean\n /** The JS code the actor produced for this turn. */\n code: string\n /** The formatted action-log entry the actor sees on the next turn. */\n output: string\n /** Provider thought (when `executorOptions.showThoughts` is true and the\n * provider returns it). */\n thought?: string\n}\n\nexport interface AnalyzeTracesOptions {\n /** Trace data source. Pass either an OTLP-JSONL path or a custom store. */\n source: string | TraceAnalysisStore\n /** Caller-provided AxAIService. */\n ai: AxAIService\n /** Model id forwarded to the actor. */\n model?: string\n /** Maximum model subqueries. 0 disables model fan-out. Default 4. */\n maxSubqueries?: number\n /** Maximum actor turns. Default 12. */\n maxTurns?: number\n /** Maximum parallel model subqueries. Default 2. */\n maxParallelSubqueries?: number\n /** Cancels in-flight model and tool work. */\n signal?: AbortSignal\n /** Override the actor description. */\n actorDescription?: string\n /** Per-turn observability hook. */\n onTurn?: (turn: AnalyzeTracesTurnSnapshot) => void | Promise<void>\n /** Override max runtime characters per turn. Default 6000. */\n maxRuntimeChars?: number\n /** When set, every turn's snapshot is appended to this JSONL file\n * immediately. If the analyst crashes mid-loop (provider 503,\n * network error, validator reject) the partial reasoning is still\n * on disk for diagnosis and recovery. */\n progressLogPath?: string\n}\n\n/**\n * Run the trace analyst.\n *\n * Throws:\n * - `TraceFileMissingError` if `source` is a path and doesn't exist.\n * - `AxAgentClarificationError` if the analyst asks for clarification.\n * - Provider errors (auth, rate limits) propagate from the AI service.\n */\nexport async function analyzeTraces(\n input: AnalyzeTracesInput,\n options: AnalyzeTracesOptions,\n): Promise<AnalyzeTracesResult> {\n if (!input.question || typeof input.question !== 'string') {\n throw new TypeError('analyzeTraces: input.question must be a non-empty string')\n }\n rejectRemovedOptions(options)\n\n const store: TraceAnalysisStore =\n typeof options.source === 'string'\n ? new OtlpFileTraceStore({ path: options.source })\n : options.source\n\n // Pre-warm file stores so missing inputs fail before the RLM starts.\n if (store instanceof OtlpFileTraceStore) {\n await store.ensureIndexed()\n }\n\n const tools: AxFunction[] = buildTraceAnalystTools({ store })\n const turns: AnalyzeTracesTurnSnapshot[] = []\n\n // Persist each turn as JSONL so interrupted analyst runs keep useful evidence.\n let progressFs: import('node:fs').WriteStream | undefined\n if (options.progressLogPath) {\n const { createWriteStream } = await import('node:fs')\n const { mkdir } = await import('node:fs/promises')\n const { dirname } = await import('node:path')\n await mkdir(dirname(options.progressLogPath), { recursive: true })\n progressFs = createWriteStream(options.progressLogPath, { flags: 'a' })\n }\n\n const actorTurnCallback = async (turn: AxAgentActorTurnCallbackArgs): Promise<void> => {\n const snap: AnalyzeTracesTurnSnapshot = {\n stage: turn.stage,\n turn: turn.turn,\n isError: turn.isError,\n code: turn.code,\n output: turn.output,\n thought: turn.thought,\n }\n turns.push(snap)\n if (progressFs) {\n try {\n progressFs.write(`${JSON.stringify({ ...snap, ts: Date.now() })}\\n`)\n } catch {\n // Progress logging must never fail the analyst.\n }\n }\n if (options.onTurn) await options.onTurn(snap)\n }\n\n const maxSubqueries = options.maxSubqueries ?? 4\n const maxTurns = options.maxTurns ?? 12\n const maxParallelSubqueries = options.maxParallelSubqueries ?? 2\n const maxRuntimeChars = options.maxRuntimeChars ?? 6000\n let completed: TraceAnalysisLoopResult<string>\n try {\n completed = await runTraceAnalysisLoop({\n id: 'TraceAnalyst',\n description:\n 'Analyzes OTLP-shaped JSONL traces using bounded discovery tools to identify systemic failure modes.',\n prompt: `${options.actorDescription ?? TRACE_ANALYST_ACTOR_DESCRIPTION}\n\nThe report must answer the user's question, and findings must be an array of concise evidence-backed strings.`,\n question: input.question,\n ai: options.ai,\n ...(options.model ? { model: options.model } : {}),\n tools,\n findingType: 'string',\n maxSubqueries,\n maxParallelSubqueries,\n maxTurns,\n maxRuntimeChars,\n ...(options.signal ? { signal: options.signal } : {}),\n onTurn: actorTurnCallback,\n })\n } finally {\n if (progressFs) {\n await new Promise<void>((resolve) => progressFs!.end(() => resolve()))\n }\n }\n\n return {\n answer: completed.report,\n findings: completed.findings,\n turns,\n turnCount: turns.length,\n usage: { actor: normalizeRecordArray(completed.usage), responder: [] },\n chatLog: { actor: normalizeRecordArray(completed.chatLog), responder: [] },\n actorPromptVersion: TRACE_ANALYST_ACTOR_DESCRIPTION_VERSION,\n }\n}\n\nfunction rejectRemovedOptions(options: AnalyzeTracesOptions): void {\n const supplied = options as unknown as Record<string, unknown>\n const migrations = [\n ['maxDepth', 'maxSubqueries'],\n ['maxParallelSubagents', 'maxParallelSubqueries'],\n ['subagentDescription', 'actorDescription'],\n ] as const\n for (const [removed, replacement] of migrations) {\n if (removed in supplied) {\n throw new TypeError(`analyzeTraces: '${removed}' is unsupported; use '${replacement}'`)\n }\n }\n}\n\nfunction normalizeRecordArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return []\n return value.map((item) =>\n item && typeof item === 'object' ? { ...(item as Record<string, unknown>) } : { value: item },\n )\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-7ZZMD7UK.js
DELETED
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FAILURE_CLASSES
|
|
3
|
-
} from "./chunk-MA6HLL3S.js";
|
|
4
|
-
import {
|
|
5
|
-
ValidationError
|
|
6
|
-
} from "./chunk-ONWEPEDO.js";
|
|
7
|
-
import {
|
|
8
|
-
LLM_CACHED_TOKEN_ATTR_KEYS,
|
|
9
|
-
LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,
|
|
10
|
-
LLM_COST_ATTR_KEYS,
|
|
11
|
-
LLM_INPUT_TOKEN_ATTR_KEYS,
|
|
12
|
-
LLM_OUTPUT_TOKEN_ATTR_KEYS,
|
|
13
|
-
LLM_REASONING_TOKEN_ATTR_KEYS,
|
|
14
|
-
RUN_COST_ATTR_KEYS
|
|
15
|
-
} from "./chunk-K4DBDHLK.js";
|
|
16
|
-
|
|
17
|
-
// src/trace/error-classification.ts
|
|
18
|
-
function summarizeTraceErrors(signals) {
|
|
19
|
-
const byId = /* @__PURE__ */ new Map();
|
|
20
|
-
for (const signal of signals) {
|
|
21
|
-
if (byId.has(signal.id)) {
|
|
22
|
-
throw new Error(`summarizeTraceErrors: duplicate span id '${signal.id}'`);
|
|
23
|
-
}
|
|
24
|
-
byId.set(signal.id, signal);
|
|
25
|
-
}
|
|
26
|
-
const propagated = /* @__PURE__ */ new Set();
|
|
27
|
-
for (const signal of signals) {
|
|
28
|
-
if (!signal.error) continue;
|
|
29
|
-
const visited = /* @__PURE__ */ new Set();
|
|
30
|
-
let parentId = signal.parentId;
|
|
31
|
-
while (parentId && !visited.has(parentId)) {
|
|
32
|
-
visited.add(parentId);
|
|
33
|
-
const parent = byId.get(parentId);
|
|
34
|
-
if (!parent) break;
|
|
35
|
-
if (parent.error) propagated.add(parent.id);
|
|
36
|
-
parentId = parent.parentId;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
const summary = {
|
|
40
|
-
total: 0,
|
|
41
|
-
execution: 0,
|
|
42
|
-
process: 0,
|
|
43
|
-
guardrail: 0,
|
|
44
|
-
evaluation: 0,
|
|
45
|
-
propagated: 0,
|
|
46
|
-
unclassified: 0
|
|
47
|
-
};
|
|
48
|
-
for (const signal of signals) {
|
|
49
|
-
if (!signal.error) continue;
|
|
50
|
-
summary.total += 1;
|
|
51
|
-
if (signal.role === "GUARDRAIL") {
|
|
52
|
-
summary.guardrail += 1;
|
|
53
|
-
} else if (signal.role === "EVALUATOR") {
|
|
54
|
-
summary.evaluation += 1;
|
|
55
|
-
} else if (signal.processRoot) {
|
|
56
|
-
summary.process += 1;
|
|
57
|
-
} else if (propagated.has(signal.id)) {
|
|
58
|
-
summary.propagated += 1;
|
|
59
|
-
} else if (signal.role === "AGENT" || signal.role === "CHAIN" || signal.role === "LLM" || signal.role === "TOOL") {
|
|
60
|
-
summary.execution += 1;
|
|
61
|
-
} else {
|
|
62
|
-
summary.unclassified += 1;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return summary;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// src/trace/execution-measurements.ts
|
|
69
|
-
var TOKEN_MEASUREMENT_KEY_GROUPS = [
|
|
70
|
-
LLM_INPUT_TOKEN_ATTR_KEYS,
|
|
71
|
-
LLM_OUTPUT_TOKEN_ATTR_KEYS,
|
|
72
|
-
LLM_REASONING_TOKEN_ATTR_KEYS,
|
|
73
|
-
LLM_CACHED_TOKEN_ATTR_KEYS,
|
|
74
|
-
LLM_CACHE_WRITE_TOKEN_ATTR_KEYS
|
|
75
|
-
];
|
|
76
|
-
var EXECUTION_MEASUREMENT_KEY_GROUPS = [
|
|
77
|
-
...TOKEN_MEASUREMENT_KEY_GROUPS,
|
|
78
|
-
LLM_COST_ATTR_KEYS
|
|
79
|
-
];
|
|
80
|
-
function summarizeExecutionMeasurements(spans) {
|
|
81
|
-
const byId = /* @__PURE__ */ new Map();
|
|
82
|
-
for (const span of spans) {
|
|
83
|
-
if (byId.has(span.id)) {
|
|
84
|
-
throw new Error(`summarizeExecutionMeasurements: duplicate span id "${span.id}"`);
|
|
85
|
-
}
|
|
86
|
-
byId.set(span.id, span);
|
|
87
|
-
}
|
|
88
|
-
const tokenMeasurementKeys = TOKEN_MEASUREMENT_KEY_GROUPS.flat();
|
|
89
|
-
const candidates = spans.filter(
|
|
90
|
-
(span) => span.modelCall || !span.aggregate && readNumber(span.attributes, tokenMeasurementKeys) !== void 0
|
|
91
|
-
);
|
|
92
|
-
const candidateIds = new Set(candidates.map((span) => span.id));
|
|
93
|
-
const candidateChildren = /* @__PURE__ */ new Map();
|
|
94
|
-
for (const candidate of candidates) {
|
|
95
|
-
const parentId = nearestCandidateParent(candidate, byId, candidateIds);
|
|
96
|
-
if (!parentId) continue;
|
|
97
|
-
const children = candidateChildren.get(parentId) ?? [];
|
|
98
|
-
children.push(candidate);
|
|
99
|
-
candidateChildren.set(parentId, children);
|
|
100
|
-
}
|
|
101
|
-
const aggregateIds = classifyAggregateSpans(candidates, candidateChildren);
|
|
102
|
-
const untypedRunCostIds = new Set(
|
|
103
|
-
spans.filter(
|
|
104
|
-
(span) => !span.modelCall && !span.aggregate && !candidateIds.has(span.id) && readNumber(span.attributes, RUN_COST_ATTR_KEYS) !== void 0
|
|
105
|
-
).map((span) => span.id)
|
|
106
|
-
);
|
|
107
|
-
const aggregateSourceIds = new Set(
|
|
108
|
-
spans.filter(
|
|
109
|
-
(span) => span.aggregate || aggregateIds.has(span.id) || untypedRunCostIds.has(span.id)
|
|
110
|
-
).map((span) => span.id)
|
|
111
|
-
);
|
|
112
|
-
const calls = candidates.filter((span) => !aggregateIds.has(span.id));
|
|
113
|
-
const input = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_INPUT_TOKEN_ATTR_KEYS);
|
|
114
|
-
const reasoning = reconcileMeasurement(
|
|
115
|
-
calls,
|
|
116
|
-
byId,
|
|
117
|
-
aggregateSourceIds,
|
|
118
|
-
LLM_REASONING_TOKEN_ATTR_KEYS
|
|
119
|
-
);
|
|
120
|
-
const output = reconcileMeasurement(
|
|
121
|
-
calls,
|
|
122
|
-
byId,
|
|
123
|
-
aggregateSourceIds,
|
|
124
|
-
LLM_OUTPUT_TOKEN_ATTR_KEYS,
|
|
125
|
-
LLM_REASONING_TOKEN_ATTR_KEYS
|
|
126
|
-
);
|
|
127
|
-
const cached = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_CACHED_TOKEN_ATTR_KEYS);
|
|
128
|
-
const cacheWrite = reconcileMeasurement(
|
|
129
|
-
calls,
|
|
130
|
-
byId,
|
|
131
|
-
aggregateSourceIds,
|
|
132
|
-
LLM_CACHE_WRITE_TOKEN_ATTR_KEYS
|
|
133
|
-
);
|
|
134
|
-
const aggregate = summarizeAggregateMeasurements(
|
|
135
|
-
spans,
|
|
136
|
-
byId,
|
|
137
|
-
/* @__PURE__ */ new Set([...aggregateIds, ...untypedRunCostIds])
|
|
138
|
-
);
|
|
139
|
-
return {
|
|
140
|
-
tokenUsage: {
|
|
141
|
-
input: input.value ?? 0,
|
|
142
|
-
output: Math.max(output.value ?? 0, reasoning.value ?? 0),
|
|
143
|
-
...reasoning.value !== void 0 ? { reasoning: reasoning.value } : {},
|
|
144
|
-
...cached.value !== void 0 ? { cached: cached.value } : {},
|
|
145
|
-
...cacheWrite.value !== void 0 ? { cacheWrite: cacheWrite.value } : {}
|
|
146
|
-
},
|
|
147
|
-
modelCallCount: calls.length,
|
|
148
|
-
callSpanIds: calls.map((span) => span.id),
|
|
149
|
-
cost: reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_COST_ATTR_KEYS),
|
|
150
|
-
...aggregate ? { aggregate } : {}
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
function recordAggregateMeasurements(raw, aggregate) {
|
|
154
|
-
if (!aggregate) return;
|
|
155
|
-
raw.aggregate_prompt_tokens = aggregate.tokenUsage.input;
|
|
156
|
-
raw.aggregate_completion_tokens = aggregate.tokenUsage.output;
|
|
157
|
-
if (aggregate.tokenUsage.reasoning !== void 0)
|
|
158
|
-
raw.aggregate_reasoning_tokens = aggregate.tokenUsage.reasoning;
|
|
159
|
-
if (aggregate.tokenUsage.cached !== void 0)
|
|
160
|
-
raw.aggregate_cached_tokens = aggregate.tokenUsage.cached;
|
|
161
|
-
if (aggregate.tokenUsage.cacheWrite !== void 0)
|
|
162
|
-
raw.aggregate_cache_write_tokens = aggregate.tokenUsage.cacheWrite;
|
|
163
|
-
if (aggregate.costUsd !== void 0) raw.aggregate_cost_usd = aggregate.costUsd;
|
|
164
|
-
}
|
|
165
|
-
function summarizeAggregateMeasurements(spans, byId, aggregateIds) {
|
|
166
|
-
const aggregates = spans.filter((span) => span.aggregate || aggregateIds.has(span.id));
|
|
167
|
-
const input = reconcileTopLevelMeasurement(aggregates, byId, LLM_INPUT_TOKEN_ATTR_KEYS);
|
|
168
|
-
const output = reconcileTopLevelMeasurement(aggregates, byId, LLM_OUTPUT_TOKEN_ATTR_KEYS);
|
|
169
|
-
const reasoning = reconcileTopLevelMeasurement(aggregates, byId, LLM_REASONING_TOKEN_ATTR_KEYS);
|
|
170
|
-
const cached = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHED_TOKEN_ATTR_KEYS);
|
|
171
|
-
const cacheWrite = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHE_WRITE_TOKEN_ATTR_KEYS);
|
|
172
|
-
const costUsd = reconcileTopLevelMeasurement(aggregates, byId, LLM_COST_ATTR_KEYS);
|
|
173
|
-
if (input === void 0 && output === void 0 && reasoning === void 0 && cached === void 0 && cacheWrite === void 0 && costUsd === void 0)
|
|
174
|
-
return void 0;
|
|
175
|
-
return {
|
|
176
|
-
tokenUsage: {
|
|
177
|
-
input: input ?? 0,
|
|
178
|
-
output: output ?? reasoning ?? 0,
|
|
179
|
-
...reasoning !== void 0 ? { reasoning } : {},
|
|
180
|
-
...cached !== void 0 ? { cached } : {},
|
|
181
|
-
...cacheWrite !== void 0 ? { cacheWrite } : {}
|
|
182
|
-
},
|
|
183
|
-
...costUsd !== void 0 ? { costUsd } : {}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
function reconcileTopLevelMeasurement(spans, byId, keys) {
|
|
187
|
-
const selected = /* @__PURE__ */ new Map();
|
|
188
|
-
for (const span of spans) {
|
|
189
|
-
const value = readNumber(span.attributes, keys);
|
|
190
|
-
if (value !== void 0) selected.set(span.id, value);
|
|
191
|
-
}
|
|
192
|
-
for (const spanId of [...selected.keys()]) {
|
|
193
|
-
const span = byId.get(spanId);
|
|
194
|
-
if (!span) continue;
|
|
195
|
-
if (ancestorIds(span, byId).some((ancestorId) => selected.has(ancestorId))) {
|
|
196
|
-
selected.delete(spanId);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return selected.size > 0 ? [...selected.values()].reduce((total, value) => total + value, 0) : void 0;
|
|
200
|
-
}
|
|
201
|
-
function reconcileMeasurement(calls, byId, aggregateSourceIds, keys, fallbackKeys) {
|
|
202
|
-
const selected = /* @__PURE__ */ new Map();
|
|
203
|
-
const callIds = new Set(calls.map((call) => call.id));
|
|
204
|
-
let reportingCalls = 0;
|
|
205
|
-
for (const call of calls) {
|
|
206
|
-
const primary = nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys);
|
|
207
|
-
const fallback = fallbackKeys ? nearestMeasurement(call, byId, callIds, aggregateSourceIds, fallbackKeys) : void 0;
|
|
208
|
-
const source = primary && fallback && primary.span.id === fallback.span.id ? { span: primary.span, value: Math.max(primary.value, fallback.value) } : primary ?? fallback;
|
|
209
|
-
if (!source) continue;
|
|
210
|
-
reportingCalls += 1;
|
|
211
|
-
selected.set(source.span.id, source.value);
|
|
212
|
-
}
|
|
213
|
-
for (const spanId of [...selected.keys()]) {
|
|
214
|
-
const span = byId.get(spanId);
|
|
215
|
-
if (!span) continue;
|
|
216
|
-
if (ancestorIds(span, byId).some(
|
|
217
|
-
(ancestorId) => selected.has(ancestorId) && !callIds.has(ancestorId)
|
|
218
|
-
)) {
|
|
219
|
-
selected.delete(spanId);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return {
|
|
223
|
-
...selected.size > 0 ? { value: [...selected.values()].reduce((total, value) => total + value, 0) } : {},
|
|
224
|
-
reportingCalls,
|
|
225
|
-
complete: calls.length > 0 && reportingCalls === calls.length
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
function nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys) {
|
|
229
|
-
let current = call;
|
|
230
|
-
const seen = /* @__PURE__ */ new Set();
|
|
231
|
-
while (current && !seen.has(current.id)) {
|
|
232
|
-
seen.add(current.id);
|
|
233
|
-
const value = readNumber(current.attributes, keys);
|
|
234
|
-
if (value !== void 0 && (current.id === call.id || !callIds.has(current.id) && aggregateSourceIds.has(current.id))) {
|
|
235
|
-
return { span: current, value };
|
|
236
|
-
}
|
|
237
|
-
current = current.parentId ? byId.get(current.parentId) : void 0;
|
|
238
|
-
}
|
|
239
|
-
return void 0;
|
|
240
|
-
}
|
|
241
|
-
function classifyAggregateSpans(candidates, childrenById) {
|
|
242
|
-
const aggregateIds = /* @__PURE__ */ new Set();
|
|
243
|
-
const summaries = /* @__PURE__ */ new Map();
|
|
244
|
-
const visiting = /* @__PURE__ */ new Set();
|
|
245
|
-
const visit = (span) => {
|
|
246
|
-
const cached = summaries.get(span.id);
|
|
247
|
-
if (cached) return cached;
|
|
248
|
-
if (visiting.has(span.id)) return emptyRetainedCallSummary();
|
|
249
|
-
visiting.add(span.id);
|
|
250
|
-
const descendants = emptyRetainedCallSummary();
|
|
251
|
-
for (const child of childrenById.get(span.id) ?? []) {
|
|
252
|
-
const childDescendants = visit(child);
|
|
253
|
-
if (!aggregateIds.has(child.id)) addRetainedCall(descendants, child);
|
|
254
|
-
addRetainedCallSummary(descendants, childDescendants);
|
|
255
|
-
}
|
|
256
|
-
if (descendants.callCount > 0 && (!span.modelCall || hasCompatibleDescendantMeasurements(span, descendants))) {
|
|
257
|
-
aggregateIds.add(span.id);
|
|
258
|
-
}
|
|
259
|
-
visiting.delete(span.id);
|
|
260
|
-
summaries.set(span.id, descendants);
|
|
261
|
-
return descendants;
|
|
262
|
-
};
|
|
263
|
-
for (const candidate of candidates) visit(candidate);
|
|
264
|
-
return aggregateIds;
|
|
265
|
-
}
|
|
266
|
-
function emptyRetainedCallSummary() {
|
|
267
|
-
return {
|
|
268
|
-
callCount: 0,
|
|
269
|
-
measurements: EXECUTION_MEASUREMENT_KEY_GROUPS.map(() => ({
|
|
270
|
-
total: 0,
|
|
271
|
-
reportingCalls: 0
|
|
272
|
-
}))
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
function addRetainedCall(summary, span) {
|
|
276
|
-
summary.callCount += 1;
|
|
277
|
-
for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {
|
|
278
|
-
const value = readNumber(span.attributes, EXECUTION_MEASUREMENT_KEY_GROUPS[index]);
|
|
279
|
-
if (value === void 0) continue;
|
|
280
|
-
const measurement = summary.measurements[index];
|
|
281
|
-
measurement.total += value;
|
|
282
|
-
measurement.reportingCalls += 1;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
function addRetainedCallSummary(target, source) {
|
|
286
|
-
target.callCount += source.callCount;
|
|
287
|
-
for (let index = 0; index < target.measurements.length; index += 1) {
|
|
288
|
-
const measurement = target.measurements[index];
|
|
289
|
-
const sourceMeasurement = source.measurements[index];
|
|
290
|
-
measurement.total += sourceMeasurement.total;
|
|
291
|
-
measurement.reportingCalls += sourceMeasurement.reportingCalls;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
function hasCompatibleDescendantMeasurements(span, descendants) {
|
|
295
|
-
let parentMeasurements = 0;
|
|
296
|
-
let descendantMeasurements = 0;
|
|
297
|
-
for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {
|
|
298
|
-
const keys = EXECUTION_MEASUREMENT_KEY_GROUPS[index];
|
|
299
|
-
const parentValue = readNumber(span.attributes, keys);
|
|
300
|
-
const measurement = descendants.measurements[index];
|
|
301
|
-
if (parentValue !== void 0) parentMeasurements += 1;
|
|
302
|
-
if (measurement.reportingCalls > 0) descendantMeasurements += 1;
|
|
303
|
-
if (parentValue === void 0 || measurement.reportingCalls === 0) continue;
|
|
304
|
-
if (measurement.reportingCalls !== descendants.callCount) continue;
|
|
305
|
-
if (Math.abs(parentValue - measurement.total) > 1e-12) return false;
|
|
306
|
-
}
|
|
307
|
-
return parentMeasurements === 0 || descendantMeasurements > 0;
|
|
308
|
-
}
|
|
309
|
-
function ancestorIds(span, byId) {
|
|
310
|
-
const ids = [];
|
|
311
|
-
const seen = /* @__PURE__ */ new Set();
|
|
312
|
-
let parentId = span.parentId;
|
|
313
|
-
while (parentId && !seen.has(parentId)) {
|
|
314
|
-
ids.push(parentId);
|
|
315
|
-
seen.add(parentId);
|
|
316
|
-
parentId = byId.get(parentId)?.parentId;
|
|
317
|
-
}
|
|
318
|
-
return ids;
|
|
319
|
-
}
|
|
320
|
-
function nearestCandidateParent(span, byId, candidateIds) {
|
|
321
|
-
const seen = /* @__PURE__ */ new Set();
|
|
322
|
-
let parentId = span.parentId;
|
|
323
|
-
while (parentId && !seen.has(parentId)) {
|
|
324
|
-
if (candidateIds.has(parentId)) return parentId;
|
|
325
|
-
seen.add(parentId);
|
|
326
|
-
parentId = byId.get(parentId)?.parentId;
|
|
327
|
-
}
|
|
328
|
-
return void 0;
|
|
329
|
-
}
|
|
330
|
-
function readNumber(attributes, keys) {
|
|
331
|
-
for (const key of keys) {
|
|
332
|
-
const value = attributes[key];
|
|
333
|
-
const parsed = typeof value === "number" ? value : typeof value === "string" && value.length > 0 ? Number(value) : Number.NaN;
|
|
334
|
-
if (Number.isFinite(parsed) && parsed >= 0) return parsed;
|
|
335
|
-
}
|
|
336
|
-
return void 0;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// src/trace/task-failure-attributes.ts
|
|
340
|
-
var TASK_FAILURE_CLASS_ATTR = "tangle.task.failure_class";
|
|
341
|
-
var TASK_FAILURE_MODE_ATTR = "tangle.task.failure_mode";
|
|
342
|
-
function readTaskFailureLabels(roots, context) {
|
|
343
|
-
const failureClass = readConsistentRootString(roots, TASK_FAILURE_CLASS_ATTR, context);
|
|
344
|
-
const failureMode = readConsistentRootString(roots, TASK_FAILURE_MODE_ATTR, context);
|
|
345
|
-
if (failureClass !== void 0 && !FAILURE_CLASSES.includes(failureClass)) {
|
|
346
|
-
throw new ValidationError(
|
|
347
|
-
`${context}: ${TASK_FAILURE_CLASS_ATTR} must be one of ${FAILURE_CLASSES.join(", ")}`
|
|
348
|
-
);
|
|
349
|
-
}
|
|
350
|
-
if (failureMode !== void 0 && (failureClass === void 0 || failureClass === "success")) {
|
|
351
|
-
throw new ValidationError(
|
|
352
|
-
`${context}: ${TASK_FAILURE_MODE_ATTR} requires a non-success ${TASK_FAILURE_CLASS_ATTR}`
|
|
353
|
-
);
|
|
354
|
-
}
|
|
355
|
-
if (failureClass === void 0) return {};
|
|
356
|
-
if (failureClass === "success") return { failureClass };
|
|
357
|
-
return {
|
|
358
|
-
failureClass,
|
|
359
|
-
...failureMode ? { failureMode } : {}
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
function readConsistentRootString(roots, key, context) {
|
|
363
|
-
const values = /* @__PURE__ */ new Set();
|
|
364
|
-
for (const root of roots) {
|
|
365
|
-
if (!Object.hasOwn(root.attributes, key)) continue;
|
|
366
|
-
const value = root.attributes[key];
|
|
367
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
368
|
-
throw new ValidationError(`${context}: ${key} must be a non-empty string`);
|
|
369
|
-
}
|
|
370
|
-
values.add(value);
|
|
371
|
-
}
|
|
372
|
-
if (values.size > 1) {
|
|
373
|
-
throw new ValidationError(
|
|
374
|
-
`${context}: conflicting ${key} values: ${[...values].sort().join(", ")}`
|
|
375
|
-
);
|
|
376
|
-
}
|
|
377
|
-
return values.values().next().value;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
export {
|
|
381
|
-
summarizeTraceErrors,
|
|
382
|
-
summarizeExecutionMeasurements,
|
|
383
|
-
recordAggregateMeasurements,
|
|
384
|
-
readTaskFailureLabels
|
|
385
|
-
};
|
|
386
|
-
//# sourceMappingURL=chunk-7ZZMD7UK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/trace/error-classification.ts","../src/trace/execution-measurements.ts","../src/trace/task-failure-attributes.ts"],"sourcesContent":["import type { OtlpSpanRole } from './otlp-attributes'\n\nexport type TraceErrorRole = OtlpSpanRole\n\nexport interface TraceErrorSignal {\n id: string\n parentId?: string\n role: TraceErrorRole\n error: boolean\n processRoot: boolean\n}\n\nexport interface TraceErrorSummary {\n total: number\n execution: number\n process: number\n guardrail: number\n evaluation: number\n propagated: number\n unclassified: number\n}\n\n/**\n * Classify errored spans without counting a propagated parent status as a\n * second execution failure.\n */\nexport function summarizeTraceErrors(signals: readonly TraceErrorSignal[]): TraceErrorSummary {\n const byId = new Map<string, TraceErrorSignal>()\n for (const signal of signals) {\n if (byId.has(signal.id)) {\n throw new Error(`summarizeTraceErrors: duplicate span id '${signal.id}'`)\n }\n byId.set(signal.id, signal)\n }\n\n const propagated = new Set<string>()\n for (const signal of signals) {\n if (!signal.error) continue\n const visited = new Set<string>()\n let parentId = signal.parentId\n while (parentId && !visited.has(parentId)) {\n visited.add(parentId)\n const parent = byId.get(parentId)\n if (!parent) break\n if (parent.error) propagated.add(parent.id)\n parentId = parent.parentId\n }\n }\n\n const summary: TraceErrorSummary = {\n total: 0,\n execution: 0,\n process: 0,\n guardrail: 0,\n evaluation: 0,\n propagated: 0,\n unclassified: 0,\n }\n\n for (const signal of signals) {\n if (!signal.error) continue\n summary.total += 1\n if (signal.role === 'GUARDRAIL') {\n summary.guardrail += 1\n } else if (signal.role === 'EVALUATOR') {\n summary.evaluation += 1\n } else if (signal.processRoot) {\n summary.process += 1\n } else if (propagated.has(signal.id)) {\n summary.propagated += 1\n } else if (\n signal.role === 'AGENT' ||\n signal.role === 'CHAIN' ||\n signal.role === 'LLM' ||\n signal.role === 'TOOL'\n ) {\n summary.execution += 1\n } else {\n summary.unclassified += 1\n }\n }\n\n return summary\n}\n","import type { RunTokenUsage } from '../run-record'\nimport {\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n LLM_CACHED_TOKEN_ATTR_KEYS,\n LLM_COST_ATTR_KEYS,\n LLM_INPUT_TOKEN_ATTR_KEYS,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n RUN_COST_ATTR_KEYS,\n} from './otlp-attributes'\n\nexport interface ExecutionMeasurementSpan {\n id: string\n parentId?: string\n attributes: Record<string, unknown>\n modelCall: boolean\n aggregate: boolean\n}\n\nexport interface MeasurementCoverage {\n value?: number\n reportingCalls: number\n complete: boolean\n}\n\nexport interface ExecutionMeasurements {\n tokenUsage: RunTokenUsage\n modelCallCount: number\n callSpanIds: string[]\n cost: MeasurementCoverage\n aggregate?: {\n tokenUsage: RunTokenUsage\n costUsd?: number\n }\n}\n\nconst TOKEN_MEASUREMENT_KEY_GROUPS = [\n LLM_INPUT_TOKEN_ATTR_KEYS,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n LLM_CACHED_TOKEN_ATTR_KEYS,\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n] as const\n\nconst EXECUTION_MEASUREMENT_KEY_GROUPS = [\n ...TOKEN_MEASUREMENT_KEY_GROUPS,\n LLM_COST_ATTR_KEYS,\n] as const\n\ninterface RetainedCallSummary {\n callCount: number\n measurements: Array<{\n total: number\n reportingCalls: number\n }>\n}\n\n/**\n * Reconcile execution measurements across nested telemetry wrappers.\n * A measured parent is used only when a descendant call does not report the\n * same field, so aggregate wrappers neither duplicate complete child data nor\n * erase complementary parent fields.\n */\nexport function summarizeExecutionMeasurements(\n spans: ExecutionMeasurementSpan[],\n): ExecutionMeasurements {\n const byId = new Map<string, ExecutionMeasurementSpan>()\n for (const span of spans) {\n if (byId.has(span.id)) {\n throw new Error(`summarizeExecutionMeasurements: duplicate span id \"${span.id}\"`)\n }\n byId.set(span.id, span)\n }\n const tokenMeasurementKeys = TOKEN_MEASUREMENT_KEY_GROUPS.flat()\n const candidates = spans.filter(\n (span) =>\n span.modelCall ||\n (!span.aggregate && readNumber(span.attributes, tokenMeasurementKeys) !== undefined),\n )\n const candidateIds = new Set(candidates.map((span) => span.id))\n const candidateChildren = new Map<string, ExecutionMeasurementSpan[]>()\n for (const candidate of candidates) {\n const parentId = nearestCandidateParent(candidate, byId, candidateIds)\n if (!parentId) continue\n const children = candidateChildren.get(parentId) ?? []\n children.push(candidate)\n candidateChildren.set(parentId, children)\n }\n const aggregateIds = classifyAggregateSpans(candidates, candidateChildren)\n const untypedRunCostIds = new Set(\n spans\n .filter(\n (span) =>\n !span.modelCall &&\n !span.aggregate &&\n !candidateIds.has(span.id) &&\n readNumber(span.attributes, RUN_COST_ATTR_KEYS) !== undefined,\n )\n .map((span) => span.id),\n )\n const aggregateSourceIds = new Set(\n spans\n .filter(\n (span) => span.aggregate || aggregateIds.has(span.id) || untypedRunCostIds.has(span.id),\n )\n .map((span) => span.id),\n )\n\n const calls = candidates.filter((span) => !aggregateIds.has(span.id))\n const input = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_INPUT_TOKEN_ATTR_KEYS)\n const reasoning = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n )\n const output = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_OUTPUT_TOKEN_ATTR_KEYS,\n LLM_REASONING_TOKEN_ATTR_KEYS,\n )\n const cached = reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_CACHED_TOKEN_ATTR_KEYS)\n const cacheWrite = reconcileMeasurement(\n calls,\n byId,\n aggregateSourceIds,\n LLM_CACHE_WRITE_TOKEN_ATTR_KEYS,\n )\n const aggregate = summarizeAggregateMeasurements(\n spans,\n byId,\n new Set([...aggregateIds, ...untypedRunCostIds]),\n )\n\n return {\n tokenUsage: {\n input: input.value ?? 0,\n output: Math.max(output.value ?? 0, reasoning.value ?? 0),\n ...(reasoning.value !== undefined ? { reasoning: reasoning.value } : {}),\n ...(cached.value !== undefined ? { cached: cached.value } : {}),\n ...(cacheWrite.value !== undefined ? { cacheWrite: cacheWrite.value } : {}),\n },\n modelCallCount: calls.length,\n callSpanIds: calls.map((span) => span.id),\n cost: reconcileMeasurement(calls, byId, aggregateSourceIds, LLM_COST_ATTR_KEYS),\n ...(aggregate ? { aggregate } : {}),\n }\n}\n\nexport function recordAggregateMeasurements(\n raw: Record<string, number>,\n aggregate: ExecutionMeasurements['aggregate'],\n): void {\n if (!aggregate) return\n raw.aggregate_prompt_tokens = aggregate.tokenUsage.input\n raw.aggregate_completion_tokens = aggregate.tokenUsage.output\n if (aggregate.tokenUsage.reasoning !== undefined)\n raw.aggregate_reasoning_tokens = aggregate.tokenUsage.reasoning\n if (aggregate.tokenUsage.cached !== undefined)\n raw.aggregate_cached_tokens = aggregate.tokenUsage.cached\n if (aggregate.tokenUsage.cacheWrite !== undefined)\n raw.aggregate_cache_write_tokens = aggregate.tokenUsage.cacheWrite\n if (aggregate.costUsd !== undefined) raw.aggregate_cost_usd = aggregate.costUsd\n}\n\nfunction summarizeAggregateMeasurements(\n spans: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n aggregateIds: Set<string>,\n): ExecutionMeasurements['aggregate'] {\n const aggregates = spans.filter((span) => span.aggregate || aggregateIds.has(span.id))\n const input = reconcileTopLevelMeasurement(aggregates, byId, LLM_INPUT_TOKEN_ATTR_KEYS)\n const output = reconcileTopLevelMeasurement(aggregates, byId, LLM_OUTPUT_TOKEN_ATTR_KEYS)\n const reasoning = reconcileTopLevelMeasurement(aggregates, byId, LLM_REASONING_TOKEN_ATTR_KEYS)\n const cached = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHED_TOKEN_ATTR_KEYS)\n const cacheWrite = reconcileTopLevelMeasurement(aggregates, byId, LLM_CACHE_WRITE_TOKEN_ATTR_KEYS)\n const costUsd = reconcileTopLevelMeasurement(aggregates, byId, LLM_COST_ATTR_KEYS)\n if (\n input === undefined &&\n output === undefined &&\n reasoning === undefined &&\n cached === undefined &&\n cacheWrite === undefined &&\n costUsd === undefined\n )\n return undefined\n return {\n tokenUsage: {\n input: input ?? 0,\n output: output ?? reasoning ?? 0,\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(cached !== undefined ? { cached } : {}),\n ...(cacheWrite !== undefined ? { cacheWrite } : {}),\n },\n ...(costUsd !== undefined ? { costUsd } : {}),\n }\n}\n\nfunction reconcileTopLevelMeasurement(\n spans: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n keys: readonly string[],\n): number | undefined {\n const selected = new Map<string, number>()\n for (const span of spans) {\n const value = readNumber(span.attributes, keys)\n if (value !== undefined) selected.set(span.id, value)\n }\n for (const spanId of [...selected.keys()]) {\n const span = byId.get(spanId)\n if (!span) continue\n if (ancestorIds(span, byId).some((ancestorId) => selected.has(ancestorId))) {\n selected.delete(spanId)\n }\n }\n return selected.size > 0\n ? [...selected.values()].reduce((total, value) => total + value, 0)\n : undefined\n}\n\nfunction reconcileMeasurement(\n calls: ExecutionMeasurementSpan[],\n byId: Map<string, ExecutionMeasurementSpan>,\n aggregateSourceIds: Set<string>,\n keys: readonly string[],\n fallbackKeys?: readonly string[],\n): MeasurementCoverage {\n const selected = new Map<string, number>()\n const callIds = new Set(calls.map((call) => call.id))\n let reportingCalls = 0\n\n for (const call of calls) {\n const primary = nearestMeasurement(call, byId, callIds, aggregateSourceIds, keys)\n const fallback = fallbackKeys\n ? nearestMeasurement(call, byId, callIds, aggregateSourceIds, fallbackKeys)\n : undefined\n const source =\n primary && fallback && primary.span.id === fallback.span.id\n ? { span: primary.span, value: Math.max(primary.value, fallback.value) }\n : (primary ?? fallback)\n if (!source) continue\n reportingCalls += 1\n selected.set(source.span.id, source.value)\n }\n\n for (const spanId of [...selected.keys()]) {\n const span = byId.get(spanId)\n if (!span) continue\n if (\n ancestorIds(span, byId).some(\n (ancestorId) => selected.has(ancestorId) && !callIds.has(ancestorId),\n )\n ) {\n selected.delete(spanId)\n }\n }\n\n return {\n ...(selected.size > 0\n ? { value: [...selected.values()].reduce((total, value) => total + value, 0) }\n : {}),\n reportingCalls,\n complete: calls.length > 0 && reportingCalls === calls.length,\n }\n}\n\nfunction nearestMeasurement(\n call: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n callIds: Set<string>,\n aggregateSourceIds: Set<string>,\n keys: readonly string[],\n): { span: ExecutionMeasurementSpan; value: number } | undefined {\n let current: ExecutionMeasurementSpan | undefined = call\n const seen = new Set<string>()\n while (current && !seen.has(current.id)) {\n seen.add(current.id)\n const value = readNumber(current.attributes, keys)\n if (\n value !== undefined &&\n (current.id === call.id || (!callIds.has(current.id) && aggregateSourceIds.has(current.id)))\n ) {\n return { span: current, value }\n }\n current = current.parentId ? byId.get(current.parentId) : undefined\n }\n return undefined\n}\n\nfunction classifyAggregateSpans(\n candidates: ExecutionMeasurementSpan[],\n childrenById: Map<string, ExecutionMeasurementSpan[]>,\n): Set<string> {\n const aggregateIds = new Set<string>()\n const summaries = new Map<string, RetainedCallSummary>()\n const visiting = new Set<string>()\n\n const visit = (span: ExecutionMeasurementSpan): RetainedCallSummary => {\n const cached = summaries.get(span.id)\n if (cached) return cached\n if (visiting.has(span.id)) return emptyRetainedCallSummary()\n visiting.add(span.id)\n\n const descendants = emptyRetainedCallSummary()\n for (const child of childrenById.get(span.id) ?? []) {\n const childDescendants = visit(child)\n if (!aggregateIds.has(child.id)) addRetainedCall(descendants, child)\n addRetainedCallSummary(descendants, childDescendants)\n }\n\n if (\n descendants.callCount > 0 &&\n (!span.modelCall || hasCompatibleDescendantMeasurements(span, descendants))\n ) {\n aggregateIds.add(span.id)\n }\n\n visiting.delete(span.id)\n summaries.set(span.id, descendants)\n return descendants\n }\n\n for (const candidate of candidates) visit(candidate)\n return aggregateIds\n}\n\nfunction emptyRetainedCallSummary(): RetainedCallSummary {\n return {\n callCount: 0,\n measurements: EXECUTION_MEASUREMENT_KEY_GROUPS.map(() => ({\n total: 0,\n reportingCalls: 0,\n })),\n }\n}\n\nfunction addRetainedCall(summary: RetainedCallSummary, span: ExecutionMeasurementSpan): void {\n summary.callCount += 1\n for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {\n const value = readNumber(span.attributes, EXECUTION_MEASUREMENT_KEY_GROUPS[index]!)\n if (value === undefined) continue\n const measurement = summary.measurements[index]!\n measurement.total += value\n measurement.reportingCalls += 1\n }\n}\n\nfunction addRetainedCallSummary(target: RetainedCallSummary, source: RetainedCallSummary): void {\n target.callCount += source.callCount\n for (let index = 0; index < target.measurements.length; index += 1) {\n const measurement = target.measurements[index]!\n const sourceMeasurement = source.measurements[index]!\n measurement.total += sourceMeasurement.total\n measurement.reportingCalls += sourceMeasurement.reportingCalls\n }\n}\n\nfunction hasCompatibleDescendantMeasurements(\n span: ExecutionMeasurementSpan,\n descendants: RetainedCallSummary,\n): boolean {\n let parentMeasurements = 0\n let descendantMeasurements = 0\n for (let index = 0; index < EXECUTION_MEASUREMENT_KEY_GROUPS.length; index += 1) {\n const keys = EXECUTION_MEASUREMENT_KEY_GROUPS[index]!\n const parentValue = readNumber(span.attributes, keys)\n const measurement = descendants.measurements[index]!\n if (parentValue !== undefined) parentMeasurements += 1\n if (measurement.reportingCalls > 0) descendantMeasurements += 1\n if (parentValue === undefined || measurement.reportingCalls === 0) continue\n if (measurement.reportingCalls !== descendants.callCount) continue\n if (Math.abs(parentValue - measurement.total) > 1e-12) return false\n }\n return parentMeasurements === 0 || descendantMeasurements > 0\n}\n\nfunction ancestorIds(\n span: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n): string[] {\n const ids: string[] = []\n const seen = new Set<string>()\n let parentId = span.parentId\n while (parentId && !seen.has(parentId)) {\n ids.push(parentId)\n seen.add(parentId)\n parentId = byId.get(parentId)?.parentId\n }\n return ids\n}\n\nfunction nearestCandidateParent(\n span: ExecutionMeasurementSpan,\n byId: Map<string, ExecutionMeasurementSpan>,\n candidateIds: Set<string>,\n): string | undefined {\n const seen = new Set<string>()\n let parentId = span.parentId\n while (parentId && !seen.has(parentId)) {\n if (candidateIds.has(parentId)) return parentId\n seen.add(parentId)\n parentId = byId.get(parentId)?.parentId\n }\n return undefined\n}\n\nfunction readNumber(\n attributes: Record<string, unknown>,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const value = attributes[key]\n const parsed =\n typeof value === 'number'\n ? value\n : typeof value === 'string' && value.length > 0\n ? Number(value)\n : Number.NaN\n if (Number.isFinite(parsed) && parsed >= 0) return parsed\n }\n return undefined\n}\n","import { ValidationError } from '../errors'\nimport { FAILURE_CLASSES, type FailureClass } from './schema'\n\nconst TASK_FAILURE_CLASS_ATTR = 'tangle.task.failure_class'\nconst TASK_FAILURE_MODE_ATTR = 'tangle.task.failure_mode'\n\ninterface AttributeCarrier {\n attributes: Record<string, unknown>\n}\n\nexport type TaskFailureLabels =\n | { failureClass?: undefined; failureMode?: undefined }\n | { failureClass: 'success'; failureMode?: undefined }\n | { failureClass: Exclude<FailureClass, 'success'>; failureMode?: string }\n\nexport function readTaskFailureLabels(\n roots: readonly AttributeCarrier[],\n context: string,\n): TaskFailureLabels {\n const failureClass = readConsistentRootString(roots, TASK_FAILURE_CLASS_ATTR, context)\n const failureMode = readConsistentRootString(roots, TASK_FAILURE_MODE_ATTR, context)\n\n if (failureClass !== undefined && !FAILURE_CLASSES.includes(failureClass as FailureClass)) {\n throw new ValidationError(\n `${context}: ${TASK_FAILURE_CLASS_ATTR} must be one of ${FAILURE_CLASSES.join(', ')}`,\n )\n }\n if (failureMode !== undefined && (failureClass === undefined || failureClass === 'success')) {\n throw new ValidationError(\n `${context}: ${TASK_FAILURE_MODE_ATTR} requires a non-success ${TASK_FAILURE_CLASS_ATTR}`,\n )\n }\n\n if (failureClass === undefined) return {}\n if (failureClass === 'success') return { failureClass }\n return {\n failureClass: failureClass as Exclude<FailureClass, 'success'>,\n ...(failureMode ? { failureMode } : {}),\n }\n}\n\nfunction readConsistentRootString(\n roots: readonly AttributeCarrier[],\n key: string,\n context: string,\n): string | undefined {\n const values = new Set<string>()\n for (const root of roots) {\n if (!Object.hasOwn(root.attributes, key)) continue\n const value = root.attributes[key]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new ValidationError(`${context}: ${key} must be a non-empty string`)\n }\n values.add(value)\n }\n\n if (values.size > 1) {\n throw new ValidationError(\n `${context}: conflicting ${key} values: ${[...values].sort().join(', ')}`,\n )\n }\n return values.values().next().value\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-BOD4O7OF.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// src/series-convergence.ts
|
|
2
|
-
function analyzeSeries(values, options = {}) {
|
|
3
|
-
const window = options.window ?? 5;
|
|
4
|
-
const stableCv = options.stableCv ?? 0.05;
|
|
5
|
-
const driftRun = options.driftRun ?? 3;
|
|
6
|
-
if (values.length < Math.max(2, Math.min(window, 3))) {
|
|
7
|
-
return { state: "insufficient-data", windowMean: 0, windowCv: 0, tailRun: 0, stable: false };
|
|
8
|
-
}
|
|
9
|
-
const tail = values.slice(-window);
|
|
10
|
-
const mean = tail.reduce((a, b) => a + b, 0) / tail.length;
|
|
11
|
-
const variance = tail.reduce((acc, v) => acc + (v - mean) ** 2, 0) / tail.length;
|
|
12
|
-
const stdDev = Math.sqrt(variance);
|
|
13
|
-
const refMean = Math.abs(mean) > 1e-9 ? Math.abs(mean) : 1;
|
|
14
|
-
const cv = stdDev / refMean;
|
|
15
|
-
const stable = tail.length >= window && cv <= stableCv;
|
|
16
|
-
let tailRun = 0;
|
|
17
|
-
let direction = 0;
|
|
18
|
-
for (let i = values.length - 1; i > 0; i--) {
|
|
19
|
-
const delta = values[i] - values[i - 1];
|
|
20
|
-
if (delta === 0) break;
|
|
21
|
-
const dir = delta > 0 ? 1 : -1;
|
|
22
|
-
if (direction === 0) direction = dir;
|
|
23
|
-
if (dir !== direction) break;
|
|
24
|
-
tailRun += dir;
|
|
25
|
-
}
|
|
26
|
-
let state;
|
|
27
|
-
if (stable) {
|
|
28
|
-
state = "stabilized";
|
|
29
|
-
} else if (Math.abs(tailRun) >= driftRun) {
|
|
30
|
-
state = tailRun > 0 ? "drifting-up" : "drifting-down";
|
|
31
|
-
} else {
|
|
32
|
-
state = "noisy";
|
|
33
|
-
}
|
|
34
|
-
return { state, windowMean: mean, windowCv: cv, tailRun, stable };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export {
|
|
38
|
-
analyzeSeries
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=chunk-BOD4O7OF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/series-convergence.ts"],"sourcesContent":["/**\n * Series convergence — detects whether a sequence of scalar measurements\n * is stabilizing, drifting, or noisy.\n *\n * Lifted from ADC convergence.ts. The per-turn `ConvergenceTracker` is\n * about progress *within* a single run; this module is about drift\n * *across* runs (e.g. \"are my nightly eval scores stabilizing?\").\n *\n * Three signals:\n * - stabilized: last K values have low variance (< epsilon) — done\n * - drifting: recent trend is monotonic and beyond noise — regressing or improving\n * - noisy: neither — keep iterating, but flag as untrustworthy for gating\n */\n\nexport interface SeriesConvergenceOptions {\n /** Window size for \"recent\" analysis (default 5). */\n window?: number\n /** Coefficient-of-variation threshold below which the window is stabilized (default 0.05 = 5%). */\n stableCv?: number\n /** Minimum monotone run length to call drift (default 3). */\n driftRun?: number\n}\n\nexport interface SeriesConvergenceResult {\n state: 'stabilized' | 'drifting-up' | 'drifting-down' | 'noisy' | 'insufficient-data'\n windowMean: number\n windowCv: number\n /** Longest monotonic run at the tail of the series (positive for up, negative for down). */\n tailRun: number\n /** True when n ≥ window AND windowCv ≤ stableCv. */\n stable: boolean\n}\n\nexport function analyzeSeries(\n values: number[],\n options: SeriesConvergenceOptions = {},\n): SeriesConvergenceResult {\n const window = options.window ?? 5\n const stableCv = options.stableCv ?? 0.05\n const driftRun = options.driftRun ?? 3\n\n if (values.length < Math.max(2, Math.min(window, 3))) {\n return { state: 'insufficient-data', windowMean: 0, windowCv: 0, tailRun: 0, stable: false }\n }\n\n const tail = values.slice(-window)\n const mean = tail.reduce((a, b) => a + b, 0) / tail.length\n const variance = tail.reduce((acc, v) => acc + (v - mean) ** 2, 0) / tail.length\n const stdDev = Math.sqrt(variance)\n const refMean = Math.abs(mean) > 1e-9 ? Math.abs(mean) : 1\n const cv = stdDev / refMean\n const stable = tail.length >= window && cv <= stableCv\n\n // Tail monotonic run: count how many consecutive strictly-increasing (or decreasing)\n // steps end at the final value.\n let tailRun = 0\n let direction: 1 | -1 | 0 = 0\n for (let i = values.length - 1; i > 0; i--) {\n const delta = values[i]! - values[i - 1]!\n if (delta === 0) break\n const dir = delta > 0 ? 1 : -1\n if (direction === 0) direction = dir\n if (dir !== direction) break\n tailRun += dir\n }\n\n let state: SeriesConvergenceResult['state']\n if (stable) {\n state = 'stabilized'\n } else if (Math.abs(tailRun) >= driftRun) {\n state = tailRun > 0 ? 'drifting-up' : 'drifting-down'\n } else {\n state = 'noisy'\n }\n\n return { state, windowMean: mean, windowCv: cv, tailRun, stable }\n}\n"],"mappings":";AAiCO,SAAS,cACd,QACA,UAAoC,CAAC,GACZ;AACzB,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,YAAY;AAErC,MAAI,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,CAAC,CAAC,GAAG;AACpD,WAAO,EAAE,OAAO,qBAAqB,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,MAAM;AAAA,EAC7F;AAEA,QAAM,OAAO,OAAO,MAAM,CAAC,MAAM;AACjC,QAAM,OAAO,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK;AACpD,QAAM,WAAW,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK;AAC1E,QAAM,SAAS,KAAK,KAAK,QAAQ;AACjC,QAAM,UAAU,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI;AACzD,QAAM,KAAK,SAAS;AACpB,QAAM,SAAS,KAAK,UAAU,UAAU,MAAM;AAI9C,MAAI,UAAU;AACd,MAAI,YAAwB;AAC5B,WAAS,IAAI,OAAO,SAAS,GAAG,IAAI,GAAG,KAAK;AAC1C,UAAM,QAAQ,OAAO,CAAC,IAAK,OAAO,IAAI,CAAC;AACvC,QAAI,UAAU,EAAG;AACjB,UAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,QAAI,cAAc,EAAG,aAAY;AACjC,QAAI,QAAQ,UAAW;AACvB,eAAW;AAAA,EACb;AAEA,MAAI;AACJ,MAAI,QAAQ;AACV,YAAQ;AAAA,EACV,WAAW,KAAK,IAAI,OAAO,KAAK,UAAU;AACxC,YAAQ,UAAU,IAAI,gBAAgB;AAAA,EACxC,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,SAAO,EAAE,OAAO,YAAY,MAAM,UAAU,IAAI,SAAS,OAAO;AAClE;","names":[]}
|