@tangle-network/agent-eval 0.129.0 → 0.130.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 +21 -0
- package/README.md +2 -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 +81 -2872
- package/dist/analyst/index.d.ts.map +1 -0
- package/dist/analyst/index.js +319 -360
- 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 -1188
- package/dist/belief-state/index.d.ts.map +1 -0
- package/dist/belief-state/index.js +1617 -1709
- package/dist/belief-state/index.js.map +1 -1
- package/dist/benchmarks/index.d.ts +2 -891
- package/dist/benchmarks/index.js +2 -60
- package/dist/benchmarks-BJgDGkAD.js +754 -0
- package/dist/benchmarks-BJgDGkAD.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 -6381
- package/dist/campaign/index.js +3 -213
- package/dist/campaign-aKJt6emI.js +3886 -0
- package/dist/campaign-aKJt6emI.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +164 -175
- 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 -5565
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +1730 -1938
- package/dist/contract/index.js.map +1 -1
- package/dist/control.d.ts +3 -1030
- package/dist/control.js +2 -33
- 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 -618
- 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-CD_WZ_Xr.d.ts +2250 -0
- package/dist/index-CD_WZ_Xr.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-Em67JBjs.d.ts +335 -0
- package/dist/index-Em67JBjs.d.ts.map +1 -0
- package/dist/index.d.ts +3755 -15555
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11182 -11216
- 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 -480
- 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 -1312
- package/dist/reporting.js +6 -51
- 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 +760 -4010
- package/dist/rl.d.ts.map +1 -0
- package/dist/rl.js +2325 -1958
- package/dist/rl.js.map +1 -1
- package/dist/rolldown-runtime-8H4AJuhK.js +14 -0
- package/dist/rollout/index.d.ts +3 -2087
- package/dist/rollout/index.js +8 -168
- 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/{chunk-56TAVBOK.js.map → run-record-BuoE80Dq.js.map} +1 -1
- 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-CUmHkGbI.js +7718 -0
- package/dist/skillopt-optimization-method-CUmHkGbI.js.map +1 -0
- package/dist/skillopt-optimization-method-CWKVTnks.d.ts +1740 -0
- package/dist/skillopt-optimization-method-CWKVTnks.d.ts.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 -959
- package/dist/supervisor-run/index.js +2 -65
- 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 -252
- 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 -1173
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +2 -81
- package/docs/campaign-proposers.md +1 -0
- package/package.json +17 -9
- package/dist/benchmarks/index.js.map +0 -1
- package/dist/campaign/index.js.map +0 -1
- package/dist/chunk-2QU3YOPR.js +0 -7374
- package/dist/chunk-2QU3YOPR.js.map +0 -1
- package/dist/chunk-3OCR4R5I.js +0 -728
- package/dist/chunk-3OCR4R5I.js.map +0 -1
- package/dist/chunk-3RF76KTD.js +0 -84
- package/dist/chunk-3RF76KTD.js.map +0 -1
- package/dist/chunk-56TAVBOK.js +0 -698
- package/dist/chunk-5DTSBUL2.js +0 -159
- package/dist/chunk-5DTSBUL2.js.map +0 -1
- package/dist/chunk-7FO3TNPI.js +0 -232
- package/dist/chunk-7FO3TNPI.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-BSO5JDQH.js +0 -2335
- package/dist/chunk-BSO5JDQH.js.map +0 -1
- package/dist/chunk-C6LXANRU.js +0 -1550
- package/dist/chunk-C6LXANRU.js.map +0 -1
- package/dist/chunk-DODXQREJ.js +0 -752
- package/dist/chunk-DODXQREJ.js.map +0 -1
- package/dist/chunk-DRYIUNWY.js +0 -622
- package/dist/chunk-DRYIUNWY.js.map +0 -1
- package/dist/chunk-E7QXT7SX.js +0 -183
- package/dist/chunk-E7QXT7SX.js.map +0 -1
- package/dist/chunk-EG66UGL4.js +0 -341
- package/dist/chunk-EG66UGL4.js.map +0 -1
- package/dist/chunk-FXTVJPYD.js +0 -576
- package/dist/chunk-FXTVJPYD.js.map +0 -1
- package/dist/chunk-G7MGMCZD.js +0 -153
- package/dist/chunk-G7MGMCZD.js.map +0 -1
- package/dist/chunk-GGE4NNQT.js +0 -65
- package/dist/chunk-GGE4NNQT.js.map +0 -1
- package/dist/chunk-H23X7XKK.js +0 -181
- package/dist/chunk-H23X7XKK.js.map +0 -1
- package/dist/chunk-HHWE3POT.js +0 -94
- package/dist/chunk-HHWE3POT.js.map +0 -1
- package/dist/chunk-HPWUNB47.js +0 -289
- package/dist/chunk-HPWUNB47.js.map +0 -1
- package/dist/chunk-IYCLP2N2.js +0 -766
- package/dist/chunk-IYCLP2N2.js.map +0 -1
- package/dist/chunk-JHCHEVET.js +0 -274
- package/dist/chunk-JHCHEVET.js.map +0 -1
- package/dist/chunk-JQSF5DQT.js +0 -701
- package/dist/chunk-JQSF5DQT.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-M4YBQKIJ.js +0 -1040
- package/dist/chunk-M4YBQKIJ.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-NPCTHQIO.js +0 -91
- package/dist/chunk-NPCTHQIO.js.map +0 -1
- package/dist/chunk-NY44NC4A.js +0 -1056
- package/dist/chunk-NY44NC4A.js.map +0 -1
- package/dist/chunk-OIUOT4QD.js +0 -44
- package/dist/chunk-OIUOT4QD.js.map +0 -1
- package/dist/chunk-ONWEPEDO.js +0 -57
- package/dist/chunk-ONWEPEDO.js.map +0 -1
- package/dist/chunk-OWN5NPMC.js +0 -152
- package/dist/chunk-OWN5NPMC.js.map +0 -1
- package/dist/chunk-P6FYH6K4.js +0 -1161
- package/dist/chunk-P6FYH6K4.js.map +0 -1
- package/dist/chunk-PC4UYEBM.js +0 -166
- package/dist/chunk-PC4UYEBM.js.map +0 -1
- package/dist/chunk-PC5DOSM7.js +0 -579
- package/dist/chunk-PC5DOSM7.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-QB6BDBP2.js +0 -4464
- package/dist/chunk-QB6BDBP2.js.map +0 -1
- package/dist/chunk-RXHCETDZ.js +0 -536
- package/dist/chunk-RXHCETDZ.js.map +0 -1
- package/dist/chunk-RZTMDUO7.js +0 -49
- package/dist/chunk-RZTMDUO7.js.map +0 -1
- package/dist/chunk-SFLLL76A.js +0 -669
- package/dist/chunk-SFLLL76A.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-T6RLYGAD.js +0 -158
- package/dist/chunk-T6RLYGAD.js.map +0 -1
- package/dist/chunk-TJVT4QFF.js +0 -911
- package/dist/chunk-TJVT4QFF.js.map +0 -1
- package/dist/chunk-TQ7LNKZ3.js +0 -136
- package/dist/chunk-TQ7LNKZ3.js.map +0 -1
- package/dist/chunk-U4L7JRPZ.js +0 -1706
- package/dist/chunk-U4L7JRPZ.js.map +0 -1
- package/dist/chunk-U4PHLT2N.js +0 -419
- package/dist/chunk-U4PHLT2N.js.map +0 -1
- package/dist/chunk-VCZ5FQYW.js +0 -928
- package/dist/chunk-VCZ5FQYW.js.map +0 -1
- package/dist/chunk-VI2UW6B6.js +0 -162
- package/dist/chunk-VI2UW6B6.js.map +0 -1
- package/dist/chunk-VQMK5FMP.js +0 -247
- package/dist/chunk-VQMK5FMP.js.map +0 -1
- package/dist/chunk-WGXIEX7P.js +0 -116
- package/dist/chunk-WGXIEX7P.js.map +0 -1
- package/dist/chunk-WVATSFCP.js +0 -1553
- package/dist/chunk-WVATSFCP.js.map +0 -1
- package/dist/chunk-X4YIBDER.js +0 -1662
- package/dist/chunk-X4YIBDER.js.map +0 -1
- package/dist/chunk-YQN4ICPP.js +0 -355
- package/dist/chunk-YQN4ICPP.js.map +0 -1
- package/dist/chunk-ZET2UAYW.js +0 -89
- package/dist/chunk-ZET2UAYW.js.map +0 -1
- package/dist/chunk-ZHTZ4EYI.js +0 -1212
- package/dist/chunk-ZHTZ4EYI.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-OJJ7CZF4.js +0 -18
- package/dist/run-campaign-OJJ7CZF4.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
package/dist/storyboard/index.js
CHANGED
|
@@ -1,122 +1,153 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// src/storyboard/code-edit.ts
|
|
4
|
-
var EDIT_TOOLS = /(edit|write|patch|apply|str_replace|create.*file|save|insert|update.*file|multi_edit)/i;
|
|
1
|
+
//#region src/storyboard/code-edit.ts
|
|
2
|
+
const EDIT_TOOLS = /(edit|write|patch|apply|str_replace|create.*file|save|insert|update.*file|multi_edit)/i;
|
|
5
3
|
function languageOf(path) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return map[ext] ?? ext;
|
|
4
|
+
const ext = path.includes(".") ? path.split(".").pop()?.toLowerCase() : void 0;
|
|
5
|
+
if (!ext) return void 0;
|
|
6
|
+
return {
|
|
7
|
+
ts: "ts",
|
|
8
|
+
tsx: "tsx",
|
|
9
|
+
js: "js",
|
|
10
|
+
jsx: "jsx",
|
|
11
|
+
mjs: "js",
|
|
12
|
+
cjs: "js",
|
|
13
|
+
py: "python",
|
|
14
|
+
rs: "rust",
|
|
15
|
+
go: "go",
|
|
16
|
+
sol: "solidity",
|
|
17
|
+
java: "java",
|
|
18
|
+
rb: "ruby",
|
|
19
|
+
php: "php",
|
|
20
|
+
c: "c",
|
|
21
|
+
cpp: "cpp",
|
|
22
|
+
cs: "csharp",
|
|
23
|
+
css: "css",
|
|
24
|
+
scss: "scss",
|
|
25
|
+
html: "html",
|
|
26
|
+
json: "json",
|
|
27
|
+
yaml: "yaml",
|
|
28
|
+
yml: "yaml",
|
|
29
|
+
toml: "toml",
|
|
30
|
+
md: "markdown",
|
|
31
|
+
sh: "bash",
|
|
32
|
+
sql: "sql"
|
|
33
|
+
}[ext] ?? ext;
|
|
37
34
|
}
|
|
38
35
|
function pick(obj, keys) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return void 0;
|
|
36
|
+
if (!obj || typeof obj !== "object") return void 0;
|
|
37
|
+
const rec = obj;
|
|
38
|
+
for (const k of Object.keys(rec)) if (keys.includes(k.toLowerCase())) {
|
|
39
|
+
const v = rec[k];
|
|
40
|
+
if (typeof v === "string") return v;
|
|
41
|
+
}
|
|
48
42
|
}
|
|
49
43
|
function countDiff(diff) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
44
|
+
if (!diff) return {
|
|
45
|
+
additions: 0,
|
|
46
|
+
deletions: 0
|
|
47
|
+
};
|
|
48
|
+
let additions = 0;
|
|
49
|
+
let deletions = 0;
|
|
50
|
+
for (const line of diff.split("\n")) if (line.startsWith("+") && !line.startsWith("+++")) additions++;
|
|
51
|
+
else if (line.startsWith("-") && !line.startsWith("---")) deletions++;
|
|
52
|
+
return {
|
|
53
|
+
additions,
|
|
54
|
+
deletions
|
|
55
|
+
};
|
|
58
56
|
}
|
|
57
|
+
/** Extract a CodeEdit from a single span, or undefined if it is not an edit. */
|
|
59
58
|
function codeEditFromSpan(span) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
59
|
+
if (span.kind !== "tool") return void 0;
|
|
60
|
+
const tool = span;
|
|
61
|
+
if (!EDIT_TOOLS.test(tool.toolName)) return void 0;
|
|
62
|
+
const path = pick(tool.args, [
|
|
63
|
+
"path",
|
|
64
|
+
"file_path",
|
|
65
|
+
"filepath",
|
|
66
|
+
"filename",
|
|
67
|
+
"file"
|
|
68
|
+
]);
|
|
69
|
+
if (!path) return void 0;
|
|
70
|
+
const diff = pick(tool.args, ["diff", "patch"]);
|
|
71
|
+
const after = pick(tool.args, [
|
|
72
|
+
"content",
|
|
73
|
+
"new_str",
|
|
74
|
+
"new_string",
|
|
75
|
+
"newtext",
|
|
76
|
+
"text",
|
|
77
|
+
"body"
|
|
78
|
+
]);
|
|
79
|
+
const before = pick(tool.args, [
|
|
80
|
+
"old_str",
|
|
81
|
+
"old_string",
|
|
82
|
+
"oldtext",
|
|
83
|
+
"original"
|
|
84
|
+
]);
|
|
85
|
+
const counts = countDiff(diff);
|
|
86
|
+
return {
|
|
87
|
+
spanId: span.spanId,
|
|
88
|
+
path,
|
|
89
|
+
language: languageOf(path),
|
|
90
|
+
diff,
|
|
91
|
+
before,
|
|
92
|
+
after,
|
|
93
|
+
additions: diff ? counts.additions : after ? after.split("\n").length : 0,
|
|
94
|
+
deletions: diff ? counts.deletions : 0,
|
|
95
|
+
startedAt: span.startedAt
|
|
96
|
+
};
|
|
80
97
|
}
|
|
98
|
+
/** All code edits in a run, in chronological order. */
|
|
81
99
|
function extractCodeEdits(spans) {
|
|
82
|
-
|
|
100
|
+
return spans.map(codeEditFromSpan).filter((e) => e != null).sort((a, b) => a.startedAt - b.startedAt);
|
|
83
101
|
}
|
|
102
|
+
/** Pair each code-edit (`diff`) scene with its concrete edit, matched via the
|
|
103
|
+
* scene's evidence span ids. Scenes without a recoverable edit are dropped. */
|
|
84
104
|
function codeEditsForStoryboard(storyboard, spans) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
105
|
+
const bySpan = new Map(extractCodeEdits(spans).map((e) => [e.spanId, e]));
|
|
106
|
+
const out = [];
|
|
107
|
+
for (const scene of storyboard.scenes) {
|
|
108
|
+
if (scene.sceneType !== "diff") continue;
|
|
109
|
+
const edit = scene.evidenceSpanIds.map((id) => bySpan.get(id)).find((e) => e != null);
|
|
110
|
+
if (edit) out.push({
|
|
111
|
+
scene,
|
|
112
|
+
edit
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
93
116
|
}
|
|
117
|
+
/** The text the animation types for an edit: prefer the full new file body,
|
|
118
|
+
* then the added lines of a diff, then a minimal placeholder so the scene is
|
|
119
|
+
* never blank. */
|
|
94
120
|
function editAnimationText(edit) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// (${edit.additions} line${edit.additions === 1 ? "" : "s"} written)`;
|
|
121
|
+
if (edit.after?.trim()) return edit.after;
|
|
122
|
+
if (edit.diff) {
|
|
123
|
+
const added = edit.diff.split("\n").filter((l) => l.startsWith("+") && !l.startsWith("+++")).map((l) => l.slice(1)).join("\n");
|
|
124
|
+
if (added.trim()) return added;
|
|
125
|
+
}
|
|
126
|
+
return `// ${edit.path}\n// (${edit.additions} line${edit.additions === 1 ? "" : "s"} written)`;
|
|
102
127
|
}
|
|
103
128
|
function esc(s) {
|
|
104
|
-
|
|
129
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
105
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Render a self-contained HTML page that animates the agent writing each file,
|
|
133
|
+
* character by character, with a filename tab, line numbers, and a blinking
|
|
134
|
+
* cursor — the shareable "watch it build" clip. No build step, no assets, no
|
|
135
|
+
* deps. The same `CodeEdit[]` feeds a Remotion MP4 renderer in a consumer
|
|
136
|
+
* package; this is the dependency-free baseline.
|
|
137
|
+
*/
|
|
106
138
|
function renderCodeAnimationHtml(source, opts = {}) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return `<!doctype html>
|
|
139
|
+
const files = (source.length > 0 && "path" in source[0] ? source : extractCodeEdits(source)).map((e) => ({
|
|
140
|
+
path: e.path,
|
|
141
|
+
language: e.language ?? "",
|
|
142
|
+
additions: e.additions,
|
|
143
|
+
deletions: e.deletions,
|
|
144
|
+
code: editAnimationText(e)
|
|
145
|
+
}));
|
|
146
|
+
const title = opts.title ?? "Agent writing code";
|
|
147
|
+
const charsPerTick = opts.charsPerTick ?? 4;
|
|
148
|
+
const pauseBetweenMs = opts.pauseBetweenMs ?? 900;
|
|
149
|
+
const filesJson = JSON.stringify(files);
|
|
150
|
+
return `<!doctype html>
|
|
120
151
|
<html lang="en">
|
|
121
152
|
<head>
|
|
122
153
|
<meta charset="utf-8" />
|
|
@@ -151,17 +182,17 @@ function renderCodeAnimationHtml(source, opts = {}) {
|
|
|
151
182
|
</style>
|
|
152
183
|
</head>
|
|
153
184
|
<body>
|
|
154
|
-
<h1
|
|
185
|
+
<h1>✏️ ${esc(title)}</h1>
|
|
155
186
|
<div class="editor">
|
|
156
187
|
<div class="tabbar">
|
|
157
188
|
<span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>
|
|
158
|
-
<span class="tab" id="tab"
|
|
189
|
+
<span class="tab" id="tab">—</span><span class="lang" id="lang"></span>
|
|
159
190
|
<span class="adds" id="adds"></span>
|
|
160
191
|
</div>
|
|
161
192
|
<div class="codewrap"><div class="gutter" id="gutter">1</div><pre id="code"></pre></div>
|
|
162
193
|
</div>
|
|
163
194
|
<div class="controls">
|
|
164
|
-
<button id="pp"
|
|
195
|
+
<button id="pp">⏸ Pause</button><button id="restart">↻ Restart</button>
|
|
165
196
|
<span id="counter"></span>
|
|
166
197
|
</div>
|
|
167
198
|
<script>
|
|
@@ -185,473 +216,517 @@ function renderCodeAnimationHtml(source, opts = {}) {
|
|
|
185
216
|
const f = FILES[fi];
|
|
186
217
|
if (ci < f.code.length){ ci = Math.min(f.code.length, ci + CPT); paint(); raf = requestAnimationFrame(tick); }
|
|
187
218
|
else if (fi < FILES.length - 1){ setTimeout(() => { fi++; ci = 0; setHeader(); paint(); raf = requestAnimationFrame(tick); }, PAUSE); }
|
|
188
|
-
else { playing = false; document.getElementById('pp').textContent = '
|
|
189
|
-
document.getElementById('pp').onclick = () => { if (!playing){ playing = true; paused = false; tick(); } else { paused = !paused; if (!paused) tick(); } document.getElementById('pp').textContent = paused ? '
|
|
190
|
-
document.getElementById('restart').onclick = () => { fi = 0; ci = 0; playing = true; paused = false; document.getElementById('pp').textContent = '
|
|
219
|
+
else { playing = false; document.getElementById('pp').textContent = '▶ Play'; } }
|
|
220
|
+
document.getElementById('pp').onclick = () => { if (!playing){ playing = true; paused = false; tick(); } else { paused = !paused; if (!paused) tick(); } document.getElementById('pp').textContent = paused ? '▶ Play' : '⏸ Pause'; };
|
|
221
|
+
document.getElementById('restart').onclick = () => { fi = 0; ci = 0; playing = true; paused = false; document.getElementById('pp').textContent = '⏸ Pause'; setHeader(); paint(); cancelAnimationFrame(raf); tick(); };
|
|
191
222
|
if (FILES.length){ setHeader(); paint(); tick(); }
|
|
192
|
-
|
|
223
|
+
<\/script>
|
|
193
224
|
</body>
|
|
194
225
|
</html>
|
|
195
226
|
`;
|
|
196
227
|
}
|
|
197
|
-
|
|
198
|
-
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/storyboard/index.ts
|
|
199
230
|
function str(v) {
|
|
200
|
-
|
|
231
|
+
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
201
232
|
}
|
|
202
233
|
function num(v) {
|
|
203
|
-
|
|
234
|
+
return typeof v === "number" ? v : void 0;
|
|
204
235
|
}
|
|
205
236
|
function attr(span, ...keys) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
return void 0;
|
|
237
|
+
const a = span.attributes;
|
|
238
|
+
if (!a) return void 0;
|
|
239
|
+
for (const k of keys) if (a[k] != null) return a[k];
|
|
210
240
|
}
|
|
211
241
|
function asObj(v) {
|
|
212
|
-
|
|
242
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : void 0;
|
|
213
243
|
}
|
|
214
244
|
function safeJson(v) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
245
|
+
if (v == null) return void 0;
|
|
246
|
+
if (typeof v === "string") return v;
|
|
247
|
+
try {
|
|
248
|
+
return JSON.stringify(v, null, 2);
|
|
249
|
+
} catch {
|
|
250
|
+
return String(v);
|
|
251
|
+
}
|
|
222
252
|
}
|
|
253
|
+
/** Is this string an embeddable image (data URI or http URL)? */
|
|
223
254
|
function isImageSrc(s) {
|
|
224
|
-
|
|
255
|
+
return !!s && (s.startsWith("data:image") || /^https?:\/\//.test(s));
|
|
225
256
|
}
|
|
257
|
+
/** Pull the modality-appropriate visual out of whatever the span carries.
|
|
258
|
+
* Conventions (checked in priority order): an image rides on
|
|
259
|
+
* `attributes.screenshot|image|frame|videoFrame` or `result.screenshot`; a
|
|
260
|
+
* diff on `attributes.diff|patch` or `args.diff`; a command on `args` /
|
|
261
|
+
* `args.command`; an API call on a `url`/`method` in args; file content on
|
|
262
|
+
* `result`. Unknown tools degrade to an args/result inspector. */
|
|
226
263
|
function extractVisual(span) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
if (span.kind === "sandbox")
|
|
313
|
-
return { type: "terminal", command: span.name, output: str(attr(span, "output")) };
|
|
314
|
-
return { type: "none" };
|
|
264
|
+
const shot = str(attr(span, "screenshot", "screenshotUrl", "image", "frame", "videoFrame")) ?? (span.kind === "tool" ? str(asObj(span.result)?.screenshot) ?? str(asObj(span.result)?.image) : void 0);
|
|
265
|
+
if (span.kind === "tool") {
|
|
266
|
+
const tn = span.toolName.toLowerCase();
|
|
267
|
+
const a = asObj(span.args);
|
|
268
|
+
if (/computer|cua|desktop|\bgui\b|xdotool|mouse|keyboard|screen_|pyautogui/.test(tn)) return {
|
|
269
|
+
type: "browser",
|
|
270
|
+
action: str(a?.action) ?? span.toolName,
|
|
271
|
+
url: str(a?.target),
|
|
272
|
+
screenshot: shot
|
|
273
|
+
};
|
|
274
|
+
if (/browser|playwright|puppeteer|\bpage\b|navigate|goto|\bclick\b|\btype\b|screenshot|dom/.test(tn)) return {
|
|
275
|
+
type: "browser",
|
|
276
|
+
url: str(a?.url) ?? str(attr(span, "url")),
|
|
277
|
+
action: str(a?.action) ?? str(a?.selector) ?? span.toolName,
|
|
278
|
+
screenshot: shot
|
|
279
|
+
};
|
|
280
|
+
const diff = str(attr(span, "diff", "patch")) ?? str(a?.diff) ?? str(a?.patch);
|
|
281
|
+
if (diff && /edit|write|patch|apply|str_replace|create|save|file/.test(tn)) return {
|
|
282
|
+
type: "diff",
|
|
283
|
+
path: str(a?.path) ?? str(a?.file) ?? str(attr(span, "path")) ?? "",
|
|
284
|
+
patch: truncate(diff, 2e3)
|
|
285
|
+
};
|
|
286
|
+
if (/edit|write|patch|apply|str_replace/.test(tn)) {
|
|
287
|
+
const newText = str(a?.new_str) ?? str(a?.content) ?? str(a?.text);
|
|
288
|
+
return {
|
|
289
|
+
type: "diff",
|
|
290
|
+
path: str(a?.path) ?? str(a?.file) ?? "",
|
|
291
|
+
patch: newText ? `+ ${truncate(newText, 1600)}` : "(no diff captured)"
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
if (/read|\bcat\b|open|view|get_file|load|fetch_file/.test(tn)) {
|
|
295
|
+
const content = str(asObj(span.result)?.content) ?? (typeof span.result === "string" ? span.result : void 0) ?? str(attr(span, "content"));
|
|
296
|
+
return {
|
|
297
|
+
type: "code",
|
|
298
|
+
path: str(a?.path) ?? str(a?.file) ?? "",
|
|
299
|
+
content: truncate(content ?? "", 1400)
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
if (/search|grep|find|glob|query/.test(tn)) return {
|
|
303
|
+
type: "terminal",
|
|
304
|
+
command: `search ${str(a?.query) ?? str(a?.pattern) ?? ""}`.trim(),
|
|
305
|
+
output: truncate(safeJson(span.result) ?? "", 1e3)
|
|
306
|
+
};
|
|
307
|
+
const url = str(a?.url) ?? str(attr(span, "url"));
|
|
308
|
+
if (url || /http|\bapi\b|fetch|request|webhook|rest|graphql|endpoint/.test(tn)) return {
|
|
309
|
+
type: "api",
|
|
310
|
+
method: str(a?.method) ?? str(attr(span, "method")),
|
|
311
|
+
url: url ?? span.toolName,
|
|
312
|
+
status: num(attr(span, "status", "statusCode")) ?? num(asObj(span.result)?.status),
|
|
313
|
+
request: truncate(str(a?.body) ?? safeJson(span.args) ?? "", 900),
|
|
314
|
+
response: truncate(str(attr(span, "response")) ?? safeJson(span.result) ?? "", 900)
|
|
315
|
+
};
|
|
316
|
+
if (/shell|exec|bash|\brun\b|terminal|command|sandbox|process/.test(tn)) {
|
|
317
|
+
const command = typeof span.args === "string" ? span.args : str(a?.command) ?? str(a?.cmd) ?? span.toolName;
|
|
318
|
+
const output = str(attr(span, "output", "stdout")) ?? (typeof span.result === "string" ? span.result : safeJson(span.result));
|
|
319
|
+
return {
|
|
320
|
+
type: "terminal",
|
|
321
|
+
command: truncate(command, 240),
|
|
322
|
+
output: truncate(output ?? "", 1400)
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
type: "api",
|
|
327
|
+
url: span.toolName,
|
|
328
|
+
request: truncate(safeJson(span.args) ?? "", 900),
|
|
329
|
+
response: truncate(safeJson(span.result) ?? "", 900)
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
if (isImageSrc(shot)) return {
|
|
333
|
+
type: "screenshot",
|
|
334
|
+
src: shot
|
|
335
|
+
};
|
|
336
|
+
if (span.kind === "llm") {
|
|
337
|
+
const text = str(span.output) ?? str(span.messages?.[span.messages.length - 1]?.content);
|
|
338
|
+
return text ? {
|
|
339
|
+
type: "prose",
|
|
340
|
+
text: truncate(text, 900)
|
|
341
|
+
} : { type: "none" };
|
|
342
|
+
}
|
|
343
|
+
if (span.kind === "sandbox") return {
|
|
344
|
+
type: "terminal",
|
|
345
|
+
command: span.name,
|
|
346
|
+
output: str(attr(span, "output"))
|
|
347
|
+
};
|
|
348
|
+
return { type: "none" };
|
|
315
349
|
}
|
|
316
350
|
function toolLabel(span) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
351
|
+
if (span.kind === "tool") {
|
|
352
|
+
const a = asObj(span.args);
|
|
353
|
+
const arg = typeof span.args === "string" ? span.args : a ? str(a.path) ?? str(a.url) ?? str(a.command) ?? str(a.query) ?? Object.values(a).find((v) => typeof v === "string") : void 0;
|
|
354
|
+
return typeof arg === "string" && arg.length > 0 ? `${span.toolName}: ${truncate(arg, 60)}` : span.toolName;
|
|
355
|
+
}
|
|
356
|
+
return span.name;
|
|
323
357
|
}
|
|
324
358
|
function classify(span) {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
359
|
+
if (span.status === "error" || span.error) return {
|
|
360
|
+
kind: "observed_failure",
|
|
361
|
+
importance: 5,
|
|
362
|
+
label: span.error ?? span.name
|
|
363
|
+
};
|
|
364
|
+
if (span.kind === "llm" || span.kind === "agent") return {
|
|
365
|
+
kind: "reasoned",
|
|
366
|
+
importance: 2,
|
|
367
|
+
label: span.name
|
|
368
|
+
};
|
|
369
|
+
if (span.kind === "judge") return {
|
|
370
|
+
kind: "evaluated",
|
|
371
|
+
importance: 2,
|
|
372
|
+
label: span.name
|
|
373
|
+
};
|
|
374
|
+
if (span.kind === "retrieval") return {
|
|
375
|
+
kind: "searched",
|
|
376
|
+
importance: 2,
|
|
377
|
+
label: span.name
|
|
378
|
+
};
|
|
379
|
+
if (span.kind === "sandbox") return {
|
|
380
|
+
kind: "ran_command",
|
|
381
|
+
importance: 3,
|
|
382
|
+
label: span.name
|
|
383
|
+
};
|
|
384
|
+
if (span.kind === "tool") {
|
|
385
|
+
const tn = span.toolName.toLowerCase();
|
|
386
|
+
const label = toolLabel(span);
|
|
387
|
+
if (/computer|cua|desktop|\bgui\b|xdotool|pyautogui/.test(tn)) return {
|
|
388
|
+
kind: "used_computer",
|
|
389
|
+
importance: 3,
|
|
390
|
+
label
|
|
391
|
+
};
|
|
392
|
+
if (/browser|playwright|puppeteer|\bpage\b|navigate|goto|\bclick\b|screenshot|dom/.test(tn)) return {
|
|
393
|
+
kind: "used_browser",
|
|
394
|
+
importance: 3,
|
|
395
|
+
label
|
|
396
|
+
};
|
|
397
|
+
if (/edit|write|patch|apply|str_replace|create.*file|save/.test(tn)) return {
|
|
398
|
+
kind: "edited_code",
|
|
399
|
+
importance: 4,
|
|
400
|
+
label
|
|
401
|
+
};
|
|
402
|
+
if (/read|\bcat\b|open|view|get.*file|load/.test(tn)) return {
|
|
403
|
+
kind: "read_file",
|
|
404
|
+
importance: 2,
|
|
405
|
+
label
|
|
406
|
+
};
|
|
407
|
+
if (/search|grep|find|glob|query/.test(tn)) return {
|
|
408
|
+
kind: "searched",
|
|
409
|
+
importance: 2,
|
|
410
|
+
label
|
|
411
|
+
};
|
|
412
|
+
if (/http|\bapi\b|fetch|request|webhook|rest|graphql|endpoint/.test(tn) || str(asObj(span.args)?.url)) return {
|
|
413
|
+
kind: "called_api",
|
|
414
|
+
importance: 3,
|
|
415
|
+
label
|
|
416
|
+
};
|
|
417
|
+
if (/shell|exec|bash|\brun\b|terminal|command|process/.test(tn)) return {
|
|
418
|
+
kind: "ran_command",
|
|
419
|
+
importance: 3,
|
|
420
|
+
label
|
|
421
|
+
};
|
|
422
|
+
return {
|
|
423
|
+
kind: "called_tool",
|
|
424
|
+
importance: 3,
|
|
425
|
+
label
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
kind: "called_tool",
|
|
430
|
+
importance: 2,
|
|
431
|
+
label: span.name
|
|
432
|
+
};
|
|
353
433
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
434
|
+
const KIND_VERB = {
|
|
435
|
+
understood_task: "Understood the task",
|
|
436
|
+
user_message: "User said",
|
|
437
|
+
agent_reply: "Agent replied",
|
|
438
|
+
reasoned: "Reasoned",
|
|
439
|
+
ran_command: "Ran a command",
|
|
440
|
+
read_file: "Read files",
|
|
441
|
+
edited_code: "Edited code",
|
|
442
|
+
searched: "Searched",
|
|
443
|
+
used_browser: "Used the browser",
|
|
444
|
+
used_computer: "Controlled the computer",
|
|
445
|
+
called_api: "Called an API",
|
|
446
|
+
called_tool: "Used a tool",
|
|
447
|
+
evaluated: "Evaluated the result",
|
|
448
|
+
observed_failure: "Hit a failure",
|
|
449
|
+
completed: "Finished"
|
|
370
450
|
};
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
451
|
+
/** Kinds that must never collapse into a neighbour — each is its own beat:
|
|
452
|
+
* a failure, and every conversation turn (so the dialogue reads in full). */
|
|
453
|
+
const STANDALONE_KINDS = /* @__PURE__ */ new Set([
|
|
454
|
+
"observed_failure",
|
|
455
|
+
"understood_task",
|
|
456
|
+
"user_message",
|
|
457
|
+
"agent_reply"
|
|
376
458
|
]);
|
|
459
|
+
/** Lift the conversation turns out of an LLM span. The user/assistant text
|
|
460
|
+
* lives in `LlmSpan.messages` (role:'user'|'assistant') and the new reply in
|
|
461
|
+
* `output`; the full history repeats across spans, so `seen` dedupes turns to
|
|
462
|
+
* the first time each is said. The first user turn becomes `understood_task`
|
|
463
|
+
* (the premise), later user turns `user_message`, assistant text `agent_reply`. */
|
|
377
464
|
function conversationEvents(span, seen, state) {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
return out;
|
|
465
|
+
if (span.kind !== "llm") return [];
|
|
466
|
+
const out = [];
|
|
467
|
+
const emit = (kind, text, importance) => {
|
|
468
|
+
const t = text.trim();
|
|
469
|
+
if (!t) return;
|
|
470
|
+
const key = `${kind === "agent_reply" ? "a" : "u"}\n${t}`;
|
|
471
|
+
if (seen.has(key)) return;
|
|
472
|
+
seen.add(key);
|
|
473
|
+
const speaker = kind === "understood_task" ? "Task" : kind === "user_message" ? "User" : "Agent";
|
|
474
|
+
out.push({
|
|
475
|
+
kind,
|
|
476
|
+
title: `${speaker}: ${truncate(t, 64)}`,
|
|
477
|
+
summary: truncate(t, 280),
|
|
478
|
+
visual: {
|
|
479
|
+
type: "prose",
|
|
480
|
+
text: truncate(t, 1200)
|
|
481
|
+
},
|
|
482
|
+
evidenceSpanIds: [span.spanId],
|
|
483
|
+
importance,
|
|
484
|
+
startTs: span.startedAt,
|
|
485
|
+
endTs: span.endedAt ?? span.startedAt
|
|
486
|
+
});
|
|
487
|
+
};
|
|
488
|
+
for (const m of span.messages ?? []) {
|
|
489
|
+
const content = str(m.content);
|
|
490
|
+
if (!content) continue;
|
|
491
|
+
if (m.role === "user") {
|
|
492
|
+
emit(state.sawUser ? "user_message" : "understood_task", content, state.sawUser ? 4 : 5);
|
|
493
|
+
state.sawUser = true;
|
|
494
|
+
} else if (m.role === "assistant") emit("agent_reply", content, 3);
|
|
495
|
+
}
|
|
496
|
+
const reply = str(span.output);
|
|
497
|
+
if (reply) emit("agent_reply", reply, 3);
|
|
498
|
+
return out;
|
|
413
499
|
}
|
|
500
|
+
/**
|
|
501
|
+
* Reduce a span tree into the meaningful moments a viewer cares about. The
|
|
502
|
+
* conversation (user asks, agent replies) is lifted from LLM spans first so the
|
|
503
|
+
* dialogue is first-class; the remaining work spans are classified + have their
|
|
504
|
+
* modality visual extracted. Adjacent same-kind work moments collapse (the
|
|
505
|
+
* compression step), carrying the latest visual; failures and conversation
|
|
506
|
+
* turns never collapse.
|
|
507
|
+
*/
|
|
414
508
|
function reduceToSemanticEvents(spans, opts = {}) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
509
|
+
const collapse = opts.collapseAdjacent ?? true;
|
|
510
|
+
const ordered = [...spans].sort((a, b) => a.startedAt - b.startedAt);
|
|
511
|
+
const seen = /* @__PURE__ */ new Set();
|
|
512
|
+
const convState = { sawUser: false };
|
|
513
|
+
const raw = [];
|
|
514
|
+
for (const s of ordered) {
|
|
515
|
+
const conv = conversationEvents(s, seen, convState);
|
|
516
|
+
if (conv.length > 0) {
|
|
517
|
+
raw.push(...conv);
|
|
518
|
+
continue;
|
|
519
|
+
}
|
|
520
|
+
const c = classify(s);
|
|
521
|
+
raw.push({
|
|
522
|
+
kind: c.kind,
|
|
523
|
+
title: c.label,
|
|
524
|
+
summary: `${KIND_VERB[c.kind]} — ${c.label}`,
|
|
525
|
+
visual: extractVisual(s),
|
|
526
|
+
evidenceSpanIds: [s.spanId],
|
|
527
|
+
importance: c.importance,
|
|
528
|
+
startTs: s.startedAt,
|
|
529
|
+
endTs: s.endedAt ?? s.startedAt
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
if (!collapse) return raw;
|
|
533
|
+
const merged = [];
|
|
534
|
+
for (const ev of raw) {
|
|
535
|
+
const prev = merged[merged.length - 1];
|
|
536
|
+
if (prev && prev.kind === ev.kind && !STANDALONE_KINDS.has(ev.kind)) {
|
|
537
|
+
prev.evidenceSpanIds.push(...ev.evidenceSpanIds);
|
|
538
|
+
prev.endTs = Math.max(prev.endTs, ev.endTs);
|
|
539
|
+
if (ev.visual.type !== "none") prev.visual = ev.visual;
|
|
540
|
+
const n = prev.evidenceSpanIds.length;
|
|
541
|
+
prev.title = `${KIND_VERB[ev.kind]} (${n}×)`;
|
|
542
|
+
prev.summary = `${KIND_VERB[ev.kind]} ${n} time${n === 1 ? "" : "s"} — latest: ${ev.title}`;
|
|
543
|
+
} else merged.push({
|
|
544
|
+
...ev,
|
|
545
|
+
evidenceSpanIds: [...ev.evidenceSpanIds]
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
return merged;
|
|
454
549
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
550
|
+
const KIND_TO_SCENE = {
|
|
551
|
+
understood_task: "title_card",
|
|
552
|
+
user_message: "prompt",
|
|
553
|
+
agent_reply: "reply",
|
|
554
|
+
reasoned: "reasoning",
|
|
555
|
+
ran_command: "terminal",
|
|
556
|
+
read_file: "file",
|
|
557
|
+
edited_code: "diff",
|
|
558
|
+
searched: "search",
|
|
559
|
+
used_browser: "browser",
|
|
560
|
+
used_computer: "computer",
|
|
561
|
+
called_api: "api",
|
|
562
|
+
called_tool: "tool",
|
|
563
|
+
evaluated: "eval",
|
|
564
|
+
observed_failure: "error",
|
|
565
|
+
completed: "summary"
|
|
471
566
|
};
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
567
|
+
const DURATION_BY_IMPORTANCE = {
|
|
568
|
+
1: 2500,
|
|
569
|
+
2: 3e3,
|
|
570
|
+
3: 4e3,
|
|
571
|
+
4: 5e3,
|
|
572
|
+
5: 6e3
|
|
478
573
|
};
|
|
574
|
+
/**
|
|
575
|
+
* Select the moments worth showing and lay them out as scenes. Every failure
|
|
576
|
+
* (importance 5) and edit (4) is always kept; the rest fill the budget by
|
|
577
|
+
* importance, then re-sort chronological. A title card opens, a summary closes.
|
|
578
|
+
*/
|
|
479
579
|
function compileStoryboard(events, opts = {}) {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
580
|
+
const title = opts.title ?? "Agent run";
|
|
581
|
+
const maxScenes = opts.maxScenes ?? 16;
|
|
582
|
+
const taskEvent = events.find((e) => e.kind === "understood_task");
|
|
583
|
+
const indexed = events.filter((ev) => ev.kind !== "understood_task").map((ev, i) => ({
|
|
584
|
+
ev,
|
|
585
|
+
i
|
|
586
|
+
}));
|
|
587
|
+
const mustKeep = indexed.filter(({ ev }) => ev.importance >= 4);
|
|
588
|
+
const rest = indexed.filter(({ ev }) => ev.importance < 4).sort((a, b) => b.ev.importance - a.ev.importance || a.i - b.i);
|
|
589
|
+
const budget = Math.max(0, maxScenes - mustKeep.length);
|
|
590
|
+
const actionScenes = [...mustKeep, ...rest.slice(0, budget)].sort((a, b) => a.i - b.i).map(({ ev }) => ({
|
|
591
|
+
sceneType: KIND_TO_SCENE[ev.kind],
|
|
592
|
+
title: ev.title,
|
|
593
|
+
narration: ev.summary,
|
|
594
|
+
visual: ev.visual,
|
|
595
|
+
durationMs: DURATION_BY_IMPORTANCE[ev.importance],
|
|
596
|
+
evidenceSpanIds: ev.evidenceSpanIds
|
|
597
|
+
}));
|
|
598
|
+
const failures = events.filter((e) => e.kind === "observed_failure").length;
|
|
599
|
+
const edits = events.filter((e) => e.kind === "edited_code").length;
|
|
600
|
+
const commands = events.filter((e) => e.kind === "ran_command").length;
|
|
601
|
+
const summaryNarration = `${events.length} moments · ${commands} command${commands === 1 ? "" : "s"} · ${edits} edit${edits === 1 ? "" : "s"} · ${failures} failure${failures === 1 ? "" : "s"}`;
|
|
602
|
+
const scenes = [
|
|
603
|
+
{
|
|
604
|
+
sceneType: "title_card",
|
|
605
|
+
title,
|
|
606
|
+
narration: taskEvent ? taskEvent.summary : "The agent receives its task.",
|
|
607
|
+
visual: taskEvent ? taskEvent.visual : { type: "none" },
|
|
608
|
+
durationMs: 3e3,
|
|
609
|
+
evidenceSpanIds: taskEvent ? taskEvent.evidenceSpanIds : []
|
|
610
|
+
},
|
|
611
|
+
...actionScenes,
|
|
612
|
+
{
|
|
613
|
+
sceneType: "summary",
|
|
614
|
+
title: failures > 0 ? "Finished — with failures" : "Finished",
|
|
615
|
+
narration: summaryNarration,
|
|
616
|
+
visual: { type: "none" },
|
|
617
|
+
durationMs: 4e3,
|
|
618
|
+
evidenceSpanIds: []
|
|
619
|
+
}
|
|
620
|
+
];
|
|
621
|
+
return {
|
|
622
|
+
title,
|
|
623
|
+
totalMs: scenes.reduce((s, sc) => s + sc.durationMs, 0),
|
|
624
|
+
scenes
|
|
625
|
+
};
|
|
520
626
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
627
|
+
const SCENE_ICON = {
|
|
628
|
+
title_card: "🎬",
|
|
629
|
+
prompt: "💬",
|
|
630
|
+
reply: "🤖",
|
|
631
|
+
reasoning: "🧠",
|
|
632
|
+
terminal: "⌨️",
|
|
633
|
+
file: "📄",
|
|
634
|
+
diff: "✏️",
|
|
635
|
+
search: "🔎",
|
|
636
|
+
browser: "🌐",
|
|
637
|
+
computer: "🖥️",
|
|
638
|
+
api: "🔌",
|
|
639
|
+
tool: "🔧",
|
|
640
|
+
eval: "⚖️",
|
|
641
|
+
error: "❌",
|
|
642
|
+
summary: "🏁"
|
|
537
643
|
};
|
|
538
644
|
function mmss(ms) {
|
|
539
|
-
|
|
540
|
-
|
|
645
|
+
const s = Math.round(ms / 1e3);
|
|
646
|
+
return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, "0")}`;
|
|
541
647
|
}
|
|
542
648
|
function truncate(s, max) {
|
|
543
|
-
|
|
649
|
+
return s.length <= max ? s : `${s.slice(0, Math.max(0, max - 1))}…`;
|
|
544
650
|
}
|
|
545
651
|
function escapeHtml(s) {
|
|
546
|
-
|
|
652
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
547
653
|
}
|
|
654
|
+
/** A short modality tag for the markdown shot list. */
|
|
548
655
|
function visualMarkdown(v) {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
\`\`\`${v.path ? `
|
|
560
|
-
_${v.path}_` : ""}`;
|
|
561
|
-
case "code":
|
|
562
|
-
return `
|
|
563
|
-
|
|
564
|
-
\`\`\`
|
|
565
|
-
${truncate(v.content, 500)}
|
|
566
|
-
\`\`\`${v.path ? `
|
|
567
|
-
_${v.path}_` : ""}`;
|
|
568
|
-
case "terminal":
|
|
569
|
-
return `
|
|
570
|
-
|
|
571
|
-
\`\`\`sh
|
|
572
|
-
$ ${v.command}${v.output ? `
|
|
573
|
-
${truncate(v.output, 500)}` : ""}
|
|
574
|
-
\`\`\``;
|
|
575
|
-
case "api":
|
|
576
|
-
return `\u{1F50C} ${v.method ?? "CALL"} ${v.url}${v.status != null ? ` \u2192 ${v.status}` : ""}`;
|
|
577
|
-
case "prose":
|
|
578
|
-
return `
|
|
579
|
-
|
|
580
|
-
> ${truncate(v.text, 400).replace(/\n/g, "\n> ")}`;
|
|
581
|
-
default:
|
|
582
|
-
return "";
|
|
583
|
-
}
|
|
656
|
+
switch (v.type) {
|
|
657
|
+
case "screenshot": return `🖼 screenshot (${truncate(v.src, 60)})`;
|
|
658
|
+
case "browser": return `🌐 ${v.action ?? "browser"}${v.url ? ` → ${v.url}` : ""}${v.screenshot ? " [screenshot]" : ""}`;
|
|
659
|
+
case "diff": return `\n\n\`\`\`diff\n${truncate(v.patch, 600)}\n\`\`\`${v.path ? `\n_${v.path}_` : ""}`;
|
|
660
|
+
case "code": return `\n\n\`\`\`\n${truncate(v.content, 500)}\n\`\`\`${v.path ? `\n_${v.path}_` : ""}`;
|
|
661
|
+
case "terminal": return `\n\n\`\`\`sh\n$ ${v.command}${v.output ? `\n${truncate(v.output, 500)}` : ""}\n\`\`\``;
|
|
662
|
+
case "api": return `🔌 ${v.method ?? "CALL"} ${v.url}${v.status != null ? ` → ${v.status}` : ""}`;
|
|
663
|
+
case "prose": return `\n\n> ${truncate(v.text, 400).replace(/\n/g, "\n> ")}`;
|
|
664
|
+
default: return "";
|
|
665
|
+
}
|
|
584
666
|
}
|
|
667
|
+
/** Build the (escaped, structured) HTML for a scene's visual. We never inject
|
|
668
|
+
* raw agent markup — every text part is escaped; only image `src` (data/http)
|
|
669
|
+
* is passed through as an attribute. */
|
|
585
670
|
function visualHtml(v) {
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
case "code":
|
|
602
|
-
return `${v.path ? `<div class="pathhdr">${escapeHtml(v.path)}</div>` : ""}<pre class="code">${escapeHtml(v.content)}</pre>`;
|
|
603
|
-
case "terminal":
|
|
604
|
-
return `<pre class="term"><span class="cmd">$ ${escapeHtml(v.command)}</span>${v.output ? `
|
|
605
|
-
${escapeHtml(v.output)}` : ""}</pre>`;
|
|
606
|
-
case "api": {
|
|
607
|
-
const badge = `<span class="method">${escapeHtml(v.method ?? "CALL")}</span> <span class="url">${escapeHtml(v.url)}</span>${v.status != null ? ` <span class="status s${Math.floor(v.status / 100)}">${v.status}</span>` : ""}`;
|
|
608
|
-
const req = v.request ? `<div class="kv"><b>req</b><pre>${escapeHtml(v.request)}</pre></div>` : "";
|
|
609
|
-
const res = v.response ? `<div class="kv"><b>res</b><pre>${escapeHtml(v.response)}</pre></div>` : "";
|
|
610
|
-
return `<div class="api"><div class="apihdr">${badge}</div>${req}${res}</div>`;
|
|
611
|
-
}
|
|
612
|
-
case "prose":
|
|
613
|
-
return `<div class="prose">${escapeHtml(v.text)}</div>`;
|
|
614
|
-
default:
|
|
615
|
-
return "";
|
|
616
|
-
}
|
|
671
|
+
switch (v.type) {
|
|
672
|
+
case "screenshot": return `<img class="shot" src="${escapeHtml(v.src)}" alt="screenshot" loading="lazy"/>`;
|
|
673
|
+
case "browser": return `<div class="browser">${`<div class="urlbar">${escapeHtml(v.url ?? v.action ?? "browser")}</div>`}${isImageSrc(v.screenshot) ? `<img class="shot" src="${escapeHtml(v.screenshot)}" alt="page" loading="lazy"/>` : `<div class="browser-action">${escapeHtml(v.action ?? "navigated")}</div>`}</div>`;
|
|
674
|
+
case "diff": {
|
|
675
|
+
const lines = v.patch.split("\n").map((l) => {
|
|
676
|
+
return `<span class="${l.startsWith("+") ? "add" : l.startsWith("-") ? "del" : ""}">${escapeHtml(l)}</span>`;
|
|
677
|
+
});
|
|
678
|
+
return `${v.path ? `<div class="pathhdr">${escapeHtml(v.path)}</div>` : ""}<pre class="diff">${lines.join("\n")}</pre>`;
|
|
679
|
+
}
|
|
680
|
+
case "code": return `${v.path ? `<div class="pathhdr">${escapeHtml(v.path)}</div>` : ""}<pre class="code">${escapeHtml(v.content)}</pre>`;
|
|
681
|
+
case "terminal": return `<pre class="term"><span class="cmd">$ ${escapeHtml(v.command)}</span>${v.output ? `\n${escapeHtml(v.output)}` : ""}</pre>`;
|
|
682
|
+
case "api": return `<div class="api"><div class="apihdr">${`<span class="method">${escapeHtml(v.method ?? "CALL")}</span> <span class="url">${escapeHtml(v.url)}</span>${v.status != null ? ` <span class="status s${Math.floor(v.status / 100)}">${v.status}</span>` : ""}`}</div>${v.request ? `<div class="kv"><b>req</b><pre>${escapeHtml(v.request)}</pre></div>` : ""}${v.response ? `<div class="kv"><b>res</b><pre>${escapeHtml(v.response)}</pre></div>` : ""}</div>`;
|
|
683
|
+
case "prose": return `<div class="prose">${escapeHtml(v.text)}</div>`;
|
|
684
|
+
default: return "";
|
|
685
|
+
}
|
|
617
686
|
}
|
|
687
|
+
/** Render the storyboard as a Markdown timeline — the human-readable shot list. */
|
|
618
688
|
function renderStoryboardMarkdown(storyboard) {
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
689
|
+
const out = [
|
|
690
|
+
`# 🎬 ${storyboard.title}`,
|
|
691
|
+
"",
|
|
692
|
+
`_${storyboard.scenes.length} scenes · ${mmss(storyboard.totalMs)} replay_`,
|
|
693
|
+
""
|
|
694
|
+
];
|
|
695
|
+
let elapsed = 0;
|
|
696
|
+
for (const sc of storyboard.scenes) {
|
|
697
|
+
out.push(`### [${mmss(elapsed)}] ${SCENE_ICON[sc.sceneType]} ${sc.title}`);
|
|
698
|
+
out.push("");
|
|
699
|
+
out.push(sc.narration);
|
|
700
|
+
const vm = visualMarkdown(sc.visual);
|
|
701
|
+
if (vm) out.push(vm);
|
|
702
|
+
if (sc.evidenceSpanIds.length > 0) {
|
|
703
|
+
out.push("");
|
|
704
|
+
out.push(`_evidence: ${sc.evidenceSpanIds.length} span(s)_`);
|
|
705
|
+
}
|
|
706
|
+
out.push("");
|
|
707
|
+
elapsed += sc.durationMs;
|
|
708
|
+
}
|
|
709
|
+
return out.join("\n");
|
|
640
710
|
}
|
|
711
|
+
/**
|
|
712
|
+
* Render the storyboard as a self-contained, auto-playing HTML replay — one
|
|
713
|
+
* shareable file, no build step, no external assets. Each scene animates in
|
|
714
|
+
* for its duration and SHOWS its modality (screenshot / diff / terminal / API
|
|
715
|
+
* / browser / prose); controls let a viewer scrub. This is the "free clip" a
|
|
716
|
+
* run produces; an MP4 is the same storyboard fed to Remotion in a consumer.
|
|
717
|
+
*/
|
|
641
718
|
function renderStoryboardHtml(storyboard, opts = {}) {
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
).replace(/</g, "\\u003c");
|
|
654
|
-
return `<!doctype html>
|
|
719
|
+
const docTitle = opts.title ?? storyboard.title;
|
|
720
|
+
const scenesJson = JSON.stringify(storyboard.scenes.map((s) => ({
|
|
721
|
+
icon: SCENE_ICON[s.sceneType],
|
|
722
|
+
type: s.sceneType,
|
|
723
|
+
title: s.title,
|
|
724
|
+
narration: s.narration,
|
|
725
|
+
durationMs: s.durationMs,
|
|
726
|
+
evidence: s.evidenceSpanIds.length,
|
|
727
|
+
visual: visualHtml(s.visual)
|
|
728
|
+
}))).replace(/</g, "\\u003c");
|
|
729
|
+
return `<!doctype html>
|
|
655
730
|
<html lang="en">
|
|
656
731
|
<head>
|
|
657
732
|
<meta charset="utf-8" />
|
|
@@ -704,7 +779,7 @@ function renderStoryboardHtml(storyboard, opts = {}) {
|
|
|
704
779
|
</head>
|
|
705
780
|
<body>
|
|
706
781
|
<div class="stage">
|
|
707
|
-
<h1
|
|
782
|
+
<h1>🎬 ${escapeHtml(docTitle)}</h1>
|
|
708
783
|
<div class="card" id="card">
|
|
709
784
|
<div class="head"><span class="icon" id="icon"></span><span class="title" id="title"></span></div>
|
|
710
785
|
<div class="narration" id="narration"></div>
|
|
@@ -712,9 +787,9 @@ function renderStoryboardHtml(storyboard, opts = {}) {
|
|
|
712
787
|
<div class="bar"><i id="fill"></i></div>
|
|
713
788
|
</div>
|
|
714
789
|
<div class="controls">
|
|
715
|
-
<button id="playPause"
|
|
716
|
-
<button id="prev"
|
|
717
|
-
<button id="next">Next
|
|
790
|
+
<button id="playPause">⏸ Pause</button>
|
|
791
|
+
<button id="prev">◀ Prev</button>
|
|
792
|
+
<button id="next">Next ▶</button>
|
|
718
793
|
<span id="counter"></span>
|
|
719
794
|
<span class="dots" id="dots"></span>
|
|
720
795
|
</div>
|
|
@@ -743,25 +818,17 @@ function renderStoryboardHtml(storyboard, opts = {}) {
|
|
|
743
818
|
if (playing) raf = requestAnimationFrame(tick);
|
|
744
819
|
}
|
|
745
820
|
function go(n) { i = Math.max(0, Math.min(SCENES.length - 1, n)); start = 0; cancelAnimationFrame(raf); paint(); if (playing) raf = requestAnimationFrame(tick); }
|
|
746
|
-
function updateBtn() { document.getElementById('playPause').textContent = playing ? '
|
|
821
|
+
function updateBtn() { document.getElementById('playPause').textContent = playing ? '⏸ Pause' : '▶ Play'; }
|
|
747
822
|
document.getElementById('playPause').onclick = () => { playing = !playing; updateBtn(); start = 0; if (playing) raf = requestAnimationFrame(tick); else cancelAnimationFrame(raf); };
|
|
748
823
|
document.getElementById('next').onclick = () => go(i + 1);
|
|
749
824
|
document.getElementById('prev').onclick = () => go(i - 1);
|
|
750
825
|
paint(); raf = requestAnimationFrame(tick);
|
|
751
|
-
|
|
826
|
+
<\/script>
|
|
752
827
|
</body>
|
|
753
828
|
</html>
|
|
754
829
|
`;
|
|
755
830
|
}
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
compileStoryboard,
|
|
760
|
-
editAnimationText,
|
|
761
|
-
extractCodeEdits,
|
|
762
|
-
reduceToSemanticEvents,
|
|
763
|
-
renderCodeAnimationHtml,
|
|
764
|
-
renderStoryboardHtml,
|
|
765
|
-
renderStoryboardMarkdown
|
|
766
|
-
};
|
|
831
|
+
//#endregion
|
|
832
|
+
export { codeEditFromSpan, codeEditsForStoryboard, compileStoryboard, editAnimationText, extractCodeEdits, reduceToSemanticEvents, renderCodeAnimationHtml, renderStoryboardHtml, renderStoryboardMarkdown };
|
|
833
|
+
|
|
767
834
|
//# sourceMappingURL=index.js.map
|