@iowarp/clio-coder 0.3.8 → 0.4.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 +102 -0
- package/NOTICE +33 -0
- package/README.md +12 -3
- package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
- package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
- package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
- package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
- package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
- package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
- package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
- package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
- package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
- package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GKF55TAZ.js +391 -0
- package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
- package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
- package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
- package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
- package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
- package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
- package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
- package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
- package/dist/chunk-OQBA45DZ.js +97 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
- package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
- package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
- package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
- package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
- package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
- package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
- package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
- package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
- package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
- package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
- package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
- package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
- package/dist/chunk-YJX4SHTD.js +40 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/chunk-Z2RR6MAK.js +127 -0
- package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
- package/dist/cli/index.js +47 -36
- package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
- package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
- package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
- package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
- package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
- package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
- package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
- package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
- package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
- package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
- package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
- package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
- package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
- package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
- package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
- package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
- package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
- package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
- package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
- package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
- package/dist/panes-HMABYVO4.js +58 -0
- package/dist/panes-KY6W3V2E.js +103 -0
- package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
- package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
- package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
- package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
- package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
- package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
- package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
- package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
- package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
- package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
- package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +106 -75
- package/docs/README.md +3 -2
- package/docs/acp.md +24 -3
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +9 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +62 -3
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +69 -12
- package/docs/context-engine.md +63 -4
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +5 -5
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +12 -11
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +27 -1
- package/docs/fleet-dispatch.md +25 -4
- package/docs/installation-and-lifecycle.md +15 -2
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +55 -4
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +19 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +19 -3
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +88 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +5 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +25 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +22 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +93 -16
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/extensions.ts +5 -1
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +810 -0
- package/src/cli/fleet.ts +179 -39
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +5 -2
- package/src/cli/run.ts +58 -0
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +44 -13
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +85 -5
- package/src/cli/usage.ts +63 -14
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +33 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/config.ts +67 -0
- package/src/core/defaults.ts +124 -8
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +80 -6
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +164 -35
- package/src/domains/config/classify.ts +6 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +52 -14
- package/src/domains/dispatch/capacity-lease.ts +118 -9
- package/src/domains/dispatch/contract.ts +11 -0
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/extension.ts +378 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-run.ts +87 -4
- package/src/domains/dispatch/gate-decisions.ts +11 -1
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +22 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/reservation-store.ts +139 -11
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +598 -0
- package/src/domains/dispatch/state.ts +49 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
- package/src/domains/dispatch/write-boundary.ts +62 -1
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +342 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +127 -0
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +105 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +2 -13
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/evidence/trust-projection.ts +2 -2
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +38 -3
- package/src/domains/extensions/resources.ts +1 -1
- package/src/domains/extensions/state.ts +12 -3
- package/src/domains/extensions/types.ts +2 -0
- package/src/domains/lifecycle/doctor.ts +69 -1
- package/src/domains/memory/index.ts +14 -1
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +82 -17
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +3 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +97 -21
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- package/src/domains/mux/contract.ts +434 -0
- package/src/domains/mux/detect.ts +158 -0
- package/src/domains/mux/extension.ts +47 -0
- package/src/domains/mux/index.ts +96 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +164 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +49 -0
- package/src/domains/mux/socket-client.ts +816 -0
- package/src/domains/mux/types.ts +222 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +180 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +228 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +22 -1
- package/src/domains/observability/index.ts +9 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +234 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/providers/endpoint-capacity.ts +228 -0
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +95 -33
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/run-effects.ts +35 -4
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -0
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +18 -3
- package/src/engine/acp/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- package/src/engine/provider-payload.ts +29 -1
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-runtime.ts +2 -13
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +279 -35
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +41 -10
- package/src/interactive/cost-overlay.ts +66 -6
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +102 -20
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +177 -7
- package/src/interactive/interactive-input-runtime.ts +15 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +63 -10
- package/src/interactive/memory-overlay.ts +9 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +17 -0
- package/src/interactive/overlay-key-routing.ts +52 -3
- package/src/interactive/overlay-lifecycle.ts +56 -7
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +112 -24
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +227 -49
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +1 -0
- package/src/interactive/overlays/cwd-fallback.ts +1 -0
- package/src/interactive/overlays/decisions.ts +11 -11
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +1 -0
- package/src/interactive/overlays/handoff-review.ts +1 -0
- package/src/interactive/overlays/help-reference.ts +6 -0
- package/src/interactive/overlays/interop.ts +1 -0
- package/src/interactive/overlays/library-install-confirm.ts +1 -0
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +1 -0
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +1 -0
- package/src/interactive/overlays/prompts.ts +12 -1
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +614 -45
- package/src/interactive/overlays/side-question.ts +1 -0
- package/src/interactive/overlays/skills-hub.ts +3 -11
- package/src/interactive/overlays/tree-selector.ts +1 -0
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +292 -0
- package/src/interactive/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +346 -33
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +29 -3
- package/src/interactive/watch-pane.ts +152 -0
- package/src/interactive/worker-progress.ts +7 -1
- package/src/interactive/worker-receipts.ts +19 -1
- package/src/interactive/worker-stream.ts +5 -0
- package/src/interactive/yazi-bridge.ts +444 -0
- package/src/tools/ask-user.ts +43 -2
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +15 -0
- package/src/tools/compete-worktrees.ts +83 -2
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +14 -3
- package/src/tools/dispatch-arguments.ts +20 -20
- package/src/tools/dispatch-plan.ts +17 -9
- package/src/tools/dispatch-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- package/src/tools/dispatch-scout.ts +1 -1
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/executables.ts +17 -14
- package/src/tools/observation.ts +54 -4
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/registry.ts +16 -0
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HLE42MG7.js +0 -37
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-JOZYP4GM.js +0 -279
- package/dist/doctor-M7YEDGAE.js +0 -91
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { tokenHex } from "../../../core/theme-token-hex.js";
|
|
2
|
+
|
|
3
|
+
/** Render the deliberately small Clio overlay on Yazi's pinned preset theme. */
|
|
4
|
+
export function renderYaziTheme(): string {
|
|
5
|
+
return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
|
|
6
|
+
|
|
7
|
+
[mgr]
|
|
8
|
+
cwd = { fg = "${tokenHex("accent")}" }
|
|
9
|
+
find_keyword = { fg = "${tokenHex("warning")}" }
|
|
10
|
+
marker_selected = { fg = "${tokenHex("success")}", bg = "${tokenHex("success")}" }
|
|
11
|
+
marker_copied = { fg = "${tokenHex("accent")}", bg = "${tokenHex("accent")}" }
|
|
12
|
+
marker_cut = { fg = "${tokenHex("error")}", bg = "${tokenHex("error")}" }
|
|
13
|
+
border_style = { fg = "${tokenHex("frame")}" }
|
|
14
|
+
|
|
15
|
+
[mode]
|
|
16
|
+
normal_main = { bg = "${tokenHex("accent")}" }
|
|
17
|
+
normal_alt = { fg = "${tokenHex("accent")}" }
|
|
18
|
+
select_main = { bg = "${tokenHex("action")}" }
|
|
19
|
+
select_alt = { fg = "${tokenHex("action")}" }
|
|
20
|
+
unset_main = { bg = "${tokenHex("error")}" }
|
|
21
|
+
unset_alt = { fg = "${tokenHex("error")}" }
|
|
22
|
+
|
|
23
|
+
[tabs]
|
|
24
|
+
active = { bg = "${tokenHex("accent")}" }
|
|
25
|
+
inactive = { fg = "${tokenHex("accent")}" }
|
|
26
|
+
|
|
27
|
+
[status]
|
|
28
|
+
perm_sep = { fg = "${tokenHex("dim")}" }
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting for one proactive-memory step.
|
|
3
|
+
*
|
|
4
|
+
* A background memory step is a priced model call that never enters the
|
|
5
|
+
* session: it appends nothing to the session JSONL, exactly as a `/btw` side
|
|
6
|
+
* question does not. Until this existed the spend was recorded nowhere at all.
|
|
7
|
+
* The operator's own telemetry ledger held 60 model steps, 137,205 tokens, and
|
|
8
|
+
* 1,666 seconds of model time across 14 days while `/cost` showed no row for
|
|
9
|
+
* any of it and `clio-coder usage report` could not see it either (#229).
|
|
10
|
+
*
|
|
11
|
+
* The two writes are the same pair the side-question path makes: the
|
|
12
|
+
* in-process cost tracker under the `background-memory` label, which is what
|
|
13
|
+
* `/cost` folds, and one durable row in the out-of-turn usage store, which is
|
|
14
|
+
* what an archive reader folds after the process is gone.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { uncachedPrefillTokens } from "../../core/cache-telemetry.js";
|
|
18
|
+
import type { CostProvenance } from "../providers/index.js";
|
|
19
|
+
import type { CostEntryLabel, UsageBreakdown } from "./cost.js";
|
|
20
|
+
import { appendOutOfTurnUsageRow, type OutOfTurnUsageRow } from "./out-of-turn-usage.js";
|
|
21
|
+
|
|
22
|
+
/** Provider-reported spend for one memory step, as the calling client observed it. */
|
|
23
|
+
export interface BackgroundMemoryStepUsage {
|
|
24
|
+
targetId: string;
|
|
25
|
+
attributedModelId: string;
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
cacheRead: number;
|
|
29
|
+
cacheWrite: number;
|
|
30
|
+
reasoning: number;
|
|
31
|
+
totalTokens: number;
|
|
32
|
+
costUsd: number;
|
|
33
|
+
costProvenance: CostProvenance;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
backend: {
|
|
36
|
+
promptTokens: number;
|
|
37
|
+
cachedTokens: number | null;
|
|
38
|
+
promptMs: number;
|
|
39
|
+
source: string;
|
|
40
|
+
} | null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The subset of the observability contract this accounting needs. */
|
|
44
|
+
export interface BackgroundMemoryUsageSink {
|
|
45
|
+
recordTokens(
|
|
46
|
+
providerId: string,
|
|
47
|
+
attributedModelId: string,
|
|
48
|
+
tokens: number,
|
|
49
|
+
costUsd?: number,
|
|
50
|
+
breakdown?: Partial<UsageBreakdown>,
|
|
51
|
+
costProvenance?: CostProvenance,
|
|
52
|
+
modelIdFacts?: unknown,
|
|
53
|
+
label?: CostEntryLabel,
|
|
54
|
+
): void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface RecordBackgroundMemoryStepInput {
|
|
58
|
+
usage: BackgroundMemoryStepUsage;
|
|
59
|
+
stateDir: string;
|
|
60
|
+
sessionId: string | null;
|
|
61
|
+
/** The cwd hash the session ledger is filed under, so `usage report --repo` selects it. */
|
|
62
|
+
repoIdentity: string | null;
|
|
63
|
+
observability?: BackgroundMemoryUsageSink | undefined;
|
|
64
|
+
now?: Date;
|
|
65
|
+
/** Test seam; production appends to the out-of-turn store under the state dir. */
|
|
66
|
+
appendRow?: (stateDir: string, row: OutOfTurnUsageRow) => void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Build the durable row for one memory step without writing it. */
|
|
70
|
+
export function backgroundMemoryUsageRow(
|
|
71
|
+
usage: BackgroundMemoryStepUsage,
|
|
72
|
+
options: { sessionId: string | null; repoIdentity: string | null; now?: Date },
|
|
73
|
+
): OutOfTurnUsageRow {
|
|
74
|
+
return {
|
|
75
|
+
label: "background-memory",
|
|
76
|
+
sessionId: options.sessionId,
|
|
77
|
+
repoIdentity: options.repoIdentity,
|
|
78
|
+
timestamp: (options.now ?? new Date()).toISOString(),
|
|
79
|
+
target: usage.targetId,
|
|
80
|
+
attributedModelId: usage.attributedModelId,
|
|
81
|
+
usage: {
|
|
82
|
+
input: usage.input,
|
|
83
|
+
output: usage.output,
|
|
84
|
+
cacheRead: usage.cacheRead,
|
|
85
|
+
cacheWrite: usage.cacheWrite,
|
|
86
|
+
reasoning: usage.reasoning,
|
|
87
|
+
totalTokens: usage.totalTokens,
|
|
88
|
+
costUsd: usage.costUsd,
|
|
89
|
+
costProvenance: usage.costProvenance,
|
|
90
|
+
},
|
|
91
|
+
timing: { durationMs: usage.durationMs },
|
|
92
|
+
...(usage.backend === null
|
|
93
|
+
? {}
|
|
94
|
+
: {
|
|
95
|
+
promptCache: {
|
|
96
|
+
promptTokens: usage.backend.promptTokens,
|
|
97
|
+
cachedTokens: usage.backend.cachedTokens,
|
|
98
|
+
uncachedPrefillTokens: uncachedPrefillTokens({
|
|
99
|
+
promptTokens: usage.backend.promptTokens,
|
|
100
|
+
cachedTokens: usage.backend.cachedTokens,
|
|
101
|
+
predictedTokens: 0,
|
|
102
|
+
promptMs: usage.backend.promptMs,
|
|
103
|
+
predictedMs: 0,
|
|
104
|
+
source: "llamacpp-timings",
|
|
105
|
+
}),
|
|
106
|
+
promptMs: usage.backend.promptMs,
|
|
107
|
+
source: usage.backend.source,
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Record one memory step in the session's cost totals and in the durable store. */
|
|
114
|
+
export function recordBackgroundMemoryStep(input: RecordBackgroundMemoryStepInput): OutOfTurnUsageRow {
|
|
115
|
+
input.observability?.recordTokens(
|
|
116
|
+
input.usage.targetId,
|
|
117
|
+
input.usage.attributedModelId,
|
|
118
|
+
input.usage.totalTokens,
|
|
119
|
+
input.usage.costUsd,
|
|
120
|
+
{
|
|
121
|
+
input: input.usage.input,
|
|
122
|
+
output: input.usage.output,
|
|
123
|
+
cacheRead: input.usage.cacheRead,
|
|
124
|
+
cacheWrite: input.usage.cacheWrite,
|
|
125
|
+
reasoningTokens: input.usage.reasoning,
|
|
126
|
+
totalTokens: input.usage.totalTokens,
|
|
127
|
+
apiCalls: 1,
|
|
128
|
+
},
|
|
129
|
+
input.usage.costProvenance,
|
|
130
|
+
undefined,
|
|
131
|
+
"background-memory",
|
|
132
|
+
);
|
|
133
|
+
const row = backgroundMemoryUsageRow(input.usage, {
|
|
134
|
+
sessionId: input.sessionId,
|
|
135
|
+
repoIdentity: input.repoIdentity,
|
|
136
|
+
...(input.now === undefined ? {} : { now: input.now }),
|
|
137
|
+
});
|
|
138
|
+
(input.appendRow ?? appendOutOfTurnUsageRow)(input.stateDir, row);
|
|
139
|
+
return row;
|
|
140
|
+
}
|
|
@@ -101,6 +101,27 @@ export function costAggregateForAmount(usd: number, provenance: CostProvenance |
|
|
|
101
101
|
return aggregateCostAmounts([{ usd, provenance: normalizeCostProvenance(provenance) }]);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/**
|
|
105
|
+
* What a fixed-width surface renders for an already-folded aggregate: the cost
|
|
106
|
+
* claim when one exists, {@link COST_NOT_MEASURED} when none does. Named here
|
|
107
|
+
* because the fallback is part of the derivation, not a caller's choice, and a
|
|
108
|
+
* surface that spells the `?? COST_NOT_MEASURED` out by hand is one edit away
|
|
109
|
+
* from spelling `$0.00` instead.
|
|
110
|
+
*/
|
|
111
|
+
export function renderCostAggregate(cost: CostAggregate | null | undefined): string {
|
|
112
|
+
return formatCostAggregate(cost) ?? COST_NOT_MEASURED;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The same render for a single sealed amount, which is the shape a receipt or a
|
|
117
|
+
* ledger row hands over. A caller that reaches for `usd.toFixed(4)` here drops
|
|
118
|
+
* the provenance on the floor and turns unpriced work into a measured `$0.0000`,
|
|
119
|
+
* which is a claim nobody made.
|
|
120
|
+
*/
|
|
121
|
+
export function renderCostAmount(usd: number, provenance: CostProvenance | undefined): string {
|
|
122
|
+
return renderCostAggregate(costAggregateForAmount(usd, provenance));
|
|
123
|
+
}
|
|
124
|
+
|
|
104
125
|
export interface UsageBreakdown {
|
|
105
126
|
input: number;
|
|
106
127
|
output: number;
|
|
@@ -116,7 +137,7 @@ export interface UsageBreakdown {
|
|
|
116
137
|
* the usage surfaces separate these out so an operator can see that money was
|
|
117
138
|
* spent beside the session rather than inside it.
|
|
118
139
|
*/
|
|
119
|
-
export type CostEntryLabel = "side-question" | "handoff";
|
|
140
|
+
export type CostEntryLabel = "side-question" | "handoff" | "prewarm" | "background-memory";
|
|
120
141
|
|
|
121
142
|
export interface CostEntry {
|
|
122
143
|
providerId: string;
|
|
@@ -16,6 +16,13 @@ export function createObservabilityDomainModule(options: ObservabilityBundleOpti
|
|
|
16
16
|
|
|
17
17
|
export type { AccountabilitySummary } from "./accountability.js";
|
|
18
18
|
export { readAccountabilitySummary, summarizeEvidenceIndex } from "./accountability.js";
|
|
19
|
+
export {
|
|
20
|
+
type BackgroundMemoryStepUsage,
|
|
21
|
+
type BackgroundMemoryUsageSink,
|
|
22
|
+
backgroundMemoryUsageRow,
|
|
23
|
+
type RecordBackgroundMemoryStepInput,
|
|
24
|
+
recordBackgroundMemoryStep,
|
|
25
|
+
} from "./background-memory-usage.js";
|
|
19
26
|
export type {
|
|
20
27
|
ObservabilityContract,
|
|
21
28
|
ObservabilityNotice,
|
|
@@ -35,6 +42,8 @@ export {
|
|
|
35
42
|
costWasMeasured,
|
|
36
43
|
emptyCostAggregate,
|
|
37
44
|
formatCostAggregate,
|
|
45
|
+
renderCostAggregate,
|
|
46
|
+
renderCostAmount,
|
|
38
47
|
type UsageBreakdown,
|
|
39
48
|
} from "./cost.js";
|
|
40
49
|
export type { EvidenceIndexRow } from "./evidence-index.js";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable record of the model calls that were billed beside a session rather
|
|
3
|
-
* than inside it: `/btw` side questions
|
|
3
|
+
* than inside it: `/btw` side questions, `/handoff` extraction rounds, and the
|
|
4
|
+
* session pre-warm.
|
|
4
5
|
*
|
|
5
6
|
* These rounds deliberately append nothing to the session JSONL. A fleet run
|
|
6
7
|
* briefs its workers from the transcript, so a question the operator asked to
|
|
@@ -50,6 +51,27 @@ export const MAX_OUT_OF_TURN_USAGE_ROWS = 1000;
|
|
|
50
51
|
*/
|
|
51
52
|
const BOUND_CHECK_INTERVAL = 64;
|
|
52
53
|
|
|
54
|
+
/** Wall-clock facts about one out-of-turn call. */
|
|
55
|
+
export interface OutOfTurnTiming {
|
|
56
|
+
/** Duration of the model call itself, as the caller measured it. */
|
|
57
|
+
durationMs: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Backend prefill facts for one out-of-turn call, in the shape brief #247
|
|
62
|
+
* established for assistant entries. A background memory step re-sends a whole
|
|
63
|
+
* trajectory to a server that has just been serving the chat prefix, so whether
|
|
64
|
+
* that prefill was cached is the difference between a cheap step and a step
|
|
65
|
+
* that re-prefills thousands of tokens on the operator's own machine.
|
|
66
|
+
*/
|
|
67
|
+
export interface OutOfTurnPromptCache {
|
|
68
|
+
promptTokens: number;
|
|
69
|
+
cachedTokens: number | null;
|
|
70
|
+
uncachedPrefillTokens: number | null;
|
|
71
|
+
promptMs: number;
|
|
72
|
+
source: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
53
75
|
/** Provider-reported usage for one out-of-turn call. */
|
|
54
76
|
export interface OutOfTurnUsage {
|
|
55
77
|
input: number;
|
|
@@ -75,6 +97,10 @@ export interface OutOfTurnUsageRow {
|
|
|
75
97
|
target: string;
|
|
76
98
|
attributedModelId: string;
|
|
77
99
|
usage: OutOfTurnUsage;
|
|
100
|
+
/** Present when the caller measured the call. */
|
|
101
|
+
timing?: OutOfTurnTiming;
|
|
102
|
+
/** Present when the serving backend reported prefill facts. */
|
|
103
|
+
promptCache?: OutOfTurnPromptCache;
|
|
78
104
|
}
|
|
79
105
|
|
|
80
106
|
export interface OutOfTurnUsageReadResult {
|
|
@@ -179,10 +205,13 @@ export function readOutOfTurnUsageRows(stateDir: string): OutOfTurnUsageReadResu
|
|
|
179
205
|
function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
|
|
180
206
|
if (!isRecord(value)) return null;
|
|
181
207
|
const label = value.label;
|
|
182
|
-
if (label !== "side-question" && label !== "handoff"
|
|
208
|
+
if (label !== "side-question" && label !== "handoff" && label !== "prewarm" && label !== "background-memory")
|
|
209
|
+
return null;
|
|
183
210
|
if (typeof value.timestamp !== "string" || value.timestamp.length === 0) return null;
|
|
184
211
|
if (!isRecord(value.usage)) return null;
|
|
185
212
|
const usage = value.usage;
|
|
213
|
+
const timing = asTiming(value.timing);
|
|
214
|
+
const promptCache = asPromptCache(value.promptCache);
|
|
186
215
|
return {
|
|
187
216
|
label,
|
|
188
217
|
sessionId: typeof value.sessionId === "string" ? value.sessionId : null,
|
|
@@ -203,6 +232,26 @@ function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
|
|
|
203
232
|
costUsd: numberOr0(usage.costUsd),
|
|
204
233
|
costProvenance: asCostProvenance(usage.costProvenance),
|
|
205
234
|
},
|
|
235
|
+
...(timing === null ? {} : { timing }),
|
|
236
|
+
...(promptCache === null ? {} : { promptCache }),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function asTiming(value: unknown): OutOfTurnTiming | null {
|
|
241
|
+
if (!isRecord(value)) return null;
|
|
242
|
+
const durationMs = numberOr0(value.durationMs);
|
|
243
|
+
return durationMs === 0 ? null : { durationMs };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function asPromptCache(value: unknown): OutOfTurnPromptCache | null {
|
|
247
|
+
if (!isRecord(value)) return null;
|
|
248
|
+
if (typeof value.source !== "string" || value.source.length === 0) return null;
|
|
249
|
+
return {
|
|
250
|
+
promptTokens: numberOr0(value.promptTokens),
|
|
251
|
+
cachedTokens: typeof value.cachedTokens === "number" ? value.cachedTokens : null,
|
|
252
|
+
uncachedPrefillTokens: typeof value.uncachedPrefillTokens === "number" ? value.uncachedPrefillTokens : null,
|
|
253
|
+
promptMs: numberOr0(value.promptMs),
|
|
254
|
+
source: value.source,
|
|
206
255
|
};
|
|
207
256
|
}
|
|
208
257
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
|
-
import { mkdirSync } from "node:fs";
|
|
10
|
+
import { mkdirSync, statSync } from "node:fs";
|
|
11
11
|
import { createRequire } from "node:module";
|
|
12
12
|
import { hostname } from "node:os";
|
|
13
13
|
import { dirname, join } from "node:path";
|
|
@@ -27,6 +27,32 @@ export const TRACE_DATABASE_FILE = "trace.sqlite";
|
|
|
27
27
|
export const TRACE_EVENT_POLL_LIMIT = 500;
|
|
28
28
|
export const TRACE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
|
|
29
29
|
export const TRACE_WRITE_QUEUE_LIMIT = 2048;
|
|
30
|
+
export const TRACE_RETENTION_DAYS_ENV = "CLIO_CODER_TRACE_RETENTION_DAYS";
|
|
31
|
+
export const TRACE_MAX_BYTES_ENV = "CLIO_CODER_TRACE_MAX_BYTES";
|
|
32
|
+
|
|
33
|
+
export interface TraceRetentionPolicy {
|
|
34
|
+
maxAgeDays: number;
|
|
35
|
+
maxBytes: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface TracePruneResult {
|
|
39
|
+
runsRemoved: number;
|
|
40
|
+
rowsRemoved: number;
|
|
41
|
+
bytesBefore: number;
|
|
42
|
+
bytesAfter: number;
|
|
43
|
+
bytesRemoved: number;
|
|
44
|
+
vacuumed: boolean;
|
|
45
|
+
protectedRuns: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Thirty days or 128 MiB, whichever limit the mirror reaches first. */
|
|
49
|
+
export const DEFAULT_TRACE_RETENTION_POLICY: Readonly<TraceRetentionPolicy> = Object.freeze({
|
|
50
|
+
maxAgeDays: 30,
|
|
51
|
+
maxBytes: 128 * 1024 * 1024,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
55
|
+
const VACUUM_RECLAIMABLE_FRACTION = 0.2;
|
|
30
56
|
|
|
31
57
|
type DatabaseSyncConstructor = typeof import("node:sqlite").DatabaseSync;
|
|
32
58
|
let sqliteConstructor: DatabaseSyncConstructor | null = null;
|
|
@@ -110,6 +136,40 @@ export function traceDatabasePath(stateDir: string): string {
|
|
|
110
136
|
return join(stateDir, TRACE_DATABASE_FILE);
|
|
111
137
|
}
|
|
112
138
|
|
|
139
|
+
/** Resolve the two operator-configurable retention bounds. */
|
|
140
|
+
export function resolveTraceRetentionPolicy(
|
|
141
|
+
overrides: Partial<TraceRetentionPolicy> = {},
|
|
142
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
143
|
+
): TraceRetentionPolicy {
|
|
144
|
+
const maxAgeDays =
|
|
145
|
+
overrides.maxAgeDays ??
|
|
146
|
+
parsePositiveRetentionNumber(environment[TRACE_RETENTION_DAYS_ENV], TRACE_RETENTION_DAYS_ENV, 1);
|
|
147
|
+
const maxBytes =
|
|
148
|
+
overrides.maxBytes ??
|
|
149
|
+
parsePositiveRetentionNumber(environment[TRACE_MAX_BYTES_ENV], TRACE_MAX_BYTES_ENV, 1024 * 1024);
|
|
150
|
+
return {
|
|
151
|
+
maxAgeDays: requirePositiveRetentionNumber(maxAgeDays, TRACE_RETENTION_DAYS_ENV, 1),
|
|
152
|
+
maxBytes: requirePositiveRetentionNumber(maxBytes, TRACE_MAX_BYTES_ENV, 1024 * 1024),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function parsePositiveRetentionNumber(raw: string | undefined, name: string, fallback: number): number {
|
|
157
|
+
if (raw === undefined || raw.trim().length === 0) {
|
|
158
|
+
return name === TRACE_RETENTION_DAYS_ENV
|
|
159
|
+
? DEFAULT_TRACE_RETENTION_POLICY.maxAgeDays
|
|
160
|
+
: DEFAULT_TRACE_RETENTION_POLICY.maxBytes;
|
|
161
|
+
}
|
|
162
|
+
const value = Number(raw);
|
|
163
|
+
return requirePositiveRetentionNumber(value, name, fallback);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function requirePositiveRetentionNumber(value: number, name: string, minimum: number): number {
|
|
167
|
+
if (!Number.isSafeInteger(value) || value < minimum) {
|
|
168
|
+
throw new Error(`${name} must be an integer of at least ${minimum}`);
|
|
169
|
+
}
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
|
|
113
173
|
export class TraceSchemaVersionError extends Error {
|
|
114
174
|
constructor(readonly found: number | null) {
|
|
115
175
|
super(
|
|
@@ -494,8 +554,13 @@ function reconcileAbandonedRuns(db: DatabaseSync): void {
|
|
|
494
554
|
|
|
495
555
|
export class TraceStore {
|
|
496
556
|
readonly db: DatabaseSync;
|
|
557
|
+
private readonly retention: TraceRetentionPolicy;
|
|
497
558
|
|
|
498
|
-
constructor(
|
|
559
|
+
constructor(
|
|
560
|
+
readonly path: string,
|
|
561
|
+
options: { retention?: Partial<TraceRetentionPolicy> } = {},
|
|
562
|
+
) {
|
|
563
|
+
this.retention = resolveTraceRetentionPolicy(options.retention);
|
|
499
564
|
mkdirSync(dirname(path), { recursive: true });
|
|
500
565
|
this.db = new (databaseSyncConstructor())(path);
|
|
501
566
|
applyConnectionPragmas(this.db);
|
|
@@ -523,6 +588,86 @@ export class TraceStore {
|
|
|
523
588
|
}
|
|
524
589
|
}
|
|
525
590
|
|
|
591
|
+
/**
|
|
592
|
+
* Remove whole terminal runs, including all of their dependent rows.
|
|
593
|
+
*
|
|
594
|
+
* Age pruning runs first. If the allocated database is still above the byte
|
|
595
|
+
* limit, the oldest remaining terminal runs are removed until the live page
|
|
596
|
+
* set fits or only queued/running runs remain. A live run is never a candidate.
|
|
597
|
+
*/
|
|
598
|
+
prune(policy: Partial<TraceRetentionPolicy> = this.retention, now = new Date().toISOString()): TracePruneResult {
|
|
599
|
+
const resolved = resolveTraceRetentionPolicy(policy);
|
|
600
|
+
const nowMs = Date.parse(now);
|
|
601
|
+
if (!Number.isFinite(nowMs)) throw new Error(`trace prune time is invalid: ${now}`);
|
|
602
|
+
const bytesBefore = traceDatabaseFootprintBytes(this.path);
|
|
603
|
+
let rowsRemoved = 0;
|
|
604
|
+
let runsRemoved = 0;
|
|
605
|
+
const removed = new Set<string>();
|
|
606
|
+
const cutoff = new Date(Math.max(0, nowMs - resolved.maxAgeDays * MILLISECONDS_PER_DAY)).toISOString();
|
|
607
|
+
|
|
608
|
+
const ageCandidates = this.db
|
|
609
|
+
.prepare(
|
|
610
|
+
"SELECT run_id FROM runs WHERE status IN ('success','fail') AND ended_at IS NOT NULL AND ended_at < ? ORDER BY ended_at, started_at, run_id",
|
|
611
|
+
)
|
|
612
|
+
.all(cutoff) as { run_id: string }[];
|
|
613
|
+
if (ageCandidates.length > 0) {
|
|
614
|
+
this.transaction(() => {
|
|
615
|
+
for (const candidate of ageCandidates) {
|
|
616
|
+
rowsRemoved += deleteTraceRun(this.db, candidate.run_id);
|
|
617
|
+
runsRemoved += 1;
|
|
618
|
+
removed.add(candidate.run_id);
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
let pages = tracePageStats(this.db);
|
|
624
|
+
if (pages.usedBytes > resolved.maxBytes) {
|
|
625
|
+
const sizeCandidates = this.db
|
|
626
|
+
.prepare(
|
|
627
|
+
"SELECT run_id FROM runs WHERE status IN ('success','fail') AND ended_at IS NOT NULL ORDER BY ended_at, started_at, run_id",
|
|
628
|
+
)
|
|
629
|
+
.all() as { run_id: string }[];
|
|
630
|
+
this.transaction(() => {
|
|
631
|
+
for (const candidate of sizeCandidates) {
|
|
632
|
+
if (pages.usedBytes <= resolved.maxBytes) break;
|
|
633
|
+
if (removed.has(candidate.run_id)) continue;
|
|
634
|
+
rowsRemoved += deleteTraceRun(this.db, candidate.run_id);
|
|
635
|
+
runsRemoved += 1;
|
|
636
|
+
removed.add(candidate.run_id);
|
|
637
|
+
pages = tracePageStats(this.db);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
pages = tracePageStats(this.db);
|
|
643
|
+
const reclaimableFraction = pages.pageCount === 0 ? 0 : pages.freePages / pages.pageCount;
|
|
644
|
+
const sizeNeedsReclaim = pages.allocatedBytes > resolved.maxBytes && pages.freePages > 0;
|
|
645
|
+
const vacuumed =
|
|
646
|
+
rowsRemoved > 0 && pages.freePages > 0 && (reclaimableFraction >= VACUUM_RECLAIMABLE_FRACTION || sizeNeedsReclaim);
|
|
647
|
+
if (vacuumed) {
|
|
648
|
+
this.db.exec("VACUUM");
|
|
649
|
+
this.db.prepare("PRAGMA wal_checkpoint(TRUNCATE)").get();
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
const protectedRuns = Number(
|
|
653
|
+
(
|
|
654
|
+
this.db.prepare("SELECT COUNT(*) AS count FROM runs WHERE status IN ('queued','running')").get() as {
|
|
655
|
+
count: number | bigint;
|
|
656
|
+
}
|
|
657
|
+
).count,
|
|
658
|
+
);
|
|
659
|
+
const bytesAfter = traceDatabaseFootprintBytes(this.path);
|
|
660
|
+
return {
|
|
661
|
+
runsRemoved,
|
|
662
|
+
rowsRemoved,
|
|
663
|
+
bytesBefore,
|
|
664
|
+
bytesAfter,
|
|
665
|
+
bytesRemoved: Math.max(0, bytesBefore - bytesAfter),
|
|
666
|
+
vacuumed,
|
|
667
|
+
protectedRuns,
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
|
|
526
671
|
upsertRun(input: DispatchEnqueuedPayload, at = new Date().toISOString()): void {
|
|
527
672
|
this.transaction(() => {
|
|
528
673
|
this.db
|
|
@@ -859,6 +1004,7 @@ export class TraceStore {
|
|
|
859
1004
|
startedAt: at,
|
|
860
1005
|
});
|
|
861
1006
|
});
|
|
1007
|
+
this.prune(this.retention, at);
|
|
862
1008
|
}
|
|
863
1009
|
|
|
864
1010
|
/**
|
|
@@ -971,9 +1117,53 @@ export class TraceStore {
|
|
|
971
1117
|
startedAt: input.at,
|
|
972
1118
|
});
|
|
973
1119
|
});
|
|
1120
|
+
this.prune(this.retention, input.at);
|
|
974
1121
|
}
|
|
975
1122
|
}
|
|
976
1123
|
|
|
1124
|
+
interface TracePageStats {
|
|
1125
|
+
pageCount: number;
|
|
1126
|
+
freePages: number;
|
|
1127
|
+
allocatedBytes: number;
|
|
1128
|
+
usedBytes: number;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
function tracePageStats(db: DatabaseSync): TracePageStats {
|
|
1132
|
+
const pageSize = Number((db.prepare("PRAGMA page_size").get() as { page_size: number | bigint }).page_size);
|
|
1133
|
+
const pageCount = Number((db.prepare("PRAGMA page_count").get() as { page_count: number | bigint }).page_count);
|
|
1134
|
+
const freePages = Number(
|
|
1135
|
+
(db.prepare("PRAGMA freelist_count").get() as { freelist_count: number | bigint }).freelist_count,
|
|
1136
|
+
);
|
|
1137
|
+
return {
|
|
1138
|
+
pageCount,
|
|
1139
|
+
freePages,
|
|
1140
|
+
allocatedBytes: pageCount * pageSize,
|
|
1141
|
+
usedBytes: Math.max(0, pageCount - freePages) * pageSize,
|
|
1142
|
+
};
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
function deleteTraceRun(db: DatabaseSync, runId: string): number {
|
|
1146
|
+
let rows = 0;
|
|
1147
|
+
for (const table of ["events", "envelopes", "gate_results", "agent_sessions", "processes", "phases", "runs"]) {
|
|
1148
|
+
const result = db.prepare(`DELETE FROM ${table} WHERE run_id=?`).run(runId);
|
|
1149
|
+
rows += Number(result.changes);
|
|
1150
|
+
}
|
|
1151
|
+
return rows;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
function traceDatabaseFootprintBytes(path: string): number {
|
|
1155
|
+
let total = 0;
|
|
1156
|
+
for (const candidate of [path, `${path}-wal`, `${path}-shm`]) {
|
|
1157
|
+
try {
|
|
1158
|
+
total += statSync(candidate).size;
|
|
1159
|
+
} catch (error) {
|
|
1160
|
+
const code = typeof error === "object" && error !== null && "code" in error ? String(error.code) : "";
|
|
1161
|
+
if (code !== "ENOENT") throw error;
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1164
|
+
return total;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
977
1167
|
export class TraceReader {
|
|
978
1168
|
readonly db: DatabaseSync;
|
|
979
1169
|
|
|
@@ -1022,6 +1212,48 @@ export class TraceReader {
|
|
|
1022
1212
|
) as unknown as TraceEventRow[];
|
|
1023
1213
|
}
|
|
1024
1214
|
|
|
1215
|
+
/**
|
|
1216
|
+
* Per-kind event tallies for one run.
|
|
1217
|
+
*
|
|
1218
|
+
* Aggregated in SQL rather than by reading rows, so `payload_json` and the
|
|
1219
|
+
* free-form event name are never loaded at all. That is the point: a caller
|
|
1220
|
+
* that only ever wants shapes should not be holding the payloads in memory
|
|
1221
|
+
* on the way to counting them.
|
|
1222
|
+
*/
|
|
1223
|
+
eventKindCounts(runId: string): Array<{ type: string; count: number }> {
|
|
1224
|
+
return this.db
|
|
1225
|
+
.prepare("SELECT type, COUNT(*) AS count FROM events WHERE run_id=? GROUP BY type ORDER BY count DESC, type")
|
|
1226
|
+
.all(runId) as unknown as Array<{ type: string; count: number }>;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/** Total events and the wall span they cover, without reading one of them. */
|
|
1230
|
+
eventSpan(runId: string): { total: number; firstAt: string | null; lastAt: string | null } {
|
|
1231
|
+
const row = this.db
|
|
1232
|
+
.prepare(
|
|
1233
|
+
`SELECT COUNT(*) AS total, MIN(started_at) AS firstAt,
|
|
1234
|
+
MAX(COALESCE(ended_at, started_at)) AS lastAt FROM events WHERE run_id=?`,
|
|
1235
|
+
)
|
|
1236
|
+
.get(runId) as unknown as { total: number; firstAt: string | null; lastAt: string | null } | undefined;
|
|
1237
|
+
return row ?? { total: 0, firstAt: null, lastAt: null };
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
/**
|
|
1241
|
+
* Per-kind process tallies for one run.
|
|
1242
|
+
*
|
|
1243
|
+
* Same reason as {@link eventKindCounts}, and more sharply: a process row
|
|
1244
|
+
* carries the command line, the pid, and the host, none of which a shape
|
|
1245
|
+
* count needs.
|
|
1246
|
+
*/
|
|
1247
|
+
processKindCounts(runId: string): Array<{ kind: string; total: number; running: number }> {
|
|
1248
|
+
return this.db
|
|
1249
|
+
.prepare(
|
|
1250
|
+
`SELECT kind, COUNT(*) AS total,
|
|
1251
|
+
SUM(CASE WHEN ended_at IS NULL THEN 1 ELSE 0 END) AS running
|
|
1252
|
+
FROM processes WHERE run_id=? GROUP BY kind ORDER BY total DESC, kind`,
|
|
1253
|
+
)
|
|
1254
|
+
.all(runId) as unknown as Array<{ kind: string; total: number; running: number }>;
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1025
1257
|
processes(runId: string): TraceProcessRow[] {
|
|
1026
1258
|
return this.db
|
|
1027
1259
|
.prepare("SELECT * FROM processes WHERE run_id=? ORDER BY ended_at IS NOT NULL, id")
|