@iowarp/clio-coder 0.3.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -0
- package/NOTICE +33 -0
- package/README.md +12 -3
- package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
- package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
- package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
- package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
- package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
- package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
- package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
- package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
- package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
- package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
- package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
- package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
- package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
- package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
- package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
- package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
- package/dist/chunk-BKFM6EJV.js +462 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
- package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/chunk-C2LTL2W6.js +2447 -0
- package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
- package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
- package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
- package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
- package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
- package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
- package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GKF55TAZ.js +391 -0
- package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
- package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
- package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
- package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
- package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
- package/dist/chunk-HZHHCK24.js +1631 -0
- package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
- package/dist/chunk-IBEBSCYA.js +564 -0
- package/dist/chunk-IQ7KR472.js +362 -0
- package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
- package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
- package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
- package/dist/chunk-KMVISBZR.js +132 -0
- package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
- package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
- package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
- package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
- package/dist/chunk-NHLBIGRH.js +1506 -0
- package/dist/chunk-NQQH3YT7.js +302 -0
- package/dist/chunk-NYS75XW5.js +15 -0
- package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
- package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
- package/dist/chunk-OQBA45DZ.js +97 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
- package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
- package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
- package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
- package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
- package/dist/chunk-SUCTJL45.js +45 -0
- package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
- package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
- package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
- package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
- package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
- package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
- package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
- package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
- package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
- package/dist/chunk-VO67MWHC.js +75 -0
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
- package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
- package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
- package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
- package/dist/chunk-X75E3D2N.js +686 -0
- package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
- package/dist/chunk-YJX4SHTD.js +40 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/chunk-Z2RR6MAK.js +127 -0
- package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
- package/dist/cli/index.js +47 -36
- package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
- package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
- package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
- package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
- package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
- package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
- package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
- package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
- package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
- package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
- package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
- package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
- package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
- package/dist/doctor-QOA5FNY5.js +313 -0
- package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
- package/dist/eval-inventory-SXH7PDKX.js +316 -0
- package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
- package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
- package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
- package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
- package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
- package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
- package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
- package/dist/fleet-inspect-VLY4S7QM.js +442 -0
- package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
- package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
- package/dist/fleet-verify-JFEL2L3H.js +175 -0
- package/dist/fleet-view-ZCON35AG.js +102 -0
- package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
- package/dist/install-XGLBQY5E.js +13 -0
- package/dist/interop-OZBKXAYL.js +114 -0
- package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
- package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
- package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
- package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
- package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
- package/dist/panes-HMABYVO4.js +58 -0
- package/dist/panes-KY6W3V2E.js +103 -0
- package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
- package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
- package/dist/resources-BB3MVJMD.js +111 -0
- package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
- package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
- package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
- package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
- package/dist/skills-inventory-S4MXPJFV.js +126 -0
- package/dist/slash-commands-ZSGASKJC.js +77 -0
- package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
- package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
- package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
- package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
- package/dist/tools-DAF3DI3C.js +27 -0
- package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
- package/dist/tui-primitives-2AKXQNZK.js +13 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
- package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
- package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
- package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
- package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
- package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
- package/dist/with-panes-MKB46MPQ.js +782 -0
- package/dist/worker/entry.js +106 -75
- package/docs/README.md +3 -2
- package/docs/acp.md +24 -3
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +9 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +62 -3
- package/docs/commands-and-modes.md +31 -2
- package/docs/configuration-and-targets.md +69 -12
- package/docs/context-engine.md +63 -4
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +5 -5
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +12 -11
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +27 -1
- package/docs/fleet-dispatch.md +25 -4
- package/docs/installation-and-lifecycle.md +15 -2
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +55 -4
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +19 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +19 -3
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +88 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +5 -2
- package/src/cli/acp.ts +6 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +25 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +23 -21
- package/src/cli/doctor-panes.ts +124 -0
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor-toolchain.ts +57 -0
- package/src/cli/doctor.ts +22 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +93 -16
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/extensions.ts +5 -1
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +810 -0
- package/src/cli/fleet.ts +179 -39
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +5 -2
- package/src/cli/run.ts +58 -0
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +44 -13
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +85 -5
- package/src/cli/usage.ts +63 -14
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/core/bus-events.ts +33 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/config.ts +67 -0
- package/src/core/defaults.ts +124 -8
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +80 -6
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +164 -35
- package/src/domains/config/classify.ts +6 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +52 -14
- package/src/domains/dispatch/capacity-lease.ts +118 -9
- package/src/domains/dispatch/contract.ts +11 -0
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/extension.ts +378 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-run.ts +87 -4
- package/src/domains/dispatch/gate-decisions.ts +11 -1
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +22 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/reservation-store.ts +139 -11
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +598 -0
- package/src/domains/dispatch/state.ts +49 -1
- package/src/domains/dispatch/types.ts +13 -0
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
- package/src/domains/dispatch/write-boundary.ts +62 -1
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +342 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +127 -0
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +105 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +2 -13
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/evidence/trust-projection.ts +2 -2
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +38 -3
- package/src/domains/extensions/resources.ts +1 -1
- package/src/domains/extensions/state.ts +12 -3
- package/src/domains/extensions/types.ts +2 -0
- package/src/domains/lifecycle/doctor.ts +69 -1
- package/src/domains/memory/index.ts +14 -1
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +82 -17
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +3 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +97 -21
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- package/src/domains/mux/contract.ts +434 -0
- package/src/domains/mux/detect.ts +158 -0
- package/src/domains/mux/extension.ts +47 -0
- package/src/domains/mux/index.ts +96 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +164 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +49 -0
- package/src/domains/mux/socket-client.ts +816 -0
- package/src/domains/mux/types.ts +222 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +180 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +228 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +22 -1
- package/src/domains/observability/index.ts +9 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +234 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/providers/endpoint-capacity.ts +228 -0
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +20 -3
- package/src/domains/providers/index.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +32 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +95 -33
- package/src/domains/resources/skills/loader.ts +33 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/run-effects.ts +35 -4
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -0
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +18 -3
- package/src/engine/acp/server.ts +413 -70
- package/src/engine/acp/types.ts +19 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/claude/sdk-module.ts +98 -0
- package/src/engine/claude/sdk-runtime.ts +19 -11
- package/src/engine/provider-payload.ts +29 -1
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-runtime.ts +2 -13
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +279 -35
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +41 -10
- package/src/interactive/cost-overlay.ts +66 -6
- package/src/interactive/council-grid.ts +1 -3
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +102 -20
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +177 -7
- package/src/interactive/interactive-input-runtime.ts +15 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +63 -10
- package/src/interactive/memory-overlay.ts +9 -0
- package/src/interactive/modal-marker.ts +170 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +58 -2
- package/src/interactive/overlay-general-openers.ts +17 -0
- package/src/interactive/overlay-key-routing.ts +52 -3
- package/src/interactive/overlay-lifecycle.ts +56 -7
- package/src/interactive/overlay-model-selectors.ts +40 -3
- package/src/interactive/overlay-permission-lifecycle.ts +112 -24
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +1 -0
- package/src/interactive/overlays/ask-user.ts +227 -49
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +1 -0
- package/src/interactive/overlays/cwd-fallback.ts +1 -0
- package/src/interactive/overlays/decisions.ts +11 -11
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +1 -0
- package/src/interactive/overlays/handoff-review.ts +1 -0
- package/src/interactive/overlays/help-reference.ts +6 -0
- package/src/interactive/overlays/interop.ts +1 -0
- package/src/interactive/overlays/library-install-confirm.ts +1 -0
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +1 -0
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +1 -0
- package/src/interactive/overlays/prompts.ts +12 -1
- package/src/interactive/overlays/session-selector.ts +1 -0
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +614 -45
- package/src/interactive/overlays/side-question.ts +1 -0
- package/src/interactive/overlays/skills-hub.ts +3 -11
- package/src/interactive/overlays/tree-selector.ts +1 -0
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +292 -0
- package/src/interactive/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +251 -15
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/tasks-overlay.ts +1 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +346 -33
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +109 -1
- package/src/interactive/view/view-overlay.ts +29 -3
- package/src/interactive/watch-pane.ts +152 -0
- package/src/interactive/worker-progress.ts +7 -1
- package/src/interactive/worker-receipts.ts +19 -1
- package/src/interactive/worker-stream.ts +5 -0
- package/src/interactive/yazi-bridge.ts +444 -0
- package/src/tools/ask-user.ts +43 -2
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +15 -0
- package/src/tools/compete-worktrees.ts +83 -2
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +14 -3
- package/src/tools/dispatch-arguments.ts +20 -20
- package/src/tools/dispatch-plan.ts +17 -9
- package/src/tools/dispatch-run-events.ts +134 -19
- package/src/tools/dispatch-runner.ts +29 -7
- package/src/tools/dispatch-scout.ts +1 -1
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/executables.ts +17 -14
- package/src/tools/observation.ts +54 -4
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/registry.ts +16 -0
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HLE42MG7.js +0 -37
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-JOZYP4GM.js +0 -279
- package/dist/doctor-M7YEDGAE.js +0 -91
package/docs/troubleshooting.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Troubleshooting & Error Remediation
|
|
2
2
|
|
|
3
|
-
This guide provides concrete, actionable remediation procedures for operational errors, permission denials, target connection failures, and system diagnostics in Clio Coder `v0.
|
|
3
|
+
This guide provides concrete, actionable remediation procedures for operational errors, permission denials, target connection failures, and system diagnostics in Clio Coder `v0.4.0`.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -26,6 +26,93 @@ This guide provides concrete, actionable remediation procedures for operational
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
+
## Reading a cold cache
|
|
30
|
+
|
|
31
|
+
On a local server prefill is most of what a turn costs, so a cold prefix cache is the difference between a first token in under a second and one in fifty. This is how to find out why a turn went cold, starting from what the TUI shows.
|
|
32
|
+
|
|
33
|
+
**1. Read the `/context` cache lines.** Two lines answer different questions. The prompt-cache line says what the provider reported and whether the compiled prompt shell was reused. The prefill line says what the server itself did:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
prefill: 34,951 uncached · 0 cached · 48,617 ms
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Those are the server's own numbers, not Clio's estimate. `server does not report cache reads` in place of the cached figure means the backend gave no `cache_n` at all, which is LM Studio 2.29.0's OpenAI-compatible port today; on that target the verdict comes from the provider's `cached_tokens` instead and the prefill line reports only total prompt work and milliseconds.
|
|
40
|
+
|
|
41
|
+
**2. Look for the expected-cold line.** When the last settled run came back `cold` and Clio had recorded a cause, `/context` names it rather than warning:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
last cold turn: working-set eviction (expected)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The eight causes and what stamps each one are in [context-engine.md](context-engine.md#cache-divergence-honesty). `background_memory` renders in prose as `last cold turn: background memory step (expected)`.
|
|
48
|
+
|
|
49
|
+
**3. Confirm it in the ledger.** The reasons are durable, so a finished session answers the same question without the TUI. Open `current.jsonl` under the session directory `clio-coder paths` reports and read the run's first assistant entry:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"timing": { "ttftMs": 53194, "apiMs": 56770 },
|
|
54
|
+
"promptCache": {
|
|
55
|
+
"input": 34951, "cacheRead": 0, "cacheWrite": 0,
|
|
56
|
+
"backendVerdict": "cold",
|
|
57
|
+
"expectedColdReasons": ["dispatch", "residency"],
|
|
58
|
+
"backend": {
|
|
59
|
+
"promptTokens": 34951, "cachedTokens": 0, "predictedTokens": 24,
|
|
60
|
+
"promptMs": 48617, "predictedMs": 373, "source": "llamacpp-timings"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`expectedColdReasons` is stamped once per run, on its first persisted call, so a turn with several model calls carries it on the first one only. `clio-coder doctor` folds the latest session for you and prints the verdict counts plus the most frequent reason, and `clio-coder usage report` gives per-session uncached prefill and verdict counts across the window.
|
|
67
|
+
|
|
68
|
+
**4. When there is no reason, the warning is the finding.** A cold backend with a reused prompt shell and no recorded reason is a real disagreement: Clio kept the bytes stable and the server re-prefilled anyway. `/context` leaves the warning in place for exactly that case. Four causes are worth checking in order, and none of them is a Clio bug:
|
|
69
|
+
|
|
70
|
+
- **The server slept.** A llama.cpp router started with `--sleep-idle-seconds N` drops the slot's prefix cache when it sleeps, and `--cache-ram` does not reliably restore a large state. A gap longer than that setting between two turns explains a cold turn completely. Raise the flag, or accept that a session left idle pays for its first turn back.
|
|
71
|
+
- **Something else used the endpoint.** A worker, a second Clio session, or another client on the same server evicts the slot. Clio stamps `dispatch`, `residency`, and `background_memory` only for work it can attribute to itself on that endpoint; a foreign process leaves no stamp. `clio-coder targets --probe` reports the endpoint's slot count, and `/fleet` settings show active slots per endpoint.
|
|
72
|
+
- **The model was swapped.** A router serving one model at a time reloads on a residency change, and everything the previous model had cached is gone. This normally does stamp `residency`, but only when the mutation went through Clio.
|
|
73
|
+
- **The prompt moved for a reason Clio did not classify.** Compare the run's `promptHash` and `toolSignature` in `context-snapshots.jsonl` against the previous run's. Equal hashes with a cold backend point at the server; different hashes with no `prompt_recompiled` or `tool_surface_change` stamp is worth an issue.
|
|
74
|
+
|
|
75
|
+
One case is expected on hybrid architectures and looks like a bug. Qwen3.8 keeps recurrent state that llama.cpp cannot roll back to an arbitrary token, so a change anywhere inside a cached prefix re-prefills from the last context checkpoint rather than from the changed byte. A small edit to old history can therefore cost thousands of tokens of prefill with the prompt hash otherwise stable. The server's checkpoint count and its `--checkpoint-min-step` are the levers; see the `qwen3.8-27b` family's `serving` and `measuredUnder` notes in `src/domains/providers/models/local-models/clio-local-coding-targets.yaml` for the measured figures and the exact argv they were taken under.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## A TUI that stops answering the keyboard
|
|
80
|
+
|
|
81
|
+
When an interactive session stops responding to typing, the question worth
|
|
82
|
+
answering before anything else is which half of the input pipeline stopped: the
|
|
83
|
+
stdin reader that hands bytes to the application, or the renderer that turns
|
|
84
|
+
them into a frame on stdout. Clio keeps that evidence without being asked. Every
|
|
85
|
+
interactive process holds a bounded in-memory ring of the last 256 input-ingress
|
|
86
|
+
records and the last 256 committed frames, and writes it out when the process
|
|
87
|
+
receives `SIGTERM`, which is the signal a `kill` of the stuck pane sends.
|
|
88
|
+
|
|
89
|
+
The dump lands in the state directory `clio-coder paths` reports:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
<stateDir>/input-wedge/<ISO timestamp>-<pid>.json
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The five newest dumps are kept and older ones are removed as new ones land.
|
|
96
|
+
Read `classification` first:
|
|
97
|
+
|
|
98
|
+
| `classification` | What it means |
|
|
99
|
+
| :--- | :--- |
|
|
100
|
+
| `input-not-committed` | Bytes reached the application and no frame carrying them ever reached stdout. The renderer is the stuck half. |
|
|
101
|
+
| `no-input-recorded` | Nothing was delivered at all. If the operator was typing, the stdin reader is the stuck half. |
|
|
102
|
+
| `input-committed` | Both halves were moving. Whatever the session was doing, it was not this pipeline. |
|
|
103
|
+
|
|
104
|
+
`msSinceLastInputIngress` and `msSinceLastCommittedFrame` say how long each half
|
|
105
|
+
had been quiet when the signal arrived, and the `inputIngress` and `frames`
|
|
106
|
+
arrays carry the records themselves. Frames are kept only when they reached
|
|
107
|
+
stdout, so an empty `frames` array is itself a finding.
|
|
108
|
+
|
|
109
|
+
For a full session trace rather than the tail, set `CLIO_CODER_RENDER_TRACE` to
|
|
110
|
+
a file path before starting the session. That writes every record, including
|
|
111
|
+
provider deltas and terminal writes, as JSONL. The ring is the always-on subset
|
|
112
|
+
of the same records, for the case where nobody armed the trace first.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
29
116
|
## Diagnostic Commands
|
|
30
117
|
|
|
31
118
|
When encountering unexpected system behavior:
|
package/docs/tui-design.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Clio TUI Design System
|
|
2
2
|
|
|
3
3
|
> [!TIP]
|
|
4
|
-
> **Interactive Spec Available:** An interactive color/glyph token laboratory and terminal transcript preview renderer is located at [docs/html/tui_design_blueprint.html](html/tui_design_blueprint.html) (Version: 0.
|
|
4
|
+
> **Interactive Spec Available:** An interactive color/glyph token laboratory and terminal transcript preview renderer is located at [docs/html/tui_design_blueprint.html](html/tui_design_blueprint.html) (Version: 0.4.0).
|
|
5
5
|
|
|
6
6
|
This document is the reference specification for the Clio Coder TUI visual layout, styling, and behavior. It describes color semantics, the glyph vocabulary, structural recipes, and state choreography for all surfaces under [src/interactive/](../src/interactive/).
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Worker Dispatch Mechanics
|
|
2
2
|
|
|
3
3
|
> [!TIP]
|
|
4
|
-
> **Interactive Spec Available:** An interactive NDJSON protocol timeline stream and heartbeat watchdog simulator is located at [docs/html/worker_dispatch_blueprint.html](html/worker_dispatch_blueprint.html) (Version: 0.
|
|
4
|
+
> **Interactive Spec Available:** An interactive NDJSON protocol timeline stream and heartbeat watchdog simulator is located at [docs/html/worker_dispatch_blueprint.html](html/worker_dispatch_blueprint.html) (Version: 0.4.0).
|
|
5
5
|
|
|
6
6
|
This document describes the design and lifecycle of Clio Coder dispatched workers, focusing on the spawning sequence, execution isolation, the standard input/output NDJSON communication loop, and permission escalation routing.
|
|
7
7
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iowarp/clio-coder",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Coding agent for HPC and scientific-software developers, part of IOWarp's CLIO ecosystem of agentic science.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -92,11 +92,14 @@
|
|
|
92
92
|
"//": "below here: a real model target, chosen with --target <id>; costs money and/or GPU time, never run in CI",
|
|
93
93
|
"live:smoke": "node --import tsx benchmarks/internal/live-smoke.ts",
|
|
94
94
|
"live:fleet-dispatch": "node --import tsx benchmarks/internal/live-fleet-dispatch.ts",
|
|
95
|
+
"live:release-residue": "node --import tsx tests/live/release-residue.ts",
|
|
95
96
|
"live:tui": "node --import tsx benchmarks/internal/pty-drive.ts",
|
|
96
97
|
"live:home": "node --import tsx benchmarks/internal/live-home.ts"
|
|
97
98
|
},
|
|
99
|
+
"optionalDependencies": {
|
|
100
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.186"
|
|
101
|
+
},
|
|
98
102
|
"dependencies": {
|
|
99
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.186",
|
|
100
103
|
"@earendil-works/pi-agent-core": "0.84.0",
|
|
101
104
|
"@earendil-works/pi-ai": "0.84.0",
|
|
102
105
|
"@earendil-works/pi-tui": "0.84.0",
|
package/src/cli/acp.ts
CHANGED
|
@@ -66,11 +66,15 @@ export async function runAcpCommand(
|
|
|
66
66
|
args: ReadonlyArray<string>,
|
|
67
67
|
options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
|
|
68
68
|
): Promise<number> {
|
|
69
|
-
|
|
69
|
+
// The top-level argv parser normally rewrites --acp to the `acp` command
|
|
70
|
+
// sentinel. Keep the command boundary tolerant too, so another dispatcher
|
|
71
|
+
// can pass the flag spelling through without changing ACP option semantics.
|
|
72
|
+
const normalizedArgs = args[0] === "--acp" ? args.slice(1) : args;
|
|
73
|
+
if (normalizedArgs.includes("--help") || normalizedArgs.includes("-h")) {
|
|
70
74
|
process.stdout.write(HELP);
|
|
71
75
|
return 0;
|
|
72
76
|
}
|
|
73
|
-
const flags = parseAcpFlags(
|
|
77
|
+
const flags = parseAcpFlags(normalizedArgs);
|
|
74
78
|
if (typeof flags === "string") {
|
|
75
79
|
printError(flags);
|
|
76
80
|
process.stderr.write(HELP);
|
package/src/cli/agents.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { printError } from "./shared.js";
|
|
|
9
9
|
|
|
10
10
|
const HELP = `clio-coder agents [--json] [--all]
|
|
11
11
|
|
|
12
|
-
List user-facing agent specs from built-in, user, and project recipes.
|
|
12
|
+
List user-facing agent specs from built-in, extension, user, and project recipes.
|
|
13
13
|
|
|
14
14
|
Flags:
|
|
15
15
|
--json emit specs as JSON instead of the formatted table
|
package/src/cli/argv.ts
CHANGED
|
@@ -70,6 +70,11 @@ export interface GlobalCliFlags {
|
|
|
70
70
|
noContextFiles: boolean;
|
|
71
71
|
noSkills: boolean;
|
|
72
72
|
skillPaths: string[];
|
|
73
|
+
/**
|
|
74
|
+
* Panes activation from the command line. `--with-panes` and `--no-panes`
|
|
75
|
+
* both beat the `panes.enabled` setting; absent means the setting decides.
|
|
76
|
+
*/
|
|
77
|
+
panes?: "with" | "without";
|
|
73
78
|
rest: string[];
|
|
74
79
|
error?: string;
|
|
75
80
|
}
|
|
@@ -85,6 +90,8 @@ const GLOBAL_ONLY_FLAGS: ReadonlyMap<string, string> = new Map([
|
|
|
85
90
|
["--api-key", "--api-key <key>"],
|
|
86
91
|
["--no-context-files", "--no-context-files"],
|
|
87
92
|
["-nc", "-nc"],
|
|
93
|
+
["--with-panes", "--with-panes"],
|
|
94
|
+
["--no-panes", "--no-panes"],
|
|
88
95
|
]);
|
|
89
96
|
|
|
90
97
|
/**
|
|
@@ -128,6 +135,7 @@ export function extractGlobalFlags(
|
|
|
128
135
|
let apiKey: string | undefined;
|
|
129
136
|
let noContextFiles = false;
|
|
130
137
|
let noSkills = false;
|
|
138
|
+
let panes: "with" | "without" | undefined;
|
|
131
139
|
const skillPaths: string[] = [];
|
|
132
140
|
for (let i = 0; i < argv.length; i++) {
|
|
133
141
|
const arg = argv[i];
|
|
@@ -140,6 +148,14 @@ export function extractGlobalFlags(
|
|
|
140
148
|
rest.push(...argv.slice(i));
|
|
141
149
|
break;
|
|
142
150
|
}
|
|
151
|
+
if (arg === "--acp") {
|
|
152
|
+
// Treat the global spelling as a command boundary. Rewriting only the
|
|
153
|
+
// sentinel keeps every trailing ACP option on the exact same dispatcher
|
|
154
|
+
// and parser path as `clio-coder acp`, without importing that command into
|
|
155
|
+
// the dependency-light startup graph.
|
|
156
|
+
rest.push("acp", ...argv.slice(i + 1));
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
143
159
|
if (ROOT_FLAG_TOKENS.has(arg)) {
|
|
144
160
|
rest.push(arg);
|
|
145
161
|
continue;
|
|
@@ -152,6 +168,12 @@ export function extractGlobalFlags(
|
|
|
152
168
|
noSkills = true;
|
|
153
169
|
continue;
|
|
154
170
|
}
|
|
171
|
+
if (arg === "--with-panes" || arg === "--no-panes") {
|
|
172
|
+
// Last occurrence wins, so a wrapper script's baked-in choice can be
|
|
173
|
+
// overridden by appending the opposite flag.
|
|
174
|
+
panes = arg === "--with-panes" ? "with" : "without";
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
155
177
|
if (arg === "--api-key" || arg === "--skill") {
|
|
156
178
|
const value = argv[i + 1];
|
|
157
179
|
if (value === undefined || value.startsWith("-") || isSubcommand(value)) {
|
|
@@ -162,6 +184,7 @@ export function extractGlobalFlags(
|
|
|
162
184
|
rest,
|
|
163
185
|
error: `${arg} requires a value`,
|
|
164
186
|
...(apiKey === undefined ? {} : { apiKey }),
|
|
187
|
+
...(panes === undefined ? {} : { panes }),
|
|
165
188
|
};
|
|
166
189
|
}
|
|
167
190
|
if (arg === "--api-key") apiKey = value;
|
|
@@ -176,6 +199,7 @@ export function extractGlobalFlags(
|
|
|
176
199
|
rest,
|
|
177
200
|
error: unknownGlobalOptionError(arg),
|
|
178
201
|
...(apiKey === undefined ? {} : { apiKey }),
|
|
202
|
+
...(panes === undefined ? {} : { panes }),
|
|
179
203
|
};
|
|
180
204
|
}
|
|
181
205
|
return {
|
|
@@ -184,5 +208,6 @@ export function extractGlobalFlags(
|
|
|
184
208
|
skillPaths,
|
|
185
209
|
rest,
|
|
186
210
|
...(apiKey === undefined ? {} : { apiKey }),
|
|
211
|
+
...(panes === undefined ? {} : { panes }),
|
|
187
212
|
};
|
|
188
213
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The effective-customization graph behind `clio-coder config inspect`. This is the
|
|
3
3
|
* "why is Clio behaving this way" surface: it answers what settings, context
|
|
4
|
-
* files, rules, skills, prompts, agents, extensions, safety, memory, hooks, and
|
|
4
|
+
* files, rules, skills, prompts, agents, fleets, extensions, safety, memory, hooks, and
|
|
5
5
|
* the operator profile loaded, from where, with what precedence, and what each
|
|
6
6
|
* costs in context.
|
|
7
7
|
*
|
|
@@ -12,8 +12,9 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
-
import { basename } from "node:path";
|
|
15
|
+
import { basename, join } from "node:path";
|
|
16
16
|
import type { ClioSettings } from "../core/config.js";
|
|
17
|
+
import { resolvePackageRoot } from "../core/package-root.js";
|
|
17
18
|
import { readLayeredSettings, type SettingsOrigin, settingsSourceFor } from "../core/settings-layers.js";
|
|
18
19
|
import { clioDataDir } from "../core/xdg.js";
|
|
19
20
|
import {
|
|
@@ -39,7 +40,8 @@ export type CustomizationCategory =
|
|
|
39
40
|
| "extension"
|
|
40
41
|
| "skill-root"
|
|
41
42
|
| "prompt-root"
|
|
42
|
-
| "
|
|
43
|
+
| "agent-root"
|
|
44
|
+
| "fleet-root"
|
|
43
45
|
| "safety"
|
|
44
46
|
| "memory";
|
|
45
47
|
|
|
@@ -265,18 +267,43 @@ function inspectResourceRoots(cwd: string, graph: CustomizationGraph): void {
|
|
|
265
267
|
for (const [kind, category] of [
|
|
266
268
|
["skills", "skill-root"],
|
|
267
269
|
["prompts", "prompt-root"],
|
|
270
|
+
["agents", "agent-root"],
|
|
271
|
+
["fleets", "fleet-root"],
|
|
268
272
|
] as const) {
|
|
269
273
|
try {
|
|
274
|
+
if (kind === "agents" || kind === "fleets") {
|
|
275
|
+
const builtinPath = join(
|
|
276
|
+
resolvePackageRoot(),
|
|
277
|
+
"src",
|
|
278
|
+
"domains",
|
|
279
|
+
"agents",
|
|
280
|
+
kind === "agents" ? "builtins" : "fleets",
|
|
281
|
+
);
|
|
282
|
+
graph.entries.push({
|
|
283
|
+
category,
|
|
284
|
+
id: `${kind}:builtin`,
|
|
285
|
+
scope: "builtin",
|
|
286
|
+
sourcePath: builtinPath,
|
|
287
|
+
trust: "trusted",
|
|
288
|
+
precedence: "layer",
|
|
289
|
+
reloadClass: "next-turn",
|
|
290
|
+
detail: { present: existsSync(builtinPath), source: "builtin", resourcePrecedence: 0 },
|
|
291
|
+
});
|
|
292
|
+
}
|
|
270
293
|
for (const root of defaultScopedResourceRoots(kind, cwd)) {
|
|
271
294
|
graph.entries.push({
|
|
272
295
|
category,
|
|
273
296
|
id: `${kind}:${root.scope}`,
|
|
274
|
-
scope: root.scope,
|
|
297
|
+
scope: root.scope === "package" ? "extension" : root.scope,
|
|
275
298
|
sourcePath: root.path,
|
|
276
299
|
trust: root.scope === "package" ? "untrusted" : "trusted",
|
|
277
|
-
precedence: "
|
|
300
|
+
precedence: "layer",
|
|
278
301
|
reloadClass: "next-turn",
|
|
279
|
-
detail: {
|
|
302
|
+
detail: {
|
|
303
|
+
present: existsSync(root.path),
|
|
304
|
+
source: root.source,
|
|
305
|
+
...(root.precedence === undefined ? {} : { resourcePrecedence: root.precedence }),
|
|
306
|
+
},
|
|
280
307
|
});
|
|
281
308
|
}
|
|
282
309
|
} catch (err) {
|
package/src/cli/config.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { printError } from "./shared.js";
|
|
|
4
4
|
const HELP = `clio-coder config inspect [--json]
|
|
5
5
|
|
|
6
6
|
Print the effective-customization graph: what settings, context files, rules,
|
|
7
|
-
skills, prompts, agents, extensions, safety, memory, hooks, and the operator
|
|
7
|
+
skills, prompts, agents, fleets, extensions, safety, memory, hooks, and the operator
|
|
8
8
|
profile loaded, from where, with what precedence, trust, reload class, and
|
|
9
9
|
context cost. Read-only; nothing is created.
|
|
10
10
|
|
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
|
+
}
|