@iowarp/clio-coder 0.4.1 → 0.4.3
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 +127 -0
- package/CONTRIBUTING.md +142 -52
- package/README.md +434 -473
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
- package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
- package/dist/builtins-IA7V7FUC.js +22 -0
- package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
- package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
- package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/chunk-4UVU7BJ5.js +39 -0
- package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
- package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/chunk-5MEZN6CB.js +1334 -0
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
- package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
- package/dist/chunk-7DRAWPTZ.js +360 -0
- package/dist/chunk-7E7I3WLS.js +3762 -0
- package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
- package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
- package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
- package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
- package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
- package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
- package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
- package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
- package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
- package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
- package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
- package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
- package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
- package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
- package/dist/chunk-IJNZMHLA.js +101 -0
- package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
- package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
- package/dist/chunk-JEQ3XTHC.js +42 -0
- package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
- package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
- package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
- package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
- package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
- package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
- package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
- package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
- package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
- package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
- package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
- package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
- package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/chunk-SKHCAU7K.js +385 -0
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
- package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
- package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
- package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
- package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
- package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
- package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
- package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
- package/dist/chunk-XRZT5WY5.js +47 -0
- package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
- package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
- package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
- package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
- package/dist/cli/index.js +41 -39
- package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
- package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
- package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
- package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
- package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
- package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
- package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
- package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
- package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
- package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
- package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
- package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
- package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
- package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
- package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
- package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
- package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
- package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
- package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
- package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
- package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
- package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
- package/dist/reset-EAJFFJVB.js +344 -0
- package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
- package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
- package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
- package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
- package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
- package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
- package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
- package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
- package/dist/uninstall-5PEVOE5B.js +408 -0
- package/dist/upgrade-M4WXY6KN.js +303 -0
- package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
- package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
- package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
- package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
- package/dist/worker/entry.js +90 -74
- 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} +27 -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} +29 -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} +61 -27
- package/docs/{observability.md → architecture/observability.md} +38 -14
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
- package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
- 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} +13 -5
- 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} +65 -35
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
- package/docs/guide/configuration-reference.md +1163 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/process/development-pipeline.md +152 -0
- 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} +108 -53
- 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} +11 -7
- 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 +2 -2
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +10 -8
- package/skills/README.md +52 -41
- package/skills/coding/ast-grep/SKILL.md +102 -31
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +41 -6
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +88 -29
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +81 -54
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +44 -3
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +46 -16
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +78 -64
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +88 -65
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +62 -13
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +131 -15
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -7
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +58 -3
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +54 -3
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +70 -62
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +77 -19
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +21 -2
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -2
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +27 -2
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +97 -62
- package/skills/workflow/cut-it/SKILL.md +66 -6
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +118 -28
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +87 -11
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +77 -18
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1082 -532
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +3 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +9 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +5 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +204 -149
- package/src/cli/usage.ts +86 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +61 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +89 -2
- 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/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +13 -15
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +11 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/contract.ts +11 -1
- package/src/domains/dispatch/extension.ts +237 -49
- 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/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +58 -3
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +5 -2
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- 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/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +6 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- 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 +28 -5
- package/src/domains/middleware/marketplace-offer.ts +3 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/extension.ts +17 -4
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- 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 +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +2 -0
- package/src/domains/providers/model-runtime-capabilities.ts +99 -25
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +23 -19
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/index.ts +1 -0
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +34 -11
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/entries.ts +6 -0
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +145 -39
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/external-subprocess.ts +114 -6
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +464 -251
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +16 -17
- package/src/interactive/chat-loop.ts +75 -3
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +72 -7
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-commands.ts +153 -20
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +39 -20
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +6 -1
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- 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/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +59 -21
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +6 -1
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +49 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-runner.ts +12 -0
- 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/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- 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 +41 -12
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/builtins-UJLMOVOV.js +0 -17
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/dist/chunk-Y45G3AXC.js +0 -1558
- package/dist/reset-EOLM7GVE.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-H7TOM7YL.js +0 -323
- package/docs/artifact-versions.md +0 -67
- package/docs/development-pipeline.md +0 -121
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -16,7 +16,7 @@ import { emitResidencyMutation, emitResidencyNotice, reconcileResidency, residen
|
|
|
16
16
|
import { withResidencyLock } from "./residency-lock.js";
|
|
17
17
|
|
|
18
18
|
interface LmStudioModelMetadata {
|
|
19
|
-
|
|
19
|
+
clioCoder?: {
|
|
20
20
|
targetId: string;
|
|
21
21
|
runtimeId: string;
|
|
22
22
|
lifecycle?: "user-managed" | "clio-coder-managed";
|
|
@@ -42,8 +42,8 @@ function responseInstanceId(data: unknown): string | undefined {
|
|
|
42
42
|
return typeof id === "string" && id.trim().length > 0 ? id.trim() : undefined;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
function metadata(model: Model<Api>): NonNullable<LmStudioModelMetadata["
|
|
46
|
-
return (model as Model<Api> & LmStudioModelMetadata).
|
|
45
|
+
function metadata(model: Model<Api>): NonNullable<LmStudioModelMetadata["clioCoder"]> | undefined {
|
|
46
|
+
return (model as Model<Api> & LmStudioModelMetadata).clioCoder;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function targetForModel(model: Model<"openai-completions">): TargetDescriptor | null {
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
} from "../../domains/providers/index.js";
|
|
33
33
|
import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
|
|
34
34
|
import { calculateEngineCost } from "../ai.js";
|
|
35
|
-
import { createGemmaChannelFilter } from "../gemma-channel-filter.js";
|
|
35
|
+
import { createGemmaChannelFilter, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
|
|
36
36
|
import { createSentinelStripper } from "../strip-tokenizer-sentinels.js";
|
|
37
37
|
import { remainingContextMaxTokens } from "./output-budget.js";
|
|
38
38
|
import { type ResidencyAdapter, reconcileResidency, residencyManagedFor } from "./residency.js";
|
|
@@ -43,7 +43,7 @@ import type { EngineApiProvider } from "./types.js";
|
|
|
43
43
|
const REASONING_CHARS_PER_TOKEN = 4;
|
|
44
44
|
|
|
45
45
|
interface ClioRuntimeMetadata {
|
|
46
|
-
|
|
46
|
+
clioCoder?: {
|
|
47
47
|
targetId: string;
|
|
48
48
|
runtimeId: string;
|
|
49
49
|
/** Present only when settings set the target lifecycle explicitly. */
|
|
@@ -55,11 +55,11 @@ interface ClioRuntimeMetadata {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function clioQuirks(model: Model<"ollama-native">): LocalModelQuirks | undefined {
|
|
58
|
-
return (model as Model<"ollama-native"> & ClioRuntimeMetadata).
|
|
58
|
+
return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder?.quirks;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
function ollamaTargetId(model: Model<"ollama-native">): string {
|
|
62
|
-
return (model as Model<"ollama-native"> & ClioRuntimeMetadata).
|
|
62
|
+
return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder?.targetId ?? model.provider;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
/**
|
|
@@ -74,7 +74,7 @@ function ollamaTargetId(model: Model<"ollama-native">): string {
|
|
|
74
74
|
async function reconcileOllamaResidency(model: Model<"ollama-native">, headers: Record<string, string>): Promise<void> {
|
|
75
75
|
const baseUrl = model.baseUrl;
|
|
76
76
|
if (!baseUrl) return;
|
|
77
|
-
const metadata = (model as Model<"ollama-native"> & ClioRuntimeMetadata).
|
|
77
|
+
const metadata = (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder;
|
|
78
78
|
const adapter: ResidencyAdapter = {
|
|
79
79
|
targetKey: residencyTargetKey("ollama-native", baseUrl),
|
|
80
80
|
targetId: ollamaTargetId(model),
|
|
@@ -384,7 +384,7 @@ function runStream(
|
|
|
384
384
|
let doneReason: string | undefined;
|
|
385
385
|
const sentinelStripper = createSentinelStripper();
|
|
386
386
|
const resolved = resolveModelRuntimeCapabilitiesForModel(model, thinkingLevel);
|
|
387
|
-
const channelFilter = resolved.
|
|
387
|
+
const channelFilter = usesGemmaChannelMarkers(resolved.modelId) ? createGemmaChannelFilter() : null;
|
|
388
388
|
const closeActiveThinking = () => {
|
|
389
389
|
if (!activeThinking) return;
|
|
390
390
|
stream.push({
|
|
@@ -17,6 +17,11 @@ import {
|
|
|
17
17
|
} from "@earendil-works/pi-ai";
|
|
18
18
|
import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
|
|
19
19
|
import type { BackendCompletionTimings, BackendTimingsSource } from "../../core/cache-telemetry.js";
|
|
20
|
+
import {
|
|
21
|
+
type GatewayRoutingObservation,
|
|
22
|
+
liteLLMGatewayRoutingFromHeaders,
|
|
23
|
+
liteLLMRouteFailureMessage,
|
|
24
|
+
} from "../../core/gateway-routing.js";
|
|
20
25
|
import type { ResponseModelIdObservation } from "../../core/response-model-id.js";
|
|
21
26
|
import {
|
|
22
27
|
type AppliedThinking,
|
|
@@ -27,13 +32,13 @@ import {
|
|
|
27
32
|
import { lmStudioReasoningEffort } from "../../domains/providers/runtimes/common/lmstudio-http.js";
|
|
28
33
|
import type { ThinkingLevel } from "../../domains/providers/types/capability-flags.js";
|
|
29
34
|
import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
|
|
30
|
-
import type { LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
|
|
31
|
-
import { filterGemmaChannelStream } from "../gemma-channel-filter.js";
|
|
35
|
+
import type { LiteLLMTargetSettings, LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
|
|
36
|
+
import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
|
|
32
37
|
import { HarmonyResponseParser } from "../harmony-response.js";
|
|
33
38
|
import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
|
|
34
39
|
import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
|
|
35
40
|
import { ensureLmStudioResidency } from "./lmstudio.js";
|
|
36
|
-
import {
|
|
41
|
+
import { remainingContextMaxTokens } from "./output-budget.js";
|
|
37
42
|
import { residencyManagedFor } from "./residency.js";
|
|
38
43
|
import { mergeSamplingOverride } from "./sampling-overrides.js";
|
|
39
44
|
import type { EngineApiProvider } from "./types.js";
|
|
@@ -42,6 +47,8 @@ declare module "@earendil-works/pi-ai" {
|
|
|
42
47
|
interface AssistantMessage {
|
|
43
48
|
/** Direct observation of model-id presence in an OpenAI-compatible response. */
|
|
44
49
|
responseModelIdObservation?: ResponseModelIdObservation;
|
|
50
|
+
/** Route, fallback, retry, and proxy timing facts reported by LiteLLM. */
|
|
51
|
+
gatewayRouting?: GatewayRoutingObservation;
|
|
45
52
|
/** Backend-reported prefill and prediction timings when available. */
|
|
46
53
|
backendTimings?: BackendCompletionTimings;
|
|
47
54
|
}
|
|
@@ -60,7 +67,7 @@ const REASONING_CHARS_PER_TOKEN = 4;
|
|
|
60
67
|
export { estimateInputTokensFromContext, remainingContextMaxTokens } from "./output-budget.js";
|
|
61
68
|
|
|
62
69
|
interface ClioRuntimeMetadata {
|
|
63
|
-
|
|
70
|
+
clioCoder?: {
|
|
64
71
|
targetId: string;
|
|
65
72
|
runtimeId: string;
|
|
66
73
|
/** Present only when settings set the target lifecycle explicitly. */
|
|
@@ -69,17 +76,18 @@ interface ClioRuntimeMetadata {
|
|
|
69
76
|
quirks?: LocalModelQuirks;
|
|
70
77
|
chatTemplateKwargsUnsupported?: boolean;
|
|
71
78
|
lmstudio?: LmStudioTargetSettings;
|
|
79
|
+
litellm?: LiteLLMTargetSettings;
|
|
72
80
|
lmstudioReasoningOptions?: ReadonlyArray<string>;
|
|
73
81
|
lmstudioDefaultModel?: string;
|
|
74
82
|
};
|
|
75
83
|
}
|
|
76
84
|
|
|
77
85
|
function chatTemplateKwargsUnsupported(model: Model<Api>): boolean {
|
|
78
|
-
return (model as Model<Api> & ClioRuntimeMetadata).
|
|
86
|
+
return (model as Model<Api> & ClioRuntimeMetadata).clioCoder?.chatTemplateKwargsUnsupported === true;
|
|
79
87
|
}
|
|
80
88
|
|
|
81
89
|
function clioQuirks(model: Model<"openai-completions">): LocalModelQuirks | undefined {
|
|
82
|
-
return (model as Model<"openai-completions"> & ClioRuntimeMetadata).
|
|
90
|
+
return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clioCoder?.quirks;
|
|
83
91
|
}
|
|
84
92
|
|
|
85
93
|
function pickSamplingProfile(
|
|
@@ -101,6 +109,7 @@ interface ResponseModelIdCapture {
|
|
|
101
109
|
modelIdDone: boolean;
|
|
102
110
|
backendTimings: BackendCompletionTimings | null;
|
|
103
111
|
backendTimingsSource: BackendTimingsSource | null;
|
|
112
|
+
gatewayRouting: GatewayRoutingObservation | null;
|
|
104
113
|
buffer: string;
|
|
105
114
|
decoder: TextDecoder | null;
|
|
106
115
|
}
|
|
@@ -138,7 +147,7 @@ function backendCompletionTimings(value: unknown, source: BackendTimingsSource):
|
|
|
138
147
|
}
|
|
139
148
|
|
|
140
149
|
function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
|
|
141
|
-
const metadata = (model as Model<Api> & ClioRuntimeMetadata).
|
|
150
|
+
const metadata = (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
|
|
142
151
|
if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
|
|
143
152
|
if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
|
|
144
153
|
return null;
|
|
@@ -199,7 +208,10 @@ function observeResponseModelIdBytes(
|
|
|
199
208
|
if (captureCanStopEarly(capture) || flush) capture.decoder = null;
|
|
200
209
|
}
|
|
201
210
|
|
|
202
|
-
function captureResponseModelId(response: Response, capture: ResponseModelIdCapture): Response {
|
|
211
|
+
function captureResponseModelId(response: Response, capture: ResponseModelIdCapture, model: Model<Api>): Response {
|
|
212
|
+
if (runtimeMetadata(model)?.runtimeId === "litellm") {
|
|
213
|
+
capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
|
|
214
|
+
}
|
|
203
215
|
if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
|
|
204
216
|
return response;
|
|
205
217
|
}
|
|
@@ -234,6 +246,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
234
246
|
modelIdDone: false,
|
|
235
247
|
backendTimings: null,
|
|
236
248
|
backendTimingsSource: backendTimingsSourceForModel(model),
|
|
249
|
+
gatewayRouting: null,
|
|
237
250
|
buffer: "",
|
|
238
251
|
decoder: new TextDecoder(),
|
|
239
252
|
};
|
|
@@ -241,7 +254,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
241
254
|
options.fetch ?? ((input, init) => globalThis.fetch(input, init));
|
|
242
255
|
const capturedOptions = {
|
|
243
256
|
...options,
|
|
244
|
-
fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture),
|
|
257
|
+
fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture, model),
|
|
245
258
|
} as TOptions;
|
|
246
259
|
const source = sourceFactory(capturedOptions);
|
|
247
260
|
const annotated = createAssistantMessageEventStream();
|
|
@@ -255,9 +268,11 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
255
268
|
: { state: "not-observed" };
|
|
256
269
|
if (event.type === "done") {
|
|
257
270
|
event.message.responseModelIdObservation = observation;
|
|
271
|
+
if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
|
|
258
272
|
if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
|
|
259
273
|
} else if (event.type === "error") {
|
|
260
274
|
event.error.responseModelIdObservation = observation;
|
|
275
|
+
if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
|
|
261
276
|
if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
|
|
262
277
|
}
|
|
263
278
|
annotated.push(event as AssistantMessageEvent);
|
|
@@ -271,6 +286,31 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
271
286
|
return annotated;
|
|
272
287
|
}
|
|
273
288
|
|
|
289
|
+
/** Make a failed physical gateway route final and useful to an operator. */
|
|
290
|
+
function withLiteLLMRouteFailureAdvice(
|
|
291
|
+
model: Model<"openai-completions">,
|
|
292
|
+
source: AssistantMessageEventStream,
|
|
293
|
+
): AssistantMessageEventStream {
|
|
294
|
+
const metadata = runtimeMetadata(model);
|
|
295
|
+
if (metadata?.runtimeId !== "litellm") return source;
|
|
296
|
+
const advised = createAssistantMessageEventStream();
|
|
297
|
+
(async () => {
|
|
298
|
+
try {
|
|
299
|
+
for await (const event of source) {
|
|
300
|
+
if (event.type === "error") {
|
|
301
|
+
event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata.targetId, model.id);
|
|
302
|
+
}
|
|
303
|
+
advised.push(event as AssistantMessageEvent);
|
|
304
|
+
}
|
|
305
|
+
advised.end();
|
|
306
|
+
} catch (err) {
|
|
307
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
308
|
+
throw new Error(liteLLMRouteFailureMessage(message, metadata.targetId, model.id));
|
|
309
|
+
}
|
|
310
|
+
})();
|
|
311
|
+
return advised;
|
|
312
|
+
}
|
|
313
|
+
|
|
274
314
|
function samplingParamsFromProfile(profile: SamplingProfile): Record<string, unknown> {
|
|
275
315
|
return {
|
|
276
316
|
...(profile.topP !== undefined ? { top_p: profile.topP } : {}),
|
|
@@ -371,8 +411,23 @@ function applyThinkingPayload(
|
|
|
371
411
|
resolved: ResolvedModelRuntimeCapabilities,
|
|
372
412
|
model: Model<Api>,
|
|
373
413
|
): Record<string, unknown> {
|
|
374
|
-
if (applied.mechanism === "none")
|
|
375
|
-
|
|
414
|
+
if (applied.mechanism === "none") {
|
|
415
|
+
const next = stripThinkingRequestFields(payload);
|
|
416
|
+
if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
|
|
417
|
+
const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
|
|
418
|
+
next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
|
|
419
|
+
}
|
|
420
|
+
return next;
|
|
421
|
+
}
|
|
422
|
+
if (applied.mechanism === "always-on") {
|
|
423
|
+
if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
|
|
424
|
+
const next: Record<string, unknown> = { ...payload };
|
|
425
|
+
const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
|
|
426
|
+
next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
|
|
427
|
+
return next;
|
|
428
|
+
}
|
|
429
|
+
return payload;
|
|
430
|
+
}
|
|
376
431
|
const next: Record<string, unknown> = { ...payload };
|
|
377
432
|
if (
|
|
378
433
|
resolved.request.reasoningEffort &&
|
|
@@ -380,6 +435,17 @@ function applyThinkingPayload(
|
|
|
380
435
|
) {
|
|
381
436
|
next.reasoning_effort = resolved.request.reasoningEffort;
|
|
382
437
|
}
|
|
438
|
+
// LiteLLM generic openai/<local model> routes otherwise drop this standard
|
|
439
|
+
// parameter. Allow only the effort this model/runtime actually resolved;
|
|
440
|
+
// unknown off controls and unrelated caller parameters gain no allowance.
|
|
441
|
+
if (
|
|
442
|
+
resolved.runtimeId === "litellm" &&
|
|
443
|
+
resolved.request.reasoningEffort &&
|
|
444
|
+
next.reasoning_effort === resolved.request.reasoningEffort
|
|
445
|
+
) {
|
|
446
|
+
const allowed = Array.isArray(next.allowed_openai_params) ? next.allowed_openai_params : [];
|
|
447
|
+
next.allowed_openai_params = [...new Set([...allowed, "reasoning_effort"])];
|
|
448
|
+
}
|
|
383
449
|
if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
|
|
384
450
|
const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
|
|
385
451
|
next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
|
|
@@ -418,15 +484,15 @@ function applyLmStudioPayload(
|
|
|
418
484
|
if (request?.ttlSeconds !== undefined) next.ttl = request.ttlSeconds;
|
|
419
485
|
if (request?.draftModel !== undefined) next.draft_model = request.draftModel;
|
|
420
486
|
if (resolved.thinking.mechanism === "none" || resolved.thinking.mechanism === "always-on") return next;
|
|
421
|
-
const resolvedEffort =
|
|
422
|
-
resolved.
|
|
423
|
-
lmStudioReasoningEffort(resolved.thinking.effectiveLevel
|
|
487
|
+
const resolvedEffort = runtimeMetadata(model)?.lmstudioReasoningOptions
|
|
488
|
+
? lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions)
|
|
489
|
+
: (resolved.request.reasoningEffort ?? lmStudioReasoningEffort(resolved.thinking.effectiveLevel));
|
|
424
490
|
switch (request?.reasoning) {
|
|
425
491
|
case "off":
|
|
426
|
-
next.reasoning_effort = "
|
|
492
|
+
next.reasoning_effort = lmStudioReasoningEffort("off", runtimeMetadata(model)?.lmstudioReasoningOptions);
|
|
427
493
|
break;
|
|
428
494
|
case "on":
|
|
429
|
-
next.reasoning_effort = "low";
|
|
495
|
+
next.reasoning_effort = lmStudioReasoningEffort("low", runtimeMetadata(model)?.lmstudioReasoningOptions);
|
|
430
496
|
break;
|
|
431
497
|
case "low":
|
|
432
498
|
case "medium":
|
|
@@ -563,21 +629,53 @@ function withRemainingContextBudget<TOptions extends StreamOptions>(
|
|
|
563
629
|
context: Context,
|
|
564
630
|
options: TOptions | undefined,
|
|
565
631
|
): TOptions {
|
|
566
|
-
const metadata = runtimeMetadata(model);
|
|
567
|
-
const localToolOutputLimit =
|
|
568
|
-
options?.maxTokens === undefined &&
|
|
569
|
-
(context.tools?.length ?? 0) > 0 &&
|
|
570
|
-
(model.provider === "llamacpp" || metadata?.runtimeId === "llamacpp")
|
|
571
|
-
? LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS
|
|
572
|
-
: undefined;
|
|
573
632
|
return {
|
|
574
633
|
...(options ?? {}),
|
|
575
|
-
maxTokens: remainingContextMaxTokens(
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
634
|
+
maxTokens: remainingContextMaxTokens(model, context, options),
|
|
635
|
+
} as TOptions;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
function hasHeader(headers: Readonly<Record<string, unknown>> | undefined, name: string): boolean {
|
|
639
|
+
if (!headers) return false;
|
|
640
|
+
const wanted = name.toLowerCase();
|
|
641
|
+
return Object.keys(headers).some((key) => key.toLowerCase() === wanted);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Apply LiteLLM's request-control headers at the final transport boundary.
|
|
646
|
+
*
|
|
647
|
+
* The OpenAI SDK otherwise retries twice below Clio's visible recovery loop and
|
|
648
|
+
* below LiteLLM's own router, multiplying a single failure into several hidden
|
|
649
|
+
* attempts. Gateway requests use zero client retries by default; optional
|
|
650
|
+
* `numRetries` controls the proxy router itself, where any configured attempts
|
|
651
|
+
* remain observable. A physical-routing gateway should leave it at zero.
|
|
652
|
+
*/
|
|
653
|
+
function withLiteLLMRequestOptions<TOptions extends StreamOptions>(
|
|
654
|
+
model: Model<"openai-completions">,
|
|
655
|
+
options: TOptions,
|
|
656
|
+
): TOptions {
|
|
657
|
+
const metadata = runtimeMetadata(model);
|
|
658
|
+
if (metadata?.runtimeId !== "litellm") return options;
|
|
659
|
+
const request = metadata.litellm?.request;
|
|
660
|
+
const modelHeaders = model.headers as Readonly<Record<string, unknown>> | undefined;
|
|
661
|
+
const optionHeaders = options.headers as Readonly<Record<string, unknown>> | undefined;
|
|
662
|
+
const headers: Record<string, string | null> = { ...(options.headers ?? {}) };
|
|
663
|
+
const setDefault = (name: string, value: string | undefined): void => {
|
|
664
|
+
if (value === undefined || hasHeader(modelHeaders, name) || hasHeader(optionHeaders, name)) return;
|
|
665
|
+
headers[name] = value;
|
|
666
|
+
};
|
|
667
|
+
setDefault("x-litellm-tags", ["clio-coder", ...(request?.tags ?? [])].join(","));
|
|
668
|
+
if (request?.sendSessionId !== false) setDefault("x-litellm-session-id", options.sessionId);
|
|
669
|
+
setDefault("x-litellm-timeout", request?.timeoutSeconds?.toString());
|
|
670
|
+
setDefault("x-litellm-stream-timeout", request?.streamTimeoutSeconds?.toString());
|
|
671
|
+
setDefault("x-litellm-num-retries", request?.numRetries?.toString());
|
|
672
|
+
return {
|
|
673
|
+
...options,
|
|
674
|
+
headers,
|
|
675
|
+
// Never hide duplicate attempts inside the OpenAI SDK beneath Clio's
|
|
676
|
+
// operator-visible failure. The gateway may still be configured to retry,
|
|
677
|
+
// but physical-routing deployments should keep that policy at zero too.
|
|
678
|
+
maxRetries: options.maxRetries ?? 0,
|
|
581
679
|
} as TOptions;
|
|
582
680
|
}
|
|
583
681
|
|
|
@@ -593,8 +691,8 @@ function hasEmptyArguments(args: Record<string, unknown>): boolean {
|
|
|
593
691
|
return Object.keys(args).length === 0;
|
|
594
692
|
}
|
|
595
693
|
|
|
596
|
-
function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["
|
|
597
|
-
return (model as Model<Api> & ClioRuntimeMetadata).
|
|
694
|
+
function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clioCoder"]> | undefined {
|
|
695
|
+
return (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
|
|
598
696
|
}
|
|
599
697
|
|
|
600
698
|
function emptyErrorMessage(model: Model<"openai-completions">, message: string): AssistantMessage {
|
|
@@ -918,15 +1016,18 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
918
1016
|
const resolved = resolvedCapabilitiesForModel(model, defaultLevel);
|
|
919
1017
|
const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
|
|
920
1018
|
const withSamplers = withSamplingOverrides(model, options, resolved);
|
|
1019
|
+
const withGatewayOptions = withLiteLLMRequestOptions(
|
|
1020
|
+
model,
|
|
1021
|
+
withRemainingContextBudget(model, effectiveContext, withSamplers),
|
|
1022
|
+
);
|
|
921
1023
|
return guardMalformedToolCalls(
|
|
922
1024
|
withReasoningTokenEstimate(
|
|
923
1025
|
stripSentinelsFromStream(
|
|
924
1026
|
stripNeverReasoningFromStream(
|
|
925
1027
|
filterGemmaChannelStream(
|
|
926
|
-
|
|
1028
|
+
withLiteLLMRouteFailureAdvice(
|
|
927
1029
|
model,
|
|
928
|
-
|
|
929
|
-
(capturedOptions) =>
|
|
1030
|
+
withResponseModelIdCapture(model, withGatewayOptions, (capturedOptions) =>
|
|
930
1031
|
withLocalResidency(
|
|
931
1032
|
model,
|
|
932
1033
|
{
|
|
@@ -935,8 +1036,9 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
935
1036
|
},
|
|
936
1037
|
(requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions),
|
|
937
1038
|
),
|
|
1039
|
+
),
|
|
938
1040
|
),
|
|
939
|
-
resolved.
|
|
1041
|
+
usesGemmaChannelMarkers(resolved.modelId),
|
|
940
1042
|
),
|
|
941
1043
|
resolved,
|
|
942
1044
|
),
|
|
@@ -951,15 +1053,18 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
951
1053
|
const resolved = resolvedCapabilitiesForModel(model, thinkingLevelFromSimple(options));
|
|
952
1054
|
const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
|
|
953
1055
|
const withSamplers = withSamplingOverrides(model, options, resolved);
|
|
1056
|
+
const withGatewayOptions = withLiteLLMRequestOptions(
|
|
1057
|
+
model,
|
|
1058
|
+
withRemainingContextBudget(model, effectiveContext, withSamplers),
|
|
1059
|
+
);
|
|
954
1060
|
return guardMalformedToolCalls(
|
|
955
1061
|
withReasoningTokenEstimate(
|
|
956
1062
|
stripSentinelsFromStream(
|
|
957
1063
|
stripNeverReasoningFromStream(
|
|
958
1064
|
filterGemmaChannelStream(
|
|
959
|
-
|
|
1065
|
+
withLiteLLMRouteFailureAdvice(
|
|
960
1066
|
model,
|
|
961
|
-
|
|
962
|
-
(capturedOptions) =>
|
|
1067
|
+
withResponseModelIdCapture(model, withGatewayOptions, (capturedOptions) =>
|
|
963
1068
|
withLocalResidency(
|
|
964
1069
|
model,
|
|
965
1070
|
{
|
|
@@ -968,8 +1073,9 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
968
1073
|
},
|
|
969
1074
|
(requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions),
|
|
970
1075
|
),
|
|
1076
|
+
),
|
|
971
1077
|
),
|
|
972
|
-
resolved.
|
|
1078
|
+
usesGemmaChannelMarkers(resolved.modelId),
|
|
973
1079
|
),
|
|
974
1080
|
resolved,
|
|
975
1081
|
),
|
|
@@ -13,7 +13,7 @@ const DEFAULT_MAX_OUTPUT_TOKENS = CLIO_MIN_MAX_OUTPUT_TOKENS;
|
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Process-wide default output budget requested per turn, sourced from
|
|
16
|
-
*
|
|
16
|
+
* chat.maxOutputTokens at session start (see
|
|
17
17
|
* {@link setGlobalDefaultMaxOutputTokens}). 0 means unset: callers fall back to
|
|
18
18
|
* the model's advertised cap as before.
|
|
19
19
|
*/
|
|
@@ -30,19 +30,6 @@ export function setGlobalDefaultMaxOutputTokens(value: number): void {
|
|
|
30
30
|
globalDefaultMaxOutputTokens = Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
/**
|
|
34
|
-
* Output ceiling applied to a llama.cpp tool-bearing turn when the caller did
|
|
35
|
-
* not request an explicit limit. It bounds a genuinely runaway local
|
|
36
|
-
* generation without muzzling real work: a single tool call that writes a
|
|
37
|
-
* sizable file (a full HTML page, a multi-function source module) needs far
|
|
38
|
-
* more than a few thousand tokens of argument, and the tool-call argument
|
|
39
|
-
* counts against this same response budget. Narration loops where a local
|
|
40
|
-
* model keeps saying it will call a tool without emitting one are caught
|
|
41
|
-
* separately by assessToolProseLoop, so this number only has to be large
|
|
42
|
-
* enough to let legitimate large outputs through.
|
|
43
|
-
*/
|
|
44
|
-
export const LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS = CLIO_MIN_MAX_OUTPUT_TOKENS;
|
|
45
|
-
|
|
46
33
|
/**
|
|
47
34
|
* Tokens a preflight context check should hold back for the response: the
|
|
48
35
|
* smaller of the model's advertised output limit and the default output
|
|
@@ -84,15 +71,18 @@ export function remainingContextMaxTokens(
|
|
|
84
71
|
const modelLimit = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
|
|
85
72
|
// Precedence for the requested ceiling when the caller gave no explicit
|
|
86
73
|
// maxTokens: a more-specific tool-turn limit, then the global default, then
|
|
87
|
-
// the model's advertised cap.
|
|
88
|
-
//
|
|
89
|
-
//
|
|
74
|
+
// the model's advertised cap. A model that advertises no cap uses the product
|
|
75
|
+
// floor instead of requesting its entire remaining context window. Math.min
|
|
76
|
+
// below clamps the result down to every known boundary, so frontier providers
|
|
77
|
+
// with a known cap never receive a larger max_tokens value.
|
|
90
78
|
const defaultLimit =
|
|
91
79
|
limits?.maxOutputTokens !== undefined && limits.maxOutputTokens > 0
|
|
92
80
|
? limits.maxOutputTokens
|
|
93
81
|
: globalDefaultMaxOutputTokens > 0
|
|
94
82
|
? globalDefaultMaxOutputTokens
|
|
95
|
-
:
|
|
83
|
+
: model.maxTokens > 0
|
|
84
|
+
? modelLimit
|
|
85
|
+
: DEFAULT_MAX_OUTPUT_TOKENS;
|
|
96
86
|
const requested = options?.maxTokens ?? defaultLimit;
|
|
97
87
|
const resolved = Math.min(requested, modelLimit, budget);
|
|
98
88
|
return Number.isFinite(resolved) ? resolved : DEFAULT_MAX_OUTPUT_TOKENS;
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
*
|
|
27
27
|
* The reconciler is best-effort and non-blocking. A slow or unreachable
|
|
28
28
|
* server, or a malformed resident listing, degrades to observe-only and never
|
|
29
|
-
* crashes a turn.
|
|
30
|
-
*
|
|
29
|
+
* crashes a turn. An explicit target `lifecycle: user-managed` forces
|
|
30
|
+
* observe-only on every runtime path.
|
|
31
31
|
* Every collision or stress case emits a notice over the event bus instead of
|
|
32
32
|
* a thrown error. One reconcile decision holds per (target, model) within a
|
|
33
33
|
* TTL, and mutations for a target are serialized across processes through a
|
|
@@ -280,7 +280,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
|
|
|
280
280
|
facts,
|
|
281
281
|
"swap",
|
|
282
282
|
"warning",
|
|
283
|
-
`swapping resident '${entry.modelId}' for requested '${facts.keepModelId}' on '${facts.targetId}' (Clio did not load it; recorded transition instead of a silent unload; set
|
|
283
|
+
`swapping resident '${entry.modelId}' for requested '${facts.keepModelId}' on '${facts.targetId}' (Clio did not load it; recorded transition instead of a silent unload; set lifecycle: user-managed to forbid swaps).`,
|
|
284
284
|
{
|
|
285
285
|
...(entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : {}),
|
|
286
286
|
swappedOut: entry.modelId,
|
|
@@ -775,29 +775,10 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
|
|
|
775
775
|
}
|
|
776
776
|
|
|
777
777
|
/**
|
|
778
|
-
*
|
|
779
|
-
*
|
|
780
|
-
*
|
|
781
|
-
* through {@link residencyManagedFor}.
|
|
778
|
+
* Residency policy for one target. An absent lifecycle means the operator made
|
|
779
|
+
* no choice and Clio manages by default; runtime synthesis only sets the
|
|
780
|
+
* metadata field when settings carry an explicit value.
|
|
782
781
|
*/
|
|
783
|
-
export function
|
|
784
|
-
|
|
785
|
-
if (opt === "observe" || opt === "off" || opt === "0" || opt === "false" || opt === "user" || opt === "user-managed") {
|
|
786
|
-
return false;
|
|
787
|
-
}
|
|
788
|
-
return true;
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
/**
|
|
792
|
-
* Combined residency opt-out for one target: the process-wide env switch plus
|
|
793
|
-
* the target's explicit `lifecycle: user-managed`. An absent lifecycle means
|
|
794
|
-
* the operator made no choice, and Clio manages by default; runtime synthesis
|
|
795
|
-
* only sets the metadata field when settings carry an explicit value.
|
|
796
|
-
*/
|
|
797
|
-
export function residencyManagedFor(
|
|
798
|
-
lifecycle: "user-managed" | "clio-coder-managed" | undefined,
|
|
799
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
800
|
-
): boolean {
|
|
801
|
-
if (lifecycle === "user-managed") return false;
|
|
802
|
-
return residencyManaged(env);
|
|
782
|
+
export function residencyManagedFor(lifecycle: "user-managed" | "clio-coder-managed" | undefined): boolean {
|
|
783
|
+
return lifecycle !== "user-managed";
|
|
803
784
|
}
|