@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,327 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { type ArchiveEntry, readTarGzEntries, readZipEntries } from "./archive.js";
|
|
5
|
+
import { ensureToolchainRoot } from "./paths.js";
|
|
6
|
+
import { currentToolPlatform, findPinnedTool } from "./registry.js";
|
|
7
|
+
import { pruneSupersededVersions } from "./remove.js";
|
|
8
|
+
import type { PinnedTool, PinnedToolDownload, ToolPlatform } from "./types.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Install a pinned tool into the vendor root.
|
|
12
|
+
*
|
|
13
|
+
* Three rules shape this file. Nothing downloads unless an operator asked for
|
|
14
|
+
* this install by name, so no startup path can reach it. Nothing is written
|
|
15
|
+
* until the asset's checksum matches the pin, and a mismatch leaves the disk
|
|
16
|
+
* exactly as it was. And the version directory appears atomically, built in a
|
|
17
|
+
* sibling staging directory and renamed into place, so a killed install leaves
|
|
18
|
+
* a `.incomplete-` directory rather than a half-populated version that the
|
|
19
|
+
* resolution ladder would happily run.
|
|
20
|
+
*
|
|
21
|
+
* A successful install then prunes, so a tool holds exactly the pinned version
|
|
22
|
+
* and nothing else. Only the ladder's own version is ever resolved, so a
|
|
23
|
+
* superseded directory is dead weight an operator would have to find and delete
|
|
24
|
+
* by hand. Pruning runs on the already-installed path too, which is what
|
|
25
|
+
* repairs a machine that bumped pins before this behavior existed.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** How a URL becomes bytes. Injectable so the contract tests never touch the network. */
|
|
29
|
+
export type ToolFetcher = (url: string) => Promise<Buffer>;
|
|
30
|
+
|
|
31
|
+
export interface ToolInstallOptions {
|
|
32
|
+
/** Re-download and replace an already-installed version. */
|
|
33
|
+
force?: boolean;
|
|
34
|
+
/** Install the asset for a platform other than the running one. */
|
|
35
|
+
platform?: ToolPlatform;
|
|
36
|
+
/** Vendor root override. Defaults to the data root's `tools` directory. */
|
|
37
|
+
root?: string;
|
|
38
|
+
fetch?: ToolFetcher;
|
|
39
|
+
onProgress?: (message: string) => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ToolInstallResult {
|
|
43
|
+
ok: boolean;
|
|
44
|
+
id: string;
|
|
45
|
+
version: string;
|
|
46
|
+
/** Where the version directory is, whether or not this run created it. */
|
|
47
|
+
dir: string;
|
|
48
|
+
/** Absolute paths of the installed executables. */
|
|
49
|
+
binaries: string[];
|
|
50
|
+
/** Absolute paths of the license and notice files placed beside them. */
|
|
51
|
+
documents: string[];
|
|
52
|
+
/** True when the version was already installed and nothing was downloaded. */
|
|
53
|
+
skipped: boolean;
|
|
54
|
+
/** Superseded versions of the same tool this install deleted. */
|
|
55
|
+
pruned: string[];
|
|
56
|
+
message: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** How long one asset download may take. */
|
|
60
|
+
const DOWNLOAD_TIMEOUT_MS = 300_000;
|
|
61
|
+
|
|
62
|
+
/** Install by registry id. */
|
|
63
|
+
export async function installTool(id: string, options: ToolInstallOptions = {}): Promise<ToolInstallResult> {
|
|
64
|
+
const entry = findPinnedTool(id);
|
|
65
|
+
if (entry === null) {
|
|
66
|
+
return failure(id, "unknown", "", `unknown tool: ${id}`);
|
|
67
|
+
}
|
|
68
|
+
return installPinnedTool(entry, options);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Install a registry row. Exported so tests can drive a fabricated entry. */
|
|
72
|
+
export async function installPinnedTool(
|
|
73
|
+
entry: PinnedTool,
|
|
74
|
+
options: ToolInstallOptions = {},
|
|
75
|
+
): Promise<ToolInstallResult> {
|
|
76
|
+
const root = options.root ?? ensureToolchainRoot();
|
|
77
|
+
const dir = join(root, entry.id, entry.version);
|
|
78
|
+
const platform = options.platform ?? currentToolPlatform();
|
|
79
|
+
const progress = options.onProgress ?? (() => undefined);
|
|
80
|
+
|
|
81
|
+
if (platform === null) {
|
|
82
|
+
return failure(entry.id, entry.version, dir, `no pinned asset for ${process.platform}-${process.arch}`);
|
|
83
|
+
}
|
|
84
|
+
const download = entry.downloads[platform];
|
|
85
|
+
if (download === undefined) {
|
|
86
|
+
return failure(entry.id, entry.version, dir, `no pinned asset for ${platform}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const installedBinaries = Object.keys(download.binaryMembers).map((name) => join(dir, executableName(name, platform)));
|
|
90
|
+
if (!options.force && installedBinaries.every((path) => existsSync(path))) {
|
|
91
|
+
const swept = prune(root, entry);
|
|
92
|
+
return {
|
|
93
|
+
ok: true,
|
|
94
|
+
id: entry.id,
|
|
95
|
+
version: entry.version,
|
|
96
|
+
dir,
|
|
97
|
+
binaries: installedBinaries,
|
|
98
|
+
documents: [],
|
|
99
|
+
skipped: true,
|
|
100
|
+
pruned: swept.pruned,
|
|
101
|
+
message: `${entry.id} ${entry.version} is already installed at ${dir}${swept.note}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const fetcher = options.fetch ?? fetchAsset;
|
|
106
|
+
let assetBytes: Buffer;
|
|
107
|
+
try {
|
|
108
|
+
progress(`downloading ${download.url}`);
|
|
109
|
+
assetBytes = await fetcher(download.url);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
return failure(entry.id, entry.version, dir, `download failed: ${messageOf(error)}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const actual = sha256(assetBytes);
|
|
115
|
+
if (actual !== download.sha256) {
|
|
116
|
+
return failure(
|
|
117
|
+
entry.id,
|
|
118
|
+
entry.version,
|
|
119
|
+
dir,
|
|
120
|
+
`checksum mismatch for ${download.url}: expected ${download.sha256}, got ${actual}. Nothing was written.`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
progress(`checksum verified (${actual})`);
|
|
124
|
+
|
|
125
|
+
const documentBytes = new Map<string, Buffer>();
|
|
126
|
+
for (const doc of entry.documents) {
|
|
127
|
+
let bytes: Buffer;
|
|
128
|
+
try {
|
|
129
|
+
progress(`downloading ${doc.url}`);
|
|
130
|
+
bytes = await fetcher(doc.url);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
return failure(entry.id, entry.version, dir, `download failed for ${doc.name}: ${messageOf(error)}`);
|
|
133
|
+
}
|
|
134
|
+
const docHash = sha256(bytes);
|
|
135
|
+
if (docHash !== doc.sha256) {
|
|
136
|
+
return failure(
|
|
137
|
+
entry.id,
|
|
138
|
+
entry.version,
|
|
139
|
+
dir,
|
|
140
|
+
`checksum mismatch for ${doc.url}: expected ${doc.sha256}, got ${docHash}. Nothing was written.`,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
documentBytes.set(doc.name, bytes);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
let members: Map<string, ArchiveEntry>;
|
|
147
|
+
try {
|
|
148
|
+
members = unpack(assetBytes, download);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
return failure(entry.id, entry.version, dir, `could not unpack the asset: ${messageOf(error)}`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
for (const memberPath of Object.values(download.binaryMembers)) {
|
|
154
|
+
if (!members.has(memberPath)) {
|
|
155
|
+
return failure(entry.id, entry.version, dir, `the asset does not contain ${memberPath || entry.primaryBinary}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const memberPath of download.documentMembers) {
|
|
159
|
+
if (!members.has(memberPath)) {
|
|
160
|
+
return failure(entry.id, entry.version, dir, `the asset does not contain ${memberPath}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const staging = join(root, entry.id, `.${entry.version}.incomplete-${process.pid}-${Date.now().toString(36)}`);
|
|
165
|
+
// Where a `--force` replacement parks the old version directory while the new
|
|
166
|
+
// one is renamed in. It is unlinked only once the new directory is in place,
|
|
167
|
+
// so the window where neither copy exists is a single rename wide.
|
|
168
|
+
const retired = join(root, entry.id, `.${entry.version}.replaced-${process.pid}-${Date.now().toString(36)}`);
|
|
169
|
+
let retiredOld = false;
|
|
170
|
+
const binaries: string[] = [];
|
|
171
|
+
const documents: string[] = [];
|
|
172
|
+
try {
|
|
173
|
+
mkdirSync(staging, { recursive: true });
|
|
174
|
+
for (const [name, memberPath] of Object.entries(download.binaryMembers)) {
|
|
175
|
+
const member = members.get(memberPath);
|
|
176
|
+
if (member === undefined) continue;
|
|
177
|
+
const target = join(staging, executableName(name, platform));
|
|
178
|
+
writeFileSync(target, member.data);
|
|
179
|
+
chmodSync(target, 0o755);
|
|
180
|
+
binaries.push(join(dir, executableName(name, platform)));
|
|
181
|
+
}
|
|
182
|
+
for (const memberPath of download.documentMembers) {
|
|
183
|
+
const member = members.get(memberPath);
|
|
184
|
+
if (member === undefined) continue;
|
|
185
|
+
const target = join(staging, basename(memberPath));
|
|
186
|
+
writeFileSync(target, member.data, { mode: 0o644 });
|
|
187
|
+
documents.push(join(dir, basename(memberPath)));
|
|
188
|
+
}
|
|
189
|
+
for (const [name, bytes] of documentBytes) {
|
|
190
|
+
writeFileSync(join(staging, name), bytes, { mode: 0o644 });
|
|
191
|
+
documents.push(join(dir, name));
|
|
192
|
+
}
|
|
193
|
+
writeFileSync(
|
|
194
|
+
join(staging, "clio-install.json"),
|
|
195
|
+
`${JSON.stringify(
|
|
196
|
+
{
|
|
197
|
+
id: entry.id,
|
|
198
|
+
version: entry.version,
|
|
199
|
+
platform,
|
|
200
|
+
license: entry.license,
|
|
201
|
+
homepage: entry.homepage,
|
|
202
|
+
url: download.url,
|
|
203
|
+
sha256: download.sha256,
|
|
204
|
+
installedAt: new Date().toISOString(),
|
|
205
|
+
},
|
|
206
|
+
null,
|
|
207
|
+
2,
|
|
208
|
+
)}\n`,
|
|
209
|
+
{ mode: 0o644 },
|
|
210
|
+
);
|
|
211
|
+
if (options.force && existsSync(dir)) {
|
|
212
|
+
renameSync(dir, retired);
|
|
213
|
+
retiredOld = true;
|
|
214
|
+
}
|
|
215
|
+
renameSync(staging, dir);
|
|
216
|
+
if (retiredOld) {
|
|
217
|
+
rmSync(retired, { recursive: true, force: true });
|
|
218
|
+
retiredOld = false;
|
|
219
|
+
}
|
|
220
|
+
} catch (error) {
|
|
221
|
+
rmSync(staging, { recursive: true, force: true });
|
|
222
|
+
// The new version never landed, so put the copy the operator had back.
|
|
223
|
+
if (retiredOld && !existsSync(dir)) {
|
|
224
|
+
try {
|
|
225
|
+
renameSync(retired, dir);
|
|
226
|
+
retiredOld = false;
|
|
227
|
+
} catch {
|
|
228
|
+
// Leave the retired directory in place: it is the only surviving copy.
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// A rename losing to a concurrent installer is not a failure: the version
|
|
232
|
+
// directory the caller asked for exists and holds the same pinned bytes.
|
|
233
|
+
if (!options.force && existsSync(dir)) {
|
|
234
|
+
const swept = prune(root, entry);
|
|
235
|
+
return {
|
|
236
|
+
ok: true,
|
|
237
|
+
id: entry.id,
|
|
238
|
+
version: entry.version,
|
|
239
|
+
dir,
|
|
240
|
+
binaries: installedBinaries,
|
|
241
|
+
documents: [],
|
|
242
|
+
skipped: true,
|
|
243
|
+
pruned: swept.pruned,
|
|
244
|
+
message: `${entry.id} ${entry.version} was installed concurrently at ${dir}${swept.note}`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return failure(entry.id, entry.version, dir, `install failed: ${messageOf(error)}`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const swept = prune(root, entry);
|
|
251
|
+
return {
|
|
252
|
+
ok: true,
|
|
253
|
+
id: entry.id,
|
|
254
|
+
version: entry.version,
|
|
255
|
+
dir,
|
|
256
|
+
binaries,
|
|
257
|
+
documents,
|
|
258
|
+
skipped: false,
|
|
259
|
+
pruned: swept.pruned,
|
|
260
|
+
message: `installed ${entry.id} ${entry.version} (${entry.license}) at ${dir}${swept.note}`,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Delete the versions this pin supersedes, and say what happened.
|
|
266
|
+
*
|
|
267
|
+
* A prune that cannot delete something never fails the install: the version the
|
|
268
|
+
* operator asked for is in place and runnable, and a directory that resisted
|
|
269
|
+
* `rm` is a disk problem to report, not a reason to claim the install did not
|
|
270
|
+
* happen. It is named in the message so the operator can go look.
|
|
271
|
+
*/
|
|
272
|
+
function prune(root: string, entry: PinnedTool): { pruned: string[]; note: string } {
|
|
273
|
+
const outcome = pruneSupersededVersions(entry.id, entry.version, { root });
|
|
274
|
+
const parts: string[] = [];
|
|
275
|
+
if (outcome.removed.length > 0) parts.push(`pruned ${outcome.removed.join(", ")}`);
|
|
276
|
+
if (outcome.staleStaging.length > 0) {
|
|
277
|
+
const count = outcome.staleStaging.length;
|
|
278
|
+
parts.push(`swept ${count} abandoned install ${count === 1 ? "directory" : "directories"}`);
|
|
279
|
+
}
|
|
280
|
+
if (outcome.failed.length > 0) {
|
|
281
|
+
parts.push(`could not prune ${outcome.failed.map((item) => `${item.version} (${item.error})`).join(", ")}`);
|
|
282
|
+
}
|
|
283
|
+
return { pruned: outcome.removed, note: parts.length === 0 ? "" : `; ${parts.join("; ")}` };
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function unpack(bytes: Buffer, download: PinnedToolDownload): Map<string, ArchiveEntry> {
|
|
287
|
+
if (download.archive === "raw") {
|
|
288
|
+
// The asset is the binary. The registry names it with an empty member
|
|
289
|
+
// path, so the synthetic map key matches what the caller looks up.
|
|
290
|
+
return new Map([["", { path: "", data: bytes, mode: 0o755 }]]);
|
|
291
|
+
}
|
|
292
|
+
if (download.archive === "zip") return readZipEntries(bytes);
|
|
293
|
+
return readTarGzEntries(bytes);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function fetchAsset(url: string): Promise<Buffer> {
|
|
297
|
+
const response = await fetch(url, {
|
|
298
|
+
redirect: "follow",
|
|
299
|
+
signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS),
|
|
300
|
+
});
|
|
301
|
+
if (!response.ok) throw new Error(`HTTP ${response.status} ${response.statusText}`);
|
|
302
|
+
return Buffer.from(await response.arrayBuffer());
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function sha256(bytes: Buffer): string {
|
|
306
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* What a binary is called once installed, for the platform being installed.
|
|
311
|
+
*
|
|
312
|
+
* Keyed off the target rather than `process.platform`, because `--platform`
|
|
313
|
+
* exists: installing the win32 asset from Linux has to write `herdr.exe`, and
|
|
314
|
+
* writing `herdr` there would produce a directory Windows could never run and
|
|
315
|
+
* that the resolution ladder on Windows would report as not installed.
|
|
316
|
+
*/
|
|
317
|
+
function executableName(name: string, platform: ToolPlatform): string {
|
|
318
|
+
return platform.startsWith("win32") ? `${name}.exe` : name;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function failure(id: string, version: string, dir: string, message: string): ToolInstallResult {
|
|
322
|
+
return { ok: false, id, version, dir, binaries: [], documents: [], skipped: false, pruned: [], message };
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function messageOf(error: unknown): string {
|
|
326
|
+
return error instanceof Error ? error.message : String(error);
|
|
327
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DomainManifest } from "../../core/domain-loader.js";
|
|
2
|
+
|
|
3
|
+
export const ToolchainManifest: DomainManifest = {
|
|
4
|
+
name: "toolchain",
|
|
5
|
+
// The registry is a static table plus filesystem lookups under the data
|
|
6
|
+
// root. It reads no settings and calls no other domain.
|
|
7
|
+
dependsOn: [],
|
|
8
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { clioDataDir, resolveClioDirs } from "../../core/xdg.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Vendored tools are durable artifacts Clio downloaded on request, so they live
|
|
6
|
+
* under the data root beside memory and evidence, not under state (machine
|
|
7
|
+
* output) or cache (disposable). The version is part of the path so a pin bump
|
|
8
|
+
* installs beside the old copy instead of over it, and a rollback is a path
|
|
9
|
+
* change rather than a re-download.
|
|
10
|
+
*
|
|
11
|
+
* Every reader resolves through `resolveClioDirs()` rather than `clioDataDir()`
|
|
12
|
+
* because the latter creates the root, and doctor and the resolution ladder both
|
|
13
|
+
* promise to create nothing. Only the installer creates.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** `<data>/tools`, without creating it. */
|
|
17
|
+
export function toolchainRoot(): string {
|
|
18
|
+
return join(resolveClioDirs().data, "tools");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** `<data>/tools/<id>/<version>`, without creating it. */
|
|
22
|
+
export function toolVersionDir(id: string, version: string): string {
|
|
23
|
+
return join(toolchainRoot(), id, version);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** `<data>/tools/<id>/<version>/<binary>`, without creating it. */
|
|
27
|
+
export function vendoredBinaryPath(id: string, version: string, binary: string): string {
|
|
28
|
+
return join(toolVersionDir(id, version), process.platform === "win32" ? `${binary}.exe` : binary);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** `<data>/tools`, creating the data root the way every other writer does. */
|
|
32
|
+
export function ensureToolchainRoot(): string {
|
|
33
|
+
return join(clioDataDir(), "tools");
|
|
34
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import type { PinnedTool, ToolPlatform } from "./types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The pinned table.
|
|
5
|
+
*
|
|
6
|
+
* Every checksum here was computed from the asset as downloaded from the URL
|
|
7
|
+
* beside it, not copied from a release note. Where upstream publishes its own
|
|
8
|
+
* checksum file the two were compared and agree; where upstream publishes no
|
|
9
|
+
* checksums, only the platform whose asset was actually fetched and hashed is
|
|
10
|
+
* listed, because a hash nobody verified is worse than a missing platform: it
|
|
11
|
+
* turns an honest "no asset for your platform" into a failed install that
|
|
12
|
+
* looks like tampering.
|
|
13
|
+
*
|
|
14
|
+
* Bumping a version means re-downloading each listed asset and re-computing
|
|
15
|
+
* each hash. The registry-shape contract test refuses an entry that carries a
|
|
16
|
+
* platform without a checksum. A bump also supersedes whatever version the
|
|
17
|
+
* machine already has, and the installer prunes it, so a tool holds exactly one
|
|
18
|
+
* version directory.
|
|
19
|
+
*
|
|
20
|
+
* `minimumVersion` is the floor a copy already on PATH has to clear. A floor
|
|
21
|
+
* moves on evidence and on nothing else: name the older release, say which of
|
|
22
|
+
* its surfaces you exercised and how, and put that in the comment beside the
|
|
23
|
+
* number. A rejection that felt noisy is not evidence. Where no such
|
|
24
|
+
* measurement exists the floor sits at the pin, because a release Clio was
|
|
25
|
+
* never run against is not something to discover through a failure that reads
|
|
26
|
+
* as a bug in the feature.
|
|
27
|
+
*
|
|
28
|
+
* The cost of a floor lands on an operator whose own copy is a release or two
|
|
29
|
+
* behind, so `describeResolution` in `resolve.ts` is required to name what it
|
|
30
|
+
* found, the floor it missed, and the command that fixes it.
|
|
31
|
+
*/
|
|
32
|
+
export const PINNED_TOOLS: ReadonlyArray<PinnedTool> = [
|
|
33
|
+
{
|
|
34
|
+
id: "herdr",
|
|
35
|
+
version: "0.8.2",
|
|
36
|
+
summary: "terminal multiplexer with an agent-aware socket API; powers Clio panes",
|
|
37
|
+
homepage: "https://herdr.dev",
|
|
38
|
+
license: "Apache-2.0",
|
|
39
|
+
binaries: ["herdr"],
|
|
40
|
+
primaryBinary: "herdr",
|
|
41
|
+
// Lowered from the pin on evidence, which is the bar this file sets for
|
|
42
|
+
// moving a floor. `herdr api schema --json` was read from 0.7.5
|
|
43
|
+
// (protocol 17) and 0.8.2 (protocol 20): every method the mux domain
|
|
44
|
+
// sends exists in both, and the only two 0.8.2 adds, `workspace.move_block`
|
|
45
|
+
// and `workspace.reordered`, are ones Clio never sends. The two methods
|
|
46
|
+
// that are not universal are already gated at runtime by protocol number
|
|
47
|
+
// in `src/domains/mux/protocol.ts`, whose own floor is 17, so an operator's
|
|
48
|
+
// 0.7.5 takes the documented fallback rather than failing. 0.7.5 is the
|
|
49
|
+
// oldest release actually checked, not the oldest that might work.
|
|
50
|
+
minimumVersion: "0.7.5",
|
|
51
|
+
versionArgs: ["--version"],
|
|
52
|
+
downloads: {
|
|
53
|
+
"linux-x64": {
|
|
54
|
+
url: "https://github.com/herdrdev/herdr/releases/download/v0.8.2/herdr-linux-x86_64",
|
|
55
|
+
sha256: "976150a14d490c94b243ea2e1a7eb2dfb67f12e36b182db90936f6728e6aecf4",
|
|
56
|
+
archive: "raw",
|
|
57
|
+
binaryMembers: { herdr: "" },
|
|
58
|
+
documentMembers: [],
|
|
59
|
+
},
|
|
60
|
+
"linux-arm64": {
|
|
61
|
+
url: "https://github.com/herdrdev/herdr/releases/download/v0.8.2/herdr-linux-aarch64",
|
|
62
|
+
sha256: "f55610658e1c2e0d2aaef730b4b2ab885f7f8ba00285ab372bfb14f2e3d5b40d",
|
|
63
|
+
archive: "raw",
|
|
64
|
+
binaryMembers: { herdr: "" },
|
|
65
|
+
documentMembers: [],
|
|
66
|
+
},
|
|
67
|
+
"darwin-x64": {
|
|
68
|
+
url: "https://github.com/herdrdev/herdr/releases/download/v0.8.2/herdr-macos-x86_64",
|
|
69
|
+
sha256: "ab50262c8190cd7aa9056d249d255c08c328c3e8716de9cfa29db4f131b8e2c1",
|
|
70
|
+
archive: "raw",
|
|
71
|
+
binaryMembers: { herdr: "" },
|
|
72
|
+
documentMembers: [],
|
|
73
|
+
},
|
|
74
|
+
"darwin-arm64": {
|
|
75
|
+
url: "https://github.com/herdrdev/herdr/releases/download/v0.8.2/herdr-macos-aarch64",
|
|
76
|
+
sha256: "a5d4f4d504d8b309c91f811050559300faba31258425f53c50852fc96f6ae574",
|
|
77
|
+
archive: "raw",
|
|
78
|
+
binaryMembers: { herdr: "" },
|
|
79
|
+
documentMembers: [],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
// No `win32-x64` entry, and not for want of an asset. herdr publishes
|
|
83
|
+
// `herdr-windows-x86_64.zip` for this tag and it was downloaded and read:
|
|
84
|
+
// alongside `herdr.exe` it carries a ConPTY runtime, `conpty/conpty.dll`
|
|
85
|
+
// and `conpty/x64/OpenConsole.exe`, that has to sit in a subdirectory
|
|
86
|
+
// beside the executable. The installer places every declared member flat
|
|
87
|
+
// under its basename, so declaring this asset would install a `herdr.exe`
|
|
88
|
+
// with its runtime scattered next to it, which is a broken install that
|
|
89
|
+
// checksums and unpacks cleanly. Windows herdr waits on the installer
|
|
90
|
+
// learning to preserve a member's relative path.
|
|
91
|
+
//
|
|
92
|
+
// The release asset is a bare executable, so the Apache-2.0 text comes
|
|
93
|
+
// from the repository at the pinned tag.
|
|
94
|
+
documents: [
|
|
95
|
+
{
|
|
96
|
+
name: "LICENSE",
|
|
97
|
+
url: "https://raw.githubusercontent.com/herdrdev/herdr/v0.8.2/LICENSE",
|
|
98
|
+
sha256: "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4",
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "yazi",
|
|
104
|
+
version: "26.8.15",
|
|
105
|
+
summary: "terminal file manager; the file-picker pane preset",
|
|
106
|
+
homepage: "https://yazi-rs.github.io",
|
|
107
|
+
license: "MIT",
|
|
108
|
+
binaries: ["yazi", "ya"],
|
|
109
|
+
primaryBinary: "yazi",
|
|
110
|
+
// Stays at the pin, now for a measured reason rather than caution. On
|
|
111
|
+
// 26.1.22 the one command Clio sends, `ya emit-to <receiver> cd <path>`,
|
|
112
|
+
// has the same signature it has at the pin. What was never exercised
|
|
113
|
+
// there is the rest of the surface: the managed profile Clio generates
|
|
114
|
+
// (`yazi.toml`, `keymap.toml`, `init.lua`) and the DDS payload shapes a
|
|
115
|
+
// pick comes back in. A profile schema mismatch degrades quietly into a
|
|
116
|
+
// file manager that opens and does the wrong thing, which is worse than
|
|
117
|
+
// vendoring a second copy. Lower this once a pick round trip has been
|
|
118
|
+
// driven end to end on the older release.
|
|
119
|
+
minimumVersion: "26.8.15",
|
|
120
|
+
versionArgs: ["--version"],
|
|
121
|
+
downloads: {
|
|
122
|
+
"linux-x64": {
|
|
123
|
+
url: "https://github.com/sxyazi/yazi/releases/download/v26.8.15/yazi-x86_64-unknown-linux-gnu.zip",
|
|
124
|
+
sha256: "cc67eb7991550c2f9407cda52d3f5af0937627aa6884e7de99a04fcf059807e0",
|
|
125
|
+
archive: "zip",
|
|
126
|
+
binaryMembers: {
|
|
127
|
+
yazi: "yazi-x86_64-unknown-linux-gnu/yazi",
|
|
128
|
+
ya: "yazi-x86_64-unknown-linux-gnu/ya",
|
|
129
|
+
},
|
|
130
|
+
documentMembers: ["yazi-x86_64-unknown-linux-gnu/LICENSE"],
|
|
131
|
+
},
|
|
132
|
+
"linux-arm64": {
|
|
133
|
+
url: "https://github.com/sxyazi/yazi/releases/download/v26.8.15/yazi-aarch64-unknown-linux-gnu.zip",
|
|
134
|
+
sha256: "f5a85771f06bb0e8c488136ae0aedaec8d341a7cee995549df391d7d852fe8d1",
|
|
135
|
+
archive: "zip",
|
|
136
|
+
binaryMembers: {
|
|
137
|
+
yazi: "yazi-aarch64-unknown-linux-gnu/yazi",
|
|
138
|
+
ya: "yazi-aarch64-unknown-linux-gnu/ya",
|
|
139
|
+
},
|
|
140
|
+
documentMembers: ["yazi-aarch64-unknown-linux-gnu/LICENSE"],
|
|
141
|
+
},
|
|
142
|
+
"darwin-x64": {
|
|
143
|
+
url: "https://github.com/sxyazi/yazi/releases/download/v26.8.15/yazi-x86_64-apple-darwin.zip",
|
|
144
|
+
sha256: "70bb2bcf57d8af862a54e2d12f2fddceefb9aa4ba3783e9a4dcbf2a8e64aacb3",
|
|
145
|
+
archive: "zip",
|
|
146
|
+
binaryMembers: {
|
|
147
|
+
yazi: "yazi-x86_64-apple-darwin/yazi",
|
|
148
|
+
ya: "yazi-x86_64-apple-darwin/ya",
|
|
149
|
+
},
|
|
150
|
+
documentMembers: ["yazi-x86_64-apple-darwin/LICENSE"],
|
|
151
|
+
},
|
|
152
|
+
"darwin-arm64": {
|
|
153
|
+
url: "https://github.com/sxyazi/yazi/releases/download/v26.8.15/yazi-aarch64-apple-darwin.zip",
|
|
154
|
+
sha256: "3f54907ea08abe96506f4b22239340ed8923a6aeaeae78f33d59bce57daca4cd",
|
|
155
|
+
archive: "zip",
|
|
156
|
+
binaryMembers: {
|
|
157
|
+
yazi: "yazi-aarch64-apple-darwin/yazi",
|
|
158
|
+
ya: "yazi-aarch64-apple-darwin/ya",
|
|
159
|
+
},
|
|
160
|
+
documentMembers: ["yazi-aarch64-apple-darwin/LICENSE"],
|
|
161
|
+
},
|
|
162
|
+
// Same shape as the other three: two executables and a LICENSE at
|
|
163
|
+
// known member paths, so the installer needs nothing new to place it.
|
|
164
|
+
"win32-x64": {
|
|
165
|
+
url: "https://github.com/sxyazi/yazi/releases/download/v26.8.15/yazi-x86_64-pc-windows-msvc.zip",
|
|
166
|
+
sha256: "451f6770999fa8f9b08e6c9f94a688c263b6d3007b0944c4407f1ae335eace30",
|
|
167
|
+
archive: "zip",
|
|
168
|
+
binaryMembers: {
|
|
169
|
+
yazi: "yazi-x86_64-pc-windows-msvc/yazi.exe",
|
|
170
|
+
ya: "yazi-x86_64-pc-windows-msvc/ya.exe",
|
|
171
|
+
},
|
|
172
|
+
documentMembers: ["yazi-x86_64-pc-windows-msvc/LICENSE"],
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
documents: [],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: "croc",
|
|
179
|
+
version: "11.3.6",
|
|
180
|
+
summary: "relay file transfer between machines; the transfer primitive's first backend",
|
|
181
|
+
homepage: "https://schollz.com/software/croc6",
|
|
182
|
+
license: "MIT",
|
|
183
|
+
binaries: ["croc"],
|
|
184
|
+
primaryBinary: "croc",
|
|
185
|
+
// Croc negotiates its relay protocol by major version, so any 11.x on
|
|
186
|
+
// PATH speaks to a pinned 11.x relay.
|
|
187
|
+
minimumVersion: "11.0.0",
|
|
188
|
+
versionArgs: ["--version"],
|
|
189
|
+
downloads: {
|
|
190
|
+
"linux-x64": {
|
|
191
|
+
url: "https://github.com/schollz/croc/releases/download/v11.3.6/croc_v11.3.6_Linux-64bit.tar.gz",
|
|
192
|
+
sha256: "bd18e01024f5ccc8e101c08c8233d4cffbfda4ff59acad80eaa1fc2963efc0b2",
|
|
193
|
+
archive: "tar.gz",
|
|
194
|
+
binaryMembers: { croc: "croc" },
|
|
195
|
+
documentMembers: ["LICENSE", "THIRD_PARTY_NOTICES.md"],
|
|
196
|
+
},
|
|
197
|
+
"linux-arm64": {
|
|
198
|
+
url: "https://github.com/schollz/croc/releases/download/v11.3.6/croc_v11.3.6_Linux-ARM64.tar.gz",
|
|
199
|
+
sha256: "c26ac67207301ed75ae0ece63796ec8a2a002b1cf64f4e3d3d8e7bcee508b5b3",
|
|
200
|
+
archive: "tar.gz",
|
|
201
|
+
binaryMembers: { croc: "croc" },
|
|
202
|
+
documentMembers: ["LICENSE", "THIRD_PARTY_NOTICES.md"],
|
|
203
|
+
},
|
|
204
|
+
"darwin-x64": {
|
|
205
|
+
url: "https://github.com/schollz/croc/releases/download/v11.3.6/croc_v11.3.6_macOS-64bit.tar.gz",
|
|
206
|
+
sha256: "701817a20f4d2bb4312f3234e6d328e0bdd68d6d1311db3a4ab4daf10906c5b2",
|
|
207
|
+
archive: "tar.gz",
|
|
208
|
+
binaryMembers: { croc: "croc" },
|
|
209
|
+
documentMembers: ["LICENSE", "THIRD_PARTY_NOTICES.md"],
|
|
210
|
+
},
|
|
211
|
+
"darwin-arm64": {
|
|
212
|
+
url: "https://github.com/schollz/croc/releases/download/v11.3.6/croc_v11.3.6_macOS-ARM64.tar.gz",
|
|
213
|
+
sha256: "96c4ef67751b4387e3d44a7a559aafe54094f0089f34a6c71dfb5361bd48d368",
|
|
214
|
+
archive: "tar.gz",
|
|
215
|
+
binaryMembers: { croc: "croc" },
|
|
216
|
+
documentMembers: ["LICENSE", "THIRD_PARTY_NOTICES.md"],
|
|
217
|
+
},
|
|
218
|
+
// A zip rather than a tarball on Windows, and the only entry in the
|
|
219
|
+
// table whose hash is confirmed by upstream's own checksums file
|
|
220
|
+
// rather than only by the download this repository made.
|
|
221
|
+
"win32-x64": {
|
|
222
|
+
url: "https://github.com/schollz/croc/releases/download/v11.3.6/croc_v11.3.6_Windows-64bit.zip",
|
|
223
|
+
sha256: "ed22552d371d55a9e3c3b612b982484fa00adaff8fb32c3f19f36dbf8e248bbf",
|
|
224
|
+
archive: "zip",
|
|
225
|
+
binaryMembers: { croc: "croc.exe" },
|
|
226
|
+
documentMembers: ["LICENSE", "THIRD_PARTY_NOTICES.md"],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
documents: [],
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
|
|
233
|
+
/** The registry's platform key for the running process, or null when unmapped. */
|
|
234
|
+
export function currentToolPlatform(): ToolPlatform | null {
|
|
235
|
+
const platform = process.platform;
|
|
236
|
+
const arch = process.arch;
|
|
237
|
+
if (platform === "linux") {
|
|
238
|
+
if (arch === "x64") return "linux-x64";
|
|
239
|
+
if (arch === "arm64") return "linux-arm64";
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
if (platform === "darwin") {
|
|
243
|
+
if (arch === "x64") return "darwin-x64";
|
|
244
|
+
if (arch === "arm64") return "darwin-arm64";
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
if (platform === "win32" && arch === "x64") return "win32-x64";
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** The row with this id. */
|
|
252
|
+
export function findPinnedTool(id: string): PinnedTool | null {
|
|
253
|
+
return PINNED_TOOLS.find((entry) => entry.id === id) ?? null;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* The row that owns this executable name.
|
|
258
|
+
*
|
|
259
|
+
* Resolution is asked for by binary name (`ya` belongs to yazi), so the lookup
|
|
260
|
+
* has to cover every name an entry installs, not just the tool id.
|
|
261
|
+
*/
|
|
262
|
+
export function findPinnedToolByBinary(name: string): PinnedTool | null {
|
|
263
|
+
const bare = name.endsWith(".exe") ? name.slice(0, -4) : name;
|
|
264
|
+
return PINNED_TOOLS.find((entry) => entry.binaries.includes(bare)) ?? null;
|
|
265
|
+
}
|