@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
|
@@ -217,6 +217,14 @@ export function createTurnRecovery(deps: TurnRecoveryDeps): TurnRecovery {
|
|
|
217
217
|
text: string,
|
|
218
218
|
initialFailure: TerminalAssistantFailure,
|
|
219
219
|
): Promise<boolean> => {
|
|
220
|
+
// A LiteLLM model id can be a deliberate physical route. Retrying it in
|
|
221
|
+
// Clio obscures the failure, delays operator recovery, and can multiply
|
|
222
|
+
// attempts beneath a gateway. Preserve and emit the one terminal failure;
|
|
223
|
+
// the operator can choose another advertised route with /model.
|
|
224
|
+
if (agentRuntime.runtimeId === "litellm") {
|
|
225
|
+
ensureFailureVisibleAndPersisted(initialFailure);
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
220
228
|
const settings = deps.retrySettings();
|
|
221
229
|
if (!settings.enabled || settings.maxRetries <= 0) return false;
|
|
222
230
|
if (initialFailure.stopReason === "aborted" || !isRetryableErrorMessage(initialFailure.errorMessage)) return false;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { performance } from "node:perf_hooks";
|
|
9
9
|
import type { BackendCompletionTimings } from "../core/cache-telemetry.js";
|
|
10
10
|
import type { ClioSettings } from "../core/config.js";
|
|
11
|
+
import { gatewayRoutingObservationFromRecord, gatewayRoutingObservationLabel } from "../core/gateway-routing.js";
|
|
11
12
|
import { attributedModelId } from "../core/response-model-id.js";
|
|
12
13
|
import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
|
|
13
14
|
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
@@ -130,6 +131,8 @@ export interface TurnRuntimeDeps {
|
|
|
130
131
|
context: TurnContext;
|
|
131
132
|
middleware: TurnMiddleware;
|
|
132
133
|
retrySettings: () => RetrySettings;
|
|
134
|
+
/** Stable Clio session id forwarded only to gateway runtimes that understand it. */
|
|
135
|
+
sessionId?: () => string | undefined;
|
|
133
136
|
emit: (event: AgentEvent | AssistantDeltaEvent) => void;
|
|
134
137
|
emitNotice: (text: string) => void;
|
|
135
138
|
/** Tool-call id to its `performance.now()` start mark; spans only, never an instant. */
|
|
@@ -447,6 +450,11 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
447
450
|
cleanupSessionResources(state.runtime.agent.sessionId);
|
|
448
451
|
}
|
|
449
452
|
let getCurrentAgentSignal: () => AbortSignal | undefined = () => undefined;
|
|
453
|
+
const gatewaySessionId = target.runtime.id === "litellm" ? deps.sessionId?.() : undefined;
|
|
454
|
+
// message_start can follow response headers. Keep each invocation's
|
|
455
|
+
// monotonic anchor before that wait, including custom stream delegates.
|
|
456
|
+
let apiCallStartedAt: number | null = null;
|
|
457
|
+
let apiCallFirstDeltaAt: number | null = null;
|
|
450
458
|
const handle = deps.createAgent({
|
|
451
459
|
initialState: {
|
|
452
460
|
systemPrompt: fallbackIdentityPrompt(),
|
|
@@ -456,6 +464,11 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
456
464
|
messages: priorMessages,
|
|
457
465
|
},
|
|
458
466
|
maxRetryDelayMs: deps.retrySettings().maxDelayMs,
|
|
467
|
+
...(gatewaySessionId ? { sessionId: gatewaySessionId } : {}),
|
|
468
|
+
onStreamInvocation: () => {
|
|
469
|
+
apiCallStartedAt = performance.now();
|
|
470
|
+
apiCallFirstDeltaAt = null;
|
|
471
|
+
},
|
|
459
472
|
onPayload: async (payload, currentModel) => {
|
|
460
473
|
const thinkingPatched = patchProviderThinkingPayload(payload, currentModel, state.currentThinkingLevel);
|
|
461
474
|
const basePayload = thinkingPatched ?? payload;
|
|
@@ -575,10 +588,6 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
575
588
|
|
|
576
589
|
let streamStartedAt: number | null = null;
|
|
577
590
|
let firstAssistantDeltaAt: number | null = null;
|
|
578
|
-
// Per-API-call timing (T3.2): one assistant message per provider call,
|
|
579
|
-
// bounded by message_start/message_end; the first delta marks TTFT.
|
|
580
|
-
let apiCallStartedAt: number | null = null;
|
|
581
|
-
let apiCallFirstDeltaAt: number | null = null;
|
|
582
591
|
// First call of the run is the one whose verdict says whether the
|
|
583
592
|
// backend reused the session prefix; later calls in a tool loop are
|
|
584
593
|
// trivially warm.
|
|
@@ -669,6 +678,15 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
669
678
|
}
|
|
670
679
|
let publicEvent = enrichedEvent;
|
|
671
680
|
if (enrichedEvent.type === "message_end" && enrichedEvent.message?.role === "assistant") {
|
|
681
|
+
const gatewayRouting = gatewayRoutingObservationFromRecord(
|
|
682
|
+
enrichedEvent.message as unknown as Record<string, unknown>,
|
|
683
|
+
);
|
|
684
|
+
if (
|
|
685
|
+
gatewayRouting !== null &&
|
|
686
|
+
((gatewayRouting.attemptedFallbacks ?? 0) > 0 || (gatewayRouting.attemptedRetries ?? 0) > 0)
|
|
687
|
+
) {
|
|
688
|
+
deps.emitNotice(`[Clio Coder] ${gatewayRoutingObservationLabel(gatewayRouting)}`);
|
|
689
|
+
}
|
|
672
690
|
const interruptedUsage = estimatedUsageForInterruptedTurn(enrichedEvent.message, context.promptSideTokens());
|
|
673
691
|
if (interruptedUsage !== null) {
|
|
674
692
|
// Persistence records the same estimate, but it does so after the
|
|
@@ -718,17 +736,15 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
718
736
|
// mediator, a dropped frame) therefore stops suspending the watchdog
|
|
719
737
|
// at the turn that issued it instead of for the rest of the run.
|
|
720
738
|
if (publicEvent?.type === "turn_end") toolsInFlight = 0;
|
|
721
|
-
if (publicEvent?.type === "message_start" && publicEvent.message?.role === "assistant") {
|
|
722
|
-
apiCallStartedAt = eventClock;
|
|
723
|
-
apiCallFirstDeltaAt = null;
|
|
724
|
-
}
|
|
725
739
|
if (publicEvent?.type === "message_update") {
|
|
726
740
|
const assistantEvent = publicEvent.assistantMessageEvent as { type?: string; delta?: unknown };
|
|
727
741
|
const hasDelta =
|
|
728
|
-
assistantEvent.type === "text_delta" ||
|
|
729
|
-
assistantEvent.type === "thinking_delta" ||
|
|
730
742
|
assistantEvent.type === "toolcall_start" ||
|
|
731
|
-
assistantEvent.type === "
|
|
743
|
+
((assistantEvent.type === "text_delta" ||
|
|
744
|
+
assistantEvent.type === "thinking_delta" ||
|
|
745
|
+
assistantEvent.type === "toolcall_delta") &&
|
|
746
|
+
typeof assistantEvent.delta === "string" &&
|
|
747
|
+
assistantEvent.delta.length > 0);
|
|
732
748
|
if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
|
|
733
749
|
if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
|
|
734
750
|
}
|
|
@@ -127,6 +127,12 @@ export interface ChatTurnState {
|
|
|
127
127
|
/** A middleware request_continuation is waiting to resubmit after settle. */
|
|
128
128
|
pendingRequestContinuation: boolean;
|
|
129
129
|
currentPendingSkillPolicy: PendingSkillToolPolicy | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* Tool surface an activated skill narrowed, held across the operator's
|
|
132
|
+
* later turns. Replaced when the operator activates a different skill,
|
|
133
|
+
* cleared by `/skill off`, gone with the session.
|
|
134
|
+
*/
|
|
135
|
+
activeSkillSurface: PendingSkillToolPolicy | undefined;
|
|
130
136
|
currentAskUserPolicy: AskUserToolPolicy | undefined;
|
|
131
137
|
lastRunSnapshot: ChatLoopRunSnapshot | null;
|
|
132
138
|
}
|
|
@@ -153,6 +159,7 @@ export function createTurnState(initialThinkingLevel: ThinkingLevel): ChatTurnSt
|
|
|
153
159
|
stalledTurnNudgeSpent: false,
|
|
154
160
|
pendingRequestContinuation: false,
|
|
155
161
|
currentPendingSkillPolicy: undefined,
|
|
162
|
+
activeSkillSurface: undefined,
|
|
156
163
|
currentAskUserPolicy: undefined,
|
|
157
164
|
lastRunSnapshot: null,
|
|
158
165
|
};
|
|
@@ -62,7 +62,12 @@ export interface WorkerAttempt {
|
|
|
62
62
|
export type WorkerResultContract = "pass" | "fail" | "not-reached" | "unmeasured";
|
|
63
63
|
|
|
64
64
|
/** Result kinds whose parsed envelopes have a dedicated transcript presentation. */
|
|
65
|
-
export type WorkerPresentedResultContract =
|
|
65
|
+
export type WorkerPresentedResultContract =
|
|
66
|
+
| "debugger-report"
|
|
67
|
+
| "verifier-report"
|
|
68
|
+
| "research-report"
|
|
69
|
+
| "world-knowledge-report"
|
|
70
|
+
| "scout-report";
|
|
66
71
|
|
|
67
72
|
/**
|
|
68
73
|
* Terminal facts a worker block reports. Sealed by the receipt when it can be
|
|
@@ -52,6 +52,10 @@ export type YaziBridgeOpenResult =
|
|
|
52
52
|
|
|
53
53
|
export interface YaziBridge {
|
|
54
54
|
open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
|
|
55
|
+
/** Close the files pane and hand focus back to the composer; false when nothing was open. */
|
|
56
|
+
close(): Promise<boolean>;
|
|
57
|
+
/** True while the pane host still reports the files pane. */
|
|
58
|
+
isOpen(): boolean;
|
|
55
59
|
status(): Readonly<YaziBridgeStatus>;
|
|
56
60
|
dispose(): void;
|
|
57
61
|
}
|
|
@@ -312,9 +316,12 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
312
316
|
}
|
|
313
317
|
deps.setDraft(appendDraft(draft, batch.text));
|
|
314
318
|
deps.requestRender();
|
|
319
|
+
// The pick is the end of the operator's trip into the files pane, so the
|
|
320
|
+
// keyboard comes back to the composer without a click.
|
|
321
|
+
void deps.mux?.focusSelf();
|
|
315
322
|
deps.notice(
|
|
316
323
|
"info",
|
|
317
|
-
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the
|
|
324
|
+
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the files pane added to the draft`,
|
|
318
325
|
);
|
|
319
326
|
if (batch.plainPaths > 0) {
|
|
320
327
|
deps.notice(
|
|
@@ -366,6 +373,8 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
366
373
|
if (disposed || ownGeneration !== generation) return;
|
|
367
374
|
paneCwd = choice.cwd;
|
|
368
375
|
if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
|
|
376
|
+
// A cancelled pick still ends the trip; the composer gets the keyboard back.
|
|
377
|
+
else void deps.mux?.focusSelf();
|
|
369
378
|
},
|
|
370
379
|
onStopped: () => {
|
|
371
380
|
if (ownGeneration !== generation) return;
|
|
@@ -379,12 +388,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
379
388
|
return { status: "unavailable", reason: "the file pane was closed while it was opening" };
|
|
380
389
|
}
|
|
381
390
|
active = result.session;
|
|
391
|
+
// An explicit open is a request to go and pick something, so the keyboard
|
|
392
|
+
// follows the pane. The dock tier itself never steals focus; this is the
|
|
393
|
+
// one caller entitled to ask.
|
|
394
|
+
await mux.focusPane(result.session.pane.paneId);
|
|
382
395
|
if (mode === "companion") {
|
|
383
396
|
livenessTimer = setTimeout(() => {
|
|
384
397
|
if (disposed || ownGeneration !== generation || sawLine || active === null) return;
|
|
385
398
|
const stale = active;
|
|
386
399
|
active = null;
|
|
387
|
-
deps.notice("warning", "the
|
|
400
|
+
deps.notice("warning", "the files pane did not report back in time; reopening it in pick mode");
|
|
388
401
|
void stale.close().finally(() => {
|
|
389
402
|
if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
|
|
390
403
|
});
|
|
@@ -394,16 +407,49 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
394
407
|
return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
|
|
395
408
|
};
|
|
396
409
|
|
|
410
|
+
/**
|
|
411
|
+
* The pane host is the authority on whether the pane exists. `active` lags
|
|
412
|
+
* it by one event at most, but a caller deciding between open and close
|
|
413
|
+
* must not be told a pane is open when herdr already reported it gone.
|
|
414
|
+
*/
|
|
415
|
+
const liveSession = (): YaziSession | null => {
|
|
416
|
+
if (active === null) return null;
|
|
417
|
+
const mux = deps.mux;
|
|
418
|
+
if (mux?.available() && !mux.list().some((record) => record.ref.paneId === active?.pane.paneId)) {
|
|
419
|
+
active = null;
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
return active;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const closeActive = async (): Promise<boolean> => {
|
|
426
|
+
const session = liveSession();
|
|
427
|
+
if (session === null) return false;
|
|
428
|
+
generation += 1;
|
|
429
|
+
clearLiveness();
|
|
430
|
+
active = null;
|
|
431
|
+
await session.close();
|
|
432
|
+
// Closing the dock the operator was looking at would otherwise leave
|
|
433
|
+
// focus wherever herdr puts it after a close, which is not the composer.
|
|
434
|
+
await deps.mux?.focusSelf();
|
|
435
|
+
return true;
|
|
436
|
+
};
|
|
437
|
+
|
|
397
438
|
return {
|
|
398
439
|
async open(options = {}): Promise<YaziBridgeOpenResult> {
|
|
399
|
-
if (disposed) return { status: "unavailable", reason: "the
|
|
440
|
+
if (disposed) return { status: "unavailable", reason: "the files pane bridge is closed" };
|
|
400
441
|
const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
|
|
401
|
-
|
|
442
|
+
const existing = liveSession();
|
|
443
|
+
if (existing) {
|
|
402
444
|
if (settings.followCwd) {
|
|
403
445
|
const cwd = deps.getCwd();
|
|
404
|
-
if (await
|
|
446
|
+
if (await existing.pushCwd(cwd)) paneCwd = cwd;
|
|
405
447
|
}
|
|
406
|
-
|
|
448
|
+
// Re-opening an open pane means "take me there": leave any zoom that
|
|
449
|
+
// hides it and put the keyboard in it.
|
|
450
|
+
await deps.mux?.unzoomSelf();
|
|
451
|
+
await deps.mux?.focusPane(existing.pane.paneId);
|
|
452
|
+
return { status: "opened", mode: existing.mode, paneId: existing.pane.paneId, existing: true };
|
|
407
453
|
}
|
|
408
454
|
const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
|
|
409
455
|
if (!deps.mux?.available()) {
|
|
@@ -426,8 +472,16 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
426
472
|
}
|
|
427
473
|
return result;
|
|
428
474
|
}
|
|
475
|
+
await deps.mux.unzoomSelf();
|
|
429
476
|
return await start(mode, settings.profile, settings.ratio);
|
|
430
477
|
},
|
|
478
|
+
close(): Promise<boolean> {
|
|
479
|
+
if (disposed) return Promise.resolve(false);
|
|
480
|
+
return closeActive();
|
|
481
|
+
},
|
|
482
|
+
isOpen(): boolean {
|
|
483
|
+
return liveSession() !== null;
|
|
484
|
+
},
|
|
431
485
|
status(): Readonly<YaziBridgeStatus> {
|
|
432
486
|
const snapshot = active?.snapshot();
|
|
433
487
|
return {
|
package/src/tools/agent-tools.ts
CHANGED
|
@@ -296,6 +296,35 @@ function errorMessage(err: unknown): string {
|
|
|
296
296
|
return err instanceof Error ? err.message : String(err);
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
+
/**
|
|
300
|
+
* The parameter schema as the provider should see it.
|
|
301
|
+
*
|
|
302
|
+
* TypeBox 1.x annotates every schema it builds with string-keyed markers
|
|
303
|
+
* (`~unsafe` on `Type.Unsafe`, `~optional` on `Type.Optional`, and so on).
|
|
304
|
+
* Unlike the older symbol keys they survive `JSON.stringify`, so each enum
|
|
305
|
+
* field reached the model as `{"~unsafe": null, "~optional": true, ...}`:
|
|
306
|
+
* 44 junk keys on the default surface, and a small model has no way to know
|
|
307
|
+
* that `"~unsafe": null` means nothing. Validation does not need them
|
|
308
|
+
* (`Value.Check` answers identically with and without), so the copy handed
|
|
309
|
+
* to the agent loop drops every `~`-prefixed key. Symbol keys are copied
|
|
310
|
+
* through untouched because pi-ai picks its coercion path by the TypeBox
|
|
311
|
+
* kind symbol on the root schema.
|
|
312
|
+
*/
|
|
313
|
+
function wireParameterSchema<T>(schema: T): T {
|
|
314
|
+
if (Array.isArray(schema)) return schema.map((entry) => wireParameterSchema(entry)) as T;
|
|
315
|
+
if (typeof schema !== "object" || schema === null) return schema;
|
|
316
|
+
const source = schema as Record<PropertyKey, unknown>;
|
|
317
|
+
const out: Record<PropertyKey, unknown> = {};
|
|
318
|
+
for (const key of Object.keys(source)) {
|
|
319
|
+
if (key.startsWith("~")) continue;
|
|
320
|
+
out[key] = wireParameterSchema(source[key]);
|
|
321
|
+
}
|
|
322
|
+
for (const symbol of Object.getOwnPropertySymbols(source)) {
|
|
323
|
+
out[symbol] = source[symbol];
|
|
324
|
+
}
|
|
325
|
+
return out as T;
|
|
326
|
+
}
|
|
327
|
+
|
|
299
328
|
function toAgentTool(
|
|
300
329
|
spec: ToolSpec,
|
|
301
330
|
registry: ToolRegistry,
|
|
@@ -305,7 +334,7 @@ function toAgentTool(
|
|
|
305
334
|
const tool: AgentTool<TSchema> = {
|
|
306
335
|
name: spec.name,
|
|
307
336
|
description: spec.description,
|
|
308
|
-
parameters: spec.parameters,
|
|
337
|
+
parameters: wireParameterSchema(spec.parameters),
|
|
309
338
|
label: spec.metadata?.uiLabel ?? spec.name,
|
|
310
339
|
async execute(
|
|
311
340
|
toolCallId: string,
|
package/src/tools/artifact.ts
CHANGED
|
@@ -20,7 +20,7 @@ import type { ToolResult, ToolSpec } from "./registry.js";
|
|
|
20
20
|
* tree holds files a human asked for, and everything Clio generates on its own
|
|
21
21
|
* belongs in the gitignored project directory. An explicit `path` still writes
|
|
22
22
|
* wherever the caller says, inside the workspace. See core/artifact-paths.ts
|
|
23
|
-
* and docs/artifact-placement.md.
|
|
23
|
+
* and docs/architecture/artifact-placement.md.
|
|
24
24
|
*
|
|
25
25
|
* Skills are not artifacts: a skill is a SKILL.md folder written with the
|
|
26
26
|
* ordinary write tool and validated by the skills loader on load. The
|
|
@@ -83,7 +83,7 @@ async function writeTerminalArtifact(
|
|
|
83
83
|
export function createArtifactTool(deps: ArtifactToolDeps = {}): ToolSpec {
|
|
84
84
|
return {
|
|
85
85
|
name: ToolNames.Artifact,
|
|
86
|
-
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
86
|
+
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn, so close the task board (tasks done/block/drop) before writing it. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
87
87
|
parameters: Type.Object({
|
|
88
88
|
kind: StringEnum(ARTIFACT_KINDS, { description: "Artifact kind." }),
|
|
89
89
|
content: Type.String({ description: "Full Markdown body." }),
|
package/src/tools/ask-user.ts
CHANGED
|
@@ -92,13 +92,13 @@ export interface AskUserToolDeps {
|
|
|
92
92
|
export const askUserParameters = Type.Object({
|
|
93
93
|
action: Type.Optional(
|
|
94
94
|
StringEnum(["ask", "complete"], {
|
|
95
|
-
description: "ask presents a round of questions; complete
|
|
95
|
+
description: "ask presents a round of questions; complete records the decisions, once, before final prose.",
|
|
96
96
|
}),
|
|
97
97
|
),
|
|
98
98
|
mode: Type.Optional(
|
|
99
99
|
StringEnum(["round", "single_question"], {
|
|
100
100
|
description:
|
|
101
|
-
"
|
|
101
|
+
"round (default) accepts 1 to 4 tightly related questions; single_question accepts exactly one, for interviews.",
|
|
102
102
|
}),
|
|
103
103
|
),
|
|
104
104
|
questions: Type.Optional(
|
|
@@ -135,7 +135,7 @@ export const askUserParameters = Type.Object({
|
|
|
135
135
|
exposure: Type.Optional(
|
|
136
136
|
StringEnum(["local", "outward"], {
|
|
137
137
|
description:
|
|
138
|
-
"
|
|
138
|
+
"local (default) stays inside the workspace; outward publishes or sends something the operator cannot take back (issue, PR, comment, push, release) and parks for the operator at auto-edit.",
|
|
139
139
|
}),
|
|
140
140
|
),
|
|
141
141
|
});
|
package/src/tools/bash.ts
CHANGED
|
@@ -163,7 +163,7 @@ export const bashTool: ToolSpec = {
|
|
|
163
163
|
cwd: Type.Optional(
|
|
164
164
|
Type.String({
|
|
165
165
|
description:
|
|
166
|
-
"Omit
|
|
166
|
+
"Omit unless the command must run in a subdirectory of the workspace root, given as a relative path; outside the root is blocked.",
|
|
167
167
|
}),
|
|
168
168
|
),
|
|
169
169
|
timeout_ms: Type.Optional(Type.Number({ description: "Timeout in milliseconds." })),
|
package/src/tools/bootstrap.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
|
|
|
10
10
|
import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
|
|
11
11
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
12
12
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
13
|
+
import type { DispatchSchemaComposition } from "./dispatch-schema.js";
|
|
13
14
|
import { lazyTool } from "./lazy-tool.js";
|
|
14
15
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
15
16
|
import { panesToolSurface } from "./panes-surface.js";
|
|
@@ -27,6 +28,8 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
27
28
|
getAutonomy?: () => AutonomyLevel;
|
|
28
29
|
getCostCeilingUsd?: () => number;
|
|
29
30
|
getWorkerRosters?: () => WorkerRosters;
|
|
31
|
+
/** Which optional `dispatch` schema blocks this session advertises; absent means every block. */
|
|
32
|
+
getDispatchSchemaComposition?: () => DispatchSchemaComposition;
|
|
30
33
|
dispatchBackground?: DispatchBackgroundRegistry;
|
|
31
34
|
/** Optional herdr worktree lifecycle for compete candidates. */
|
|
32
35
|
competeMuxWorktrees?: CompeteMuxWorktrees;
|
|
@@ -61,6 +64,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
61
64
|
...(deps.getAutonomy ? { getAutonomy: deps.getAutonomy } : {}),
|
|
62
65
|
...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
|
|
63
66
|
...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
|
|
67
|
+
...(deps.getDispatchSchemaComposition ? { getSchemaComposition: deps.getDispatchSchemaComposition } : {}),
|
|
64
68
|
...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
|
|
65
69
|
...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
|
|
66
70
|
};
|
|
@@ -4,7 +4,13 @@ import { BASH_DEFAULT_RESULT_DISPOSITION } from "./bash.js";
|
|
|
4
4
|
import { OBSERVATION_POLICY_SLACK_BYTES, OBSERVE_SELF_CAPS } from "./observation.js";
|
|
5
5
|
import { toolPresentationPolicy } from "./presentation.js";
|
|
6
6
|
import { readMaxBytes } from "./read.js";
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
resolveToolPromptHint,
|
|
9
|
+
type ToolMetadata,
|
|
10
|
+
type ToolPromptHintRole,
|
|
11
|
+
type ToolSourceInfo,
|
|
12
|
+
type ToolSpec,
|
|
13
|
+
} from "./registry.js";
|
|
8
14
|
|
|
9
15
|
function withSourceInfo<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
10
16
|
return { ...spec, sourceInfo };
|
|
@@ -83,7 +89,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
83
89
|
resultSizePolicy: observePolicy(OBSERVE_SELF_CAPS.codeNav, "Raise limit or use a narrower mode/query."),
|
|
84
90
|
costLatency: "local_fast",
|
|
85
91
|
promptHint:
|
|
86
|
-
"Use code_nav for
|
|
92
|
+
"Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
|
|
87
93
|
},
|
|
88
94
|
[ToolNames.Context]: {
|
|
89
95
|
objective: "Return workspace, bundled-docs, or skill context.",
|
|
@@ -94,8 +100,14 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
94
100
|
"Use a narrower query or scope to inspect omitted content.",
|
|
95
101
|
),
|
|
96
102
|
costLatency: "local_fast",
|
|
97
|
-
promptHint:
|
|
98
|
-
|
|
103
|
+
promptHint: {
|
|
104
|
+
session:
|
|
105
|
+
'On an explicit pending skill request, first load exactly that skill with context(scope="skills", name=<skill>). Follow a [Marketplace] reminder\'s exact ask_user options. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
106
|
+
worker:
|
|
107
|
+
'This worker has no operator skill-activation channel; do not load or suggest skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
108
|
+
boundWorker:
|
|
109
|
+
'Load only the harness-activated recipe-bound skills named in the persona, and only when they match the assigned task. This worker cannot install or suggest marketplace skills. Recall needed [evicted ...] content with context(scope="recall", ref=...).',
|
|
110
|
+
},
|
|
99
111
|
},
|
|
100
112
|
[ToolNames.CredentialPresent]: {
|
|
101
113
|
objective: "Check whether a credential key is present without returning its value.",
|
|
@@ -135,7 +147,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
135
147
|
resultDisposition: BASH_DEFAULT_RESULT_DISPOSITION,
|
|
136
148
|
costLatency: "local_slow",
|
|
137
149
|
promptHint:
|
|
138
|
-
"
|
|
150
|
+
"bash output_policy: omit for a bounded tail; summary for noisy commands; metadata-only when only the outcome matters; full only when the output is known to fit.",
|
|
139
151
|
},
|
|
140
152
|
[ToolNames.Git]: {
|
|
141
153
|
objective: "Read-only git inspection: status, diff, or log.",
|
|
@@ -167,9 +179,8 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
167
179
|
},
|
|
168
180
|
costLatency: "local_fast",
|
|
169
181
|
promptHint:
|
|
170
|
-
'
|
|
171
|
-
|
|
172
|
-
'(what proves it works), and use "block" with a reason instead of silently stalling.',
|
|
182
|
+
'For a request with three or more distinct steps, declare the board before the first edit: tasks(action="plan") with a title and the task list. ' +
|
|
183
|
+
"start one task before working it, close it with done plus an evidence note, and block with a reason instead of stalling.",
|
|
173
184
|
},
|
|
174
185
|
[ToolNames.Ledger]: {
|
|
175
186
|
objective: "Coordinate with the peer workers of this dispatch through typed claims, findings, and reviews.",
|
|
@@ -191,9 +202,10 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
191
202
|
resultSizePolicy: summaryPolicy(
|
|
192
203
|
"Use the dispatch receipt paths or ask a narrower worker follow-up for omitted output.",
|
|
193
204
|
),
|
|
205
|
+
// No hint: the Tool Contract's inventory line already says when
|
|
206
|
+
// dispatch(list:true) is the right answer, and the Fleet section says
|
|
207
|
+
// everything else about routing.
|
|
194
208
|
costLatency: "agent",
|
|
195
|
-
promptHint:
|
|
196
|
-
"Call dispatch with list:true only when the operator asks about agents, workers, or the fleet; never use it to inventory direct tools.",
|
|
197
209
|
},
|
|
198
210
|
[ToolNames.Monitor]: {
|
|
199
211
|
objective: "Inspect dispatched runs: state, recent events, receipts.",
|
|
@@ -226,7 +238,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
226
238
|
},
|
|
227
239
|
costLatency: "local_fast",
|
|
228
240
|
promptHint:
|
|
229
|
-
'When the operator asks to see a dispatched agent ("show me the tester"), call panes
|
|
241
|
+
'When the operator asks to see a dispatched agent ("show me the tester"), call panes(action="show", target=<agent id>).',
|
|
230
242
|
},
|
|
231
243
|
// RETRIEVE: network-class.
|
|
232
244
|
[ToolNames.WebFetch]: {
|
|
@@ -252,7 +264,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
252
264
|
},
|
|
253
265
|
costLatency: "local_slow",
|
|
254
266
|
promptHint:
|
|
255
|
-
'Use ask_user only when blocked on a decision the request does not answer
|
|
267
|
+
'Use ask_user only when blocked on a decision the request does not answer, never about something the operator already stated: one question per round in interviews, up to four related questions otherwise, recommended option first, then action="complete" with the decisions before final prose.',
|
|
256
268
|
},
|
|
257
269
|
// ARTIFACT: terminal writers.
|
|
258
270
|
[ToolNames.Artifact]: {
|
|
@@ -264,15 +276,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
264
276
|
},
|
|
265
277
|
};
|
|
266
278
|
|
|
267
|
-
/** Canonical,
|
|
268
|
-
export function toolPromptHintsForNames(
|
|
269
|
-
|
|
279
|
+
/** Canonical, role-aware prompt hints for an already-admitted tool set. */
|
|
280
|
+
export function toolPromptHintsForNames(
|
|
281
|
+
names: ReadonlyArray<ToolName>,
|
|
282
|
+
role: ToolPromptHintRole = "session",
|
|
283
|
+
): ReadonlyArray<{ tool: string; hint: string }> {
|
|
284
|
+
const seenTools = new Set<string>();
|
|
285
|
+
const seenHints = new Set<string>();
|
|
270
286
|
const hints: Array<{ tool: string; hint: string }> = [];
|
|
271
287
|
for (const name of [...names].sort()) {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
const hint = TOOL_METADATA[name]?.promptHint
|
|
275
|
-
if (hint
|
|
288
|
+
if (seenTools.has(name)) continue;
|
|
289
|
+
seenTools.add(name);
|
|
290
|
+
const hint = resolveToolPromptHint(TOOL_METADATA[name]?.promptHint, role);
|
|
291
|
+
if (!hint || seenHints.has(hint)) continue;
|
|
292
|
+
seenHints.add(hint);
|
|
293
|
+
hints.push({ tool: name, hint });
|
|
276
294
|
}
|
|
277
295
|
return hints;
|
|
278
296
|
}
|
|
@@ -282,9 +300,21 @@ export function toolPromptHintsForNames(names: ReadonlyArray<ToolName>): Readonl
|
|
|
282
300
|
// live panel (which has no registry) answer the fold question identically.
|
|
283
301
|
function withBuiltinMetadata<T extends ToolSpec>(spec: T): T {
|
|
284
302
|
const metadata = TOOL_METADATA[spec.name];
|
|
285
|
-
return
|
|
286
|
-
|
|
287
|
-
|
|
303
|
+
if (!metadata) return spec;
|
|
304
|
+
// The read cap is a guardrail (`safety.limits.readBytesPerCall`) installed
|
|
305
|
+
// from settings after this module loads, so the table's import-time value
|
|
306
|
+
// is the default, not the operator's. Recompute the policy cap when the tool
|
|
307
|
+
// is registered; the drift check in policy.ts compares against the live cap
|
|
308
|
+
// and a settings file raising the read cap used to fail boot.
|
|
309
|
+
const resultSizePolicy =
|
|
310
|
+
spec.name === ToolNames.Read
|
|
311
|
+
? observePolicy(readMaxBytes(), metadata.resultSizePolicy?.followUpHint ?? "")
|
|
312
|
+
: metadata.resultSizePolicy;
|
|
313
|
+
return withMetadata(spec, {
|
|
314
|
+
...metadata,
|
|
315
|
+
...(resultSizePolicy ? { resultSizePolicy } : {}),
|
|
316
|
+
presentation: toolPresentationPolicy(spec.name, undefined),
|
|
317
|
+
});
|
|
288
318
|
}
|
|
289
319
|
|
|
290
320
|
export function builtin<T extends ToolSpec>(spec: T, sourceInfo: ToolSourceInfo): T {
|
|
@@ -12,6 +12,12 @@ export const codeNavToolSurface = {
|
|
|
12
12
|
description:
|
|
13
13
|
"Navigate the indexed codewiki: mode=symbol finds files by symbol, path finds files by glob/regex/substring, entries lists likely entry points, outline lists file symbols, deps lists imports, and dependents lists importers. mode=wiki without query lists generated Markdown wiki pages; with query it resolves a page id/title and returns its summary plus a path to open with read. For Clio's bundled product docs use context scope=docs.",
|
|
14
14
|
parameters: Type.Object({
|
|
15
|
+
source: Type.Optional(
|
|
16
|
+
StringEnum(["workspace", "clio"], {
|
|
17
|
+
description: "Code map source (default workspace).",
|
|
18
|
+
default: "workspace",
|
|
19
|
+
}),
|
|
20
|
+
),
|
|
15
21
|
mode: StringEnum(["symbol", "path", "entries", "outline", "deps", "dependents", "wiki"], {
|
|
16
22
|
description: "Lookup mode.",
|
|
17
23
|
}),
|