@iowarp/clio-coder 0.3.9 → 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 +53 -0
- package/NOTICE +33 -0
- package/README.md +7 -2
- package/dist/{acp-7LOELQFP.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-FIBG2SHA.js → agents-FMV2Q5G4.js} +39 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-3IDSJEIK.js} +16 -15
- package/dist/{builtins-AD25UL3C.js → builtins-XCZWXSC7.js} +3 -3
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-56KB5IJP.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-N3PBVRTZ.js → chunk-32KWKNSF.js} +9 -7
- package/dist/{chunk-VKBMFOYV.js → chunk-36EJLSQQ.js} +23 -27
- package/dist/{chunk-465CC7FK.js → chunk-3BT2XMV4.js} +16 -13
- package/dist/{chunk-NQ6UCCOD.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WIE7ZOSW.js → chunk-3XML7CDN.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-JEQQR47K.js → chunk-6DB53AJS.js} +168 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-76ONBSIA.js} +5 -25
- package/dist/{chunk-FALJGAWU.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-AB44T6BB.js} +5 -5
- package/dist/chunk-B7OBL7PK.js +1405 -0
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-O6I4CIEU.js → chunk-BKFJHQCA.js} +6 -6
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-MV2VUEJC.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TEO2TLVN.js → chunk-BUMFYQFY.js} +964 -1120
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-EBOC7MT3.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-MIX5N5AC.js → chunk-DQITNCXG.js} +394 -154
- package/dist/{chunk-S4COXYBG.js → chunk-DYJP44XW.js} +129 -106
- package/dist/{chunk-N5XKWMDW.js → chunk-F4CKPOEQ.js} +6 -6
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-GKF55TAZ.js} +3 -3
- package/dist/{chunk-B5XRQOLB.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-XDOQXGFO.js → chunk-GXNLGKAB.js} +64 -8
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-774ILSRL.js → chunk-HI63TFOG.js} +4 -3
- package/dist/{chunk-R7LNVMCS.js → chunk-HJJTYUHX.js} +64 -72
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/{chunk-CA42X6KT.js → chunk-HWHKMHUA.js} +6 -6
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-HJB5IUKP.js → chunk-I5VEOC6I.js} +12 -12
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-4H6ULJ3H.js → chunk-J4W7KFM7.js} +921 -990
- package/dist/{chunk-4LJX2PUC.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-NZU6YDNV.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-NNNWO6F2.js → chunk-KFZI4NIL.js} +93 -3
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-BVDVID7E.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-OEDBCISO.js → chunk-LQ3DZAMX.js} +2 -2
- package/dist/{chunk-PZ4I4JE2.js → chunk-LY4S7GJC.js} +124 -116
- package/dist/{chunk-3DUR4WUA.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-5DQRIYDZ.js → chunk-NHCZP4K7.js} +2 -2
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-O4XIVISU.js} +7 -7
- package/dist/{chunk-WXCJ7VME.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-HKO36JWF.js → chunk-QBJA7R7N.js} +31 -3
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-5HFBWUMU.js → chunk-QLFS5GO2.js} +4 -4
- package/dist/{chunk-GAYUJ7LE.js → chunk-QLL7ILRG.js} +41 -32
- package/dist/{chunk-LXPJXFM5.js → chunk-QREDIESB.js} +7 -7
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/{chunk-VPTUJU4P.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-QQ7EKM72.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-IHKBWSXF.js → chunk-TZ3SGWZZ.js} +2 -2
- package/dist/{chunk-ECUO3KDP.js → chunk-U77AMWDL.js} +47 -7
- package/dist/{chunk-3UUY7R3Z.js → chunk-ULC6OTWO.js} +7 -7
- package/dist/{chunk-AEYBF3TB.js → chunk-UM7N4G5A.js} +2 -2
- package/dist/{chunk-3V5AYSEQ.js → chunk-UXMFQ54G.js} +43 -36
- package/dist/{chunk-YW7UVM5V.js → chunk-V5DHCITQ.js} +34 -1
- package/dist/{chunk-47CMYGET.js → chunk-VAZSBTKF.js} +2 -2
- package/dist/{chunk-3MRC2YSQ.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-PNY46YEY.js → chunk-VFA6GDY5.js} +47 -3
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-AD7Y7STJ.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-T3Z6VAAF.js → chunk-W5VSYASO.js} +19 -17
- package/dist/{chunk-5PVQ4SRS.js → chunk-WZR7K7ZX.js} +7 -123
- package/dist/{chunk-DG4M6ZUE.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-P3JGPQFL.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-YSEHGPCT.js → chunk-Z2RR6MAK.js} +3 -3
- package/dist/{chunk-HCBCAYZU.js → chunk-Z4TXYIEG.js} +5 -5
- package/dist/cli/index.js +47 -36
- package/dist/{clio-LT5V7SSZ.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-LMW275PA.js → code-nav-3YYRMYNF.js} +6 -6
- 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-RXS5T3JT.js → config-QZPCMYSO.js} +58 -50
- package/dist/{configure-2WYWSCSD.js → configure-TEGEBYCA.js} +21 -19
- package/dist/{context-I3BTOTCS.js → context-AV7OEZ4D.js} +11 -11
- package/dist/{context-MVOORGMF.js → context-E6H5RNMC.js} +49 -41
- package/dist/{context-PALKKQYL.js → context-GSXUE4CT.js} +25 -23
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-SHIBYK6T.js} +48 -40
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-5ZGKPGZQ.js} +11 -10
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-EFMJT4LD.js} +88 -60
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-TFBYQH4H.js} +66 -64
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-L5APPXNV.js → evidence-ERGESKGN.js} +198 -44
- package/dist/{evolve-RGNKFJ52.js → evolve-VDXTSYCJ.js} +46 -38
- package/dist/{extensions-7WYWUX5A.js → extensions-7BGBHN57.js} +6 -6
- package/dist/{fleet-6CNVBZZP.js → fleet-2RRVDF2V.js} +189 -101
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-VJ726XIA.js} +10 -10
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-JF5QOATM.js} +16 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-AIZUEJOY.js} +6 -5
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-AJRPDMDV.js} +20 -18
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-VBN2ACVA.js → init-DN2WWLFE.js} +64 -56
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-JHGUMLY2.js → library-YWZG7IMW.js} +19 -18
- package/dist/{memory-K4OQIYWG.js → memory-I4C4HMLW.js} +48 -40
- package/dist/{models-2NCZUWDD.js → models-CEYXJBO6.js} +30 -28
- package/dist/{monitor-MMVTJABD.js → monitor-NZ6GCI3P.js} +53 -47
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-GCGQ4N5I.js} +6311 -7145
- 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-DD5JGOY3.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-QEGNX7FL.js → run-H2GQDUER.js} +113 -82
- package/dist/{share-JKD3BQMW.js → share-GTJN6A5O.js} +18 -17
- package/dist/{skills-LMQIKDOZ.js → skills-L55TEW6R.js} +31 -24
- package/dist/{skills-eval-I7X2774U.js → skills-eval-XVXPH2JI.js} +61 -52
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-CF5TDANS.js → steer-RZGSCY4R.js} +3 -3
- package/dist/{support-I7LOJLIF.js → support-PKEUNNQL.js} +4 -4
- package/dist/{targets-RUSR6B5Z.js → targets-NCPZ644J.js} +31 -29
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-44SV3YCN.js} +4 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-ODOQIVIW.js → trace-FYVW2MQA.js} +149 -7
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-XANW3FXB.js → upgrade-3XPP6OQL.js} +26 -24
- package/dist/{usage-4H7ZRXQT.js → usage-3NLHGTU2.js} +57 -49
- package/dist/{verifiers-UZXNBZEB.js → verifiers-SSQONKRT.js} +171 -12
- package/dist/{verify-BVKWTNDL.js → verify-3U6J7FZI.js} +9 -9
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-CEHYGPGQ.js} +67 -59
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +101 -66
- 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 +4 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +40 -10
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +1 -0
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-dispatch.md +22 -1
- 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 +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- 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 +1 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +4 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/argv.ts +25 -0
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +20 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- 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/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 +148 -37
- 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/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +23 -2
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +4 -0
- package/src/core/config.ts +49 -0
- package/src/core/defaults.ts +93 -7
- package/src/core/response-schema.ts +44 -4
- 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 +3 -0
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/capacity-lease.ts +21 -1
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +222 -50
- 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 +64 -1
- 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/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/reservation-store.ts +24 -4
- 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 +45 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- 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/cost.ts +21 -0
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/trace-store.ts +42 -0
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- 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/resources/index.ts +3 -0
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -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/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- 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 +103 -5
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/context-overlay.ts +1 -0
- package/src/interactive/cost-overlay.ts +2 -0
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +26 -16
- package/src/interactive/interactive-application.ts +153 -6
- package/src/interactive/interactive-input-runtime.ts +7 -0
- package/src/interactive/interactive-slash-runtime.ts +36 -6
- package/src/interactive/memory-overlay.ts +1 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +1 -0
- package/src/interactive/overlay-key-routing.ts +14 -3
- package/src/interactive/overlay-lifecycle.ts +19 -3
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +136 -30
- 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 +2 -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 +1 -0
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +579 -44
- 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/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +47 -2
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +1 -0
- 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/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-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- 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/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/doctor-TWBWFK5V.js +0 -165
package/src/cli/configure.ts
CHANGED
|
@@ -19,6 +19,8 @@ import {
|
|
|
19
19
|
listKnownModelsForRuntime,
|
|
20
20
|
listProviderSupportEntries,
|
|
21
21
|
type ProviderSupportEntry,
|
|
22
|
+
readTargetModelSnapshot,
|
|
23
|
+
recordTargetModelSnapshot,
|
|
22
24
|
resolveRuntimeAuthTarget,
|
|
23
25
|
supportGroupLabel,
|
|
24
26
|
} from "../domains/providers/index.js";
|
|
@@ -103,6 +105,7 @@ const DEFAULT_PORTS: Record<string, number> = {
|
|
|
103
105
|
lemonade: 8000,
|
|
104
106
|
"anthropic-compat": 8000,
|
|
105
107
|
"openai-compat": 8000,
|
|
108
|
+
litellm: 4000,
|
|
106
109
|
};
|
|
107
110
|
|
|
108
111
|
interface ParsedArgs {
|
|
@@ -317,7 +320,9 @@ function printRuntimeList(includeHidden: boolean): void {
|
|
|
317
320
|
: runtime?.auth === "api-key"
|
|
318
321
|
? status?.available
|
|
319
322
|
? "credential"
|
|
320
|
-
:
|
|
323
|
+
: targetRequiresAuth({ id: entry.runtimeId, runtime: entry.runtimeId }, runtime)
|
|
324
|
+
? "needs-key"
|
|
325
|
+
: "key-optional"
|
|
321
326
|
: (runtime?.auth ?? "none");
|
|
322
327
|
rows.push({
|
|
323
328
|
group: supportGroupLabel(entry.group),
|
|
@@ -387,8 +392,8 @@ function catalogContextWindowFor(runtime: RuntimeDescriptor, modelId: string): n
|
|
|
387
392
|
/**
|
|
388
393
|
* Check the resolved model against the catalog where there is one and against
|
|
389
394
|
* the target's own list where there is not. A runtime with no catalog used to
|
|
390
|
-
* pass any string here while the same command
|
|
391
|
-
*
|
|
395
|
+
* pass any string here while the same command had a live list that ruled it
|
|
396
|
+
* out, so the target saved as `ok` and failed on its first
|
|
392
397
|
* turn. Without a catalog or a live list there is nothing to check against, and
|
|
393
398
|
* the note says so rather than implying the id was verified.
|
|
394
399
|
*/
|
|
@@ -617,7 +622,6 @@ function buildDescriptor(
|
|
|
617
622
|
parts: {
|
|
618
623
|
url?: string;
|
|
619
624
|
model?: string;
|
|
620
|
-
wireModels?: string[];
|
|
621
625
|
apiKeyEnv?: string;
|
|
622
626
|
apiKeyRef?: string;
|
|
623
627
|
oauthProfile?: string;
|
|
@@ -631,19 +635,12 @@ function buildDescriptor(
|
|
|
631
635
|
): TargetDescriptor {
|
|
632
636
|
const descriptor: TargetDescriptor = { id, runtime: runtime.id };
|
|
633
637
|
if (parts.url) descriptor.url = parts.url;
|
|
634
|
-
const wireModels =
|
|
635
|
-
parts.wireModels?.filter((value, index, all) => value.trim().length > 0 && all.indexOf(value) === index) ?? [];
|
|
636
638
|
if (parts.model) descriptor.defaultModel = parts.model;
|
|
637
|
-
else {
|
|
638
|
-
const firstWireModel = wireModels[0];
|
|
639
|
-
if (firstWireModel) descriptor.defaultModel = firstWireModel;
|
|
640
|
-
}
|
|
641
639
|
const auth: NonNullable<TargetDescriptor["auth"]> = {};
|
|
642
640
|
if (parts.apiKeyEnv) auth.apiKeyEnvVar = parts.apiKeyEnv;
|
|
643
641
|
if (parts.apiKeyRef) auth.apiKeyRef = parts.apiKeyRef;
|
|
644
642
|
if (parts.oauthProfile) auth.oauthProfile = parts.oauthProfile;
|
|
645
643
|
if (Object.keys(auth).length > 0) descriptor.auth = auth;
|
|
646
|
-
if (wireModels.length > 0) descriptor.wireModels = wireModels;
|
|
647
644
|
if (parts.gateway) descriptor.gateway = true;
|
|
648
645
|
if (parts.lifecycle) descriptor.lifecycle = parts.lifecycle;
|
|
649
646
|
const caps: NonNullable<TargetDescriptor["capabilities"]> = {};
|
|
@@ -714,7 +711,7 @@ async function loginOAuthRuntime(rl: ReturnType<typeof createInterface>, runtime
|
|
|
714
711
|
*/
|
|
715
712
|
interface WireModelInventory {
|
|
716
713
|
models: string[];
|
|
717
|
-
source: "catalog" | "probe" | "
|
|
714
|
+
source: "catalog" | "probe" | "cache" | "legacy" | "none";
|
|
718
715
|
/** Per-model load state when the probe reported it. */
|
|
719
716
|
modelStates?: Readonly<Record<string, ProbeModelStatus>> | undefined;
|
|
720
717
|
}
|
|
@@ -761,13 +758,21 @@ async function resolveSupportedWireModels(
|
|
|
761
758
|
// lists models only through probeModels still gets its ids checked.
|
|
762
759
|
const probe = await runtimeProbe(runtime, target, authToken);
|
|
763
760
|
if (probe?.ok && probe.models && probe.models.length > 0) {
|
|
761
|
+
recordTargetModelSnapshot(target, probe.models);
|
|
764
762
|
return { models: [...probe.models], source: "probe", modelStates: probe.modelStates };
|
|
765
763
|
}
|
|
766
764
|
const discovered = await runtimeProbeModels(runtime, target, authToken);
|
|
767
|
-
if (discovered.length > 0)
|
|
765
|
+
if (discovered.length > 0) {
|
|
766
|
+
recordTargetModelSnapshot(target, discovered);
|
|
767
|
+
return { models: discovered, source: "probe" };
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
const cached = readTargetModelSnapshot(target);
|
|
771
|
+
if (cached && cached.models.length > 0) return { models: [...cached.models], source: "cache" };
|
|
772
|
+
if (existing?.wireModels && existing.wireModels.length > 0) {
|
|
773
|
+
recordTargetModelSnapshot(target, existing.wireModels);
|
|
774
|
+
return { models: [...existing.wireModels], source: "legacy" };
|
|
768
775
|
}
|
|
769
|
-
if (existing?.wireModels && existing.wireModels.length > 0)
|
|
770
|
-
return { models: [...existing.wireModels], source: "existing" };
|
|
771
776
|
return { models: [], source: "none" };
|
|
772
777
|
}
|
|
773
778
|
|
|
@@ -905,7 +910,6 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
|
|
|
905
910
|
const descriptor = buildDescriptor(runtime, args.id, {
|
|
906
911
|
...(url !== undefined ? { url } : {}),
|
|
907
912
|
...(model ? { model } : {}),
|
|
908
|
-
...(wireModels.length > 0 ? { wireModels } : {}),
|
|
909
913
|
...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
|
|
910
914
|
...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
|
|
911
915
|
...(oauthProfile !== undefined ? { oauthProfile } : {}),
|
|
@@ -966,6 +970,7 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
|
|
|
966
970
|
applyConfiguration(settings);
|
|
967
971
|
updateSettings(applyConfiguration);
|
|
968
972
|
const probe = await runtimeProbe(runtime, descriptor);
|
|
973
|
+
if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
|
|
969
974
|
printSummary(settings, descriptor, probe);
|
|
970
975
|
if (
|
|
971
976
|
runtime.auth === "oauth" &&
|
|
@@ -1272,10 +1277,7 @@ async function runInteractive(
|
|
|
1272
1277
|
}
|
|
1273
1278
|
|
|
1274
1279
|
let model: string | undefined = defaults.model;
|
|
1275
|
-
let inventory: WireModelInventory =
|
|
1276
|
-
existing?.wireModels && existing.wireModels.length > 0
|
|
1277
|
-
? { models: [...existing.wireModels], source: "existing" }
|
|
1278
|
-
: { models: [], source: "none" };
|
|
1280
|
+
let inventory: WireModelInventory = { models: [], source: "none" };
|
|
1279
1281
|
const tentative = buildDescriptor(runtime, targetId, {
|
|
1280
1282
|
...(url !== undefined ? { url } : {}),
|
|
1281
1283
|
...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
|
|
@@ -1367,7 +1369,6 @@ async function runInteractive(
|
|
|
1367
1369
|
...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
|
|
1368
1370
|
...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
|
|
1369
1371
|
...(oauthProfile !== undefined ? { oauthProfile } : {}),
|
|
1370
|
-
...(wireModels.length > 0 ? { wireModels } : {}),
|
|
1371
1372
|
gateway: gatewayAnswer,
|
|
1372
1373
|
...(defaults.lifecycle !== undefined
|
|
1373
1374
|
? { lifecycle: defaults.lifecycle }
|
|
@@ -1395,6 +1396,7 @@ async function runInteractive(
|
|
|
1395
1396
|
}
|
|
1396
1397
|
|
|
1397
1398
|
const probe = await runtimeProbe(runtime, descriptor);
|
|
1399
|
+
if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
|
|
1398
1400
|
if (probe) {
|
|
1399
1401
|
process.stdout.write("\n");
|
|
1400
1402
|
for (const line of probeLines(descriptor, probe)) process.stdout.write(`${line}\n`);
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { accessSync, constants, mkdirSync } from "node:fs";
|
|
2
|
+
import { readSettings } from "../core/config.js";
|
|
3
|
+
import { runEventJournalRoot } from "../domains/dispatch/run-event-journal.js";
|
|
4
|
+
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
5
|
+
import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
|
|
6
|
+
import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The panes section of `clio-coder doctor`.
|
|
10
|
+
*
|
|
11
|
+
* Five rows, in the order an operator debugs them: what mode the pane layer
|
|
12
|
+
* resolved to, whether the socket answered, whether the server is new enough
|
|
13
|
+
* for the methods phase 3 uses, where the pane host binary resolves, and
|
|
14
|
+
* whether the journal directory the viewer reads is writable.
|
|
15
|
+
*
|
|
16
|
+
* No row is an error. Panes are optional: an operator who never wanted them has
|
|
17
|
+
* a healthy install without them, and doctor's exit code answers "is this
|
|
18
|
+
* install healthy". The rows that would be errors elsewhere are warnings that
|
|
19
|
+
* name the next step instead.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const PANE_HOST_TOOL_ID = "herdr";
|
|
23
|
+
|
|
24
|
+
/** Highest protocol any method Clio drives requires, for the version row. */
|
|
25
|
+
const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
|
|
26
|
+
|
|
27
|
+
function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding {
|
|
28
|
+
try {
|
|
29
|
+
// The viewer reads this tree and the journal writes it, so the useful
|
|
30
|
+
// question is whether it can exist and be written, not whether it does.
|
|
31
|
+
mkdirSync(root, { recursive: true });
|
|
32
|
+
accessSync(root, constants.W_OK);
|
|
33
|
+
return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
|
|
34
|
+
} catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
ok: true,
|
|
37
|
+
level: "warn",
|
|
38
|
+
name: "panes journal dir",
|
|
39
|
+
detail: `${root} is not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
|
|
45
|
+
let enabled: "auto" | "embedded" | "off" = "off";
|
|
46
|
+
try {
|
|
47
|
+
enabled = readSettings().panes.enabled;
|
|
48
|
+
} catch {
|
|
49
|
+
// An unreadable settings file is already reported by the settings row;
|
|
50
|
+
// this section answers on the shipped default (off) rather than throwing.
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Inactive by choice is a different answer from unavailable. With the
|
|
54
|
+
// setting off, detection is skipped the same way the boot skips it, and the
|
|
55
|
+
// row names the two ways to turn the extension on instead of warning about
|
|
56
|
+
// a socket nobody asked for.
|
|
57
|
+
if (enabled === "off") {
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
ok: true,
|
|
61
|
+
name: "panes mode",
|
|
62
|
+
detail:
|
|
63
|
+
"off by choice (panes.enabled=off); start `clio-coder --with-panes` for one session, or set panes.enabled=auto",
|
|
64
|
+
},
|
|
65
|
+
journalWritabilityFinding(),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Detection is the same ladder the interactive boot runs, so this row is the
|
|
70
|
+
// answer that boot would get. It opens a socket and nothing else: no file is
|
|
71
|
+
// created and no pane is touched.
|
|
72
|
+
const { detection, client } = await detectMux({ enabled, env });
|
|
73
|
+
await client?.close().catch(() => undefined);
|
|
74
|
+
|
|
75
|
+
const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
|
|
76
|
+
const findings: DoctorFinding[] = [
|
|
77
|
+
{
|
|
78
|
+
ok: true,
|
|
79
|
+
level: detection.mode === "none" ? "warn" : "ok",
|
|
80
|
+
name: "panes mode",
|
|
81
|
+
detail: `${detection.mode} (panes.enabled=${enabled}); ${detection.reason}`,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
ok: true,
|
|
85
|
+
level: detection.socketPath === null ? "warn" : "ok",
|
|
86
|
+
name: "panes socket",
|
|
87
|
+
detail:
|
|
88
|
+
detection.socketPath === null
|
|
89
|
+
? `no socket answered; tried ${candidates.length > 0 ? candidates.join(", ") : "no candidates"}`
|
|
90
|
+
: `${detection.socketPath} answered a ping`,
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
const server = detection.server;
|
|
95
|
+
findings.push({
|
|
96
|
+
ok: true,
|
|
97
|
+
level: server === null || server.protocol < REQUIRED_PROTOCOL ? "warn" : "ok",
|
|
98
|
+
name: "panes protocol",
|
|
99
|
+
detail:
|
|
100
|
+
server === null
|
|
101
|
+
? `unknown; Clio's optional methods need protocol ${REQUIRED_PROTOCOL} or newer`
|
|
102
|
+
: `server ${server.version}, protocol ${server.protocol}; Clio's optional methods need ${REQUIRED_PROTOCOL} (${server.protocol >= REQUIRED_PROTOCOL ? "satisfied" : "toasts and agent focus fall back"})`,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const entry = findPinnedTool(PANE_HOST_TOOL_ID);
|
|
106
|
+
findings.push(
|
|
107
|
+
entry === null
|
|
108
|
+
? {
|
|
109
|
+
ok: true,
|
|
110
|
+
level: "warn",
|
|
111
|
+
name: "panes binary",
|
|
112
|
+
detail: `${PANE_HOST_TOOL_ID} is not in the pinned tool registry`,
|
|
113
|
+
}
|
|
114
|
+
: {
|
|
115
|
+
ok: true,
|
|
116
|
+
level: toolStatus(entry).resolution.source === "none" ? "warn" : "ok",
|
|
117
|
+
name: "panes binary",
|
|
118
|
+
detail: describeResolution(toolStatus(entry)),
|
|
119
|
+
},
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
findings.push(journalWritabilityFinding());
|
|
123
|
+
return findings;
|
|
124
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
2
|
+
import {
|
|
3
|
+
describeYaziProfile,
|
|
4
|
+
inspectCurrentYaziProfile,
|
|
5
|
+
userYaziConfigDir,
|
|
6
|
+
yaziProfileDir,
|
|
7
|
+
} from "../domains/mux/index.js";
|
|
8
|
+
import { describeResolution, toolStatuses } from "../domains/toolchain/index.js";
|
|
9
|
+
|
|
10
|
+
function yaziProfileFinding(): DoctorFinding {
|
|
11
|
+
try {
|
|
12
|
+
const profile = inspectCurrentYaziProfile();
|
|
13
|
+
return {
|
|
14
|
+
ok: true,
|
|
15
|
+
name: "yazi managed profile",
|
|
16
|
+
detail: describeYaziProfile(profile),
|
|
17
|
+
level: profile.state === "current" ? "ok" : "warn",
|
|
18
|
+
};
|
|
19
|
+
} catch (error) {
|
|
20
|
+
return {
|
|
21
|
+
ok: true,
|
|
22
|
+
name: "yazi managed profile",
|
|
23
|
+
level: "warn",
|
|
24
|
+
detail: `${yaziProfileDir()} could not be inspected (${error instanceof Error ? error.message : String(error)}); user config ${userYaziConfigDir()} is separate and untouched`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* One row per pinned external tool: where it resolves, and how the version
|
|
31
|
+
* found compares to the pin.
|
|
32
|
+
*
|
|
33
|
+
* Every one of these tools is optional, so no row is ever an error. A missing
|
|
34
|
+
* tool is a WARN with the command that installs it, because doctor's exit code
|
|
35
|
+
* answers "is this Clio install healthy", and an operator who never wanted
|
|
36
|
+
* panes has a healthy install without them.
|
|
37
|
+
*
|
|
38
|
+
* A PATH copy Clio rejected for being below the registry floor is never
|
|
39
|
+
* reported as an absent one. The row says which binary was found, what version
|
|
40
|
+
* it reported, and which floor it missed, and adds the install command only
|
|
41
|
+
* when there is no vendored copy already answering for the tool. Doctor is the
|
|
42
|
+
* surface an operator reaches for when a tool they installed themselves is not
|
|
43
|
+
* being used, and a row that only said "not found" would send them looking for
|
|
44
|
+
* a binary that is right there on their PATH.
|
|
45
|
+
*/
|
|
46
|
+
export function toolchainFindings(): DoctorFinding[] {
|
|
47
|
+
const tools = toolStatuses().map((status) => ({
|
|
48
|
+
ok: true,
|
|
49
|
+
name: `external tool ${status.id}`,
|
|
50
|
+
// The rejection and the remedy both live inside the shared resolution
|
|
51
|
+
// sentence, so this row and `clio-coder tools status` cannot describe the
|
|
52
|
+
// same machine differently.
|
|
53
|
+
detail: describeResolution(status),
|
|
54
|
+
level: status.resolution.source === "none" ? ("warn" as const) : ("ok" as const),
|
|
55
|
+
}));
|
|
56
|
+
return [...tools, yaziProfileFinding()];
|
|
57
|
+
}
|
package/src/cli/doctor.ts
CHANGED
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
runDoctorModelChecks,
|
|
8
8
|
runDoctorRuntimeChecks,
|
|
9
9
|
} from "../domains/lifecycle/doctor.js";
|
|
10
|
+
import { panesFindings } from "./doctor-panes.js";
|
|
10
11
|
import { stateStorageFinding } from "./doctor-state-size.js";
|
|
12
|
+
import { toolchainFindings } from "./doctor-toolchain.js";
|
|
11
13
|
import { printError } from "./shared.js";
|
|
12
14
|
|
|
13
15
|
const HELP = `clio-coder doctor [--fix] [--json]
|
|
@@ -49,7 +51,24 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
|
|
|
49
51
|
// Fleet preflight probes each configured node over SSH and persists the
|
|
50
52
|
// per-node eligibility verdicts dispatch placement enforces.
|
|
51
53
|
const fleetChecks = untouched ? [] : await runDoctorFleetChecks();
|
|
52
|
-
|
|
54
|
+
// Resolution reads PATH and the vendor root and creates nothing, but on an
|
|
55
|
+
// untouched home there is no vendor root to look at and the answer would be
|
|
56
|
+
// "none" for every row regardless, so the sweep stays with the others.
|
|
57
|
+
const toolChecks = untouched ? [] : toolchainFindings();
|
|
58
|
+
// The pane sweep pings a socket and reads PATH; it creates nothing except the
|
|
59
|
+
// journal directory it is asked about, which is inside the state root doctor
|
|
60
|
+
// has already agreed not to build on an untouched home.
|
|
61
|
+
const paneChecks = untouched ? [] : await panesFindings();
|
|
62
|
+
const all = [
|
|
63
|
+
...findings,
|
|
64
|
+
...storageChecks,
|
|
65
|
+
...runtimeChecks,
|
|
66
|
+
...modelChecks,
|
|
67
|
+
...interopChecks,
|
|
68
|
+
...fleetChecks,
|
|
69
|
+
...toolChecks,
|
|
70
|
+
...paneChecks,
|
|
71
|
+
];
|
|
53
72
|
const ok = all.every((f) => f.ok);
|
|
54
73
|
if (json) {
|
|
55
74
|
process.stdout.write(`${JSON.stringify({ ok, fix, findings: all }, null, 2)}\n`);
|