@iowarp/clio-coder 0.4.0 → 0.4.2
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 +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +20 -3
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +22 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 1. `~/.config/clio-coder/runtimes/`: any `.js` file whose default export is a valid
|
|
5
5
|
* RuntimeDescriptor. Resolved from `clioConfigDir()` so CLIO_CODER_HOME /
|
|
6
6
|
* CLIO_CODER_CONFIG_DIR overrides flow through.
|
|
7
|
-
* 2. npm packages listed under `settings.runtimePlugins
|
|
7
|
+
* 2. npm packages listed under `settings.integrations.runtimePlugins`.
|
|
8
8
|
* Each package must export a `clioRuntimes: RuntimeDescriptor[]` array.
|
|
9
9
|
*
|
|
10
10
|
* Missing directories, import failures, and descriptor conflicts are logged
|
|
@@ -117,7 +117,7 @@ function buildResult(
|
|
|
117
117
|
*
|
|
118
118
|
* Trailing `:low`/`:medium`/`:high`/`:xhigh`/`:minimal`/`:off` is parsed off
|
|
119
119
|
* before matching and surfaced on the returned ref so callers can apply it
|
|
120
|
-
* to settings.
|
|
120
|
+
* to settings.chat.thinkingLevel.
|
|
121
121
|
*/
|
|
122
122
|
export function resolveModelReference(rawPattern: string, providers: ProvidersContract): ResolveModelResult {
|
|
123
123
|
const trimmed = rawPattern.trim();
|
|
@@ -273,6 +273,34 @@ function appendThinkingDiagnostics(
|
|
|
273
273
|
diagnostics.push(diagnostic(severity, `thinking-${thinking.noticeKind}`, thinking.notice));
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
const CHAT_TEMPLATE_KWARGS_UNDELIVERABLE = "chat-template-kwargs-undeliverable";
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* One warning when the family declares chat-template kwargs the runtime
|
|
280
|
+
* cannot carry (#268). LM Studio ignores `chat_template_kwargs` for every
|
|
281
|
+
* family measured, so a Nemotron 3.5 target on that runtime runs without the
|
|
282
|
+
* `force_nonempty_content` its card asks for; the operator sees that once per
|
|
283
|
+
* target and model rather than finding the key silently missing from the wire.
|
|
284
|
+
*/
|
|
285
|
+
function appendChatTemplateKwargsDiagnostics(
|
|
286
|
+
diagnostics: RuntimeResolutionDiagnostic[],
|
|
287
|
+
resolved: ResolvedModelRuntimeCapabilities,
|
|
288
|
+
): void {
|
|
289
|
+
const undeliverable = resolved.request.undeliverableChatTemplateKwargs;
|
|
290
|
+
if (!undeliverable || undeliverable.keys.length === 0) return;
|
|
291
|
+
const keys = undeliverable.keys.join(", ");
|
|
292
|
+
const declared = undeliverable.declaredUnsupported
|
|
293
|
+
? "its family entry marks them unsupported there"
|
|
294
|
+
: "its family entry does not say so";
|
|
295
|
+
diagnostics.push(
|
|
296
|
+
diagnostic(
|
|
297
|
+
"warning",
|
|
298
|
+
CHAT_TEMPLATE_KWARGS_UNDELIVERABLE,
|
|
299
|
+
`chat-template kwargs ${keys} cannot reach ${resolved.runtimeId}, which ignores chat_template_kwargs; ${resolved.modelId} runs without them and ${declared}`,
|
|
300
|
+
),
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
276
304
|
function nonNegativeFiniteNumber(value: unknown): number | undefined {
|
|
277
305
|
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
278
306
|
}
|
|
@@ -447,6 +475,7 @@ export function resolveRuntimeTarget(
|
|
|
447
475
|
const decisions = capabilityDecisions(runtime, capabilities);
|
|
448
476
|
appendCapabilityDiagnostics(diagnostics, input, capabilities, decisions, targetId);
|
|
449
477
|
appendThinkingDiagnostics(diagnostics, modelRuntime, requestedThinkingLevel);
|
|
478
|
+
appendChatTemplateKwargsDiagnostics(diagnostics, modelRuntime);
|
|
450
479
|
|
|
451
480
|
if (hasError(diagnostics)) return { ok: false, diagnostics };
|
|
452
481
|
|
|
@@ -493,6 +522,7 @@ function withoutStaleRuntimeDiagnostics(
|
|
|
493
522
|
): RuntimeResolutionDiagnostic[] {
|
|
494
523
|
return diagnostics.filter((entry) => {
|
|
495
524
|
if (entry.code.startsWith("thinking-")) return false;
|
|
525
|
+
if (entry.code === CHAT_TEMPLATE_KWARGS_UNDELIVERABLE) return false;
|
|
496
526
|
if (entry.code === "output-budget-unknown" && decisions.maxTokens > 0) return false;
|
|
497
527
|
if (entry.code === "tools-unsupported" && decisions.tools) return false;
|
|
498
528
|
return true;
|
|
@@ -545,6 +575,7 @@ export function refineRuntimeTargetWithModelHints(
|
|
|
545
575
|
const decisions = capabilityDecisions(target.runtime, capabilities);
|
|
546
576
|
const diagnostics = withoutStaleRuntimeDiagnostics(target.diagnostics, decisions);
|
|
547
577
|
appendThinkingDiagnostics(diagnostics, modelRuntime, target.requestedThinkingLevel);
|
|
578
|
+
appendChatTemplateKwargsDiagnostics(diagnostics, modelRuntime);
|
|
548
579
|
return {
|
|
549
580
|
...target,
|
|
550
581
|
capabilities,
|
|
@@ -35,13 +35,13 @@ const KNOWN_MODELS: string[] = [
|
|
|
35
35
|
|
|
36
36
|
type AlcfCluster = string;
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
function clusterFromUrl(url: string | undefined): AlcfCluster | null {
|
|
39
39
|
if (!url) return null;
|
|
40
40
|
const match = /\/resource_server\/([^/]+)\//.exec(url);
|
|
41
41
|
return match ? (match[1] ?? null) : null;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
function frameworkForCluster(cluster: AlcfCluster): string {
|
|
45
45
|
return cluster === "metis" ? "api" : "vllm";
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -59,7 +59,7 @@ export function catalogModels(payload: CatalogPayload, cluster: string, framewor
|
|
|
59
59
|
return models.map((model) => String(model).trim()).filter((model) => model.length > 0);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
function runningModels(payload: JobsPayload): string[] {
|
|
63
63
|
const out: string[] = [];
|
|
64
64
|
for (const job of payload.running ?? []) {
|
|
65
65
|
for (const raw of String(job.Models ?? "").split(",")) {
|
|
@@ -162,7 +162,7 @@ const alcfRuntime: RuntimeDescriptor = {
|
|
|
162
162
|
provider: "alcf",
|
|
163
163
|
baseUrlForTarget: withAsIs,
|
|
164
164
|
});
|
|
165
|
-
const meta = (model as Model<Api> & {
|
|
165
|
+
const meta = (model as Model<Api> & { clioCoder?: { chatTemplateKwargsUnsupported?: boolean } }).clioCoder;
|
|
166
166
|
if (meta) meta.chatTemplateKwargsUnsupported = true;
|
|
167
167
|
return model;
|
|
168
168
|
},
|
|
@@ -169,7 +169,7 @@ function reasoningOptions(capabilities: unknown): string[] | undefined {
|
|
|
169
169
|
return options.length > 0 ? options : undefined;
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
|
|
172
|
+
function parseLmStudioV1Models(data: unknown): LmStudioModelInfo[] | null {
|
|
173
173
|
if (!isRecord(data) || !Array.isArray(data.models)) return null;
|
|
174
174
|
const models: LmStudioModelInfo[] = [];
|
|
175
175
|
for (const raw of data.models) {
|
|
@@ -285,10 +285,6 @@ export function resolveLmStudioInstance(
|
|
|
285
285
|
return { requestedId, wireModelId: requestedId, peerTargets: [], state: "unknown" };
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
-
export function resetLmStudioHostCatalogs(): void {
|
|
289
|
-
catalogsByHost.clear();
|
|
290
|
-
}
|
|
291
|
-
|
|
292
288
|
export function lmStudioReasoningLevels(options: ReadonlyArray<string> | undefined): ThinkingLevel[] {
|
|
293
289
|
if (!options || options.length === 0) return [...THINKING_LEVELS];
|
|
294
290
|
if (options.includes("on") && !options.includes("low") && !options.includes("medium") && !options.includes("high")) {
|
|
@@ -7,10 +7,10 @@ import { extractLocalModelQuirks, type LocalModelQuirks } from "../../types/loca
|
|
|
7
7
|
import type { RuntimeApiFamily } from "../../types/runtime-descriptor.js";
|
|
8
8
|
import type { TargetDescriptor } from "../../types/target-descriptor.js";
|
|
9
9
|
|
|
10
|
-
export type LocalModelLifecycle = "user-managed" | "clio-managed";
|
|
10
|
+
export type LocalModelLifecycle = "user-managed" | "clio-coder-managed";
|
|
11
11
|
|
|
12
12
|
export interface ClioLocalModelMetadata {
|
|
13
|
-
|
|
13
|
+
clioCoder?: {
|
|
14
14
|
targetId: string;
|
|
15
15
|
runtimeId: string;
|
|
16
16
|
/**
|
|
@@ -101,7 +101,7 @@ export function synthLocalModel(input: LocalSynthesisInput): Model<Api> {
|
|
|
101
101
|
},
|
|
102
102
|
contextWindow: caps.contextWindow,
|
|
103
103
|
maxTokens: caps.maxTokens,
|
|
104
|
-
|
|
104
|
+
clioCoder: {
|
|
105
105
|
targetId: target.id,
|
|
106
106
|
runtimeId: target.runtime,
|
|
107
107
|
...(target.lifecycle ? { lifecycle: target.lifecycle } : {}),
|
|
@@ -357,7 +357,7 @@ export interface LlamaCppRequestContextWindow {
|
|
|
357
357
|
* 25% (issue #187). With `--kv-unified` every slot shares one sequence and
|
|
358
358
|
* the total is the window.
|
|
359
359
|
*/
|
|
360
|
-
|
|
360
|
+
function llamaCppRequestContextWindow(flags: LlamaCppServerFlags): LlamaCppRequestContextWindow | undefined {
|
|
361
361
|
const total = positiveNumber(flags.contextSize);
|
|
362
362
|
if (total === undefined) return undefined;
|
|
363
363
|
const parallel = positiveNumber(flags.parallel);
|
|
@@ -374,6 +374,8 @@ export interface LlamaCppStatusEnrichment {
|
|
|
374
374
|
modelId?: string;
|
|
375
375
|
serverFlags?: LlamaCppServerFlags;
|
|
376
376
|
notes?: string[];
|
|
377
|
+
/** The router's own load state for the selected model, when it reports one. */
|
|
378
|
+
loadState?: ProbeModelStatus["state"];
|
|
377
379
|
}
|
|
378
380
|
|
|
379
381
|
function argsFromStatus(status: unknown): string[] {
|
|
@@ -423,7 +425,7 @@ function booleanFlag(args: ReadonlyArray<string>, ...flags: ReadonlyArray<string
|
|
|
423
425
|
return undefined;
|
|
424
426
|
}
|
|
425
427
|
|
|
426
|
-
|
|
428
|
+
function parseLlamaCppServerFlags(args: ReadonlyArray<string>): LlamaCppServerFlags {
|
|
427
429
|
const flags: LlamaCppServerFlags = {};
|
|
428
430
|
const ctxSize = numberFlag(args, "--ctx-size", "-c");
|
|
429
431
|
if (ctxSize !== undefined) flags.contextSize = ctxSize;
|
|
@@ -490,8 +492,11 @@ export async function probeLlamaCppModelStatus(
|
|
|
490
492
|
const entries = await probeOpenAIModelEntries(base, ctx);
|
|
491
493
|
const selected = selectedModelEntry(entries, target);
|
|
492
494
|
if (!selected) return {};
|
|
495
|
+
const loadState = modelStateFromOpenAIModelEntry({ id: selected.id, status: selected.status })?.state;
|
|
496
|
+
const withState = (enrichment: LlamaCppStatusEnrichment): LlamaCppStatusEnrichment =>
|
|
497
|
+
loadState === undefined ? enrichment : { ...enrichment, loadState };
|
|
493
498
|
const args = argsFromStatus(selected.status);
|
|
494
|
-
if (args.length === 0) return { notes: statusNotes(selected.id, selected.status) };
|
|
499
|
+
if (args.length === 0) return withState({ notes: statusNotes(selected.id, selected.status) });
|
|
495
500
|
const flags = parseLlamaCppServerFlags(args);
|
|
496
501
|
const caps: Partial<CapabilityFlags> = {};
|
|
497
502
|
const window = llamaCppRequestContextWindow(flags);
|
|
@@ -512,7 +517,7 @@ export async function probeLlamaCppModelStatus(
|
|
|
512
517
|
);
|
|
513
518
|
}
|
|
514
519
|
if (notes.length > 0) enrichment.notes = notes;
|
|
515
|
-
return enrichment;
|
|
520
|
+
return withState(enrichment);
|
|
516
521
|
}
|
|
517
522
|
|
|
518
523
|
/**
|
|
@@ -100,7 +100,7 @@ async function* streamSse(body: ReadableStream<Uint8Array>): AsyncGenerator<Comp
|
|
|
100
100
|
}
|
|
101
101
|
} finally {
|
|
102
102
|
if (droppedFrames > 0) {
|
|
103
|
-
process.stderr.write(`[clio:llamacpp] dropped ${droppedFrames} malformed stream frame(s)\n`);
|
|
103
|
+
process.stderr.write(`[clio-coder:llamacpp] dropped ${droppedFrames} malformed stream frame(s)\n`);
|
|
104
104
|
}
|
|
105
105
|
reader.releaseLock();
|
|
106
106
|
}
|
|
@@ -56,7 +56,15 @@ const llamacppRuntime: RuntimeDescriptor = {
|
|
|
56
56
|
const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
|
|
57
57
|
if (!health.ok) return health;
|
|
58
58
|
const status = await probeLlamaCppModelStatus(base, target, ctx);
|
|
59
|
-
|
|
59
|
+
// A router answers /props?model=<id> by loading that model, and with
|
|
60
|
+
// --models-max 1 that evicts whatever is resident: every probe of a
|
|
61
|
+
// fleet target's default model unloaded the chat model, so the next turn
|
|
62
|
+
// prefilled from zero (11,601 tokens, cache_n 0, on the round-3 resume
|
|
63
|
+
// run on mini). The router's model list already carries the worker's
|
|
64
|
+
// flags (--parallel, --ctx-size) for an unloaded model, so the worker is
|
|
65
|
+
// asked only when it is resident.
|
|
66
|
+
const resident = status.loadState === undefined || status.loadState === "loaded";
|
|
67
|
+
const props = await probeLlamaCppProps(base, ctx, resident ? (status.modelId ?? target.defaultModel) : undefined);
|
|
60
68
|
const catalog = await probeOpenAIModelCatalog(base, ctx);
|
|
61
69
|
const result: ProbeResult = { ok: true };
|
|
62
70
|
if (catalog.models.length > 0) result.models = catalog.models;
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
listLmStudioModels,
|
|
14
14
|
lmStudioReasoningLevels,
|
|
15
15
|
loadedContextLength,
|
|
16
|
-
parseLmStudioV1Models,
|
|
17
16
|
resolveLmStudioInstance,
|
|
18
17
|
} from "../common/lmstudio-http.js";
|
|
19
18
|
import { synthLocalModel, withV1 } from "../common/local-synth.js";
|
|
@@ -181,12 +180,6 @@ function probeFromCatalog(catalog: LmStudioCatalog, target: TargetDescriptor): P
|
|
|
181
180
|
return result;
|
|
182
181
|
}
|
|
183
182
|
|
|
184
|
-
export function probeResultFromV1Models(data: unknown, target: TargetDescriptor, latencyMs?: number): ProbeResult {
|
|
185
|
-
const models = parseLmStudioV1Models(data);
|
|
186
|
-
if (!models) return { ok: false, error: "LM Studio /api/v1/models response has no models array" };
|
|
187
|
-
return probeFromCatalog({ ok: true, models, tier: "0.4+", ...(latencyMs !== undefined ? { latencyMs } : {}) }, target);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
183
|
const lmstudioRuntime: RuntimeDescriptor = {
|
|
191
184
|
id: "lmstudio",
|
|
192
185
|
aliases: ["lmstudio-native"],
|
|
@@ -224,13 +217,13 @@ const lmstudioRuntime: RuntimeDescriptor = {
|
|
|
224
217
|
});
|
|
225
218
|
const metadata = (
|
|
226
219
|
model as Model<Api> & {
|
|
227
|
-
|
|
220
|
+
clioCoder?: {
|
|
228
221
|
chatTemplateKwargsUnsupported?: boolean;
|
|
229
222
|
lmstudioReasoningOptions?: ReadonlyArray<string>;
|
|
230
223
|
lmstudioDefaultModel?: string;
|
|
231
224
|
};
|
|
232
225
|
}
|
|
233
|
-
).
|
|
226
|
+
).clioCoder;
|
|
234
227
|
if (metadata) {
|
|
235
228
|
metadata.chatTemplateKwargsUnsupported = true;
|
|
236
229
|
if (target.defaultModel) metadata.lmstudioDefaultModel = target.defaultModel;
|
|
@@ -14,10 +14,6 @@
|
|
|
14
14
|
* publishes the real numbers on `/v1/model/info` instead, which is what this
|
|
15
15
|
* probe reads.
|
|
16
16
|
*
|
|
17
|
-
* Second, routed-deployment attribution. Which physical model answered is a
|
|
18
|
-
* per-response fact behind an alias, and LiteLLM returns it in `x-litellm-*`
|
|
19
|
-
* response headers. See {@link routedDeploymentFromHeaders}.
|
|
20
|
-
*
|
|
21
17
|
* Structured output is the one property worth stating explicitly, because
|
|
22
18
|
* getting it wrong is silent. `src/core/response-schema.ts` deliberately keys
|
|
23
19
|
* the schema dialect on runtime id and not on api family, since a generic
|
|
@@ -110,7 +106,7 @@ function boolean(value: unknown): boolean | undefined {
|
|
|
110
106
|
* so the caller can tell "the gateway says this model has no vision" apart from
|
|
111
107
|
* "the gateway did not say", and merge accordingly.
|
|
112
108
|
*/
|
|
113
|
-
|
|
109
|
+
function capabilitiesFromLiteLLMModelInfo(info: Record<string, unknown>): Partial<CapabilityFlags> {
|
|
114
110
|
const caps: Partial<CapabilityFlags> = {};
|
|
115
111
|
const contextWindow = positiveInteger(info.max_input_tokens) ?? positiveInteger(info.max_tokens);
|
|
116
112
|
if (contextWindow !== undefined) caps.contextWindow = contextWindow;
|
|
@@ -200,92 +196,6 @@ async function fetchCatalog(base: string, ctx: ProbeContext, headers: Record<str
|
|
|
200
196
|
return { models, modelCapabilities: {}, modelStates: {}, deployments: {} };
|
|
201
197
|
}
|
|
202
198
|
|
|
203
|
-
/**
|
|
204
|
-
* The routed deployment LiteLLM reports for one response.
|
|
205
|
-
*
|
|
206
|
-
* Behind an alias the physical model is a per-request fact: a fallback, a
|
|
207
|
-
* context-window promotion, or an ordinary load-balancing choice all change it
|
|
208
|
-
* without changing what the client asked for. Reporting the alias back as the
|
|
209
|
-
* model is how a gateway hides an outage, and it is exactly what an operator
|
|
210
|
-
* needs to see. LiteLLM answers in headers on every completion.
|
|
211
|
-
*/
|
|
212
|
-
export interface RoutedDeployment {
|
|
213
|
-
/** The alias the client asked for, e.g. `code`. */
|
|
214
|
-
group?: string;
|
|
215
|
-
/** The physical model that answered, e.g. `openai/katcoder2.5-35b-moe`. */
|
|
216
|
-
model?: string;
|
|
217
|
-
/** The upstream that served it. */
|
|
218
|
-
apiBase?: string;
|
|
219
|
-
/** Stable id of the specific deployment inside the group. */
|
|
220
|
-
deploymentId?: string;
|
|
221
|
-
/** Non-zero when the request did not reach its first-choice deployment. */
|
|
222
|
-
attemptedFallbacks?: number;
|
|
223
|
-
attemptedRetries?: number;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
function headerValue(headers: { get(name: string): string | null }, name: string): string | undefined {
|
|
227
|
-
const raw = headers.get(name)?.trim();
|
|
228
|
-
return raw && raw.length > 0 ? raw : undefined;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function headerInteger(headers: { get(name: string): string | null }, name: string): number | undefined {
|
|
232
|
-
const raw = headerValue(headers, name);
|
|
233
|
-
if (raw === undefined) return undefined;
|
|
234
|
-
const parsed = Number.parseInt(raw, 10);
|
|
235
|
-
return Number.isFinite(parsed) ? parsed : undefined;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Extract the routed deployment from a LiteLLM response, or null when the
|
|
240
|
-
* headers are absent. Absent is the normal answer for every non-LiteLLM target,
|
|
241
|
-
* so callers treat null as "no attribution available" rather than an error.
|
|
242
|
-
*/
|
|
243
|
-
export function routedDeploymentFromHeaders(headers: { get(name: string): string | null }): RoutedDeployment | null {
|
|
244
|
-
const routed: RoutedDeployment = {};
|
|
245
|
-
const group = headerValue(headers, "x-litellm-model-group");
|
|
246
|
-
if (group !== undefined) routed.group = group;
|
|
247
|
-
const model = headerValue(headers, "x-litellm-model-name");
|
|
248
|
-
if (model !== undefined) routed.model = model;
|
|
249
|
-
const apiBase = headerValue(headers, "x-litellm-model-api-base");
|
|
250
|
-
if (apiBase !== undefined) routed.apiBase = apiBase;
|
|
251
|
-
const deploymentId = headerValue(headers, "x-litellm-model-id");
|
|
252
|
-
if (deploymentId !== undefined) routed.deploymentId = deploymentId;
|
|
253
|
-
const fallbacks = headerInteger(headers, "x-litellm-attempted-fallbacks");
|
|
254
|
-
if (fallbacks !== undefined) routed.attemptedFallbacks = fallbacks;
|
|
255
|
-
const retries = headerInteger(headers, "x-litellm-attempted-retries");
|
|
256
|
-
if (retries !== undefined) routed.attemptedRetries = retries;
|
|
257
|
-
return Object.keys(routed).length > 0 ? routed : null;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* One-line attribution for a routed response.
|
|
262
|
-
*
|
|
263
|
-
* A request that fell back says so. `code -> openai/qwen3.8-27b-dense @
|
|
264
|
-
* mini.tail78f300.ts.net:8080 (fallback)` is the whole point of the runtime:
|
|
265
|
-
* the operator asked for the coder, the coder was asleep, and something else
|
|
266
|
-
* answered.
|
|
267
|
-
*/
|
|
268
|
-
export function formatRoutedDeployment(routed: RoutedDeployment): string {
|
|
269
|
-
const parts: string[] = [];
|
|
270
|
-
if (routed.group && routed.model && routed.group !== routed.model) {
|
|
271
|
-
parts.push(`${routed.group} -> ${routed.model}`);
|
|
272
|
-
} else if (routed.model ?? routed.group) {
|
|
273
|
-
parts.push((routed.model ?? routed.group) as string);
|
|
274
|
-
}
|
|
275
|
-
if (routed.apiBase) {
|
|
276
|
-
let host = routed.apiBase;
|
|
277
|
-
try {
|
|
278
|
-
host = new URL(routed.apiBase).host;
|
|
279
|
-
} catch {
|
|
280
|
-
// A non-URL api_base is displayed verbatim.
|
|
281
|
-
}
|
|
282
|
-
parts.push(`@ ${host}`);
|
|
283
|
-
}
|
|
284
|
-
if ((routed.attemptedFallbacks ?? 0) > 0) parts.push("(fallback)");
|
|
285
|
-
else if ((routed.attemptedRetries ?? 0) > 0) parts.push("(retried)");
|
|
286
|
-
return parts.join(" ");
|
|
287
|
-
}
|
|
288
|
-
|
|
289
199
|
const litellmRuntime: RuntimeDescriptor = {
|
|
290
200
|
id: "litellm",
|
|
291
201
|
displayName: "LiteLLM gateway",
|
|
@@ -5,3 +5,22 @@ export type CostProvenance = "known" | "known_free" | "estimated" | "unknown";
|
|
|
5
5
|
export function normalizeCostProvenance(value: CostProvenance | undefined): CostProvenance {
|
|
6
6
|
return value ?? "unknown";
|
|
7
7
|
}
|
|
8
|
+
|
|
9
|
+
const COST_PROVENANCE_VALUES: ReadonlySet<string> = new Set<CostProvenance>([
|
|
10
|
+
"known",
|
|
11
|
+
"known_free",
|
|
12
|
+
"estimated",
|
|
13
|
+
"unknown",
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Validate an unvalidated wire value (a dispatch bus payload crossing a
|
|
18
|
+
* worker process boundary, never runtime-checked against this closed set
|
|
19
|
+
* before) against the four real provenance values. An unrecognized value
|
|
20
|
+
* keeps `fallback` rather than being accepted as-is, matching how the
|
|
21
|
+
* observability projection's run summary already treated this field; the
|
|
22
|
+
* interactive dispatch board previously accepted any truthy string here.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveCostProvenance(value: unknown, fallback: CostProvenance): CostProvenance {
|
|
25
|
+
return typeof value === "string" && COST_PROVENANCE_VALUES.has(value) ? (value as CostProvenance) : fallback;
|
|
26
|
+
}
|
|
@@ -2,6 +2,7 @@ import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { parse as parseYaml } from "yaml";
|
|
4
4
|
|
|
5
|
+
import { warnLegacyNaming } from "../../../core/naming-compat.js";
|
|
5
6
|
import type { CapabilityFlags } from "./capability-flags.js";
|
|
6
7
|
|
|
7
8
|
export interface KnowledgeBaseEntry {
|
|
@@ -9,6 +10,8 @@ export interface KnowledgeBaseEntry {
|
|
|
9
10
|
matchPatterns: ReadonlyArray<string>;
|
|
10
11
|
capabilities: Partial<CapabilityFlags>;
|
|
11
12
|
quirks?: Record<string, unknown>;
|
|
13
|
+
/** Product-owned catalog metadata, normalized from either YAML spelling. */
|
|
14
|
+
clioCoder?: Record<string, unknown>;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
export type MatchKind = "family" | "alias";
|
|
@@ -152,5 +155,15 @@ function normalizeEntry(raw: unknown, file: string): KnowledgeBaseEntry {
|
|
|
152
155
|
}
|
|
153
156
|
entry.quirks = candidate.quirks as Record<string, unknown>;
|
|
154
157
|
}
|
|
158
|
+
const canonicalMetadata = candidate["clio-coder"];
|
|
159
|
+
const legacyMetadata = candidate.clio;
|
|
160
|
+
if (legacyMetadata !== undefined) warnLegacyNaming("clio: model metadata", "clio-coder: model metadata");
|
|
161
|
+
const metadata = canonicalMetadata ?? legacyMetadata;
|
|
162
|
+
if (metadata !== undefined) {
|
|
163
|
+
if (typeof metadata !== "object" || metadata === null || Array.isArray(metadata)) {
|
|
164
|
+
throw new Error(`knowledge base file ${file}: entry '${family}' clio-coder metadata must be an object`);
|
|
165
|
+
}
|
|
166
|
+
entry.clioCoder = metadata as Record<string, unknown>;
|
|
167
|
+
}
|
|
155
168
|
return entry;
|
|
156
169
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Engine-visible quirks extracted from a knowledge-base entry. The catalog YAML
|
|
3
3
|
* keeps free-form `quirks` (gpu tiers, runtime preferences, serving notes), so
|
|
4
4
|
* `KnowledgeBaseEntry.quirks` stays `Record<string, unknown>`. This module
|
|
5
|
-
* narrows the slice the engine consumes (
|
|
6
|
-
* into a typed shape that flows through `model.
|
|
5
|
+
* narrows the slice the engine consumes (per-mode sampling and thinking)
|
|
6
|
+
* into a typed shape that flows through `model.clioCoder.quirks` at synth time.
|
|
7
7
|
*
|
|
8
8
|
* Field naming follows the Hugging Face / model-card terminology so the YAML
|
|
9
9
|
* can be authored against the source-of-truth card. The OpenAI adapter
|
|
@@ -13,19 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { ThinkingBudgetByLevel, ThinkingEffortByLevel } from "../thinking-control-policy.js";
|
|
16
|
-
|
|
17
|
-
export const KV_CACHE_QUANTS = ["f32", "f16", "q8_0", "q4_0", "q4_1", "iq4_nl", "q5_0", "q5_1"] as const;
|
|
18
|
-
|
|
19
|
-
export type KvCacheQuant = (typeof KV_CACHE_QUANTS)[number];
|
|
20
|
-
|
|
21
|
-
export interface KvCacheQuirks {
|
|
22
|
-
/** Quantization type for the key cache. `false` disables quantization (full precision). */
|
|
23
|
-
kQuant?: KvCacheQuant | false;
|
|
24
|
-
/** Quantization type for the value cache. Requires flash attention to take effect. */
|
|
25
|
-
vQuant?: KvCacheQuant | false;
|
|
26
|
-
/** Force fp16 KV cache regardless of K/V quant settings. */
|
|
27
|
-
useFp16?: boolean;
|
|
28
|
-
}
|
|
16
|
+
import { type ThinkingLevel, VALID_THINKING_LEVELS } from "./capability-flags.js";
|
|
29
17
|
|
|
30
18
|
export interface SamplingProfile {
|
|
31
19
|
temperature?: number;
|
|
@@ -36,7 +24,6 @@ export interface SamplingProfile {
|
|
|
36
24
|
repeatPenalty?: number;
|
|
37
25
|
presencePenalty?: number;
|
|
38
26
|
frequencyPenalty?: number;
|
|
39
|
-
maxTokens?: number;
|
|
40
27
|
}
|
|
41
28
|
|
|
42
29
|
export interface SamplingQuirks {
|
|
@@ -59,6 +46,20 @@ export interface SamplingQuirks {
|
|
|
59
46
|
*/
|
|
60
47
|
export type ThinkingMechanism = "effort-levels" | "budget-tokens" | "on-off" | "always-on" | "none";
|
|
61
48
|
|
|
49
|
+
export type ChatTemplateKwargValue = string | number | boolean;
|
|
50
|
+
|
|
51
|
+
export interface ChatTemplateKwargsByLevel {
|
|
52
|
+
key: string;
|
|
53
|
+
values: Partial<Record<ThinkingLevel, string | number>>;
|
|
54
|
+
lmstudio?: "unsupported" | string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface ChatTemplateKwargsQuirks {
|
|
58
|
+
static?: Record<string, ChatTemplateKwargValue>;
|
|
59
|
+
byLevel?: ChatTemplateKwargsByLevel;
|
|
60
|
+
lmstudio?: "unsupported" | string | Record<string, string>;
|
|
61
|
+
}
|
|
62
|
+
|
|
62
63
|
export interface ThinkingQuirks {
|
|
63
64
|
mechanism: ThinkingMechanism;
|
|
64
65
|
/** Token budget for budget-tokens mechanism, keyed by Clio's thinking level. */
|
|
@@ -67,24 +68,19 @@ export interface ThinkingQuirks {
|
|
|
67
68
|
effortByLevel?: ThinkingEffortByLevel;
|
|
68
69
|
/** 2-5 line free-text guidance rendered into the Runtime prompt block. */
|
|
69
70
|
guidance?: string;
|
|
71
|
+
chatTemplateKwargs?: ChatTemplateKwargsQuirks;
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
export interface LocalModelQuirks {
|
|
73
|
-
kvCache?: KvCacheQuirks;
|
|
74
75
|
sampling?: SamplingQuirks;
|
|
75
76
|
thinking?: ThinkingQuirks;
|
|
77
|
+
chatTemplateKwargs?: ChatTemplateKwargsQuirks;
|
|
76
78
|
}
|
|
77
79
|
|
|
78
80
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
79
81
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
80
82
|
}
|
|
81
83
|
|
|
82
|
-
function asKvCacheQuant(value: unknown): KvCacheQuant | false | undefined {
|
|
83
|
-
if (value === false) return false;
|
|
84
|
-
if (typeof value !== "string") return undefined;
|
|
85
|
-
return (KV_CACHE_QUANTS as ReadonlyArray<string>).includes(value) ? (value as KvCacheQuant) : undefined;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
84
|
function asPositive(value: unknown): number | undefined {
|
|
89
85
|
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
90
86
|
}
|
|
@@ -98,17 +94,6 @@ function asPenalty(value: unknown): number | undefined {
|
|
|
98
94
|
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
99
95
|
}
|
|
100
96
|
|
|
101
|
-
function extractKvCache(raw: unknown): KvCacheQuirks | undefined {
|
|
102
|
-
if (!isRecord(raw)) return undefined;
|
|
103
|
-
const out: KvCacheQuirks = {};
|
|
104
|
-
const k = asKvCacheQuant(raw.kQuant);
|
|
105
|
-
if (k !== undefined) out.kQuant = k;
|
|
106
|
-
const v = asKvCacheQuant(raw.vQuant);
|
|
107
|
-
if (v !== undefined) out.vQuant = v;
|
|
108
|
-
if (typeof raw.useFp16 === "boolean") out.useFp16 = raw.useFp16;
|
|
109
|
-
return Object.keys(out).length > 0 ? out : undefined;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
97
|
function extractSamplingProfile(raw: unknown): SamplingProfile | undefined {
|
|
113
98
|
if (!isRecord(raw)) return undefined;
|
|
114
99
|
const out: SamplingProfile = {};
|
|
@@ -129,8 +114,6 @@ function extractSamplingProfile(raw: unknown): SamplingProfile | undefined {
|
|
|
129
114
|
if (pp !== undefined) out.presencePenalty = pp;
|
|
130
115
|
const fp = asPenalty(raw.frequencyPenalty);
|
|
131
116
|
if (fp !== undefined) out.frequencyPenalty = fp;
|
|
132
|
-
const maxTokens = asInteger(raw.maxTokens);
|
|
133
|
-
if (maxTokens !== undefined) out.maxTokens = maxTokens;
|
|
134
117
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
135
118
|
}
|
|
136
119
|
|
|
@@ -185,6 +168,66 @@ function extractEffortByLevel(raw: unknown): ThinkingQuirks["effortByLevel"] | u
|
|
|
185
168
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
186
169
|
}
|
|
187
170
|
|
|
171
|
+
function extractChatTemplateKwargs(raw: unknown): ChatTemplateKwargsQuirks | undefined {
|
|
172
|
+
if (!isRecord(raw)) return undefined;
|
|
173
|
+
const out: ChatTemplateKwargsQuirks = {};
|
|
174
|
+
|
|
175
|
+
if (isRecord(raw.static)) {
|
|
176
|
+
const staticMap: Record<string, ChatTemplateKwargValue> = {};
|
|
177
|
+
for (const [k, v] of Object.entries(raw.static)) {
|
|
178
|
+
if (typeof v === "boolean") {
|
|
179
|
+
staticMap[k] = v;
|
|
180
|
+
} else if (typeof v === "number" && Number.isFinite(v)) {
|
|
181
|
+
staticMap[k] = v;
|
|
182
|
+
} else if (typeof v === "string" && v.length > 0) {
|
|
183
|
+
staticMap[k] = v;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (Object.keys(staticMap).length > 0) out.static = staticMap;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (isRecord(raw.byLevel)) {
|
|
190
|
+
const byLevelRaw = raw.byLevel;
|
|
191
|
+
if (typeof byLevelRaw.key === "string" && byLevelRaw.key.trim().length > 0 && isRecord(byLevelRaw.values)) {
|
|
192
|
+
const values: Partial<Record<ThinkingLevel, string | number>> = {};
|
|
193
|
+
for (const level of VALID_THINKING_LEVELS) {
|
|
194
|
+
const val = byLevelRaw.values[level];
|
|
195
|
+
if (typeof val === "string" && val.length > 0) {
|
|
196
|
+
values[level] = val;
|
|
197
|
+
} else if (typeof val === "number" && Number.isFinite(val)) {
|
|
198
|
+
values[level] = val;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (Object.keys(values).length > 0) {
|
|
202
|
+
const byLevel: ChatTemplateKwargsByLevel = {
|
|
203
|
+
key: byLevelRaw.key.trim(),
|
|
204
|
+
values,
|
|
205
|
+
};
|
|
206
|
+
if (typeof byLevelRaw.lmstudio === "string" && byLevelRaw.lmstudio.trim().length > 0) {
|
|
207
|
+
byLevel.lmstudio = byLevelRaw.lmstudio.trim();
|
|
208
|
+
}
|
|
209
|
+
out.byLevel = byLevel;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (typeof raw.lmstudio === "string" && raw.lmstudio.trim().length > 0) {
|
|
215
|
+
out.lmstudio = raw.lmstudio.trim();
|
|
216
|
+
} else if (isRecord(raw.lmstudio)) {
|
|
217
|
+
const lmstudioMap: Record<string, string> = {};
|
|
218
|
+
for (const [k, v] of Object.entries(raw.lmstudio)) {
|
|
219
|
+
if (typeof v === "string" && v.trim().length > 0) {
|
|
220
|
+
lmstudioMap[k] = v.trim();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (Object.keys(lmstudioMap).length > 0) {
|
|
224
|
+
out.lmstudio = lmstudioMap;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
229
|
+
}
|
|
230
|
+
|
|
188
231
|
function extractThinkingQuirks(raw: unknown): ThinkingQuirks | undefined {
|
|
189
232
|
if (!isRecord(raw)) return undefined;
|
|
190
233
|
const mechanism = asThinkingMechanism(raw.mechanism);
|
|
@@ -195,22 +238,27 @@ function extractThinkingQuirks(raw: unknown): ThinkingQuirks | undefined {
|
|
|
195
238
|
const effortByLevel = extractEffortByLevel(raw.effortByLevel);
|
|
196
239
|
if (effortByLevel) out.effortByLevel = effortByLevel;
|
|
197
240
|
if (typeof raw.guidance === "string" && raw.guidance.length > 0) out.guidance = raw.guidance;
|
|
241
|
+
const chatTemplateKwargs = extractChatTemplateKwargs(raw.chatTemplateKwargs);
|
|
242
|
+
if (chatTemplateKwargs) out.chatTemplateKwargs = chatTemplateKwargs;
|
|
198
243
|
return out;
|
|
199
244
|
}
|
|
200
245
|
|
|
201
246
|
/**
|
|
202
247
|
* Pull the engine-visible quirks slice out of a free-form catalog quirks
|
|
203
248
|
* record. Returns `undefined` when nothing engine-relevant is configured so
|
|
204
|
-
* `model.
|
|
249
|
+
* `model.clioCoder.quirks` only gets attached when it carries information.
|
|
205
250
|
*/
|
|
206
251
|
export function extractLocalModelQuirks(raw: unknown): LocalModelQuirks | undefined {
|
|
207
252
|
if (!isRecord(raw)) return undefined;
|
|
208
253
|
const out: LocalModelQuirks = {};
|
|
209
|
-
const kvCache = extractKvCache(raw.kvCache);
|
|
210
|
-
if (kvCache) out.kvCache = kvCache;
|
|
211
254
|
const sampling = extractSampling(raw.sampling);
|
|
212
255
|
if (sampling) out.sampling = sampling;
|
|
213
256
|
const thinking = extractThinkingQuirks(raw.thinking);
|
|
214
257
|
if (thinking) out.thinking = thinking;
|
|
258
|
+
const chatTemplateKwargs =
|
|
259
|
+
extractChatTemplateKwargs(raw.chatTemplateKwargs) ??
|
|
260
|
+
extractChatTemplateKwargs(isRecord(raw.thinking) ? raw.thinking.chatTemplateKwargs : undefined) ??
|
|
261
|
+
extractChatTemplateKwargs(isRecord(raw.request) ? raw.request.chatTemplateKwargs : undefined);
|
|
262
|
+
if (chatTemplateKwargs) out.chatTemplateKwargs = chatTemplateKwargs;
|
|
215
263
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
216
264
|
}
|
|
@@ -14,9 +14,9 @@ export interface TargetPricing {
|
|
|
14
14
|
cacheWrite?: number;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
export type TargetLifecycle = "user-managed" | "clio-managed";
|
|
17
|
+
// Canonical persisted lifecycle name. Readers temporarily normalize the
|
|
18
|
+
// released `clio-managed` spelling at the settings boundary.
|
|
19
|
+
export type TargetLifecycle = "user-managed" | "clio-coder-managed";
|
|
20
20
|
|
|
21
21
|
export interface LmStudioLoadSettings {
|
|
22
22
|
contextLength?: number;
|