@iowarp/clio-coder 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +20 -3
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +22 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -28,12 +28,12 @@ import { lmStudioReasoningEffort } from "../../domains/providers/runtimes/common
|
|
|
28
28
|
import type { ThinkingLevel } from "../../domains/providers/types/capability-flags.js";
|
|
29
29
|
import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
|
|
30
30
|
import type { LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
|
|
31
|
-
import { filterGemmaChannelStream } from "../gemma-channel-filter.js";
|
|
31
|
+
import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
|
|
32
32
|
import { HarmonyResponseParser } from "../harmony-response.js";
|
|
33
33
|
import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
|
|
34
34
|
import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
|
|
35
35
|
import { ensureLmStudioResidency } from "./lmstudio.js";
|
|
36
|
-
import {
|
|
36
|
+
import { remainingContextMaxTokens } from "./output-budget.js";
|
|
37
37
|
import { residencyManagedFor } from "./residency.js";
|
|
38
38
|
import { mergeSamplingOverride } from "./sampling-overrides.js";
|
|
39
39
|
import type { EngineApiProvider } from "./types.js";
|
|
@@ -60,11 +60,11 @@ const REASONING_CHARS_PER_TOKEN = 4;
|
|
|
60
60
|
export { estimateInputTokensFromContext, remainingContextMaxTokens } from "./output-budget.js";
|
|
61
61
|
|
|
62
62
|
interface ClioRuntimeMetadata {
|
|
63
|
-
|
|
63
|
+
clioCoder?: {
|
|
64
64
|
targetId: string;
|
|
65
65
|
runtimeId: string;
|
|
66
66
|
/** Present only when settings set the target lifecycle explicitly. */
|
|
67
|
-
lifecycle?: "user-managed" | "clio-managed";
|
|
67
|
+
lifecycle?: "user-managed" | "clio-coder-managed";
|
|
68
68
|
gateway?: boolean;
|
|
69
69
|
quirks?: LocalModelQuirks;
|
|
70
70
|
chatTemplateKwargsUnsupported?: boolean;
|
|
@@ -75,11 +75,11 @@ interface ClioRuntimeMetadata {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function chatTemplateKwargsUnsupported(model: Model<Api>): boolean {
|
|
78
|
-
return (model as Model<Api> & ClioRuntimeMetadata).
|
|
78
|
+
return (model as Model<Api> & ClioRuntimeMetadata).clioCoder?.chatTemplateKwargsUnsupported === true;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
function clioQuirks(model: Model<"openai-completions">): LocalModelQuirks | undefined {
|
|
82
|
-
return (model as Model<"openai-completions"> & ClioRuntimeMetadata).
|
|
82
|
+
return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clioCoder?.quirks;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
function pickSamplingProfile(
|
|
@@ -138,7 +138,7 @@ function backendCompletionTimings(value: unknown, source: BackendTimingsSource):
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
|
|
141
|
-
const metadata = (model as Model<Api> & ClioRuntimeMetadata).
|
|
141
|
+
const metadata = (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
|
|
142
142
|
if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
|
|
143
143
|
if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
|
|
144
144
|
return null;
|
|
@@ -371,8 +371,23 @@ function applyThinkingPayload(
|
|
|
371
371
|
resolved: ResolvedModelRuntimeCapabilities,
|
|
372
372
|
model: Model<Api>,
|
|
373
373
|
): Record<string, unknown> {
|
|
374
|
-
if (applied.mechanism === "none")
|
|
375
|
-
|
|
374
|
+
if (applied.mechanism === "none") {
|
|
375
|
+
const next = stripThinkingRequestFields(payload);
|
|
376
|
+
if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
|
|
377
|
+
const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
|
|
378
|
+
next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
|
|
379
|
+
}
|
|
380
|
+
return next;
|
|
381
|
+
}
|
|
382
|
+
if (applied.mechanism === "always-on") {
|
|
383
|
+
if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
|
|
384
|
+
const next: Record<string, unknown> = { ...payload };
|
|
385
|
+
const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
|
|
386
|
+
next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
|
|
387
|
+
return next;
|
|
388
|
+
}
|
|
389
|
+
return payload;
|
|
390
|
+
}
|
|
376
391
|
const next: Record<string, unknown> = { ...payload };
|
|
377
392
|
if (
|
|
378
393
|
resolved.request.reasoningEffort &&
|
|
@@ -563,21 +578,9 @@ function withRemainingContextBudget<TOptions extends StreamOptions>(
|
|
|
563
578
|
context: Context,
|
|
564
579
|
options: TOptions | undefined,
|
|
565
580
|
): 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
581
|
return {
|
|
574
582
|
...(options ?? {}),
|
|
575
|
-
maxTokens: remainingContextMaxTokens(
|
|
576
|
-
model,
|
|
577
|
-
context,
|
|
578
|
-
options,
|
|
579
|
-
localToolOutputLimit === undefined ? undefined : { maxOutputTokens: localToolOutputLimit },
|
|
580
|
-
),
|
|
583
|
+
maxTokens: remainingContextMaxTokens(model, context, options),
|
|
581
584
|
} as TOptions;
|
|
582
585
|
}
|
|
583
586
|
|
|
@@ -593,8 +596,8 @@ function hasEmptyArguments(args: Record<string, unknown>): boolean {
|
|
|
593
596
|
return Object.keys(args).length === 0;
|
|
594
597
|
}
|
|
595
598
|
|
|
596
|
-
function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["
|
|
597
|
-
return (model as Model<Api> & ClioRuntimeMetadata).
|
|
599
|
+
function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clioCoder"]> | undefined {
|
|
600
|
+
return (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
|
|
598
601
|
}
|
|
599
602
|
|
|
600
603
|
function emptyErrorMessage(model: Model<"openai-completions">, message: string): AssistantMessage {
|
|
@@ -679,7 +682,7 @@ function hasReportedReasoningUsage(usage: Usage): boolean {
|
|
|
679
682
|
* upstream already reported reasoning usage, because ACP consumers accept all
|
|
680
683
|
* three field spellings for cross-agent compatibility.
|
|
681
684
|
*/
|
|
682
|
-
|
|
685
|
+
function applyOpenAICompatReasoningEstimate(message: AssistantMessage): void {
|
|
683
686
|
if (hasReportedReasoningUsage(message.usage)) return;
|
|
684
687
|
const estimated = estimateReasoningTokens(message.content);
|
|
685
688
|
const reportedOutput = message.usage.output;
|
|
@@ -936,7 +939,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
936
939
|
(requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions),
|
|
937
940
|
),
|
|
938
941
|
),
|
|
939
|
-
resolved.
|
|
942
|
+
usesGemmaChannelMarkers(resolved.modelId),
|
|
940
943
|
),
|
|
941
944
|
resolved,
|
|
942
945
|
),
|
|
@@ -969,7 +972,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
969
972
|
(requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions),
|
|
970
973
|
),
|
|
971
974
|
),
|
|
972
|
-
resolved.
|
|
975
|
+
usesGemmaChannelMarkers(resolved.modelId),
|
|
973
976
|
),
|
|
974
977
|
resolved,
|
|
975
978
|
),
|
|
@@ -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
|
|
@@ -130,7 +130,7 @@ export function residentTagProtected(tags: ReadonlyArray<string> | undefined): b
|
|
|
130
130
|
const clioLoaded = new Map<string, Set<string>>();
|
|
131
131
|
|
|
132
132
|
/** Record that Clio loaded `modelId` on the target identified by `targetKey`. */
|
|
133
|
-
|
|
133
|
+
function markClioLoaded(targetKey: string, modelId: string): void {
|
|
134
134
|
let set = clioLoaded.get(targetKey);
|
|
135
135
|
if (!set) {
|
|
136
136
|
set = new Set();
|
|
@@ -156,12 +156,6 @@ function isClioLoaded(targetKey: string, entry: ResidentModelInfo): boolean {
|
|
|
156
156
|
export const RECONCILE_TTL_MS = 60_000;
|
|
157
157
|
const reconcileCache = new Map<string, { modelId: string; decision: "reconcile" | "observe"; at: number }>();
|
|
158
158
|
|
|
159
|
-
/** Test-only: clear the cross-call Clio-loaded registry and TTL cache. */
|
|
160
|
-
export function resetResidencyState(): void {
|
|
161
|
-
clioLoaded.clear();
|
|
162
|
-
reconcileCache.clear();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
159
|
// --- residency decision (pure) ----------------------------------------------
|
|
166
160
|
|
|
167
161
|
/**
|
|
@@ -286,7 +280,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
|
|
|
286
280
|
facts,
|
|
287
281
|
"swap",
|
|
288
282
|
"warning",
|
|
289
|
-
`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).`,
|
|
290
284
|
{
|
|
291
285
|
...(entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : {}),
|
|
292
286
|
swappedOut: entry.modelId,
|
|
@@ -301,7 +295,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
|
|
|
301
295
|
* tiers, eviction order, and every notice case directly testable without a
|
|
302
296
|
* server.
|
|
303
297
|
*/
|
|
304
|
-
|
|
298
|
+
function decideResidency(facts: ResidencyFacts): ResidencyPlan {
|
|
305
299
|
const notices: ResidencyNotice[] = [];
|
|
306
300
|
const keepResident = facts.resident.some((entry) => residentMatchesKeep(entry, facts.keepModelId));
|
|
307
301
|
const others = facts.resident.filter((entry) => !residentMatchesKeep(entry, facts.keepModelId));
|
|
@@ -781,29 +775,10 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
|
|
|
781
775
|
}
|
|
782
776
|
|
|
783
777
|
/**
|
|
784
|
-
*
|
|
785
|
-
*
|
|
786
|
-
*
|
|
787
|
-
* through {@link residencyManagedFor}.
|
|
788
|
-
*/
|
|
789
|
-
export function residencyManaged(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
790
|
-
const opt = (env.CLIO_CODER_RESIDENCY ?? "").trim().toLowerCase();
|
|
791
|
-
if (opt === "observe" || opt === "off" || opt === "0" || opt === "false" || opt === "user" || opt === "user-managed") {
|
|
792
|
-
return false;
|
|
793
|
-
}
|
|
794
|
-
return true;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
/**
|
|
798
|
-
* Combined residency opt-out for one target: the process-wide env switch plus
|
|
799
|
-
* the target's explicit `lifecycle: user-managed`. An absent lifecycle means
|
|
800
|
-
* the operator made no choice, and Clio manages by default; runtime synthesis
|
|
801
|
-
* only sets the metadata field when settings carry an explicit value.
|
|
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.
|
|
802
781
|
*/
|
|
803
|
-
export function residencyManagedFor(
|
|
804
|
-
lifecycle
|
|
805
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
806
|
-
): boolean {
|
|
807
|
-
if (lifecycle === "user-managed") return false;
|
|
808
|
-
return residencyManaged(env);
|
|
782
|
+
export function residencyManagedFor(lifecycle: "user-managed" | "clio-coder-managed" | undefined): boolean {
|
|
783
|
+
return lifecycle !== "user-managed";
|
|
809
784
|
}
|
|
@@ -66,20 +66,9 @@ export type ClaudeAgentSdkLoader = () => Promise<ClaudeAgentSdkModule>;
|
|
|
66
66
|
// runtime `import()`.
|
|
67
67
|
const realLoader: ClaudeAgentSdkLoader = async () => await import("@anthropic-ai/claude-agent-sdk");
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
const loader: ClaudeAgentSdkLoader = realLoader;
|
|
70
70
|
let cached: ClaudeAgentSdkModule | null = null;
|
|
71
71
|
|
|
72
|
-
/**
|
|
73
|
-
* Swap the import used by {@link loadClaudeAgentSdk}. The absence of a 224MB
|
|
74
|
-
* optional package cannot be staged inside a normal test process, so the
|
|
75
|
-
* contract test intercepts the import here; passing `null` restores the real
|
|
76
|
-
* one and clears the cache.
|
|
77
|
-
*/
|
|
78
|
-
export function setClaudeAgentSdkLoader(next: ClaudeAgentSdkLoader | null): void {
|
|
79
|
-
loader = next ?? realLoader;
|
|
80
|
-
cached = null;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
72
|
/**
|
|
84
73
|
* Resolve the SDK, or fail with {@link ClaudeAgentSdkUnavailableError}. A load
|
|
85
74
|
* error that is not a resolution failure (a broken install, a throwing module
|
|
@@ -53,11 +53,11 @@ async function* oneSdkUserMessage(message: SDKUserMessage): AsyncIterable<SDKUse
|
|
|
53
53
|
yield message;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
function claudeSdkPermissionModeForAutonomy(_level: AutonomyLevel | undefined): PermissionMode {
|
|
57
57
|
return "default";
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
function claudeSdkToolsForAutonomy(_level: AutonomyLevel | undefined): NonNullable<Options["tools"]> {
|
|
61
61
|
return DEFAULT_CLAUDE_TOOLS;
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -314,7 +314,7 @@ export interface ClaudeWorkerBudgetGate {
|
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
/** Canonical call counter shared by the SDK's PreToolUse/canUseTool mediation seam. */
|
|
317
|
-
|
|
317
|
+
function createClaudeWorkerBudgetGate(
|
|
318
318
|
budget: WorkerBudget,
|
|
319
319
|
onBoundary: () => void,
|
|
320
320
|
onHardCap: () => void,
|
|
@@ -438,7 +438,7 @@ function decideToolUse(
|
|
|
438
438
|
}
|
|
439
439
|
|
|
440
440
|
/** Share one logical permission decision across the SDK hook/callback pair. */
|
|
441
|
-
|
|
441
|
+
function decideClaudeSdkToolUseOnce(
|
|
442
442
|
handled: Map<string, ClaudeToolPermissionDecision>,
|
|
443
443
|
toolUseID: string | undefined,
|
|
444
444
|
decide: () => ClaudeToolPermissionDecision,
|
|
@@ -536,7 +536,7 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
|
|
|
536
536
|
() => {},
|
|
537
537
|
() => {
|
|
538
538
|
budgetFailure = true;
|
|
539
|
-
emit({ type: "
|
|
539
|
+
emit({ type: "clio_coder_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
|
|
540
540
|
abort();
|
|
541
541
|
},
|
|
542
542
|
resolveDeliveryTools(allowedToolSet, input.product),
|
|
@@ -563,7 +563,7 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
|
|
|
563
563
|
if (hookInput.hook_event_name !== "PostToolBatch" || !budgetGate?.phaseReached()) return { continue: true };
|
|
564
564
|
if (input.budget?.synthesis === false) {
|
|
565
565
|
budgetFailure = true;
|
|
566
|
-
emit({ type: "
|
|
566
|
+
emit({ type: "clio_coder_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
|
|
567
567
|
return { continue: false, stopReason: `worker agent budget reached (${input.budget.toolCalls})` };
|
|
568
568
|
}
|
|
569
569
|
return {
|
|
@@ -54,7 +54,7 @@ function buildClaudeCodePrompt(input: WorkerRunInput): string {
|
|
|
54
54
|
return parts.join("\n\n");
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
|
|
58
58
|
assertToolProfileEnforceable(input.toolProfile, "claude-code");
|
|
59
59
|
const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy);
|
|
60
60
|
const args = [
|
|
@@ -227,7 +227,7 @@ function budgetDenial(
|
|
|
227
227
|
};
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
function evaluateClaudeToolPermission(input: EvaluateClaudeToolPermissionInput): ClaudeToolPermissionDecision {
|
|
231
231
|
const mapped = mapClaudeToolCall(input.toolName, input.input, input.cwd);
|
|
232
232
|
const call: ClassifierCall = { tool: mapped.clioToolName, args: mapped.args };
|
|
233
233
|
const attempt = input.budgetGate?.attempt(mapped.clioToolName);
|
|
@@ -346,7 +346,7 @@ function emitToolFinish(
|
|
|
346
346
|
const finalReasonCode = reasonCode ?? decision.policy?.reasonCode;
|
|
347
347
|
if (finalReasonCode !== undefined) event.reasonCode = finalReasonCode;
|
|
348
348
|
if (decision.policy?.policySource !== undefined) event.policySource = decision.policy.policySource;
|
|
349
|
-
emit({ type: "
|
|
349
|
+
emit({ type: "clio_coder_tool_finish", payload: event });
|
|
350
350
|
}
|
|
351
351
|
|
|
352
352
|
export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermissionInput): ClaudeToolPermissionDecision {
|
|
@@ -366,7 +366,7 @@ export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermission
|
|
|
366
366
|
startedAt,
|
|
367
367
|
...(action !== null ? { action } : {}),
|
|
368
368
|
};
|
|
369
|
-
input.emit({ type: "
|
|
369
|
+
input.emit({ type: "clio_coder_tool_start", payload: start });
|
|
370
370
|
if (decision.kind === "allow") {
|
|
371
371
|
emitToolFinish(
|
|
372
372
|
input.emit,
|
|
@@ -383,7 +383,7 @@ export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermission
|
|
|
383
383
|
if (decision.permissionRequired) {
|
|
384
384
|
const mode = input.onPermission ?? "deny";
|
|
385
385
|
input.emit({
|
|
386
|
-
type: "
|
|
386
|
+
type: "clio_coder_permission_resolved",
|
|
387
387
|
payload: {
|
|
388
388
|
tool: decision.mapped.clioToolName,
|
|
389
389
|
actionClass: decision.decision.classification.actionClass,
|
|
@@ -6,6 +6,25 @@ import type {
|
|
|
6
6
|
ThinkingContent,
|
|
7
7
|
} from "@earendil-works/pi-ai";
|
|
8
8
|
import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
|
|
9
|
+
import { inferLocalModelFamily } from "../domains/providers/model-family.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Whether a model id names a Gemma 4 checkpoint, whose chat template writes its
|
|
13
|
+
* private channel with the markers below when llama-server leaves the thought
|
|
14
|
+
* inline in `content` instead of extracting it to `reasoning_content`.
|
|
15
|
+
*
|
|
16
|
+
* Keyed on the wire model id rather than on the resolved family, because
|
|
17
|
+
* `capabilityFamily` returns the knowledge-base family whenever the catalog
|
|
18
|
+
* matches an id and every Gemma entry there names a build (`gemma4-26b-a4b`,
|
|
19
|
+
* `gemma-4-31b-it-qat-mtp`, `gemopus-4-31b-it`), never the literal `gemma-4`
|
|
20
|
+
* that `inferLocalModelFamily` produces for an id the catalog does not match.
|
|
21
|
+
* Gating on the family therefore ran the filter only for Gemma ids the catalog
|
|
22
|
+
* did not know, so naming `gemma4-26b-moe` and `gemma4-31b-dense` in it (issue
|
|
23
|
+
* #263) turned the filter off for the two ids the router actually serves.
|
|
24
|
+
*/
|
|
25
|
+
export function usesGemmaChannelMarkers(modelId: string): boolean {
|
|
26
|
+
return inferLocalModelFamily(modelId) === "gemma-4";
|
|
27
|
+
}
|
|
9
28
|
|
|
10
29
|
const THOUGHT_START = /<\|channel>[^\n]*\n/;
|
|
11
30
|
const BARE_THOUGHT_START = /^\s*(?:thought|own[- ]?(?:thought|think))\s*\n/i;
|
package/src/engine/loop-guard.ts
CHANGED
|
@@ -87,9 +87,9 @@ export const LOOP_SYNTHESIS_BACKSTOP_DENIALS = 2;
|
|
|
87
87
|
export const WIDE_BATCH_DENIAL_FLOOR = 32;
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* Default lifetime tool-call cap for a worker run.
|
|
91
|
-
*
|
|
92
|
-
*
|
|
90
|
+
* Default lifetime tool-call cap for a worker run. The configurable value lives
|
|
91
|
+
* at `fleet.limits.toolCallsPerRun`; this default is re-exported for tests and
|
|
92
|
+
* callers that reason about the guard's tuning in one place.
|
|
93
93
|
*/
|
|
94
94
|
export const DEFAULT_WORKER_TOOL_CALL_CAP = GUARDRAIL_DEFAULTS.workerToolCallCap;
|
|
95
95
|
|
|
@@ -105,7 +105,7 @@ export const DEFAULT_WORKER_TOOL_CALL_CAP = GUARDRAIL_DEFAULTS.workerToolCallCap
|
|
|
105
105
|
* DISTINCT unproductive calls. Legitimate deep work (a repo-wide audit runs
|
|
106
106
|
* 25+ productive calls in one turn) must not be decapitated by it; mainstream
|
|
107
107
|
* harnesses run 100+ calls per turn with no ceiling at all. Value and env
|
|
108
|
-
*
|
|
108
|
+
* live at `safety.limits.chatToolCallsPerTurn`.
|
|
109
109
|
*/
|
|
110
110
|
export const DEFAULT_ORCH_TURN_TOOL_CALL_BUDGET = GUARDRAIL_DEFAULTS.turnToolCallBudget;
|
|
111
111
|
/**
|
|
@@ -185,6 +185,70 @@ function loopBlockBaseReason(tool: string, repeatCount: number, priorSuccesses:
|
|
|
185
185
|
);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
+
/** True when a sanitized locked reply holds nothing but the fallback notice. */
|
|
189
|
+
export function isLockedSynthesisFallbackOnly(message: AgentMessage | undefined): boolean {
|
|
190
|
+
if (!message || typeof message !== "object" || (message as { role?: unknown }).role !== "assistant") return false;
|
|
191
|
+
const content = (message as { content?: unknown }).content;
|
|
192
|
+
if (!Array.isArray(content)) return false;
|
|
193
|
+
const text = content
|
|
194
|
+
.filter((block): block is { type: "text"; text: string } => block?.type === "text" && typeof block.text === "string")
|
|
195
|
+
.map((block) => block.text)
|
|
196
|
+
.join("")
|
|
197
|
+
.trim();
|
|
198
|
+
return text === lockedSynthesisFallbackText();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export const LOCKED_SYNTHESIS_REPROMPT_TOOL = "clio_synthesis_reprompt";
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* One bounded re-prompt after a locked round came back as tool-call markup
|
|
205
|
+
* only. Delivered as a paired synthetic tool exchange, never a user turn, for
|
|
206
|
+
* the same reason the result-contract repair is (#55: a late user message
|
|
207
|
+
* re-renders every earlier assistant turn on templates keyed off the last
|
|
208
|
+
* user message and invalidates the whole prompt cache).
|
|
209
|
+
*/
|
|
210
|
+
export function lockedSynthesisRepromptMessages(
|
|
211
|
+
attempt: number,
|
|
212
|
+
origin: { provider: string; api: string; model: string },
|
|
213
|
+
): ReadonlyArray<AgentMessage> {
|
|
214
|
+
const id = `clio-synthesis-reprompt-${attempt}`;
|
|
215
|
+
const timestamp = Date.now();
|
|
216
|
+
return [
|
|
217
|
+
{
|
|
218
|
+
role: "assistant",
|
|
219
|
+
content: [{ type: "toolCall", id, name: LOCKED_SYNTHESIS_REPROMPT_TOOL, arguments: {} }],
|
|
220
|
+
stopReason: "toolUse",
|
|
221
|
+
usage: {
|
|
222
|
+
input: 0,
|
|
223
|
+
output: 0,
|
|
224
|
+
cacheRead: 0,
|
|
225
|
+
cacheWrite: 0,
|
|
226
|
+
totalTokens: 0,
|
|
227
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
228
|
+
},
|
|
229
|
+
...origin,
|
|
230
|
+
timestamp,
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
role: "toolResult",
|
|
234
|
+
toolCallId: id,
|
|
235
|
+
toolName: LOCKED_SYNTHESIS_REPROMPT_TOOL,
|
|
236
|
+
content: [
|
|
237
|
+
{
|
|
238
|
+
type: "text",
|
|
239
|
+
text:
|
|
240
|
+
"Your previous reply contained only tool-call markup, which cannot run: tool calls are disabled for " +
|
|
241
|
+
"the rest of this run. Everything you gathered is already in the conversation above. Write the " +
|
|
242
|
+
"final answer now as plain prose (or the exact result format the task asked for), with no tool-call " +
|
|
243
|
+
"markup of any kind.",
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
isError: true,
|
|
247
|
+
timestamp,
|
|
248
|
+
},
|
|
249
|
+
] as unknown as ReadonlyArray<AgentMessage>;
|
|
250
|
+
}
|
|
251
|
+
|
|
188
252
|
/**
|
|
189
253
|
* Directive returned when a turn is locked to synthesis: tool use is over, so
|
|
190
254
|
* the model must answer from what it already gathered. Fed back to the model as
|
|
@@ -352,11 +416,6 @@ export function isLoopGuardSynthesisBackstopReason(reason: string): boolean {
|
|
|
352
416
|
return /^loop guard: tool calls stayed disabled and .+ was called again instead of answering/.test(reason);
|
|
353
417
|
}
|
|
354
418
|
|
|
355
|
-
/** Worker lifetime tool-call cap: env > settings guardrails > default. */
|
|
356
|
-
export function readWorkerToolCallCap(env: NodeJS.ProcessEnv = process.env): number {
|
|
357
|
-
return resolveGuardrail("workerToolCallCap", env);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
419
|
/** Soft/hard per-turn tool-call budget for the interactive orchestrator. */
|
|
361
420
|
export interface OrchTurnToolCallBudget {
|
|
362
421
|
/** Distinct calls in a turn that trigger the re-plan nudge. */
|
|
@@ -365,8 +424,8 @@ export interface OrchTurnToolCallBudget {
|
|
|
365
424
|
hard: number;
|
|
366
425
|
}
|
|
367
426
|
|
|
368
|
-
export function readOrchTurnToolCallBudget(
|
|
369
|
-
const soft = resolveGuardrail("turnToolCallBudget"
|
|
427
|
+
export function readOrchTurnToolCallBudget(): OrchTurnToolCallBudget {
|
|
428
|
+
const soft = resolveGuardrail("turnToolCallBudget");
|
|
370
429
|
return { soft, hard: soft + ORCH_TURN_TOOL_CALL_HARD_MARGIN };
|
|
371
430
|
}
|
|
372
431
|
|
|
@@ -421,7 +480,7 @@ export interface CreateLoopGuardRegistrationOptions {
|
|
|
421
480
|
* the turn over the bus. Absent for workers, which rely on the lifetime
|
|
422
481
|
* {@link toolCallCap} instead.
|
|
423
482
|
*/
|
|
424
|
-
turnToolCallBudget?: OrchTurnToolCallBudget;
|
|
483
|
+
turnToolCallBudget?: OrchTurnToolCallBudget | (() => OrchTurnToolCallBudget);
|
|
425
484
|
/**
|
|
426
485
|
* When the per-turn loop-block budget is exhausted, lock tool use for the
|
|
427
486
|
* rest of the turn instead of cancelling it outright. Every further call is
|
|
@@ -472,7 +531,6 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
472
531
|
(cap === undefined || options.toolCallSoftLimit <= cap)
|
|
473
532
|
? options.toolCallSoftLimit
|
|
474
533
|
: undefined;
|
|
475
|
-
const turnBudget = options.turnToolCallBudget;
|
|
476
534
|
const synthesisLockout = options.turnSynthesisLockout === true;
|
|
477
535
|
let softReadReserve = options.toolCallSoftReadReserve ?? 0;
|
|
478
536
|
let softReadReserveThreshold =
|
|
@@ -521,6 +579,12 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
521
579
|
let reserveDirectiveEmitted = false;
|
|
522
580
|
const blocksByTurn = new Map<string, number>();
|
|
523
581
|
const callsByTurn = new Map<string, number>();
|
|
582
|
+
/**
|
|
583
|
+
* Per-turn count of successful write or edit calls. The identical-call key
|
|
584
|
+
* carries it, so a check rerun after a change (fix-verify) is a fresh call
|
|
585
|
+
* while a verbatim repeat with nothing changed in between still counts.
|
|
586
|
+
*/
|
|
587
|
+
const mutationEpochByTurn = new Map<string, number>();
|
|
524
588
|
/**
|
|
525
589
|
* Turns whose tool use is locked to synthesis after reaching the block
|
|
526
590
|
* budget. Key present means locked; the value carries the block that tripped
|
|
@@ -599,6 +663,9 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
599
663
|
// (admission returns before execution), so only real results anchor.
|
|
600
664
|
const recordSuccessfulResult = (input: MiddlewareHookInput): void => {
|
|
601
665
|
if (input.metadata?.resultKind !== "ok") return;
|
|
666
|
+
if (input.toolName === ToolNames.Write || input.toolName === ToolNames.Edit) {
|
|
667
|
+
bumpBoundedCounter(mutationEpochByTurn, input.turnId ?? NO_TURN_BUCKET);
|
|
668
|
+
}
|
|
602
669
|
if (!resultCarriesEvidence(input.toolResultDetails)) return;
|
|
603
670
|
const tool = input.toolName;
|
|
604
671
|
if (typeof tool !== "string" || tool.length === 0) return;
|
|
@@ -753,11 +820,11 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
753
820
|
|
|
754
821
|
const emitBudgetEvent = (
|
|
755
822
|
input: MiddlewareHookInput,
|
|
823
|
+
turnBudget: OrchTurnToolCallBudget,
|
|
756
824
|
callsThisTurn: number,
|
|
757
825
|
interrupted: boolean,
|
|
758
826
|
at: number,
|
|
759
827
|
): void => {
|
|
760
|
-
if (turnBudget === undefined) return;
|
|
761
828
|
const payload: ToolBudgetExceededPayload = {
|
|
762
829
|
tool: input.toolName ?? "unknown",
|
|
763
830
|
callsThisTurn,
|
|
@@ -771,6 +838,8 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
771
838
|
};
|
|
772
839
|
|
|
773
840
|
const evaluateTurnBudget = (input: MiddlewareHookInput, now: number): ReadonlyArray<MiddlewareEffect> | null => {
|
|
841
|
+
const budgetSource = options.turnToolCallBudget;
|
|
842
|
+
const turnBudget = typeof budgetSource === "function" ? budgetSource() : budgetSource;
|
|
774
843
|
if (turnBudget === undefined) return null;
|
|
775
844
|
const turnKey = input.turnId ?? NO_TURN_BUCKET;
|
|
776
845
|
const callsThisTurn = bumpBoundedCounter(callsByTurn, turnKey);
|
|
@@ -778,7 +847,7 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
778
847
|
// Hard ceiling: interrupt the turn the same way the block budget does.
|
|
779
848
|
// The bus event drives chat.cancel() in the interactive layer; the
|
|
780
849
|
// block effect makes the in-flight attempt fail with the same reason.
|
|
781
|
-
if (callsThisTurn === turnBudget.hard) emitBudgetEvent(input, callsThisTurn, true, now);
|
|
850
|
+
if (callsThisTurn === turnBudget.hard) emitBudgetEvent(input, turnBudget, callsThisTurn, true, now);
|
|
782
851
|
return [
|
|
783
852
|
{
|
|
784
853
|
kind: "block_tool",
|
|
@@ -797,7 +866,7 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
797
866
|
// ever run. The operator sees one warn notice per turn (the first
|
|
798
867
|
// crossing); the model keeps getting the directive on every further
|
|
799
868
|
// over-budget attempt so it cannot quietly resume spraying calls.
|
|
800
|
-
if (callsThisTurn === turnBudget.soft) emitBudgetEvent(input, callsThisTurn, false, now);
|
|
869
|
+
if (callsThisTurn === turnBudget.soft) emitBudgetEvent(input, turnBudget, callsThisTurn, false, now);
|
|
801
870
|
return [
|
|
802
871
|
{
|
|
803
872
|
kind: "block_tool",
|
|
@@ -1089,7 +1158,13 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
|
|
|
1089
1158
|
// regardless of age, so an unscoped key would let one identical call
|
|
1090
1159
|
// per user turn (rerunning a build across turns) accumulate into a
|
|
1091
1160
|
// false loop.
|
|
1092
|
-
|
|
1161
|
+
// The epoch scopes repeats to "since the last successful write or
|
|
1162
|
+
// edit": a live session repeated a batch of eleven read-only bash
|
|
1163
|
+
// calls five times, every one admitted, because the detector kept
|
|
1164
|
+
// only a 30 s window or the last four attempts and no batch ever
|
|
1165
|
+
// showed a third repeat inside either.
|
|
1166
|
+
const epoch = mutationEpochByTurn.get(turnKey) ?? 0;
|
|
1167
|
+
const verdict = options.safety.observeLoop(`${turnKey}|${epoch}|${fingerprint}`, now);
|
|
1093
1168
|
if (verdict.looping) {
|
|
1094
1169
|
const tool = input.toolName ?? "unknown";
|
|
1095
1170
|
const priorSuccesses = succeededFingerprints.get(fingerprint) ?? 0;
|