@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
package/src/core/config.ts
CHANGED
|
@@ -525,6 +525,57 @@ function validateLmStudioSettings(
|
|
|
525
525
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
526
526
|
}
|
|
527
527
|
|
|
528
|
+
function validateLiteLLMSettings(
|
|
529
|
+
issues: Issues,
|
|
530
|
+
path: string,
|
|
531
|
+
value: unknown,
|
|
532
|
+
): ClioSettings["targets"][number]["litellm"] | undefined {
|
|
533
|
+
if (!isPlainObject(value)) {
|
|
534
|
+
issues.add(path, `expected a map, got ${describe(value)}`);
|
|
535
|
+
return undefined;
|
|
536
|
+
}
|
|
537
|
+
issues.unknownKeys(path, value, ["request"]);
|
|
538
|
+
const out: NonNullable<ClioSettings["targets"][number]["litellm"]> = {};
|
|
539
|
+
if ("request" in value) {
|
|
540
|
+
if (!isPlainObject(value.request)) {
|
|
541
|
+
issues.add(`${path}.request`, `expected a map, got ${describe(value.request)}`);
|
|
542
|
+
} else {
|
|
543
|
+
issues.unknownKeys(`${path}.request`, value.request, [
|
|
544
|
+
"tags",
|
|
545
|
+
"sendSessionId",
|
|
546
|
+
"timeoutSeconds",
|
|
547
|
+
"streamTimeoutSeconds",
|
|
548
|
+
"numRetries",
|
|
549
|
+
]);
|
|
550
|
+
const request: NonNullable<typeof out.request> = {};
|
|
551
|
+
if ("tags" in value.request) {
|
|
552
|
+
const parsed = expectStringArray(issues, `${path}.request.tags`, value.request.tags);
|
|
553
|
+
if (parsed !== undefined) {
|
|
554
|
+
const invalidTag = parsed.find((tag) => tag.includes(","));
|
|
555
|
+
if (invalidTag) issues.add(`${path}.request.tags`, "tags may not contain commas");
|
|
556
|
+
else if (parsed.length > 0) request.tags = [...new Set(parsed)];
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
if ("sendSessionId" in value.request) {
|
|
560
|
+
const parsed = expectBoolean(issues, `${path}.request.sendSessionId`, value.request.sendSessionId);
|
|
561
|
+
if (parsed !== undefined) request.sendSessionId = parsed;
|
|
562
|
+
}
|
|
563
|
+
for (const key of ["timeoutSeconds", "streamTimeoutSeconds"] as const) {
|
|
564
|
+
if (key in value.request) {
|
|
565
|
+
const parsed = expectNumber(issues, `${path}.request.${key}`, value.request[key], { min: 0.001, max: 86_400 });
|
|
566
|
+
if (parsed !== undefined) request[key] = parsed;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if ("numRetries" in value.request) {
|
|
570
|
+
const parsed = expectInteger(issues, `${path}.request.numRetries`, value.request.numRetries, { min: 0, max: 100 });
|
|
571
|
+
if (parsed !== undefined) request.numRetries = parsed;
|
|
572
|
+
}
|
|
573
|
+
if (Object.keys(request).length > 0) out.request = request;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
577
|
+
}
|
|
578
|
+
|
|
528
579
|
function validateTarget(issues: Issues, path: string, value: unknown): ClioSettings["targets"][number] | null {
|
|
529
580
|
if (!isPlainObject(value)) {
|
|
530
581
|
issues.add(path, `expected a map, got ${describe(value)}`);
|
|
@@ -542,6 +593,7 @@ function validateTarget(issues: Issues, path: string, value: unknown): ClioSetti
|
|
|
542
593
|
"gateway",
|
|
543
594
|
"pricing",
|
|
544
595
|
"lmstudio",
|
|
596
|
+
"litellm",
|
|
545
597
|
"maxConcurrentRequests",
|
|
546
598
|
]);
|
|
547
599
|
const id = "id" in value ? expectString(issues, `${path}.id`, value.id) : undefined;
|
|
@@ -593,6 +645,10 @@ function validateTarget(issues: Issues, path: string, value: unknown): ClioSetti
|
|
|
593
645
|
const v = validateLmStudioSettings(issues, `${path}.lmstudio`, value.lmstudio);
|
|
594
646
|
if (v !== undefined) target.lmstudio = v;
|
|
595
647
|
}
|
|
648
|
+
if ("litellm" in value) {
|
|
649
|
+
const v = validateLiteLLMSettings(issues, `${path}.litellm`, value.litellm);
|
|
650
|
+
if (v !== undefined) target.litellm = v;
|
|
651
|
+
}
|
|
596
652
|
if ("maxConcurrentRequests" in value) {
|
|
597
653
|
const v = expectInteger(issues, `${path}.maxConcurrentRequests`, value.maxConcurrentRequests, { min: 1 });
|
|
598
654
|
if (v !== undefined) target.maxConcurrentRequests = v;
|
|
@@ -1486,7 +1542,11 @@ export function validateSettings(raw: unknown): SettingsValidationResult {
|
|
|
1486
1542
|
if (!isPlainObject(raw.context)) issues.add("context", `expected a map, got ${describe(raw.context)}`);
|
|
1487
1543
|
else {
|
|
1488
1544
|
const context = raw.context;
|
|
1489
|
-
issues.unknownKeys("context", context, ["workingSet", "compaction", "memory"]);
|
|
1545
|
+
issues.unknownKeys("context", context, ["toolResultMaxBytes", "workingSet", "compaction", "memory"]);
|
|
1546
|
+
if ("toolResultMaxBytes" in context) {
|
|
1547
|
+
const parsed = expectInteger(issues, "context.toolResultMaxBytes", context.toolResultMaxBytes, { min: 4096 });
|
|
1548
|
+
if (parsed !== undefined) settings.context.toolResultMaxBytes = parsed;
|
|
1549
|
+
}
|
|
1490
1550
|
if ("workingSet" in context) {
|
|
1491
1551
|
if (!isPlainObject(context.workingSet))
|
|
1492
1552
|
issues.add("context.workingSet", `expected a map, got ${describe(context.workingSet)}`);
|
package/src/core/defaults.ts
CHANGED
|
@@ -412,6 +412,7 @@ export interface MemorySettings {
|
|
|
412
412
|
}
|
|
413
413
|
|
|
414
414
|
export interface ContextSettings {
|
|
415
|
+
toolResultMaxBytes: number;
|
|
415
416
|
workingSet: WorkingSetSettings;
|
|
416
417
|
compaction: DurableCompactionSettings;
|
|
417
418
|
memory: MemorySettings;
|
|
@@ -447,13 +448,13 @@ export const DEFAULT_SETTINGS = {
|
|
|
447
448
|
chat: {
|
|
448
449
|
target: null as string | null,
|
|
449
450
|
model: null as string | null,
|
|
450
|
-
thinkingLevel: "
|
|
451
|
+
thinkingLevel: "low" as ThinkingLevel,
|
|
451
452
|
modelPicker: {
|
|
452
453
|
cycleSet: [] as string[],
|
|
453
454
|
favorites: [] as string[],
|
|
454
455
|
recentLimit: 12,
|
|
455
456
|
} as ModelSelectorSettings,
|
|
456
|
-
maxOutputTokens:
|
|
457
|
+
maxOutputTokens: 0,
|
|
457
458
|
prewarm: true,
|
|
458
459
|
retry: {
|
|
459
460
|
enabled: true,
|
|
@@ -491,6 +492,7 @@ export const DEFAULT_SETTINGS = {
|
|
|
491
492
|
history: { maxRuns: GUARDRAIL_DEFAULTS.maxDispatchRuns, journal: true },
|
|
492
493
|
} as FleetSettings,
|
|
493
494
|
context: {
|
|
495
|
+
toolResultMaxBytes: 65536,
|
|
494
496
|
workingSet: DEFAULT_WORKING_SET_SETTINGS,
|
|
495
497
|
compaction: {
|
|
496
498
|
auto: true,
|
|
@@ -582,12 +584,12 @@ targets: []
|
|
|
582
584
|
chat:
|
|
583
585
|
target: null
|
|
584
586
|
model: null
|
|
585
|
-
thinkingLevel:
|
|
587
|
+
thinkingLevel: low
|
|
586
588
|
modelPicker:
|
|
587
589
|
cycleSet: []
|
|
588
590
|
favorites: []
|
|
589
591
|
recentLimit: 12
|
|
590
|
-
maxOutputTokens:
|
|
592
|
+
maxOutputTokens: 0
|
|
591
593
|
prewarm: true
|
|
592
594
|
retry:
|
|
593
595
|
enabled: true
|
|
@@ -626,6 +628,7 @@ fleet:
|
|
|
626
628
|
journal: true
|
|
627
629
|
|
|
628
630
|
context:
|
|
631
|
+
toolResultMaxBytes: 65536
|
|
629
632
|
workingSet:
|
|
630
633
|
enabled: true
|
|
631
634
|
policy: structural-v1
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mapping from a `DispatchFailed` payload's `reason` field to the
|
|
3
|
+
* terminal status it implies. Both the observability projection's run
|
|
4
|
+
* summary (src/domains/observability/projection.ts) and the interactive
|
|
5
|
+
* dispatch board (src/interactive/dispatch-board.ts) derive a run's status
|
|
6
|
+
* from the same DispatchCompleted/DispatchFailed bus events; before this
|
|
7
|
+
* module existed they each carried their own copy of this exact mapping,
|
|
8
|
+
* kept in sync only by a comment asking the next editor to remember to.
|
|
9
|
+
*/
|
|
10
|
+
export type DispatchFailureStatus = "dead" | "aborted" | "failed";
|
|
11
|
+
|
|
12
|
+
export function resolveDispatchFailureStatus(reason: unknown): DispatchFailureStatus {
|
|
13
|
+
if (reason === "dead" || reason === "stalled") return "dead";
|
|
14
|
+
if (reason === "interrupted" || reason === "canceled") return "aborted";
|
|
15
|
+
return "failed";
|
|
16
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const REDACTED = "[redacted]";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sanitize free-form text received from an external process before it crosses
|
|
5
|
+
* into errors, receipts, transcripts, evidence, or model-catalog snapshots.
|
|
6
|
+
*/
|
|
7
|
+
function redactExternalDiagnostic(input: string): string {
|
|
8
|
+
return input
|
|
9
|
+
.replace(/\b(?:authorization|proxy-authorization)\s*:\s*[^\r\n]+/giu, `Authorization: ${REDACTED}`)
|
|
10
|
+
.replace(/\b(?:set-cookie|cookie)\s*:\s*[^\r\n]+/giu, `Cookie: ${REDACTED}`)
|
|
11
|
+
.replace(/\bbearer\s+[A-Za-z0-9._~+/-]+=*/giu, `Bearer ${REDACTED}`)
|
|
12
|
+
.replace(
|
|
13
|
+
/\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|token|secret|password)\s*[:=]\s*[^\s,;]+/giu,
|
|
14
|
+
(match) => {
|
|
15
|
+
const separator = match.includes(":") ? ":" : "=";
|
|
16
|
+
return `${match.slice(0, match.indexOf(separator)).trim()}${separator}${REDACTED}`;
|
|
17
|
+
},
|
|
18
|
+
)
|
|
19
|
+
.replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu, REDACTED)
|
|
20
|
+
.replace(
|
|
21
|
+
/(?:~|\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*)\/\.(?:gemini\/antigravity-cli|antigravitycli)(?:\/[^\s]*)?/gu,
|
|
22
|
+
"[redacted credential path]",
|
|
23
|
+
)
|
|
24
|
+
.replace(/https?:\/\/[^\s"'<>]+/giu, (url) => {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = new URL(url);
|
|
27
|
+
if (/(?:auth|oauth|login|signin|callback)/iu.test(parsed.pathname)) return "[redacted authorization URL]";
|
|
28
|
+
parsed.username = "";
|
|
29
|
+
parsed.password = "";
|
|
30
|
+
parsed.search = "";
|
|
31
|
+
parsed.hash = "";
|
|
32
|
+
return parsed.toString();
|
|
33
|
+
} catch {
|
|
34
|
+
return REDACTED;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function boundedExternalDiagnostic(input: string, maxBytes = 8192): string {
|
|
40
|
+
const redacted = redactExternalDiagnostic(input).trim();
|
|
41
|
+
const bytes = Buffer.from(redacted, "utf8");
|
|
42
|
+
if (bytes.byteLength <= maxBytes) return redacted;
|
|
43
|
+
return `${bytes.subarray(0, Math.max(0, maxBytes - 32)).toString("utf8")}\n[diagnostic truncated]`;
|
|
44
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable routing facts reported by an AI gateway for one upstream response.
|
|
3
|
+
*
|
|
4
|
+
* The gateway is authoritative for the physical deployment that served an
|
|
5
|
+
* alias. Clio deliberately records only the host portion of an upstream API
|
|
6
|
+
* base: LiteLLM deployments may embed paths, query credentials, or user-info
|
|
7
|
+
* in the configured URL, none of which belongs in a session or sealed receipt.
|
|
8
|
+
*/
|
|
9
|
+
export interface LiteLLMGatewayRoutingObservation {
|
|
10
|
+
gateway: "litellm";
|
|
11
|
+
callId?: string;
|
|
12
|
+
modelGroup?: string;
|
|
13
|
+
modelName?: string;
|
|
14
|
+
apiBaseHost?: string;
|
|
15
|
+
deploymentId?: string;
|
|
16
|
+
attemptedFallbacks?: number;
|
|
17
|
+
attemptedRetries?: number;
|
|
18
|
+
overheadMs?: number;
|
|
19
|
+
responseDurationMs?: number;
|
|
20
|
+
version?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type GatewayRoutingObservation = LiteLLMGatewayRoutingObservation;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Preserve the provider's diagnostic while making Clio's failure policy
|
|
27
|
+
* explicit and actionable. LiteLLM targets deliberately do not enter Clio's
|
|
28
|
+
* transient retry ladder: a named route is an operator choice, not permission
|
|
29
|
+
* to substitute another model behind their back.
|
|
30
|
+
*/
|
|
31
|
+
export function liteLLMRouteFailureMessage(
|
|
32
|
+
errorMessage: string | null | undefined,
|
|
33
|
+
targetId: string,
|
|
34
|
+
modelId: string,
|
|
35
|
+
): string {
|
|
36
|
+
const providerMessage = errorMessage?.trim() || "LiteLLM request failed.";
|
|
37
|
+
const advice =
|
|
38
|
+
`LiteLLM route '${modelId}' on target '${targetId}' failed. ` +
|
|
39
|
+
"Clio did not retry or substitute another model; select a different route with /model, then resend.";
|
|
40
|
+
return providerMessage.includes(advice) ? providerMessage : `${providerMessage}\n\n${advice}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface HeaderReader {
|
|
44
|
+
get(name: string): string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function nonEmptyString(value: unknown): string | undefined {
|
|
48
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function nonnegativeNumber(value: unknown): number | undefined {
|
|
52
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0) return value;
|
|
53
|
+
if (typeof value !== "string" || value.trim().length === 0) return undefined;
|
|
54
|
+
const parsed = Number(value);
|
|
55
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function nonnegativeInteger(value: unknown): number | undefined {
|
|
59
|
+
const parsed = nonnegativeNumber(value);
|
|
60
|
+
return parsed === undefined ? undefined : Math.floor(parsed);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function apiBaseHost(value: unknown): string | undefined {
|
|
64
|
+
const raw = nonEmptyString(value);
|
|
65
|
+
if (raw === undefined) return undefined;
|
|
66
|
+
try {
|
|
67
|
+
return new URL(raw).host || undefined;
|
|
68
|
+
} catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function storedApiBaseHost(value: unknown): string | undefined {
|
|
74
|
+
const raw = nonEmptyString(value);
|
|
75
|
+
if (raw === undefined) return undefined;
|
|
76
|
+
try {
|
|
77
|
+
return new URL(raw.includes("://") ? raw : `http://${raw}`).host || undefined;
|
|
78
|
+
} catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Read LiteLLM's response headers without retaining sensitive API-base data. */
|
|
84
|
+
export function liteLLMGatewayRoutingFromHeaders(headers: HeaderReader): GatewayRoutingObservation | null {
|
|
85
|
+
const callId = nonEmptyString(headers.get("x-litellm-call-id"));
|
|
86
|
+
const modelGroup = nonEmptyString(headers.get("x-litellm-model-group"));
|
|
87
|
+
const modelName = nonEmptyString(headers.get("x-litellm-model-name"));
|
|
88
|
+
const host = apiBaseHost(headers.get("x-litellm-model-api-base"));
|
|
89
|
+
const deploymentId = nonEmptyString(headers.get("x-litellm-model-id"));
|
|
90
|
+
const attemptedFallbacks = nonnegativeInteger(headers.get("x-litellm-attempted-fallbacks"));
|
|
91
|
+
const attemptedRetries = nonnegativeInteger(headers.get("x-litellm-attempted-retries"));
|
|
92
|
+
const overheadMs = nonnegativeNumber(headers.get("x-litellm-overhead-duration-ms"));
|
|
93
|
+
const responseDurationMs = nonnegativeNumber(headers.get("x-litellm-response-duration-ms"));
|
|
94
|
+
const version = nonEmptyString(headers.get("x-litellm-version"));
|
|
95
|
+
const observation: GatewayRoutingObservation = {
|
|
96
|
+
gateway: "litellm",
|
|
97
|
+
...(callId !== undefined ? { callId } : {}),
|
|
98
|
+
...(modelGroup !== undefined ? { modelGroup } : {}),
|
|
99
|
+
...(modelName !== undefined ? { modelName } : {}),
|
|
100
|
+
...(host !== undefined ? { apiBaseHost: host } : {}),
|
|
101
|
+
...(deploymentId !== undefined ? { deploymentId } : {}),
|
|
102
|
+
...(attemptedFallbacks !== undefined ? { attemptedFallbacks } : {}),
|
|
103
|
+
...(attemptedRetries !== undefined ? { attemptedRetries } : {}),
|
|
104
|
+
...(overheadMs !== undefined ? { overheadMs } : {}),
|
|
105
|
+
...(responseDurationMs !== undefined ? { responseDurationMs } : {}),
|
|
106
|
+
...(version !== undefined ? { version } : {}),
|
|
107
|
+
};
|
|
108
|
+
return Object.keys(observation).length > 1 ? observation : null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Parse a live message, persisted session row, or receipt response defensively. */
|
|
112
|
+
export function gatewayRoutingObservationFromRecord(
|
|
113
|
+
record: Readonly<Record<string, unknown>>,
|
|
114
|
+
): GatewayRoutingObservation | null {
|
|
115
|
+
const value = record.gatewayRouting;
|
|
116
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
|
|
117
|
+
const raw = value as Record<string, unknown>;
|
|
118
|
+
if (raw.gateway !== "litellm") return null;
|
|
119
|
+
const callId = nonEmptyString(raw.callId);
|
|
120
|
+
const modelGroup = nonEmptyString(raw.modelGroup);
|
|
121
|
+
const modelName = nonEmptyString(raw.modelName);
|
|
122
|
+
const host = storedApiBaseHost(raw.apiBaseHost);
|
|
123
|
+
const deploymentId = nonEmptyString(raw.deploymentId);
|
|
124
|
+
const attemptedFallbacks = nonnegativeInteger(raw.attemptedFallbacks);
|
|
125
|
+
const attemptedRetries = nonnegativeInteger(raw.attemptedRetries);
|
|
126
|
+
const overheadMs = nonnegativeNumber(raw.overheadMs);
|
|
127
|
+
const responseDurationMs = nonnegativeNumber(raw.responseDurationMs);
|
|
128
|
+
const version = nonEmptyString(raw.version);
|
|
129
|
+
const observation: GatewayRoutingObservation = {
|
|
130
|
+
gateway: "litellm",
|
|
131
|
+
...(callId !== undefined ? { callId } : {}),
|
|
132
|
+
...(modelGroup !== undefined ? { modelGroup } : {}),
|
|
133
|
+
...(modelName !== undefined ? { modelName } : {}),
|
|
134
|
+
...(host !== undefined ? { apiBaseHost: host } : {}),
|
|
135
|
+
...(deploymentId !== undefined ? { deploymentId } : {}),
|
|
136
|
+
...(attemptedFallbacks !== undefined ? { attemptedFallbacks } : {}),
|
|
137
|
+
...(attemptedRetries !== undefined ? { attemptedRetries } : {}),
|
|
138
|
+
...(overheadMs !== undefined ? { overheadMs } : {}),
|
|
139
|
+
...(responseDurationMs !== undefined ? { responseDurationMs } : {}),
|
|
140
|
+
...(version !== undefined ? { version } : {}),
|
|
141
|
+
};
|
|
142
|
+
return Object.keys(observation).length > 1 ? observation : null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Compact human projection for receipts and operator notices. */
|
|
146
|
+
export function gatewayRoutingObservationLabel(observation: GatewayRoutingObservation): string {
|
|
147
|
+
const route = [observation.modelGroup, observation.modelName].filter(Boolean).join("->");
|
|
148
|
+
const destination = [route, observation.apiBaseHost ? `@${observation.apiBaseHost}` : ""].filter(Boolean).join("");
|
|
149
|
+
const parts = [
|
|
150
|
+
"gateway=litellm",
|
|
151
|
+
...(destination ? [`route=${destination}`] : []),
|
|
152
|
+
...(observation.attemptedFallbacks !== undefined ? [`fallbacks=${observation.attemptedFallbacks}`] : []),
|
|
153
|
+
...(observation.attemptedRetries !== undefined ? [`retries=${observation.attemptedRetries}`] : []),
|
|
154
|
+
...(observation.overheadMs !== undefined ? [`overhead_ms=${observation.overheadMs}`] : []),
|
|
155
|
+
];
|
|
156
|
+
return parts.join(" ");
|
|
157
|
+
}
|
package/src/core/guardrails.ts
CHANGED
|
@@ -2,17 +2,11 @@
|
|
|
2
2
|
* Guardrail policy values: the numeric backstops that bound runaway agent
|
|
3
3
|
* behavior (tool-call budgets, tool output byte caps, dispatch ledger size).
|
|
4
4
|
*
|
|
5
|
-
* These are durable operator policy,
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* env override on top for CI and one-off experiments:
|
|
11
|
-
*
|
|
12
|
-
* env var > settings.yaml guardrails > built-in default
|
|
13
|
-
*
|
|
14
|
-
* Every value is a positive safe integer; invalid overrides fall through to
|
|
15
|
-
* the next layer rather than erroring.
|
|
5
|
+
* These are durable operator policy, so their only configurable home is the
|
|
6
|
+
* canonical version 2 settings tree. Composition roots project that tree into
|
|
7
|
+
* this process through {@link configureGuardrails}; hot-path consumers resolve
|
|
8
|
+
* the current projection through {@link resolveGuardrail} without reading
|
|
9
|
+
* settings.yaml themselves.
|
|
16
10
|
*/
|
|
17
11
|
|
|
18
12
|
export interface GuardrailValues {
|
|
@@ -66,16 +60,6 @@ export const GUARDRAIL_DEFAULTS: GuardrailValues = {
|
|
|
66
60
|
internalDispatchTimeoutMs: 15 * 60 * 1000,
|
|
67
61
|
};
|
|
68
62
|
|
|
69
|
-
/** Per-process env overrides, one per guardrail. */
|
|
70
|
-
export const GUARDRAIL_ENV_VARS: Readonly<Record<keyof GuardrailValues, string>> = {
|
|
71
|
-
turnToolCallBudget: "CLIO_CODER_TURN_TOOL_CALL_BUDGET",
|
|
72
|
-
workerToolCallCap: "CLIO_CODER_WORKER_TOOL_CALL_CAP",
|
|
73
|
-
maxDispatchRuns: "CLIO_CODER_MAX_DISPATCH_RUNS",
|
|
74
|
-
readMaxBytes: "CLIO_CODER_READ_MAX_BYTES",
|
|
75
|
-
observationTurnBudgetBytes: "CLIO_CODER_OBSERVATION_TURN_BUDGET_BYTES",
|
|
76
|
-
internalDispatchTimeoutMs: "CLIO_CODER_INTERNAL_DISPATCH_TIMEOUT_MS",
|
|
77
|
-
};
|
|
78
|
-
|
|
79
63
|
/** Project canonical v2 settings leaves onto the process-local guardrail registry. */
|
|
80
64
|
export function guardrailValuesFromSettings(settings: {
|
|
81
65
|
safety: {
|
|
@@ -100,15 +84,6 @@ export function guardrailValuesFromSettings(settings: {
|
|
|
100
84
|
};
|
|
101
85
|
}
|
|
102
86
|
|
|
103
|
-
/**
|
|
104
|
-
* Older env spellings that still read. `CLIO_CODER_MAX_RUNS` was the only
|
|
105
|
-
* guardrail whose variable was not the SCREAMING_SNAKE of its key, and CI
|
|
106
|
-
* environments already set it, so it keeps working behind the canonical name.
|
|
107
|
-
*/
|
|
108
|
-
const GUARDRAIL_ENV_ALIASES: Readonly<Partial<Record<keyof GuardrailValues, string>>> = {
|
|
109
|
-
maxDispatchRuns: "CLIO_CODER_MAX_RUNS",
|
|
110
|
-
};
|
|
111
|
-
|
|
112
87
|
/**
|
|
113
88
|
* One-shot annotation attached to the first tool result inside the reserve
|
|
114
89
|
* window. Advisory: the call that carried it still ran; only subsequent
|
|
@@ -178,28 +153,14 @@ export function mentionsWorkerToolCallCap(text: string | null | undefined): bool
|
|
|
178
153
|
let configured: Partial<GuardrailValues> = {};
|
|
179
154
|
|
|
180
155
|
/**
|
|
181
|
-
* Install the settings
|
|
182
|
-
*
|
|
156
|
+
* Install the effective settings projection. Later calls replace the whole
|
|
157
|
+
* layer when a session override or configuration reload changes the view.
|
|
183
158
|
*/
|
|
184
159
|
export function configureGuardrails(values: Partial<GuardrailValues> | undefined): void {
|
|
185
160
|
configured = { ...(values ?? {}) };
|
|
186
161
|
}
|
|
187
162
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (!/^[1-9]\d*$/.test(normalized)) return undefined;
|
|
192
|
-
const parsed = Number(normalized);
|
|
193
|
-
return Number.isSafeInteger(parsed) ? parsed : undefined;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/** Resolve one guardrail: env override > configured settings > default. */
|
|
197
|
-
export function resolveGuardrail(key: keyof GuardrailValues, env: NodeJS.ProcessEnv = process.env): number {
|
|
198
|
-
const alias = GUARDRAIL_ENV_ALIASES[key];
|
|
199
|
-
return (
|
|
200
|
-
parsePositiveSafeInt(env[GUARDRAIL_ENV_VARS[key]]) ??
|
|
201
|
-
(alias ? parsePositiveSafeInt(env[alias]) : undefined) ??
|
|
202
|
-
configured[key] ??
|
|
203
|
-
GUARDRAIL_DEFAULTS[key]
|
|
204
|
-
);
|
|
163
|
+
/** Resolve one guardrail from the effective settings projection or its default. */
|
|
164
|
+
export function resolveGuardrail(key: keyof GuardrailValues): number {
|
|
165
|
+
return configured[key] ?? GUARDRAIL_DEFAULTS[key];
|
|
205
166
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Collapse descriptor-authored prompt guidance to one byte-stable line. */
|
|
2
|
+
export function normalizePromptHint(text: string | undefined): string | undefined {
|
|
3
|
+
if (!text) return undefined;
|
|
4
|
+
const normalized = text
|
|
5
|
+
.replace(/[\r\n]+/gu, " ")
|
|
6
|
+
.replace(/\s+/gu, " ")
|
|
7
|
+
.trim();
|
|
8
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
9
|
+
}
|
package/src/core/safe-exec.ts
CHANGED
|
@@ -24,6 +24,18 @@ const ENV_ALLOWLIST = [
|
|
|
24
24
|
"TMP",
|
|
25
25
|
"CI",
|
|
26
26
|
"NO_COLOR",
|
|
27
|
+
// Platform/session location variables needed by installed local CLIs. These
|
|
28
|
+
// locate operator-owned state; provider keys and Clio gates are deliberately
|
|
29
|
+
// absent from this allowlist.
|
|
30
|
+
"XDG_CONFIG_HOME",
|
|
31
|
+
"XDG_CACHE_HOME",
|
|
32
|
+
"XDG_STATE_HOME",
|
|
33
|
+
"APPDATA",
|
|
34
|
+
"LOCALAPPDATA",
|
|
35
|
+
"SYSTEMROOT",
|
|
36
|
+
"WINDIR",
|
|
37
|
+
"COMSPEC",
|
|
38
|
+
"PATHEXT",
|
|
27
39
|
] as const;
|
|
28
40
|
|
|
29
41
|
export interface SafeCommandResult {
|
|
@@ -49,10 +61,13 @@ export interface RunCommandVectorOptions {
|
|
|
49
61
|
env?: Record<string, string>;
|
|
50
62
|
}
|
|
51
63
|
|
|
52
|
-
export function buildSafeToolEnv(
|
|
64
|
+
export function buildSafeToolEnv(
|
|
65
|
+
extra: Record<string, string> = {},
|
|
66
|
+
source: NodeJS.ProcessEnv = process.env,
|
|
67
|
+
): NodeJS.ProcessEnv {
|
|
53
68
|
const env: NodeJS.ProcessEnv = {};
|
|
54
69
|
for (const key of ENV_ALLOWLIST) {
|
|
55
|
-
const value =
|
|
70
|
+
const value = source[key];
|
|
56
71
|
if (value !== undefined) env[key] = value;
|
|
57
72
|
}
|
|
58
73
|
for (const [key, value] of Object.entries(extra)) {
|
|
@@ -58,6 +58,90 @@ export interface PendingSkillToolPolicy {
|
|
|
58
58
|
loadedSkillNames: Set<string>;
|
|
59
59
|
/** Declared tool policy per successfully loaded skill, recorded by context(scope=skills). */
|
|
60
60
|
loadedSkillPolicies: Map<string, SkillDeclaredToolPolicy>;
|
|
61
|
+
/**
|
|
62
|
+
* True once this policy is a surface that outlived the turn that armed it.
|
|
63
|
+
* The narrowing is identical; the flag exists so a load request the policy
|
|
64
|
+
* does not cover reads as "only the operator activates skills" rather than
|
|
65
|
+
* claiming a pending request that no longer exists.
|
|
66
|
+
*/
|
|
67
|
+
carriedSurface?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* True when the session's autonomy level lets the model activate an
|
|
70
|
+
* installed skill itself instead of emitting the suggestion anchor and
|
|
71
|
+
* waiting for `/skill`. Activation is the same per-run policy the operator's
|
|
72
|
+
* path produces: skills only ever narrow the tool surface, so this grants
|
|
73
|
+
* nothing the level had not already granted. Marketplace (not yet
|
|
74
|
+
* installed) skills stay operator-gated at every level.
|
|
75
|
+
*/
|
|
76
|
+
modelActivation?: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The surface that stays armed after an interactive turn ends.
|
|
81
|
+
*
|
|
82
|
+
* A skill an operator loaded narrows the tools for the workflow it started,
|
|
83
|
+
* and a multi-turn workflow (an interview skill asking a question per turn)
|
|
84
|
+
* is still inside that workflow on the operator's next message. Dropping the
|
|
85
|
+
* narrowing at turn end handed the workflow back the full surface partway
|
|
86
|
+
* through, which is how a `bash` call correctly refused in turn one ran in
|
|
87
|
+
* turn six. Returns undefined when nothing declared a narrowing, which is the
|
|
88
|
+
* signal to clear whatever surface was armed before.
|
|
89
|
+
*/
|
|
90
|
+
export function armedSkillSurface(policy: PendingSkillToolPolicy | undefined): PendingSkillToolPolicy | undefined {
|
|
91
|
+
if (!policy) return undefined;
|
|
92
|
+
const declared = [...policy.loadedSkillPolicies.entries()].filter(
|
|
93
|
+
([, declaration]) => (declaration.allowedTools?.length ?? 0) > 0 || (declaration.disallowedTools?.length ?? 0) > 0,
|
|
94
|
+
);
|
|
95
|
+
if (declared.length === 0) return undefined;
|
|
96
|
+
return {
|
|
97
|
+
allowedSkillNames: [...policy.allowedSkillNames],
|
|
98
|
+
requests: [...policy.requests],
|
|
99
|
+
loadedSkillNames: new Set(policy.loadedSkillNames),
|
|
100
|
+
loadedSkillPolicies: new Map(declared),
|
|
101
|
+
carriedSurface: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Skill names contributing a declaration to an armed surface, for the operator notice. */
|
|
106
|
+
export function skillSurfaceNames(policy: PendingSkillToolPolicy | undefined): ReadonlyArray<string> {
|
|
107
|
+
return policy ? [...policy.loadedSkillPolicies.keys()] : [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The same names, each tagged with who activated it. A skill the operator
|
|
112
|
+
* named arrives as a pending request; anything else was activated by the model
|
|
113
|
+
* under `modelActivation`, and the operator's one line about the surface is
|
|
114
|
+
* where that distinction has to be visible.
|
|
115
|
+
*/
|
|
116
|
+
export function skillSurfaceLabels(policy: PendingSkillToolPolicy | undefined): ReadonlyArray<string> {
|
|
117
|
+
if (!policy) return [];
|
|
118
|
+
return [...policy.loadedSkillPolicies.keys()].map((name) =>
|
|
119
|
+
policy.requests.some((request) => request.name === name) ? `${name} (operator)` : `${name} (model)`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Stamp (or clear) the model-activation grant on the policy this turn runs
|
|
125
|
+
* under, creating one when nothing else did. Mutates in place so a surface
|
|
126
|
+
* carried from an earlier turn keeps its identity, and re-stamps every turn so
|
|
127
|
+
* a level change takes effect on the next message rather than the next skill.
|
|
128
|
+
*/
|
|
129
|
+
export function withModelSkillActivation(
|
|
130
|
+
policy: PendingSkillToolPolicy | undefined,
|
|
131
|
+
enabled: boolean,
|
|
132
|
+
): PendingSkillToolPolicy | undefined {
|
|
133
|
+
if (policy) {
|
|
134
|
+
policy.modelActivation = enabled;
|
|
135
|
+
return policy;
|
|
136
|
+
}
|
|
137
|
+
if (!enabled) return undefined;
|
|
138
|
+
return {
|
|
139
|
+
allowedSkillNames: [],
|
|
140
|
+
requests: [],
|
|
141
|
+
loadedSkillNames: new Set<string>(),
|
|
142
|
+
loadedSkillPolicies: new Map<string, SkillDeclaredToolPolicy>(),
|
|
143
|
+
modelActivation: true,
|
|
144
|
+
};
|
|
61
145
|
}
|
|
62
146
|
|
|
63
147
|
/**
|
|
@@ -75,6 +159,8 @@ export interface SkillToolSurfaceViolation {
|
|
|
75
159
|
mergedAllowedTools: ReadonlyArray<string> | null;
|
|
76
160
|
/** Skills whose disallowed-tools name the tool directly. */
|
|
77
161
|
disallowedBy: ReadonlyArray<string>;
|
|
162
|
+
/** True when the surface outlived the turn that armed it, which changes the lifetime the block message states. */
|
|
163
|
+
carriedSurface: boolean;
|
|
78
164
|
}
|
|
79
165
|
|
|
80
166
|
/**
|
|
@@ -98,15 +184,16 @@ export function evaluateSkillToolSurface(
|
|
|
98
184
|
if (SKILL_SURFACE_EXEMPT_TOOLS.has(tool)) return null;
|
|
99
185
|
const entries = [...policy.loadedSkillPolicies.entries()];
|
|
100
186
|
const skills = entries.map(([name]) => name);
|
|
187
|
+
const carriedSurface = policy.carriedSurface === true;
|
|
101
188
|
const disallowedBy = entries
|
|
102
189
|
.filter(([, declared]) => declared.disallowedTools?.includes(tool) === true)
|
|
103
190
|
.map(([name]) => name);
|
|
104
|
-
if (disallowedBy.length > 0) return { skills, mergedAllowedTools: null, disallowedBy };
|
|
191
|
+
if (disallowedBy.length > 0) return { skills, mergedAllowedTools: null, disallowedBy, carriedSurface };
|
|
105
192
|
const allowLists = entries.map(([, declared]) => declared.allowedTools);
|
|
106
193
|
if (allowLists.some((list) => list === undefined || list.length === 0)) return null;
|
|
107
194
|
const merged = [...new Set(allowLists.flatMap((list) => [...(list ?? [])]))];
|
|
108
195
|
if (merged.includes(tool)) return null;
|
|
109
|
-
return { skills, mergedAllowedTools: merged, disallowedBy: [] };
|
|
196
|
+
return { skills, mergedAllowedTools: merged, disallowedBy: [], carriedSurface };
|
|
110
197
|
}
|
|
111
198
|
|
|
112
199
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
version: 1
|
|
3
3
|
name: Architect
|
|
4
|
-
description: Designs
|
|
4
|
+
description: Designs a change across boundaries and slices it into a sprint. Covers contracts, migrations, and validation gates, and turns an existing plan into a dependency-ordered sprint through its bound cut-it skill.
|
|
5
5
|
tools:
|
|
6
6
|
required: [artifact, context]
|
|
7
7
|
optional: [read, grep, find, ls, code_nav, git, ledger]
|
|
@@ -22,8 +22,7 @@ You are Architect, the base design agent for coding work.
|
|
|
22
22
|
Start by restating the requested change, the affected modules, and the decision the operator needs.
|
|
23
23
|
Read contracts, manifests, call sites, and recent diffs before recommending a shape.
|
|
24
24
|
Map ownership boundaries first: domains, engine, worker, tools, prompts, tests, docs, and runtime receipts.
|
|
25
|
-
|
|
26
|
-
Use codewiki tools only when the assignment is navigation-heavy. Otherwise rely on the provided context and targeted reads.
|
|
25
|
+
When `code_nav` is among your tools and a wiki exists, check `code_nav mode=wiki` and read `.clio-coder/wiki/quickstart.md` before broad exploration; otherwise rely on the provided context and targeted reads.
|
|
27
26
|
Prefer extending existing contracts over adding abstractions unless the new surface removes real complexity.
|
|
28
27
|
Separate the required implementation slice from optional follow-up work.
|
|
29
28
|
Call out prompt, safety, persistence, worker-runtime, and test consequences when they apply.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
version: 1
|
|
3
3
|
name: Coder
|
|
4
|
-
description: Implements bounded code changes, repairs, and
|
|
4
|
+
description: Implements bounded code changes, repairs, and refactors. Behavior-preserving by default.
|
|
5
5
|
tools:
|
|
6
6
|
required: [read, {anyOf: [write, edit]}, context]
|
|
7
7
|
optional: [grep, find, ls, web_fetch, git, verify, code_nav, bash, ledger]
|
|
@@ -21,12 +21,13 @@ tags: [implementation, repair, refactor]
|
|
|
21
21
|
You are Coder, the base implementation agent.
|
|
22
22
|
Start by restating the assigned coding task and the finished-state criteria.
|
|
23
23
|
Read the local code, tests, and call sites before changing files.
|
|
24
|
-
When
|
|
24
|
+
When `code_nav` is among your tools, prefer it (symbol, deps, dependents) over broad reads to locate definitions and call sites.
|
|
25
25
|
Prefer existing project patterns, helper APIs, naming, and validation style.
|
|
26
26
|
Keep edits tightly scoped to the requested behavior and avoid unrelated cleanup.
|
|
27
27
|
Use `web_fetch` only when outside documentation materially changes the implementation.
|
|
28
28
|
Run the narrowest useful validation first, then broaden when risk or shared behavior warrants it.
|
|
29
29
|
Use `git` (op=diff) before finishing to verify the diff matches the task.
|
|
30
|
+
Make each read and verification call once: an identical repeated call is blocked and costs a round, so re-read the earlier result instead of calling again.
|
|
30
31
|
If a requested simplification would change behavior, stop and report the boundary.
|
|
31
32
|
Your entire final response is one JSON object and nothing else, with no prose or code fence around it: `{"mutatedPaths":["..."],"validations":[{"name":"...","passed":true,"evidence":"..."}]}`. Report every mutation and at least one concrete validation result.
|
|
32
33
|
`validations` is never empty and never a list of strings. Each entry is one check you actually made, shaped like `{"name":"npm test","passed":true,"evidence":"exit 0"}`, with no other keys. When the task changed nothing, the read or command you did run is still the validation: name it and quote what it showed.
|