@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
package/src/cli/tools.ts
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { describeYaziProfile, inspectCurrentYaziProfile, resetYaziProfile } from "../domains/mux/index.js";
|
|
2
|
+
import {
|
|
3
|
+
describeFloorRejection,
|
|
4
|
+
describeResolution,
|
|
5
|
+
findPinnedTool,
|
|
6
|
+
installedToolVersions,
|
|
7
|
+
installRemedy,
|
|
8
|
+
installTool,
|
|
9
|
+
PINNED_TOOLS,
|
|
10
|
+
removeTool,
|
|
11
|
+
type ToolStatus,
|
|
12
|
+
toolStatus,
|
|
13
|
+
toolStatuses,
|
|
14
|
+
} from "../domains/toolchain/index.js";
|
|
15
|
+
import { formatColumns, printError, printOk } from "./shared.js";
|
|
16
|
+
|
|
17
|
+
const HELP = `clio-coder tools <command>
|
|
18
|
+
|
|
19
|
+
Manage the external terminal programs Clio can drive. Every one of them is
|
|
20
|
+
optional: Clio works without them and only uses one when it is present. Each is
|
|
21
|
+
pinned to an exact upstream version and checksum, and a copy already on PATH
|
|
22
|
+
wins over Clio's own as long as it clears the pinned minimum.
|
|
23
|
+
|
|
24
|
+
Commands:
|
|
25
|
+
clio-coder tools list [--json] the pinned table and where each resolves
|
|
26
|
+
clio-coder tools status <id> [--json] [--reset-profile] one tool in detail
|
|
27
|
+
clio-coder tools install <id> [--force] [--json] download, verify, and vendor a tool
|
|
28
|
+
clio-coder tools remove <id>|--all [--json] delete every vendored version of a tool
|
|
29
|
+
|
|
30
|
+
Downloads happen only here. Nothing on a startup path fetches anything.
|
|
31
|
+
|
|
32
|
+
An install keeps one version directory per tool: once the pinned version is in
|
|
33
|
+
place, versions it superseded are pruned, along with any staging directory left
|
|
34
|
+
by an install that was killed. Removal touches nothing outside <data>/tools/<id>
|
|
35
|
+
and needs no confirmation, since every byte under it is re-downloadable from the
|
|
36
|
+
checksum-pinned registry. "remove --all" sweeps every tool in the table.
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
interface Parsed {
|
|
40
|
+
command?: string;
|
|
41
|
+
positional: string[];
|
|
42
|
+
json: boolean;
|
|
43
|
+
force: boolean;
|
|
44
|
+
all: boolean;
|
|
45
|
+
resetProfile: boolean;
|
|
46
|
+
help: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function runToolsCommand(argv: ReadonlyArray<string> = []): Promise<number> {
|
|
50
|
+
let parsed: Parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = parse(argv);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
55
|
+
process.stderr.write(HELP);
|
|
56
|
+
return 2;
|
|
57
|
+
}
|
|
58
|
+
if (parsed.help || parsed.command === undefined) {
|
|
59
|
+
process.stdout.write(HELP);
|
|
60
|
+
return parsed.help ? 0 : 2;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// `--all` belongs to `remove` alone. Silently ignoring it elsewhere would let
|
|
64
|
+
// `tools install --all` read as a request that was honored.
|
|
65
|
+
if (parsed.all && parsed.command !== "remove") {
|
|
66
|
+
printError("--all is only valid with `tools remove`");
|
|
67
|
+
return 2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
switch (parsed.command) {
|
|
71
|
+
case "list":
|
|
72
|
+
if (parsed.resetProfile) return invalidResetProfile();
|
|
73
|
+
return listTools(parsed.json);
|
|
74
|
+
case "status":
|
|
75
|
+
return statusTool(parsed.positional[0], parsed.json, parsed.resetProfile);
|
|
76
|
+
case "install":
|
|
77
|
+
if (parsed.resetProfile) return invalidResetProfile();
|
|
78
|
+
return installOne(parsed.positional[0], parsed.force, parsed.json);
|
|
79
|
+
case "remove":
|
|
80
|
+
if (parsed.resetProfile) return invalidResetProfile();
|
|
81
|
+
return parsed.all ? removeAll(parsed.positional[0], parsed.json) : removeOne(parsed.positional[0], parsed.json);
|
|
82
|
+
default:
|
|
83
|
+
printError(`unknown tools command: ${parsed.command}`);
|
|
84
|
+
process.stderr.write(HELP);
|
|
85
|
+
return 2;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function parse(argv: ReadonlyArray<string>): Parsed {
|
|
90
|
+
const out: Parsed = { positional: [], json: false, force: false, all: false, resetProfile: false, help: false };
|
|
91
|
+
for (const arg of argv) {
|
|
92
|
+
if (!out.command && !arg.startsWith("-")) {
|
|
93
|
+
out.command = arg;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
switch (arg) {
|
|
97
|
+
case "--json":
|
|
98
|
+
out.json = true;
|
|
99
|
+
break;
|
|
100
|
+
case "--force":
|
|
101
|
+
case "-f":
|
|
102
|
+
out.force = true;
|
|
103
|
+
break;
|
|
104
|
+
case "--all":
|
|
105
|
+
out.all = true;
|
|
106
|
+
break;
|
|
107
|
+
case "--reset-profile":
|
|
108
|
+
out.resetProfile = true;
|
|
109
|
+
break;
|
|
110
|
+
case "--help":
|
|
111
|
+
case "-h":
|
|
112
|
+
out.help = true;
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
if (arg.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
116
|
+
out.positional.push(arg);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function listTools(json: boolean): number {
|
|
123
|
+
const statuses = toolStatuses();
|
|
124
|
+
if (json) {
|
|
125
|
+
process.stdout.write(`${JSON.stringify(statuses.map(jsonShape), null, 2)}\n`);
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
const rows = statuses.map((status) => [
|
|
129
|
+
status.id,
|
|
130
|
+
status.version,
|
|
131
|
+
status.license,
|
|
132
|
+
status.resolution.source,
|
|
133
|
+
describeResolution(status),
|
|
134
|
+
]);
|
|
135
|
+
process.stdout.write(formatColumns([["TOOL", "PIN", "LICENSE", "SOURCE", "RESOLVED"], ...rows]));
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function invalidResetProfile(): number {
|
|
140
|
+
printError("--reset-profile is only valid with `tools status yazi`");
|
|
141
|
+
return 2;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The one refusal an unknown id gets, from every verb.
|
|
146
|
+
*
|
|
147
|
+
* It names the tools that do exist, because the whole error an operator makes
|
|
148
|
+
* here is a name: `tools remove herd` and `tools remove tmux` want different
|
|
149
|
+
* answers, and the registry list gives both of them one.
|
|
150
|
+
*/
|
|
151
|
+
function unknownTool(id: string): number {
|
|
152
|
+
printError(`unknown tool: ${id} (known: ${PINNED_TOOLS.map((row) => row.id).join(", ")})`);
|
|
153
|
+
return 2;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function statusTool(id: string | undefined, json: boolean, resetProfile: boolean): number {
|
|
157
|
+
if (id === undefined) {
|
|
158
|
+
printError("usage: clio-coder tools status <id>");
|
|
159
|
+
return 2;
|
|
160
|
+
}
|
|
161
|
+
const entry = findPinnedTool(id);
|
|
162
|
+
if (entry === null) {
|
|
163
|
+
return unknownTool(id);
|
|
164
|
+
}
|
|
165
|
+
if (resetProfile && id !== "yazi") return invalidResetProfile();
|
|
166
|
+
if (resetProfile) resetYaziProfile();
|
|
167
|
+
const status = toolStatus(entry);
|
|
168
|
+
const profile = id === "yazi" ? inspectCurrentYaziProfile() : null;
|
|
169
|
+
if (json) {
|
|
170
|
+
process.stdout.write(
|
|
171
|
+
`${JSON.stringify({ ...jsonShape(status), ...(profile ? { profile, profileReset: resetProfile } : {}) }, null, 2)}\n`,
|
|
172
|
+
);
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
const rejection = describeFloorRejection(status);
|
|
176
|
+
const installedVersions = installedToolVersions(entry.id);
|
|
177
|
+
const lines = [
|
|
178
|
+
`${entry.id} ${entry.version} (${entry.license})`,
|
|
179
|
+
` ${entry.summary}`,
|
|
180
|
+
` homepage ${entry.homepage}`,
|
|
181
|
+
` binaries ${entry.binaries.join(", ")}`,
|
|
182
|
+
` PATH floor ${entry.minimumVersion}`,
|
|
183
|
+
` platform ${status.platform ?? `${process.platform}-${process.arch}`}${status.supported ? "" : " (no pinned asset)"}`,
|
|
184
|
+
` vendor dir ${status.installDir}${status.installed ? "" : " (not installed)"}`,
|
|
185
|
+
` vendored ${installedVersions.length === 0 ? "nothing" : installedVersions.join(", ")}`,
|
|
186
|
+
` resolves to ${describeResolution(status)}`,
|
|
187
|
+
// Spelled out on its own line as well as inside the resolution sentence,
|
|
188
|
+
// because a rejected PATH copy is the one thing an operator reads this
|
|
189
|
+
// command to understand and the sentence above may be about something else.
|
|
190
|
+
...(rejection === null
|
|
191
|
+
? []
|
|
192
|
+
: [
|
|
193
|
+
` floor rejected: ${rejection}`,
|
|
194
|
+
...(status.resolution.source === "none" && status.supported ? [` remedy ${installRemedy(entry.id)}`] : []),
|
|
195
|
+
]),
|
|
196
|
+
...(profile
|
|
197
|
+
? [
|
|
198
|
+
` profile ${describeYaziProfile(profile)}`,
|
|
199
|
+
...(resetProfile ? [" profile reset; next open regenerates it"] : []),
|
|
200
|
+
]
|
|
201
|
+
: []),
|
|
202
|
+
];
|
|
203
|
+
process.stdout.write(`${lines.join("\n")}\n`);
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async function installOne(id: string | undefined, force: boolean, json: boolean): Promise<number> {
|
|
208
|
+
if (id === undefined) {
|
|
209
|
+
printError("usage: clio-coder tools install <id>");
|
|
210
|
+
return 2;
|
|
211
|
+
}
|
|
212
|
+
if (findPinnedTool(id) === null) {
|
|
213
|
+
return unknownTool(id);
|
|
214
|
+
}
|
|
215
|
+
const result = await installTool(id, {
|
|
216
|
+
force,
|
|
217
|
+
...(json ? {} : { onProgress: (message: string) => process.stderr.write(` ${message}\n`) }),
|
|
218
|
+
});
|
|
219
|
+
if (json) {
|
|
220
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
221
|
+
return result.ok ? 0 : 1;
|
|
222
|
+
}
|
|
223
|
+
if (!result.ok) {
|
|
224
|
+
printError(result.message);
|
|
225
|
+
return 1;
|
|
226
|
+
}
|
|
227
|
+
printOk(result.message);
|
|
228
|
+
for (const path of result.documents) process.stdout.write(` license ${path}\n`);
|
|
229
|
+
for (const version of result.pruned) process.stdout.write(` pruned ${id} ${version}\n`);
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Delete a tool's vendored install.
|
|
235
|
+
*
|
|
236
|
+
* The two answers an operator can act on are "there was nothing there" and
|
|
237
|
+
* "these versions are gone", and both are exit 0: the state they asked for
|
|
238
|
+
* holds either way. Only an id the registry does not know is a usage error,
|
|
239
|
+
* because that is the one case where nothing was inspected at all.
|
|
240
|
+
*/
|
|
241
|
+
function removeOne(id: string | undefined, json: boolean): number {
|
|
242
|
+
if (id === undefined) {
|
|
243
|
+
printError("usage: clio-coder tools remove <id>");
|
|
244
|
+
return 2;
|
|
245
|
+
}
|
|
246
|
+
if (findPinnedTool(id) === null) return unknownTool(id);
|
|
247
|
+
const result = removeTool(id);
|
|
248
|
+
if (json) {
|
|
249
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
250
|
+
return result.ok ? 0 : 1;
|
|
251
|
+
}
|
|
252
|
+
if (!result.ok) {
|
|
253
|
+
printError(result.message);
|
|
254
|
+
return 1;
|
|
255
|
+
}
|
|
256
|
+
printOk(result.message);
|
|
257
|
+
if (result.removed.length > 0) {
|
|
258
|
+
process.stdout.write(` reinstall with \`${installRemedy(id)}\`\n`);
|
|
259
|
+
}
|
|
260
|
+
return 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Delete every pinned tool's vendored install.
|
|
265
|
+
*
|
|
266
|
+
* Each tool is swept independently and the exit code is the worst of them, so
|
|
267
|
+
* one directory that resists deletion does not hide the two that came off
|
|
268
|
+
* cleanly. Tools that had nothing installed are counted rather than listed:
|
|
269
|
+
* on the machine this verb is for, most of the registry is usually absent, and
|
|
270
|
+
* three lines of "nothing to remove" would bury the one line that matters.
|
|
271
|
+
*/
|
|
272
|
+
function removeAll(id: string | undefined, json: boolean): number {
|
|
273
|
+
if (id !== undefined) {
|
|
274
|
+
printError("`tools remove --all` takes no tool id; drop the id or drop --all");
|
|
275
|
+
return 2;
|
|
276
|
+
}
|
|
277
|
+
const results = PINNED_TOOLS.map((entry) => removeTool(entry.id));
|
|
278
|
+
if (json) {
|
|
279
|
+
process.stdout.write(`${JSON.stringify(results, null, 2)}\n`);
|
|
280
|
+
return results.every((result) => result.ok) ? 0 : 1;
|
|
281
|
+
}
|
|
282
|
+
for (const result of results) {
|
|
283
|
+
if (!result.ok) printError(result.message);
|
|
284
|
+
else if (result.removed.length > 0 || result.staleStaging.length > 0) printOk(result.message);
|
|
285
|
+
}
|
|
286
|
+
const touched = results.filter((result) => result.ok && result.removed.length > 0);
|
|
287
|
+
const untouched = results.filter((result) => result.ok && result.removed.length === 0);
|
|
288
|
+
if (touched.length > 0) {
|
|
289
|
+
process.stdout.write(` reinstall with \`clio-coder tools install <id>\`\n`);
|
|
290
|
+
}
|
|
291
|
+
if (untouched.length > 0) {
|
|
292
|
+
process.stdout.write(` ${untouched.length} of ${results.length} had nothing vendored\n`);
|
|
293
|
+
}
|
|
294
|
+
return results.every((result) => result.ok) ? 0 : 1;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/** The JSON surface, flattened so a script does not have to walk the resolution. */
|
|
298
|
+
function jsonShape(status: ToolStatus): Record<string, unknown> {
|
|
299
|
+
return {
|
|
300
|
+
id: status.id,
|
|
301
|
+
version: status.version,
|
|
302
|
+
license: status.license,
|
|
303
|
+
platform: status.platform,
|
|
304
|
+
supported: status.supported,
|
|
305
|
+
installed: status.installed,
|
|
306
|
+
installDir: status.installDir,
|
|
307
|
+
source: status.resolution.source,
|
|
308
|
+
binaryPath: status.resolution.binaryPath,
|
|
309
|
+
foundVersion: status.resolution.version,
|
|
310
|
+
minimumVersion: status.resolution.entry?.minimumVersion ?? null,
|
|
311
|
+
pathCandidate: status.resolution.pathCandidate,
|
|
312
|
+
// A script deciding whether to warn about a floor rejection should not have
|
|
313
|
+
// to parse `detail` for it, so the rejection and the command that answers
|
|
314
|
+
// it are their own fields. `remedy` is null exactly where installing would
|
|
315
|
+
// change nothing: already vendored, or no asset for this platform.
|
|
316
|
+
floorRejection: describeFloorRejection(status),
|
|
317
|
+
remedy: status.resolution.source === "none" && status.supported ? installRemedy(status.id) : null,
|
|
318
|
+
installedVersions: installedToolVersions(status.id),
|
|
319
|
+
detail: describeResolution(status),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of recent durable trace runs and phases.
|
|
3
|
+
*
|
|
4
|
+
* `trace runs --json` is an operator-directed terminal surface: it takes a
|
|
5
|
+
* database path and a limit, and it emits `SELECT *`, which includes the
|
|
6
|
+
* request text the operator typed. The GUI cannot reuse that transport. This
|
|
7
|
+
* command accepts no identifier, path, or limit, opens only the default trace
|
|
8
|
+
* database, selects a bounded newest-first window itself, and emits accounting
|
|
9
|
+
* facts with no prompt text, no free-form description or error, and no path.
|
|
10
|
+
*
|
|
11
|
+
* It is deliberately a separate read from `fleet inspect --json` even though
|
|
12
|
+
* both are keyed by run id. The ledger and the trace database are different
|
|
13
|
+
* durable stores with different failure modes: an installation that never
|
|
14
|
+
* enabled tracing has no trace database at all, and that must be an empty
|
|
15
|
+
* answer here rather than a failure of the run journal.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { existsSync } from "node:fs";
|
|
19
|
+
import { clioStatePath } from "../core/xdg.js";
|
|
20
|
+
import { TraceReader, traceDatabasePath } from "../domains/observability/trace-store.js";
|
|
21
|
+
import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
|
|
22
|
+
import { truncateToWidth } from "../engine/tui-primitives.js";
|
|
23
|
+
|
|
24
|
+
export const TRACE_INSPECT_MAX_RUNS = 8;
|
|
25
|
+
export const TRACE_INSPECT_MAX_PHASES = 16;
|
|
26
|
+
export const TRACE_INSPECT_MAX_EVENT_KINDS = 12;
|
|
27
|
+
export const TRACE_INSPECT_MAX_PROCESS_KINDS = 8;
|
|
28
|
+
|
|
29
|
+
const IDENTITY_WIDTH = 128;
|
|
30
|
+
const STATUS_WIDTH = 64;
|
|
31
|
+
|
|
32
|
+
export interface TraceInspectPhase {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly kind: string;
|
|
35
|
+
readonly owner: string;
|
|
36
|
+
readonly status: string;
|
|
37
|
+
readonly attempt: number;
|
|
38
|
+
readonly retries: number;
|
|
39
|
+
/** Whether the phase recorded an error, without the error text itself. */
|
|
40
|
+
readonly failed: boolean;
|
|
41
|
+
readonly elapsedMs: number | null;
|
|
42
|
+
readonly totalTokens: number | null;
|
|
43
|
+
readonly totalCostUsd: number | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* What a run's events were, in aggregate.
|
|
48
|
+
*
|
|
49
|
+
* Deliberately shapes and not rows. A trace event carries `payload_json` and a
|
|
50
|
+
* free-form name, which are the class of value this boundary keeps host-side,
|
|
51
|
+
* so the tail itself stays in the terminal and what crosses is how many events
|
|
52
|
+
* of each kind there were and the span they cover. The counts come out of SQL,
|
|
53
|
+
* so the payloads are not read on the way to counting them.
|
|
54
|
+
*/
|
|
55
|
+
export interface TraceInspectEvents {
|
|
56
|
+
readonly total: number;
|
|
57
|
+
readonly firstAt: string | null;
|
|
58
|
+
readonly lastAt: string | null;
|
|
59
|
+
readonly kinds: readonly { readonly kind: string; readonly count: number }[];
|
|
60
|
+
readonly kindsTruncated: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* What a run's child processes were, in aggregate.
|
|
65
|
+
*
|
|
66
|
+
* Same rule, applied harder: a process row carries the command line, the pid,
|
|
67
|
+
* and the host. None of that is needed to say a run spawned four workers and
|
|
68
|
+
* one is still alive, and none of it crosses.
|
|
69
|
+
*/
|
|
70
|
+
export interface TraceInspectProcesses {
|
|
71
|
+
readonly total: number;
|
|
72
|
+
readonly running: number;
|
|
73
|
+
readonly kinds: readonly { readonly kind: string; readonly total: number; readonly running: number }[];
|
|
74
|
+
readonly kindsTruncated: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface TraceInspectRun {
|
|
78
|
+
readonly runId: string;
|
|
79
|
+
readonly agent: string;
|
|
80
|
+
readonly target: string;
|
|
81
|
+
readonly model: string;
|
|
82
|
+
readonly runtime: string;
|
|
83
|
+
readonly node: string | null;
|
|
84
|
+
readonly status: string;
|
|
85
|
+
readonly startedAt: string;
|
|
86
|
+
readonly elapsedMs: number | null;
|
|
87
|
+
readonly totalTokens: number | null;
|
|
88
|
+
readonly totalCostUsd: number | null;
|
|
89
|
+
readonly phases: readonly TraceInspectPhase[];
|
|
90
|
+
readonly phasesTruncated: boolean;
|
|
91
|
+
readonly events: TraceInspectEvents;
|
|
92
|
+
readonly processes: TraceInspectProcesses;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface TraceInspectSnapshot {
|
|
96
|
+
readonly version: 1;
|
|
97
|
+
readonly generatedAt: string;
|
|
98
|
+
/**
|
|
99
|
+
* False when this installation has no trace database. That is the ordinary
|
|
100
|
+
* state of an installation that never enabled tracing, and it has to stay
|
|
101
|
+
* distinguishable from a database that exists and holds no runs.
|
|
102
|
+
*/
|
|
103
|
+
readonly available: boolean;
|
|
104
|
+
readonly runs: readonly TraceInspectRun[];
|
|
105
|
+
readonly truncated: boolean;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function bounded(value: string, width: number): string {
|
|
109
|
+
const sanitized = sanitizeCallTargetText(value);
|
|
110
|
+
if (sanitized.length === 0) return "unavailable";
|
|
111
|
+
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function nullableBounded(value: string | null, width: number): string | null {
|
|
115
|
+
return value === null ? null : bounded(value, width);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** A finite non-negative count, or null when the store recorded none. */
|
|
119
|
+
function tally(value: number | null): number | null {
|
|
120
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** A finite non-negative cost, or null. Kept as a number so the GUI formats it. */
|
|
124
|
+
function cost(value: number | null): number | null {
|
|
125
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Wall time between two stamps. Null rather than zero when either is missing or
|
|
130
|
+
* unparseable, because "still running" and "took no time" are different facts.
|
|
131
|
+
*/
|
|
132
|
+
function elapsed(startedAt: string | null, endedAt: string | null): number | null {
|
|
133
|
+
if (startedAt === null || endedAt === null) return null;
|
|
134
|
+
const start = Date.parse(startedAt);
|
|
135
|
+
const end = Date.parse(endedAt);
|
|
136
|
+
if (!Number.isFinite(start) || !Number.isFinite(end)) return null;
|
|
137
|
+
return Math.max(0, end - start);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function eventSummary(reader: TraceReader, runId: string): TraceInspectEvents {
|
|
141
|
+
const span = reader.eventSpan(runId);
|
|
142
|
+
const all = reader.eventKindCounts(runId);
|
|
143
|
+
const visible = all.slice(0, TRACE_INSPECT_MAX_EVENT_KINDS);
|
|
144
|
+
return {
|
|
145
|
+
total: tally(span.total) ?? 0,
|
|
146
|
+
firstAt: span.firstAt,
|
|
147
|
+
lastAt: span.lastAt,
|
|
148
|
+
kinds: visible.map((entry) => ({ kind: bounded(entry.type, STATUS_WIDTH), count: tally(entry.count) ?? 0 })),
|
|
149
|
+
kindsTruncated: all.length > visible.length,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function processSummary(reader: TraceReader, runId: string): TraceInspectProcesses {
|
|
154
|
+
const all = reader.processKindCounts(runId);
|
|
155
|
+
const visible = all.slice(0, TRACE_INSPECT_MAX_PROCESS_KINDS);
|
|
156
|
+
return {
|
|
157
|
+
total: all.reduce((sum, entry) => sum + (tally(entry.total) ?? 0), 0),
|
|
158
|
+
running: all.reduce((sum, entry) => sum + (tally(entry.running) ?? 0), 0),
|
|
159
|
+
kinds: visible.map((entry) => ({
|
|
160
|
+
kind: bounded(entry.kind, STATUS_WIDTH),
|
|
161
|
+
total: tally(entry.total) ?? 0,
|
|
162
|
+
running: tally(entry.running) ?? 0,
|
|
163
|
+
})),
|
|
164
|
+
kindsTruncated: all.length > visible.length,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Pure payload builder, exported so the fixed contract is testable without subprocess capture. */
|
|
169
|
+
export function traceInspectSnapshot(
|
|
170
|
+
now: () => number = Date.now,
|
|
171
|
+
databasePath: string = traceDatabasePath(clioStatePath()),
|
|
172
|
+
): TraceInspectSnapshot {
|
|
173
|
+
const generatedAt = new Date(now()).toISOString();
|
|
174
|
+
if (!existsSync(databasePath)) {
|
|
175
|
+
return { version: 1, generatedAt, available: false, runs: [], truncated: false };
|
|
176
|
+
}
|
|
177
|
+
let reader: TraceReader;
|
|
178
|
+
try {
|
|
179
|
+
reader = new TraceReader(databasePath);
|
|
180
|
+
} catch {
|
|
181
|
+
// A database that exists but will not open is not an empty installation,
|
|
182
|
+
// and it is not this command's job to diagnose it. Report it as present
|
|
183
|
+
// with nothing readable rather than inventing either extreme.
|
|
184
|
+
return { version: 1, generatedAt, available: true, runs: [], truncated: false };
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const selected = reader.runs(TRACE_INSPECT_MAX_RUNS + 1);
|
|
188
|
+
const window = selected.slice(0, TRACE_INSPECT_MAX_RUNS);
|
|
189
|
+
const runs = window.map((row): TraceInspectRun => {
|
|
190
|
+
const allPhases = reader.phases(row.run_id);
|
|
191
|
+
const visible = allPhases.slice(0, TRACE_INSPECT_MAX_PHASES);
|
|
192
|
+
return {
|
|
193
|
+
runId: bounded(row.run_id, IDENTITY_WIDTH),
|
|
194
|
+
agent: bounded(row.agent, IDENTITY_WIDTH),
|
|
195
|
+
target: bounded(row.target, IDENTITY_WIDTH),
|
|
196
|
+
model: bounded(row.model, IDENTITY_WIDTH),
|
|
197
|
+
runtime: bounded(row.runtime, IDENTITY_WIDTH),
|
|
198
|
+
node: nullableBounded(row.node, IDENTITY_WIDTH),
|
|
199
|
+
status: bounded(row.status, STATUS_WIDTH),
|
|
200
|
+
startedAt: row.started_at,
|
|
201
|
+
elapsedMs: elapsed(row.started_at, row.ended_at),
|
|
202
|
+
totalTokens: tally(row.total_tokens),
|
|
203
|
+
totalCostUsd: cost(row.total_cost_usd),
|
|
204
|
+
phases: visible.map(
|
|
205
|
+
(phase): TraceInspectPhase => ({
|
|
206
|
+
name: bounded(phase.name, IDENTITY_WIDTH),
|
|
207
|
+
kind: bounded(phase.kind, STATUS_WIDTH),
|
|
208
|
+
owner: bounded(phase.owner, IDENTITY_WIDTH),
|
|
209
|
+
status: bounded(phase.status, STATUS_WIDTH),
|
|
210
|
+
attempt: tally(phase.attempt) ?? 0,
|
|
211
|
+
retries: tally(phase.retries) ?? 0,
|
|
212
|
+
// The error text can quote a path, a URL, or a model reply, so only
|
|
213
|
+
// the fact that one was recorded crosses.
|
|
214
|
+
failed: phase.error !== null && phase.error !== "",
|
|
215
|
+
elapsedMs: elapsed(phase.started_at, phase.ended_at),
|
|
216
|
+
totalTokens: tally(phase.total_tokens),
|
|
217
|
+
totalCostUsd: cost(phase.total_cost_usd),
|
|
218
|
+
}),
|
|
219
|
+
),
|
|
220
|
+
phasesTruncated: allPhases.length > visible.length,
|
|
221
|
+
events: eventSummary(reader, row.run_id),
|
|
222
|
+
processes: processSummary(reader, row.run_id),
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
version: 1,
|
|
227
|
+
generatedAt,
|
|
228
|
+
available: true,
|
|
229
|
+
runs,
|
|
230
|
+
truncated: selected.length > window.length,
|
|
231
|
+
};
|
|
232
|
+
} finally {
|
|
233
|
+
reader.close();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* `clio-coder trace inspect --json`, and nothing else.
|
|
239
|
+
*
|
|
240
|
+
* `fixed` is false as soon as the caller supplied a database, a limit, a follow,
|
|
241
|
+
* or any other positional. The whole point of this command is that its argv is
|
|
242
|
+
* not a surface: a GUI host can invoke it and be certain the process it started
|
|
243
|
+
* cannot be steered into reading a different file or a wider window.
|
|
244
|
+
*/
|
|
245
|
+
export function runTraceInspect(fixed: boolean): number {
|
|
246
|
+
if (!fixed) {
|
|
247
|
+
process.stderr.write("clio-coder trace inspect: usage: clio-coder trace inspect --json\n");
|
|
248
|
+
return 2;
|
|
249
|
+
}
|
|
250
|
+
process.stdout.write(`${JSON.stringify(traceInspectSnapshot(), null, 2)}\n`);
|
|
251
|
+
return 0;
|
|
252
|
+
}
|