@iowarp/clio-coder 0.3.9 → 0.4.1
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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- 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 +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- 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 +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- 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 +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- 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/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- 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 +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- 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 +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -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/response-schema.ts +44 -4
- 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/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -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 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- 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/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- 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/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- 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 +24 -27
- 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-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- 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/serving.ts +31 -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 +12 -2
- 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/store.ts +6 -0
- 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-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 +20 -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 +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -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 +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- 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} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -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/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 +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- 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 +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- 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/share/archive.ts +85 -36
- 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 +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- 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 +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- 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 +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- 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 +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- 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 +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- 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 +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- 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 +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- 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/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- 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-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
import { canonicalEndpointUrl } from "../../core/endpoint-key.js";
|
|
2
2
|
import type { TargetStatus } from "./contract.js";
|
|
3
|
+
import {
|
|
4
|
+
type DiscoveredEndpointSlots,
|
|
5
|
+
readDiscoveredEndpointSlots,
|
|
6
|
+
recordDiscoveredEndpointSlots,
|
|
7
|
+
} from "./endpoint-slots-store.js";
|
|
8
|
+
import type { RuntimeDescriptor } from "./types/runtime-descriptor.js";
|
|
3
9
|
import type { TargetDescriptor } from "./types/target-descriptor.js";
|
|
4
10
|
|
|
5
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Where an endpoint's slot bound came from, weakest first.
|
|
13
|
+
*
|
|
14
|
+
* `discovered-prior` is a slot count a previous process probed and persisted
|
|
15
|
+
* (endpoint-slots-store.ts). It outranks the blind local default because it is
|
|
16
|
+
* evidence, and it yields to a probe this process ran because that evidence is
|
|
17
|
+
* newer.
|
|
18
|
+
*/
|
|
19
|
+
export type EndpointCapacitySource = "override" | "discovered" | "discovered-prior" | "local-native-default";
|
|
6
20
|
|
|
7
21
|
export interface EndpointCapacity {
|
|
8
22
|
key: string;
|
|
@@ -11,6 +25,9 @@ export interface EndpointCapacity {
|
|
|
11
25
|
source: EndpointCapacitySource;
|
|
12
26
|
}
|
|
13
27
|
|
|
28
|
+
/** Endpoint priors keyed by canonical endpoint key. */
|
|
29
|
+
export type EndpointSlotPriors = Readonly<Record<string, DiscoveredEndpointSlots>>;
|
|
30
|
+
|
|
14
31
|
/** Runtime ids whose request schedulers are intentionally not modeled as fixed local slots. */
|
|
15
32
|
const UNBOUNDED_LOCAL_NATIVE_RUNTIMES = new Set(["vllm", "sglang"]);
|
|
16
33
|
|
|
@@ -37,42 +54,157 @@ function positiveInteger(value: unknown): number | undefined {
|
|
|
37
54
|
return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : undefined;
|
|
38
55
|
}
|
|
39
56
|
|
|
40
|
-
/**
|
|
41
|
-
export
|
|
42
|
-
|
|
57
|
+
/** The runtime facts capacity resolution needs; a full descriptor satisfies it. */
|
|
58
|
+
export type EndpointRuntimeIdentity = Pick<RuntimeDescriptor, "id" | "tier">;
|
|
59
|
+
|
|
60
|
+
export interface EndpointCapacityInput {
|
|
61
|
+
target: TargetDescriptor;
|
|
62
|
+
/** Null when no runtime descriptor has resolved yet for `target.runtime`. */
|
|
63
|
+
runtime: EndpointRuntimeIdentity | null;
|
|
64
|
+
/** Slot count a probe in this process discovered, if one has landed. */
|
|
65
|
+
discoveredSlots?: number | undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Resolve one endpoint's concurrency bound.
|
|
70
|
+
*
|
|
71
|
+
* The order is the whole contract, because it is what makes the answer
|
|
72
|
+
* independent of when it is asked:
|
|
73
|
+
*
|
|
74
|
+
* 1. `maxConcurrentRequests` on the target. The operator said so.
|
|
75
|
+
* 2. A probe this process ran.
|
|
76
|
+
* 3. A probe a previous process ran and persisted, still inside its
|
|
77
|
+
* staleness bound and still describing the same runtime.
|
|
78
|
+
* 4. The conservative local-native default of one slot.
|
|
79
|
+
*
|
|
80
|
+
* Steps 2 and 3 answer with the same number for the same server, so a dispatch
|
|
81
|
+
* typed one second after boot and one typed a minute later resolve identically.
|
|
82
|
+
* Runtimes whose schedulers are not fixed local slots stay unbounded (null).
|
|
83
|
+
*/
|
|
84
|
+
export function endpointCapacityFor(
|
|
85
|
+
input: EndpointCapacityInput,
|
|
86
|
+
priors: EndpointSlotPriors = readDiscoveredEndpointSlots(),
|
|
87
|
+
): EndpointCapacity | null {
|
|
88
|
+
const key = canonicalEndpointKey(input.target);
|
|
43
89
|
if (key === null) return null;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (
|
|
49
|
-
|
|
90
|
+
const label = endpointLabel(key);
|
|
91
|
+
const override = positiveInteger(input.target.maxConcurrentRequests);
|
|
92
|
+
if (override !== undefined) return { key, label, limit: override, source: "override" };
|
|
93
|
+
const discovered = positiveInteger(input.discoveredSlots);
|
|
94
|
+
if (discovered !== undefined) return { key, label, limit: discovered, source: "discovered" };
|
|
95
|
+
const prior = priors[key];
|
|
96
|
+
// A record written by another runtime describes another server that once
|
|
97
|
+
// answered on this host and port, which is not evidence about this one.
|
|
98
|
+
if (prior !== undefined && prior.runtimeId === (input.runtime?.id ?? input.target.runtime)) {
|
|
99
|
+
return { key, label, limit: prior.slots, source: "discovered-prior" };
|
|
100
|
+
}
|
|
101
|
+
if (input.runtime?.tier !== "local-native" || UNBOUNDED_LOCAL_NATIVE_RUNTIMES.has(input.runtime.id)) return null;
|
|
102
|
+
return { key, label, limit: 1, source: "local-native-default" };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Resolve the endpoint bound from configuration, discovery, priors, or the local-native fallback. */
|
|
106
|
+
export function endpointCapacityForStatus(
|
|
107
|
+
status: TargetStatus,
|
|
108
|
+
priors: EndpointSlotPriors = readDiscoveredEndpointSlots(),
|
|
109
|
+
): EndpointCapacity | null {
|
|
110
|
+
return endpointCapacityFor(
|
|
111
|
+
{
|
|
112
|
+
target: status.target,
|
|
113
|
+
runtime: status.runtime ?? null,
|
|
114
|
+
discoveredSlots: status.probeCapabilities?.parallelSlots,
|
|
115
|
+
},
|
|
116
|
+
priors,
|
|
117
|
+
);
|
|
50
118
|
}
|
|
51
119
|
|
|
52
120
|
function sourceRank(source: EndpointCapacitySource): number {
|
|
53
|
-
|
|
121
|
+
switch (source) {
|
|
122
|
+
case "override":
|
|
123
|
+
return 3;
|
|
124
|
+
case "discovered":
|
|
125
|
+
return 2;
|
|
126
|
+
case "discovered-prior":
|
|
127
|
+
return 1;
|
|
128
|
+
default:
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Strongest evidence wins; among equals the smaller bound wins. */
|
|
134
|
+
function foldCapacity(capacities: Record<string, EndpointCapacity>, candidate: EndpointCapacity | null): void {
|
|
135
|
+
if (candidate === null) return;
|
|
136
|
+
const current = capacities[candidate.key];
|
|
137
|
+
if (
|
|
138
|
+
current === undefined ||
|
|
139
|
+
sourceRank(candidate.source) > sourceRank(current.source) ||
|
|
140
|
+
(sourceRank(candidate.source) === sourceRank(current.source) && candidate.limit < current.limit)
|
|
141
|
+
) {
|
|
142
|
+
capacities[candidate.key] = candidate;
|
|
143
|
+
}
|
|
54
144
|
}
|
|
55
145
|
|
|
56
146
|
/** Resolve one conservative limit per scheduler, preferring an explicit override. */
|
|
57
147
|
export function endpointCapacitiesForStatuses(
|
|
58
148
|
statuses: ReadonlyArray<TargetStatus>,
|
|
59
149
|
): Readonly<Record<string, EndpointCapacity>> {
|
|
150
|
+
const priors = readDiscoveredEndpointSlots();
|
|
151
|
+
const capacities: Record<string, EndpointCapacity> = {};
|
|
152
|
+
for (const status of statuses) foldCapacity(capacities, endpointCapacityForStatus(status, priors));
|
|
153
|
+
return capacities;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Every endpoint the configured fleet can reach, whether or not a probe has
|
|
158
|
+
* built a status for it yet.
|
|
159
|
+
*
|
|
160
|
+
* Resolving from `statuses` alone made the endpoint set depend on how far
|
|
161
|
+
* provider startup had progressed. An endpoint missing from that set carries no
|
|
162
|
+
* limit, and a capacity check with no limit is not a conservative check, it is
|
|
163
|
+
* no check: a plan needing two slots on a one-slot server was admitted whole
|
|
164
|
+
* when it was typed before the provider domain had finished building statuses,
|
|
165
|
+
* and denied afterwards. Configured targets fill the gap so the set is the same
|
|
166
|
+
* at both moments.
|
|
167
|
+
*/
|
|
168
|
+
export function resolveEndpointCapacities(input: {
|
|
169
|
+
statuses: ReadonlyArray<TargetStatus>;
|
|
170
|
+
targets?: ReadonlyArray<TargetDescriptor>;
|
|
171
|
+
runtimeFor?: (runtimeId: string) => EndpointRuntimeIdentity | null | undefined;
|
|
172
|
+
}): Readonly<Record<string, EndpointCapacity>> {
|
|
173
|
+
const priors = readDiscoveredEndpointSlots();
|
|
60
174
|
const capacities: Record<string, EndpointCapacity> = {};
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
175
|
+
const covered = new Set<string>();
|
|
176
|
+
for (const status of input.statuses) {
|
|
177
|
+
covered.add(status.target.id);
|
|
178
|
+
foldCapacity(capacities, endpointCapacityForStatus(status, priors));
|
|
179
|
+
}
|
|
180
|
+
for (const target of input.targets ?? []) {
|
|
181
|
+
if (covered.has(target.id)) continue;
|
|
182
|
+
foldCapacity(
|
|
183
|
+
capacities,
|
|
184
|
+
endpointCapacityFor({ target, runtime: input.runtimeFor?.(target.runtime) ?? null }, priors),
|
|
185
|
+
);
|
|
72
186
|
}
|
|
73
187
|
return capacities;
|
|
74
188
|
}
|
|
75
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Persist what a live probe just learned about this target's endpoint so the
|
|
192
|
+
* next process starts with the count instead of the blind default. A status
|
|
193
|
+
* with no probed slot count writes nothing: absence is not an observation, and
|
|
194
|
+
* overwriting a good record with silence would lose the fact this exists to
|
|
195
|
+
* keep.
|
|
196
|
+
*/
|
|
197
|
+
export function recordEndpointSlotsFromStatus(
|
|
198
|
+
status: TargetStatus,
|
|
199
|
+
options?: { nowMs?: number; onError?: (error: unknown) => void },
|
|
200
|
+
): Promise<void> {
|
|
201
|
+
const key = canonicalEndpointKey(status.target);
|
|
202
|
+
const slots = positiveInteger(status.probeCapabilities?.parallelSlots);
|
|
203
|
+
const runtimeId = status.runtime?.id ?? status.target.runtime;
|
|
204
|
+
if (key === null || slots === undefined || runtimeId === undefined) return Promise.resolve();
|
|
205
|
+
return recordDiscoveredEndpointSlots({ endpointKey: key, runtimeId, slots }, options);
|
|
206
|
+
}
|
|
207
|
+
|
|
76
208
|
/**
|
|
77
209
|
* The orchestrator's own request lives only in this process. It deliberately
|
|
78
210
|
* never enters dispatch-admission.json because process exit releases it.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable endpoint slot discovery.
|
|
3
|
+
*
|
|
4
|
+
* On-disk layout under `clioStateDir()`:
|
|
5
|
+
* endpoint-slots.json { version: 1, endpoints: { <canonical key>: record } }
|
|
6
|
+
*
|
|
7
|
+
* A probe that reads a server's own parallel slot count learns a fact about a
|
|
8
|
+
* machine, not about the process that asked. Holding it in memory made every
|
|
9
|
+
* fresh process start ignorant, so a four-slot llama.cpp server resolved at the
|
|
10
|
+
* conservative local-native default of 1 until something in that process
|
|
11
|
+
* happened to probe it again. This file is what carries the count across
|
|
12
|
+
* process boundaries.
|
|
13
|
+
*
|
|
14
|
+
* Conventions follow the rest of dispatch state (see dispatch/state.ts and
|
|
15
|
+
* dispatch/assignment-store.ts): reads are lock-free and tolerate a partially
|
|
16
|
+
* written or foreign-versioned file by answering empty, writes take the shared
|
|
17
|
+
* cross-process `withStateFileLock` on the target path and land through the
|
|
18
|
+
* canonical atomic writer.
|
|
19
|
+
*
|
|
20
|
+
* Three things bound what a persisted count may claim:
|
|
21
|
+
*
|
|
22
|
+
* 1. Age. A record older than {@link endpointSlotsTtlMs} is not returned and
|
|
23
|
+
* is pruned by the next write. A server restarted with a different
|
|
24
|
+
* `--parallel` must not keep over-admitting against yesterday's number.
|
|
25
|
+
* 2. Runtime identity. The record names the runtime that observed it. A
|
|
26
|
+
* different inference server now listening on the same host and port is a
|
|
27
|
+
* different scheduler, and its predecessor's slot count says nothing about
|
|
28
|
+
* it.
|
|
29
|
+
* 3. Precedence. A fresh probe in this process always outranks the record,
|
|
30
|
+
* and an explicit `maxConcurrentRequests` outranks both. See
|
|
31
|
+
* endpoint-capacity.ts.
|
|
32
|
+
*
|
|
33
|
+
* Reads are deliberately uncached. The file holds at most
|
|
34
|
+
* MAX_ENDPOINT_SLOT_RECORDS small rows, callers read it once per capacity
|
|
35
|
+
* resolution rather than once per target, and a cache keyed on mtime would
|
|
36
|
+
* reintroduce exactly the kind of timing-dependent answer this file exists to
|
|
37
|
+
* remove.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
41
|
+
import { join } from "node:path";
|
|
42
|
+
import { safeResourceWrite } from "../../core/safe-resource-write.js";
|
|
43
|
+
import { withStateFileLock } from "../../core/state-file-lock.js";
|
|
44
|
+
import { clioStateDir, stateRootRemoved } from "../../core/xdg.js";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* How long a persisted slot count may answer for an endpoint nothing has
|
|
48
|
+
* probed in this process. A day spans an ordinary working session while still
|
|
49
|
+
* expiring across the reconfigure-and-restart cycle that changes the number.
|
|
50
|
+
*/
|
|
51
|
+
export const DEFAULT_ENDPOINT_SLOTS_TTL_MS = 24 * 60 * 60 * 1000;
|
|
52
|
+
|
|
53
|
+
export const ENDPOINT_SLOTS_TTL_ENV_VAR = "CLIO_CODER_ENDPOINT_SLOTS_TTL_MS";
|
|
54
|
+
|
|
55
|
+
/** Bounded ring. An operator's target list is small; a runaway file is not. */
|
|
56
|
+
const MAX_ENDPOINT_SLOT_RECORDS = 64;
|
|
57
|
+
|
|
58
|
+
export interface DiscoveredEndpointSlots {
|
|
59
|
+
/** Canonical endpoint key, as produced by `canonicalEndpointKey`. */
|
|
60
|
+
endpointKey: string;
|
|
61
|
+
/** Runtime that observed the count. A different runtime invalidates it. */
|
|
62
|
+
runtimeId: string;
|
|
63
|
+
slots: number;
|
|
64
|
+
observedAt: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface EndpointSlotsFile {
|
|
68
|
+
version: 1;
|
|
69
|
+
endpoints: Record<string, DiscoveredEndpointSlots>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function endpointSlotsPath(): string {
|
|
73
|
+
return join(clioStateDir(), "endpoint-slots.json");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** env override > built-in default, mirroring core/guardrails.ts resolution order. */
|
|
77
|
+
export function endpointSlotsTtlMs(env: NodeJS.ProcessEnv = process.env): number {
|
|
78
|
+
const raw = env[ENDPOINT_SLOTS_TTL_ENV_VAR]?.trim();
|
|
79
|
+
if (raw !== undefined && /^[1-9]\d*$/.test(raw)) {
|
|
80
|
+
const parsed = Number(raw);
|
|
81
|
+
if (Number.isSafeInteger(parsed)) return parsed;
|
|
82
|
+
}
|
|
83
|
+
return DEFAULT_ENDPOINT_SLOTS_TTL_MS;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function validRecord(key: string, value: unknown): value is DiscoveredEndpointSlots {
|
|
87
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
88
|
+
const record = value as Partial<DiscoveredEndpointSlots>;
|
|
89
|
+
return (
|
|
90
|
+
record.endpointKey === key &&
|
|
91
|
+
typeof record.runtimeId === "string" &&
|
|
92
|
+
record.runtimeId.length > 0 &&
|
|
93
|
+
typeof record.slots === "number" &&
|
|
94
|
+
Number.isInteger(record.slots) &&
|
|
95
|
+
record.slots > 0 &&
|
|
96
|
+
typeof record.observedAt === "string" &&
|
|
97
|
+
Number.isFinite(Date.parse(record.observedAt))
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Every well-formed row on disk, regardless of age. */
|
|
102
|
+
function readRecords(): DiscoveredEndpointSlots[] {
|
|
103
|
+
const path = endpointSlotsPath();
|
|
104
|
+
if (!existsSync(path)) return [];
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(readFileSync(path, "utf8")) as EndpointSlotsFile;
|
|
107
|
+
if (parsed?.version !== 1 || typeof parsed.endpoints !== "object" || parsed.endpoints === null) return [];
|
|
108
|
+
return Object.entries(parsed.endpoints)
|
|
109
|
+
.filter(([key, value]) => validRecord(key, value))
|
|
110
|
+
.map(([, value]) => ({ ...value }));
|
|
111
|
+
} catch {
|
|
112
|
+
// A truncated or hand-edited file cannot bound anything. Answering empty
|
|
113
|
+
// falls back to the conservative default rather than to a guess.
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function fresh(record: DiscoveredEndpointSlots, nowMs: number, ttlMs: number): boolean {
|
|
119
|
+
const observedMs = Date.parse(record.observedAt);
|
|
120
|
+
// A stamp from the future is a clock that moved, not evidence of freshness.
|
|
121
|
+
return observedMs <= nowMs && nowMs - observedMs < ttlMs;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The slot counts a new process may treat as priors: well-formed, and observed
|
|
126
|
+
* inside the staleness bound. Keyed by canonical endpoint key.
|
|
127
|
+
*/
|
|
128
|
+
export function readDiscoveredEndpointSlots(options?: {
|
|
129
|
+
nowMs?: number;
|
|
130
|
+
ttlMs?: number;
|
|
131
|
+
}): Readonly<Record<string, DiscoveredEndpointSlots>> {
|
|
132
|
+
const nowMs = options?.nowMs ?? Date.now();
|
|
133
|
+
const ttlMs = options?.ttlMs ?? endpointSlotsTtlMs();
|
|
134
|
+
const out: Record<string, DiscoveredEndpointSlots> = {};
|
|
135
|
+
for (const record of readRecords()) {
|
|
136
|
+
if (!fresh(record, nowMs, ttlMs)) continue;
|
|
137
|
+
out[record.endpointKey] = record;
|
|
138
|
+
}
|
|
139
|
+
return Object.freeze(out);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function writeRecords(records: ReadonlyArray<DiscoveredEndpointSlots>): void {
|
|
143
|
+
const kept = [...records]
|
|
144
|
+
.sort((a, b) => Date.parse(b.observedAt) - Date.parse(a.observedAt))
|
|
145
|
+
.slice(0, MAX_ENDPOINT_SLOT_RECORDS);
|
|
146
|
+
const file: EndpointSlotsFile = {
|
|
147
|
+
version: 1,
|
|
148
|
+
endpoints: Object.fromEntries(kept.map((record) => [record.endpointKey, { ...record }])),
|
|
149
|
+
};
|
|
150
|
+
safeResourceWrite(endpointSlotsPath(), `${JSON.stringify(file, null, 2)}\n`, { encoding: "utf8" });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Record what a probe just learned about one endpoint. A fresh observation
|
|
155
|
+
* always replaces the stored one, including downward: a server restarted with
|
|
156
|
+
* fewer slots must be able to lower its own bound.
|
|
157
|
+
*
|
|
158
|
+
* Never throws. Losing a capacity prior degrades a later process to the
|
|
159
|
+
* conservative default; failing a probe over it would be worse.
|
|
160
|
+
*/
|
|
161
|
+
export async function recordDiscoveredEndpointSlots(
|
|
162
|
+
entry: { endpointKey: string; runtimeId: string; slots: number },
|
|
163
|
+
options?: { nowMs?: number; ttlMs?: number; onError?: (error: unknown) => void },
|
|
164
|
+
): Promise<void> {
|
|
165
|
+
if (!Number.isInteger(entry.slots) || entry.slots <= 0) return;
|
|
166
|
+
if (entry.endpointKey.length === 0 || entry.runtimeId.length === 0) return;
|
|
167
|
+
// Checked before the lock because acquiring it recreates the state root, and
|
|
168
|
+
// again under it because an uninstall can land while this call waits.
|
|
169
|
+
if (stateRootRemoved()) return;
|
|
170
|
+
const nowMs = options?.nowMs ?? Date.now();
|
|
171
|
+
const ttlMs = options?.ttlMs ?? endpointSlotsTtlMs();
|
|
172
|
+
try {
|
|
173
|
+
await withStateFileLock(endpointSlotsPath(), () => {
|
|
174
|
+
if (stateRootRemoved()) return;
|
|
175
|
+
const kept = readRecords().filter(
|
|
176
|
+
(record) => record.endpointKey !== entry.endpointKey && fresh(record, nowMs, ttlMs),
|
|
177
|
+
);
|
|
178
|
+
kept.push({
|
|
179
|
+
endpointKey: entry.endpointKey,
|
|
180
|
+
runtimeId: entry.runtimeId,
|
|
181
|
+
slots: entry.slots,
|
|
182
|
+
observedAt: new Date(nowMs).toISOString(),
|
|
183
|
+
});
|
|
184
|
+
writeRecords(kept);
|
|
185
|
+
});
|
|
186
|
+
} catch (error) {
|
|
187
|
+
options?.onError?.(error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -11,12 +11,14 @@ import { mergeCapabilities } from "./capabilities.js";
|
|
|
11
11
|
import { capabilitiesFromCatalogModel, getCatalogModelForRuntime } from "./catalog.js";
|
|
12
12
|
import type { ContextWindowProvenance, ProvidersContract, TargetHealth, TargetStatus } from "./contract.js";
|
|
13
13
|
import { credentialsPresent } from "./credentials.js";
|
|
14
|
+
import { recordEndpointSlotsFromStatus } from "./endpoint-capacity.js";
|
|
14
15
|
import { resolveProviderKnowledgeBaseRoots } from "./knowledge-base-path.js";
|
|
15
16
|
import { probeCapabilitiesForModel } from "./model-capabilities.js";
|
|
16
17
|
import { loadPluginRuntimes } from "./plugins.js";
|
|
17
18
|
import { getRuntimeRegistry } from "./registry.js";
|
|
18
19
|
import { registerBuiltinRuntimes } from "./runtimes/builtins.js";
|
|
19
20
|
import { listKnownModelsForRuntime } from "./support.js";
|
|
21
|
+
import { readTargetModelSnapshot, recordTargetModelSnapshot } from "./target-model-cache.js";
|
|
20
22
|
import type { CapabilityFlags } from "./types/capability-flags.js";
|
|
21
23
|
import { EMPTY_CAPABILITIES } from "./types/capability-flags.js";
|
|
22
24
|
import {
|
|
@@ -86,7 +88,7 @@ function positiveWindow(value: unknown): number | undefined {
|
|
|
86
88
|
* `n_ctx: 0` still discovers the window it did publish, instead of silently
|
|
87
89
|
* falling back to the runtime descriptor's placeholder.
|
|
88
90
|
*/
|
|
89
|
-
|
|
91
|
+
function capabilitiesFor(
|
|
90
92
|
desc: RuntimeDescriptor,
|
|
91
93
|
target: TargetDescriptor,
|
|
92
94
|
probe: ProbeMerge,
|
|
@@ -133,10 +135,12 @@ function discoveredModelsSource(
|
|
|
133
135
|
probe: ProbeResult | null,
|
|
134
136
|
preservePreviousProbe: boolean,
|
|
135
137
|
previous: TargetStatus | undefined,
|
|
138
|
+
cachedModels: ReadonlyArray<string>,
|
|
136
139
|
desc: RuntimeDescriptor,
|
|
137
140
|
): "probe" | "cache" | "runtime" | "none" {
|
|
138
141
|
if (probe?.models !== undefined) return "probe";
|
|
139
142
|
if (preservePreviousProbe && previous?.discoveredModels && previous.discoveredModels.length > 0) return "cache";
|
|
143
|
+
if (cachedModels.length > 0) return "cache";
|
|
140
144
|
if (desc.knownModels && desc.knownModels.length > 0) return "runtime";
|
|
141
145
|
return "none";
|
|
142
146
|
}
|
|
@@ -169,11 +173,12 @@ export interface ProbeMerge {
|
|
|
169
173
|
* `cache`, while health and availability (decided by the caller from `probe`)
|
|
170
174
|
* reflect the failure. Only a successful probe replaces the catalog.
|
|
171
175
|
*/
|
|
172
|
-
|
|
176
|
+
function mergeProbeResult(
|
|
173
177
|
desc: RuntimeDescriptor,
|
|
174
178
|
target: TargetDescriptor,
|
|
175
179
|
probe: ProbeResult | null,
|
|
176
180
|
previous: TargetStatus | undefined,
|
|
181
|
+
cachedModels: ReadonlyArray<string> = [],
|
|
177
182
|
): ProbeMerge {
|
|
178
183
|
const probeSucceeded = probe?.ok ?? false;
|
|
179
184
|
const preservePrevious = !probeSucceeded && previous !== undefined && sameProbeIdentity(previous.target, target);
|
|
@@ -189,12 +194,16 @@ export function mergeProbeResult(
|
|
|
189
194
|
probe?.notes && probe.notes.length > 0 ? probe.notes : preservePrevious ? previous.probeNotes : undefined;
|
|
190
195
|
const probeSurfaces = probe?.surfaces ?? (preservePrevious ? previous.probeSurfaces : undefined);
|
|
191
196
|
const discoveredModels = uniqueModels(
|
|
192
|
-
probe?.models ??
|
|
197
|
+
probe?.models ??
|
|
198
|
+
(preservePrevious ? previous.discoveredModels : undefined) ??
|
|
199
|
+
(cachedModels.length > 0 ? cachedModels : undefined) ??
|
|
200
|
+
desc.knownModels ??
|
|
201
|
+
[],
|
|
193
202
|
);
|
|
194
203
|
const discoveredModelStates = probe?.modelStates ?? (preservePrevious ? previous.discoveredModelStates : null) ?? null;
|
|
195
204
|
const merge: ProbeMerge = {
|
|
196
205
|
discoveredModels,
|
|
197
|
-
discoveredModelsSource: discoveredModelsSource(probe, preservePrevious, previous, desc),
|
|
206
|
+
discoveredModelsSource: discoveredModelsSource(probe, preservePrevious, previous, cachedModels, desc),
|
|
198
207
|
discoveredModelStates,
|
|
199
208
|
probeCapabilities,
|
|
200
209
|
probeModelCapabilities,
|
|
@@ -215,7 +224,7 @@ export function mergeProbeResult(
|
|
|
215
224
|
* Returns the reason when the default is not served, null when it is or when
|
|
216
225
|
* there is no live evidence either way.
|
|
217
226
|
*/
|
|
218
|
-
|
|
227
|
+
function unservedDefaultModelReason(
|
|
219
228
|
desc: Pick<RuntimeDescriptor, "id">,
|
|
220
229
|
target: Pick<TargetDescriptor, "defaultModel">,
|
|
221
230
|
merge: Pick<ProbeMerge, "discoveredModels" | "discoveredModelsSource" | "discoveredModelStates">,
|
|
@@ -316,7 +325,8 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
|
|
|
316
325
|
return out;
|
|
317
326
|
}
|
|
318
327
|
const availability = availabilityFor(desc, target, authStatusFor);
|
|
319
|
-
const
|
|
328
|
+
const cachedModels = readTargetModelSnapshot(target)?.models ?? [];
|
|
329
|
+
const merge = mergeProbeResult(desc, target, probe, previous, cachedModels);
|
|
320
330
|
const { capabilities, contextWindowProvenance } = capabilitiesFor(desc, target, merge, kb);
|
|
321
331
|
const healthy = probe !== null ? probe.ok : null;
|
|
322
332
|
const unservedDefault = probe?.ok ? unservedDefaultModelReason(desc, target, merge) : null;
|
|
@@ -386,7 +396,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
|
|
|
386
396
|
}
|
|
387
397
|
if (probeResult.ok && options?.reasoning !== false && typeof desc.probeReasoning === "function") {
|
|
388
398
|
const settings = readConfig();
|
|
389
|
-
const orchestratorTarget = settings.
|
|
399
|
+
const orchestratorTarget = settings.chat.target === target.id ? settings.chat.model : null;
|
|
390
400
|
const candidateModelId = orchestratorTarget ?? target.defaultModel ?? null;
|
|
391
401
|
if (candidateModelId) {
|
|
392
402
|
try {
|
|
@@ -414,6 +424,13 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
|
|
|
414
424
|
}
|
|
415
425
|
const status = buildStatus(target, desc, probeResult, previous);
|
|
416
426
|
statuses.set(target.id, status);
|
|
427
|
+
if (probeResult.ok && probeResult.models !== undefined) {
|
|
428
|
+
recordTargetModelSnapshot(target, probeResult.models);
|
|
429
|
+
}
|
|
430
|
+
// Durable so the next process resolves this endpoint's real slot count
|
|
431
|
+
// instead of the conservative default. Fire and forget: the probe's answer
|
|
432
|
+
// is already in `statuses`, and a failed write must not fail the probe.
|
|
433
|
+
void recordEndpointSlotsFromStatus(status);
|
|
417
434
|
context.bus.emit(BusChannels.ProviderHealth, { id: target.id, status });
|
|
418
435
|
return status;
|
|
419
436
|
}
|
|
@@ -465,7 +482,7 @@ export function createProvidersBundle(context: DomainContext): DomainBundle<Prov
|
|
|
465
482
|
registerClioOAuthProviders();
|
|
466
483
|
registerBuiltinRuntimes(registry);
|
|
467
484
|
const settings = readConfig();
|
|
468
|
-
setGlobalDefaultMaxOutputTokens(settings.
|
|
485
|
+
setGlobalDefaultMaxOutputTokens(settings.chat.maxOutputTokens);
|
|
469
486
|
await loadPluginRuntimes(registry, settings);
|
|
470
487
|
await probeAll();
|
|
471
488
|
const config = context.getContract<ConfigContract>("config");
|
|
@@ -30,13 +30,28 @@ export { isDispatchEligibleRuntime, isOrchestratorEligibleRuntime, isTargetEligi
|
|
|
30
30
|
export {
|
|
31
31
|
canonicalEndpointKey,
|
|
32
32
|
type EndpointCapacity,
|
|
33
|
+
type EndpointCapacityInput,
|
|
33
34
|
type EndpointCapacitySource,
|
|
35
|
+
type EndpointRuntimeIdentity,
|
|
36
|
+
type EndpointSlotPriors,
|
|
34
37
|
endpointCapacitiesForStatuses,
|
|
38
|
+
endpointCapacityFor,
|
|
35
39
|
endpointCapacityForStatus,
|
|
36
40
|
endpointLabel,
|
|
37
41
|
foregroundStreamUsage,
|
|
42
|
+
recordEndpointSlotsFromStatus,
|
|
38
43
|
registerForegroundStream,
|
|
44
|
+
resolveEndpointCapacities,
|
|
39
45
|
} from "./endpoint-capacity.js";
|
|
46
|
+
export {
|
|
47
|
+
DEFAULT_ENDPOINT_SLOTS_TTL_MS,
|
|
48
|
+
type DiscoveredEndpointSlots,
|
|
49
|
+
ENDPOINT_SLOTS_TTL_ENV_VAR,
|
|
50
|
+
endpointSlotsPath,
|
|
51
|
+
endpointSlotsTtlMs,
|
|
52
|
+
readDiscoveredEndpointSlots,
|
|
53
|
+
recordDiscoveredEndpointSlots,
|
|
54
|
+
} from "./endpoint-slots-store.js";
|
|
40
55
|
export { ProvidersManifest } from "./manifest.js";
|
|
41
56
|
export type { ModelCapabilityPatchTarget } from "./model-capabilities.js";
|
|
42
57
|
export { applyModelCapabilityPatch, resolveModelCapabilities } from "./model-capabilities.js";
|
|
@@ -126,6 +141,13 @@ export {
|
|
|
126
141
|
runtimeModelListSource,
|
|
127
142
|
supportGroupLabel,
|
|
128
143
|
} from "./support.js";
|
|
144
|
+
export {
|
|
145
|
+
readTargetModelSnapshot,
|
|
146
|
+
recordTargetModelSnapshot,
|
|
147
|
+
TARGET_MODEL_CACHE_TTL_MS,
|
|
148
|
+
type TargetModelSnapshot,
|
|
149
|
+
targetModelSnapshotPath,
|
|
150
|
+
} from "./target-model-cache.js";
|
|
129
151
|
export type {
|
|
130
152
|
CapabilityFlags,
|
|
131
153
|
StructuredOutputMode,
|
|
@@ -72,7 +72,7 @@ function envOverlayDirs(): string[] {
|
|
|
72
72
|
.filter((entry) => entry.length > 0);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
function resolveProviderModelCatalogDirs(
|
|
76
76
|
importMetaUrl: string,
|
|
77
77
|
options: { cwd?: string } = {},
|
|
78
78
|
): ProviderModelCatalogDirs {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { warnLegacyNaming } from "../../core/naming-compat.js";
|
|
1
2
|
import type { Api, Model } from "../../engine/types.js";
|
|
2
3
|
import { getCatalogModelForRuntime } from "./catalog.js";
|
|
3
4
|
import type { ProvidersContract, TargetStatus } from "./contract.js";
|
|
@@ -111,10 +112,19 @@ function capabilityHints(input: {
|
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
interface ClioRuntimeMetadata {
|
|
115
|
+
clioCoder?: {
|
|
116
|
+
targetId?: string;
|
|
117
|
+
runtimeId?: string;
|
|
118
|
+
lifecycle?: "user-managed" | "clio-coder-managed";
|
|
119
|
+
gateway?: boolean;
|
|
120
|
+
family?: string;
|
|
121
|
+
quirks?: LocalModelQuirks;
|
|
122
|
+
};
|
|
123
|
+
/** Released in-memory metadata name accepted at plugin/runtime read boundaries. */
|
|
114
124
|
clio?: {
|
|
115
125
|
targetId?: string;
|
|
116
126
|
runtimeId?: string;
|
|
117
|
-
lifecycle?: "user-managed" | "clio-managed";
|
|
127
|
+
lifecycle?: "user-managed" | "clio-coder-managed";
|
|
118
128
|
gateway?: boolean;
|
|
119
129
|
family?: string;
|
|
120
130
|
quirks?: LocalModelQuirks;
|
|
@@ -178,6 +188,38 @@ export function harmonyReasoningEffort(level: string | undefined): HarmonyReason
|
|
|
178
188
|
*/
|
|
179
189
|
export type ReasoningClass = "never" | "switchable" | "always";
|
|
180
190
|
|
|
191
|
+
/**
|
|
192
|
+
* Minimum completion room for a memory envelope on an always-on-thinking
|
|
193
|
+
* model. A 9B local route has been measured reasoning for more than 1,800
|
|
194
|
+
* tokens before its first `<operations>` byte, while an always-on 35B spent a
|
|
195
|
+
* 400-token allowance entirely on reasoning and ended at length. Four thousand
|
|
196
|
+
* leaves the configured 2,000-token content budget after that preamble.
|
|
197
|
+
*/
|
|
198
|
+
export const MEMORY_ALWAYS_ON_MODEL_MIN_OUTPUT_TOKENS = 4_000;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Derive the memory step's request budget from the resolved model capability.
|
|
202
|
+
* Switchable models are requested with thinking off and need only the normal
|
|
203
|
+
* content budget. An always-on mechanism cannot honor that request, so it gets
|
|
204
|
+
* explicit reasoning headroom. The runtime's known cap remains authoritative.
|
|
205
|
+
*/
|
|
206
|
+
export function memoryInterventionModelMaxTokens(input: {
|
|
207
|
+
configuredMaxTokens: number;
|
|
208
|
+
thinkingMechanism: ThinkingMechanism;
|
|
209
|
+
modelMaxTokens?: number;
|
|
210
|
+
}): number {
|
|
211
|
+
const configured =
|
|
212
|
+
Number.isSafeInteger(input.configuredMaxTokens) && input.configuredMaxTokens > 0 ? input.configuredMaxTokens : 1;
|
|
213
|
+
const requested =
|
|
214
|
+
input.thinkingMechanism === "always-on"
|
|
215
|
+
? Math.max(configured * 2, MEMORY_ALWAYS_ON_MODEL_MIN_OUTPUT_TOKENS)
|
|
216
|
+
: configured;
|
|
217
|
+
const modelCap = input.modelMaxTokens;
|
|
218
|
+
return typeof modelCap === "number" && Number.isSafeInteger(modelCap) && modelCap > 0
|
|
219
|
+
? Math.min(requested, modelCap)
|
|
220
|
+
: requested;
|
|
221
|
+
}
|
|
222
|
+
|
|
181
223
|
export function reasoningClassForMechanism(mechanism: ThinkingMechanism | null | undefined): ReasoningClass {
|
|
182
224
|
if (mechanism === "none") return "never";
|
|
183
225
|
if (mechanism === "always-on") return "always";
|
|
@@ -659,7 +701,9 @@ export function resolveModelRuntimeCapabilitiesForModel<TApi extends Api>(
|
|
|
659
701
|
model: Model<TApi>,
|
|
660
702
|
configuredThinkingLevel?: ThinkingLevel,
|
|
661
703
|
): ResolvedModelRuntimeCapabilities {
|
|
662
|
-
const
|
|
704
|
+
const runtimeModel = model as Model<TApi> & ClioRuntimeMetadata;
|
|
705
|
+
if (runtimeModel.clio !== undefined) warnLegacyNaming("model.clio", "model.clioCoder");
|
|
706
|
+
const metadata = runtimeModel.clioCoder ?? runtimeModel.clio;
|
|
663
707
|
const caps = capabilitiesFromModel(model as Model<Api> & ClioRuntimeMetadata);
|
|
664
708
|
return resolveModelRuntimeCapabilities({
|
|
665
709
|
targetId: metadata?.targetId ?? null,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ALCF (Argonne) inference-gateway model knowledge base.
|
|
2
2
|
#
|
|
3
3
|
# GPT-OSS models served through ALCF are already covered by the existing
|
|
4
|
-
# openai-gpt-oss family in local-models/clio-local-coding-targets.yaml.
|
|
4
|
+
# openai-gpt-oss family in local-models/clio-coder-local-coding-targets.yaml.
|
|
5
5
|
|
|
6
6
|
- family: meta-llama-4-maverick
|
|
7
7
|
matchPatterns:
|