@iowarp/clio-coder 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +20 -3
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +22 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -6,32 +6,33 @@ import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-life
|
|
|
6
6
|
export const APPLICATION_DOUBLE_TAP_MS = 500;
|
|
7
7
|
|
|
8
8
|
const CLOSED_ACTION_ORDER = [
|
|
9
|
-
"clio.notifications.dismiss",
|
|
10
|
-
"clio.tool.expand",
|
|
11
|
-
"clio.tool.expandAll",
|
|
12
|
-
"clio.tool.liveOutput",
|
|
13
|
-
"clio.editor.external",
|
|
14
|
-
"clio.message.followUp",
|
|
15
|
-
"clio.message.interrupt",
|
|
16
|
-
"clio.message.dequeue",
|
|
17
|
-
"clio.thinking.expand",
|
|
18
|
-
"clio.thinking.expandAll",
|
|
9
|
+
"clio-coder.notifications.dismiss",
|
|
10
|
+
"clio-coder.tool.expand",
|
|
11
|
+
"clio-coder.tool.expandAll",
|
|
12
|
+
"clio-coder.tool.liveOutput",
|
|
13
|
+
"clio-coder.editor.external",
|
|
14
|
+
"clio-coder.message.followUp",
|
|
15
|
+
"clio-coder.message.interrupt",
|
|
16
|
+
"clio-coder.message.dequeue",
|
|
17
|
+
"clio-coder.thinking.expand",
|
|
18
|
+
"clio-coder.thinking.expandAll",
|
|
19
19
|
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
20
20
|
|
|
21
|
-
const GLOBAL_ACTION_ORDER = [
|
|
22
|
-
"clio.status.toggle",
|
|
23
|
-
"clio.thinking.cycle",
|
|
24
|
-
"clio.session.tree",
|
|
25
|
-
"clio.dispatchBoard.toggle",
|
|
26
|
-
"clio.
|
|
27
|
-
"clio.
|
|
28
|
-
"clio.
|
|
29
|
-
"clio.
|
|
21
|
+
export const GLOBAL_ACTION_ORDER = [
|
|
22
|
+
"clio-coder.status.toggle",
|
|
23
|
+
"clio-coder.thinking.cycle",
|
|
24
|
+
"clio-coder.session.tree",
|
|
25
|
+
"clio-coder.dispatchBoard.toggle",
|
|
26
|
+
"clio-coder.files.toggle",
|
|
27
|
+
"clio-coder.tasks.open",
|
|
28
|
+
"clio-coder.decisions.open",
|
|
29
|
+
"clio-coder.dispatch.background",
|
|
30
|
+
"clio-coder.model.select",
|
|
30
31
|
// Backward stays ahead of forward so prefix-overlapping user bindings keep
|
|
31
32
|
// the same more-specific-first behavior as the original input listener.
|
|
32
|
-
"clio.model.cycleBackward",
|
|
33
|
-
"clio.model.cycleForward",
|
|
34
|
-
"clio.exit",
|
|
33
|
+
"clio-coder.model.cycleBackward",
|
|
34
|
+
"clio-coder.model.cycleForward",
|
|
35
|
+
"clio-coder.exit",
|
|
35
36
|
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
36
37
|
|
|
37
38
|
export type CtrlCAction = "cancel-stream" | "close-overlay" | "clear-editor" | "arm-shutdown" | "shutdown";
|
|
@@ -72,7 +72,7 @@ function isSafetyBlockedPayload(value: unknown): value is SafetyBlockedPayload {
|
|
|
72
72
|
function isMiddlewareHookFailedPayload(value: unknown): value is MiddlewareHookFailedPayload {
|
|
73
73
|
if (!value || typeof value !== "object") return false;
|
|
74
74
|
const p = value as Record<string, unknown>;
|
|
75
|
-
if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded") return false;
|
|
75
|
+
if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded" && p.kind !== "registration_conflict") return false;
|
|
76
76
|
if (typeof p.registrationId !== "string" || p.registrationId.length === 0) return false;
|
|
77
77
|
if (typeof p.hook !== "string" || p.hook.length === 0) return false;
|
|
78
78
|
if (p.message !== undefined && typeof p.message !== "string") return false;
|
|
@@ -125,7 +125,7 @@ function workerEscalationAxis(
|
|
|
125
125
|
return null;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
function middlewareBudgetWarningKey(payload: unknown): string | null {
|
|
129
129
|
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
130
130
|
if (payload.kind !== "budget_exceeded") return null;
|
|
131
131
|
return `${payload.registrationId}\u0000${payload.hook}`;
|
|
@@ -137,11 +137,18 @@ export function middlewareBudgetWarningKey(payload: unknown): string | null {
|
|
|
137
137
|
* either way; this warn notice is the operator's only interactive signal
|
|
138
138
|
* that a guard or assessor is misbehaving.
|
|
139
139
|
*/
|
|
140
|
-
|
|
140
|
+
function middlewareHookFailedNotice(
|
|
141
141
|
payload: unknown,
|
|
142
142
|
options: MiddlewareHookFailedNoticeOptions = {},
|
|
143
143
|
): BusNotice | null {
|
|
144
144
|
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
145
|
+
if (payload.kind === "registration_conflict") {
|
|
146
|
+
const detail =
|
|
147
|
+
payload.message !== undefined && payload.message.length > 0
|
|
148
|
+
? payload.message
|
|
149
|
+
: `registration '${payload.registrationId}' conflicts with an existing id`;
|
|
150
|
+
return { level: "warn", text: `[middleware] ${detail}` };
|
|
151
|
+
}
|
|
145
152
|
if (payload.kind === "hook_failed") {
|
|
146
153
|
const detail = payload.message !== undefined && payload.message.length > 0 ? `: ${payload.message}` : "";
|
|
147
154
|
return {
|
|
@@ -21,12 +21,13 @@ import {
|
|
|
21
21
|
} from "../core/response-model-id.js";
|
|
22
22
|
import type { PendingSkillRequest, PendingSkillToolPolicy, SkillDeclaredToolPolicy } from "../core/skill-activation.js";
|
|
23
23
|
import { ToolNames } from "../core/tool-names.js";
|
|
24
|
-
import {
|
|
24
|
+
import { sha256 } from "../domains/prompts/hash.js";
|
|
25
25
|
import { toContextOverflowError } from "../domains/providers/errors.js";
|
|
26
26
|
import type { ResolvedRuntimeTarget } from "../domains/providers/index.js";
|
|
27
27
|
import { ceilChars, extractReasoningTokens } from "../domains/session/context-accounting.js";
|
|
28
28
|
import type { AgentMessage } from "../engine/types.js";
|
|
29
29
|
import type { AskUserToolPolicy } from "../tools/registry.js";
|
|
30
|
+
import { attachedToolSchemaBytes, attachedToolSchemasFromState } from "./prompt-cache-identity.js";
|
|
30
31
|
|
|
31
32
|
/** Minimal structural view of the engine agent used by state-inspection helpers. */
|
|
32
33
|
export interface AgentStateView {
|
|
@@ -291,18 +292,7 @@ export function pendingSkillRequestPreamble(requests: ReadonlyArray<PendingSkill
|
|
|
291
292
|
* tool-surface change.
|
|
292
293
|
*/
|
|
293
294
|
export function toolSignatureFromState(tools: ReadonlyArray<unknown>): string {
|
|
294
|
-
|
|
295
|
-
for (const tool of tools) {
|
|
296
|
-
if (!tool || typeof tool !== "object" || Array.isArray(tool)) continue;
|
|
297
|
-
const record = tool as Record<string, unknown>;
|
|
298
|
-
schemas.push({
|
|
299
|
-
name: typeof record.name === "string" ? record.name : "",
|
|
300
|
-
description: typeof record.description === "string" ? record.description : "",
|
|
301
|
-
parameters: record.parameters ?? null,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
schemas.sort((a, b) => a.name.localeCompare(b.name));
|
|
305
|
-
return sha256(canonicalJson(schemas));
|
|
295
|
+
return sha256(attachedToolSchemaBytes(attachedToolSchemasFromState(tools)));
|
|
306
296
|
}
|
|
307
297
|
|
|
308
298
|
/**
|
|
@@ -215,7 +215,7 @@ export interface ChatSubmitOptions {
|
|
|
215
215
|
* the turn runtime's own local fallback, so a `/btw` round against a local
|
|
216
216
|
* server authenticates exactly the way a turn against it does.
|
|
217
217
|
*/
|
|
218
|
-
const LOCAL_SIDE_QUESTION_API_KEY = "clio-local-target";
|
|
218
|
+
const LOCAL_SIDE_QUESTION_API_KEY = "clio-coder-local-target";
|
|
219
219
|
|
|
220
220
|
/** Closing notice an operator interrupt leaves in the transcript and the ledger. */
|
|
221
221
|
const INTERRUPT_CANCEL_REASON = "[Clio Coder] run interrupted by operator; delivering the new message now.";
|
|
@@ -372,7 +372,7 @@ export interface CreateChatLoopDeps {
|
|
|
372
372
|
/**
|
|
373
373
|
* Whitelist of target ids that the chat-loop is allowed to drive. The
|
|
374
374
|
* orchestrator composes this from `providers.list()` so an unknown
|
|
375
|
-
* `settings.
|
|
375
|
+
* `settings.chat.target` surfaces a configuration error before
|
|
376
376
|
* the agent is constructed.
|
|
377
377
|
*/
|
|
378
378
|
knownTargets: () => ReadonlySet<string>;
|
|
@@ -527,7 +527,7 @@ export interface CreateChatLoopDeps {
|
|
|
527
527
|
registerPrewarmEndpointSlot?: (runtime: AgentRuntime) => (() => void) | null;
|
|
528
528
|
}
|
|
529
529
|
|
|
530
|
-
|
|
530
|
+
function reloadProtectedArtifactsForSession(
|
|
531
531
|
protectedArtifacts: NonNullable<CreateChatLoopDeps["protectedArtifacts"]>,
|
|
532
532
|
readSessionEntries: (() => ReadonlyArray<SessionEntry>) | undefined,
|
|
533
533
|
): void {
|
|
@@ -547,7 +547,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
547
547
|
const sideQuestionRound = deps.runSideQuestion ?? runSideQuestion;
|
|
548
548
|
const handoffRound = deps.runHandoffRound ?? runHandoffRound;
|
|
549
549
|
const middlewareToolChoice = deps.middlewareToolChoice ?? createMiddlewareToolChoiceControl();
|
|
550
|
-
const state = createTurnState(deps.getSettings().
|
|
550
|
+
const state = createTurnState(deps.getSettings().chat.thinkingLevel ?? "off");
|
|
551
551
|
const toolStartTimes = new Map<string, number>();
|
|
552
552
|
|
|
553
553
|
const preparationListeners = new Set<(phase: TurnPreparationPhase) => void>();
|
|
@@ -639,16 +639,18 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
639
639
|
* collapsing them sent a client with a configured target to the wrong fix.
|
|
640
640
|
*/
|
|
641
641
|
const nullRuntimeAdmissionReason = (): string => {
|
|
642
|
-
const orchestrator = deps.getSettings().
|
|
642
|
+
const orchestrator = deps.getSettings().chat;
|
|
643
643
|
const target = orchestrator.target?.trim() ?? "";
|
|
644
644
|
const model = orchestrator.model?.trim() ?? "";
|
|
645
645
|
return target.length > 0 && model.length === 0 ? "model-not-configured" : "orchestrator-not-configured";
|
|
646
646
|
};
|
|
647
647
|
|
|
648
|
-
const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().retry);
|
|
648
|
+
const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().chat.retry);
|
|
649
649
|
|
|
650
650
|
const currentToolInvokeOptions = (): Partial<ToolInvokeOptions> => {
|
|
651
|
-
const options: Partial<ToolInvokeOptions> = {
|
|
651
|
+
const options: Partial<ToolInvokeOptions> = {
|
|
652
|
+
toolResultMaxBytes: deps.getSettings().context.toolResultMaxBytes,
|
|
653
|
+
};
|
|
652
654
|
const sessionId = deps.session?.current()?.id ?? null;
|
|
653
655
|
if (sessionId) options.sessionId = sessionId;
|
|
654
656
|
const turnId = state.activeUserTurnId ?? state.lastTurnId;
|
|
@@ -764,6 +766,12 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
764
766
|
deps.bus?.on(BusChannels.ConfigHotReload, () => {
|
|
765
767
|
context.invalidateSessionPromptCache();
|
|
766
768
|
}) ?? null;
|
|
769
|
+
// A committed extension generation with new content can change the skill
|
|
770
|
+
// and prompt inputs the session prompt compiles from; same invalidation.
|
|
771
|
+
const unsubscribeExtensionsReload =
|
|
772
|
+
deps.bus?.on(BusChannels.ExtensionsReloaded, (payload) => {
|
|
773
|
+
if (payload.changed) context.invalidateSessionPromptCache();
|
|
774
|
+
}) ?? null;
|
|
767
775
|
|
|
768
776
|
const unsubscribeSynthesisLock =
|
|
769
777
|
deps.bus?.on(BusChannels.LoopBlocked, (payload) => {
|
|
@@ -1088,7 +1096,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1088
1096
|
// 4. Preflight overflow check, before the user turn is committed.
|
|
1089
1097
|
// A blocked request must not leave a dangling user entry that the
|
|
1090
1098
|
// next replay would treat as an unanswered turn.
|
|
1091
|
-
const compactionThreshold = deps.getSettings().compaction?.threshold ?? null;
|
|
1099
|
+
const compactionThreshold = deps.getSettings().context.compaction?.threshold ?? null;
|
|
1092
1100
|
const captureTurnSnapshot = (turnId: string): ContextSnapshot =>
|
|
1093
1101
|
context.captureRuntimeContextSnapshot(agentRuntime, turnId, compactionThreshold, {
|
|
1094
1102
|
promptSegments: compiledPrompt
|
|
@@ -1179,7 +1187,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1179
1187
|
runtimeId: agentRuntime.runtimeId,
|
|
1180
1188
|
runtimeKind: agentRuntime.runtimeResolution.runtimeKind,
|
|
1181
1189
|
wireModelId: agentRuntime.wireModelId,
|
|
1182
|
-
autonomy: deps.getSettings().autonomy,
|
|
1190
|
+
autonomy: deps.getSettings().safety.autonomy,
|
|
1183
1191
|
compiledPromptHash: promptHash,
|
|
1184
1192
|
staticCompositionHash: promptHash,
|
|
1185
1193
|
promptSignature: promptHash,
|
|
@@ -1417,6 +1425,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
|
1417
1425
|
|
|
1418
1426
|
dispose(): void {
|
|
1419
1427
|
unsubscribeConfigReload?.();
|
|
1428
|
+
unsubscribeExtensionsReload?.();
|
|
1420
1429
|
unsubscribeSynthesisLock?.();
|
|
1421
1430
|
unsubscribePrewarmCompaction();
|
|
1422
1431
|
prewarm.dispose();
|
|
@@ -384,7 +384,7 @@ export interface ChatPanel extends Component {
|
|
|
384
384
|
|
|
385
385
|
export interface ChatPanelOptions {
|
|
386
386
|
/**
|
|
387
|
-
* Resolves the user-visible key string for the `clio.tool.expand`
|
|
387
|
+
* Resolves the user-visible key string for the `clio-coder.tool.expand`
|
|
388
388
|
* action, which folds and unfolds the newest tool call or worker block.
|
|
389
389
|
* Returning a non-empty string surfaces a dim ` (<key>)` hint on the one
|
|
390
390
|
* surface the key would act on: the latest finished collapsed tool subline,
|
|
@@ -603,30 +603,53 @@ function hasStreamingText(entry: Extract<TranscriptEntry, { role: "assistant" }>
|
|
|
603
603
|
}
|
|
604
604
|
|
|
605
605
|
/**
|
|
606
|
-
*
|
|
607
|
-
* line and the answer beneath it.
|
|
606
|
+
* Locate the skill-suggestion protocol line inside a reply.
|
|
608
607
|
*
|
|
609
|
-
* The prompt asks the model to
|
|
610
|
-
*
|
|
611
|
-
*
|
|
612
|
-
*
|
|
613
|
-
*
|
|
608
|
+
* The prompt asks the model to begin its reply with the line, but a model
|
|
609
|
+
* that narrates its work first puts the line at the end of the final message
|
|
610
|
+
* about half the time (round-4 skill batches: 1/2 and 0/2 opened, 2/2 fired).
|
|
611
|
+
* The line is recognized at the start of any line, provided it is complete
|
|
612
|
+
* (a newline follows it, or the segment is finalized), so a partially
|
|
613
|
+
* streamed line stays ordinary prose until it is whole. Returns the line's
|
|
614
|
+
* byte range or null.
|
|
615
|
+
*/
|
|
616
|
+
function findSkillSuggestionLine(seg: TextSegment): { start: number; end: number } | null {
|
|
617
|
+
const text = seg.text;
|
|
618
|
+
let at = text.startsWith(SKILL_SUGGESTION_PREFIX) ? 0 : text.indexOf(`\n${SKILL_SUGGESTION_PREFIX}`);
|
|
619
|
+
if (at < 0) return null;
|
|
620
|
+
if (at > 0) at += 1;
|
|
621
|
+
const lineEnd = text.indexOf("\n", at);
|
|
622
|
+
if (lineEnd < 0) return seg.finalized ? { start: at, end: text.length } : null;
|
|
623
|
+
return { start: at, end: lineEnd };
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Split a reply that carries the skill-suggestion protocol line into that
|
|
628
|
+
* line and the answer around it.
|
|
629
|
+
*
|
|
630
|
+
* The usual shape is one segment holding both. Classifying that whole segment
|
|
631
|
+
* as advisory left the turn with no voice glyph at all: the suggestion did not
|
|
632
|
+
* claim it and the answer never got the chance. The suggestion renders first
|
|
633
|
+
* wherever the model put it, and the answer is the rest of the segment with
|
|
634
|
+
* that line removed. Returns null when the segment is only a suggestion,
|
|
635
|
+
* which stays advisory in full.
|
|
614
636
|
*/
|
|
615
637
|
function skillSuggestionSplit(seg: TextSegment): { suggestion: string; answer: TextSegment } | null {
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
638
|
+
const found = findSkillSuggestionLine(seg);
|
|
639
|
+
if (!found) return null;
|
|
640
|
+
const before = seg.text.slice(0, found.start).replace(/\n+$/, "");
|
|
641
|
+
const after = seg.text.slice(found.end + 1).replace(/^\n+/, "");
|
|
619
642
|
// A model that puts a blank line between the suggestion and the answer left
|
|
620
643
|
// the remainder opening with a newline, so the first rendered row was empty
|
|
621
644
|
// and took the glyph the answer's own text row was owed.
|
|
622
|
-
const answerText =
|
|
645
|
+
const answerText = before.length > 0 && after.length > 0 ? `${before}\n${after}` : before + after;
|
|
623
646
|
if (answerText.trim().length === 0) return null;
|
|
624
647
|
const split = seg.suggestionSplit ?? {
|
|
625
648
|
suggestion: "",
|
|
626
649
|
answer: { kind: "text", text: answerText, finalized: seg.finalized } as TextSegment,
|
|
627
650
|
};
|
|
628
651
|
seg.suggestionSplit = split;
|
|
629
|
-
split.suggestion = seg.text.slice(
|
|
652
|
+
split.suggestion = seg.text.slice(found.start, found.end).replace(/\r$/, "");
|
|
630
653
|
const answer = split.answer;
|
|
631
654
|
if (answer.text === answerText && answer.finalized === seg.finalized) return split;
|
|
632
655
|
// The answer half follows the same cache rules as any other segment: the
|
|
@@ -1113,7 +1136,7 @@ function renderEntryLines(
|
|
|
1113
1136
|
const rendered =
|
|
1114
1137
|
seg.kind === "text" ? renderTextSegmentLines(seg, proseWidth) : renderErrorSegmentLines(seg, proseWidth);
|
|
1115
1138
|
if (rendered.length === 0) continue;
|
|
1116
|
-
const isSkillSuggestion = seg.kind === "text" && seg
|
|
1139
|
+
const isSkillSuggestion = seg.kind === "text" && findSkillSuggestionLine(seg) !== null;
|
|
1117
1140
|
if (!labeled && !isSkillSuggestion) {
|
|
1118
1141
|
lines.push(...hangProseLines(rendered, clioPrefix));
|
|
1119
1142
|
labeled = true;
|
|
@@ -460,15 +460,73 @@ function richMessageFromEntry(entry: MessageEntry, maxTextChars?: number): Agent
|
|
|
460
460
|
return message as unknown as AgentMessage;
|
|
461
461
|
}
|
|
462
462
|
|
|
463
|
-
function
|
|
463
|
+
function toolCallIdsFromMessage(message: AgentMessage): string[] {
|
|
464
464
|
const content = (message as { content?: unknown }).content;
|
|
465
|
-
if (!Array.isArray(content)) return;
|
|
465
|
+
if (!Array.isArray(content)) return [];
|
|
466
|
+
const ids: string[] = [];
|
|
466
467
|
for (const block of content) {
|
|
467
468
|
if (!block || typeof block !== "object") continue;
|
|
468
469
|
const b = block as Record<string, unknown>;
|
|
469
470
|
if (b.type !== "toolCall") continue;
|
|
470
|
-
if (typeof b.id === "string" && b.id.length > 0)
|
|
471
|
+
if (typeof b.id === "string" && b.id.length > 0) ids.push(b.id);
|
|
471
472
|
}
|
|
473
|
+
return ids;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function recordToolCallsFromMessage(message: AgentMessage, seen: Set<string>): void {
|
|
477
|
+
for (const id of toolCallIdsFromMessage(message)) seen.add(id);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Replay sink that hands tool results to the model in the order the assistant
|
|
482
|
+
* issued the calls.
|
|
483
|
+
*
|
|
484
|
+
* The ledger appends a tool result when its tool finishes, while the live loop
|
|
485
|
+
* appends a parallel batch's results by call index (pi executes the batch and
|
|
486
|
+
* pushes results in the assistant's order). A two-call turn whose second call
|
|
487
|
+
* finished first is therefore recorded as [b, a] and was sent as [a, b]. A
|
|
488
|
+
* resume that replayed the ledger order sent different bytes from that point
|
|
489
|
+
* on, and the provider's prefix cache missed for the rest of the session.
|
|
490
|
+
* Results are staged until the next non-result message and released in call
|
|
491
|
+
* order; an id the staged assistant turn never issued keeps its ledger order
|
|
492
|
+
* after the known ones.
|
|
493
|
+
*/
|
|
494
|
+
function createOrderedReplaySink(): {
|
|
495
|
+
messages: AgentMessage[];
|
|
496
|
+
push(message: AgentMessage): void;
|
|
497
|
+
stageToolResult(message: AgentMessage): void;
|
|
498
|
+
flush(): void;
|
|
499
|
+
} {
|
|
500
|
+
const messages: AgentMessage[] = [];
|
|
501
|
+
let callOrder: string[] = [];
|
|
502
|
+
let staged: AgentMessage[] = [];
|
|
503
|
+
const rank = (message: AgentMessage): number => {
|
|
504
|
+
const id = (message as { toolCallId?: unknown }).toolCallId;
|
|
505
|
+
const index = typeof id === "string" ? callOrder.indexOf(id) : -1;
|
|
506
|
+
return index < 0 ? Number.MAX_SAFE_INTEGER : index;
|
|
507
|
+
};
|
|
508
|
+
const flush = (): void => {
|
|
509
|
+
if (staged.length === 0) return;
|
|
510
|
+
staged.sort((a, b) => rank(a) - rank(b));
|
|
511
|
+
messages.push(...staged);
|
|
512
|
+
staged = [];
|
|
513
|
+
callOrder = [];
|
|
514
|
+
};
|
|
515
|
+
return {
|
|
516
|
+
messages,
|
|
517
|
+
flush,
|
|
518
|
+
push(message) {
|
|
519
|
+
flush();
|
|
520
|
+
messages.push(message);
|
|
521
|
+
// Consecutive assistant messages (one legacy standalone tool_call entry
|
|
522
|
+
// per call) share one batch; anything else starts a new one.
|
|
523
|
+
if (message.role === "assistant") callOrder.push(...toolCallIdsFromMessage(message));
|
|
524
|
+
else callOrder = [];
|
|
525
|
+
},
|
|
526
|
+
stageToolResult(message) {
|
|
527
|
+
staged.push(message);
|
|
528
|
+
},
|
|
529
|
+
};
|
|
472
530
|
}
|
|
473
531
|
|
|
474
532
|
function toolCallMessageFromEntry(entry: MessageEntry): AgentMessage {
|
|
@@ -998,7 +1056,12 @@ function bashContextText(entry: BashExecutionEntry): string {
|
|
|
998
1056
|
return bashExecutionToText(message);
|
|
999
1057
|
}
|
|
1000
1058
|
|
|
1001
|
-
function appendContextMessage(
|
|
1059
|
+
function appendContextMessage(
|
|
1060
|
+
out: { push(message: AgentMessage): void },
|
|
1061
|
+
role: "user" | "assistant",
|
|
1062
|
+
text: string,
|
|
1063
|
+
timestamp: string,
|
|
1064
|
+
): void {
|
|
1002
1065
|
const trimmed = text.trim();
|
|
1003
1066
|
if (trimmed.length === 0) return;
|
|
1004
1067
|
out.push(makeTextMessage(role, truncateReplayText(trimmed), timestamp));
|
|
@@ -1014,7 +1077,7 @@ export function buildReplayAgentMessagesFromTurns(
|
|
|
1014
1077
|
turns: ReadonlyArray<SessionEntry>,
|
|
1015
1078
|
options: RehydrateChatPanelOptions = {},
|
|
1016
1079
|
): AgentMessage[] {
|
|
1017
|
-
const out
|
|
1080
|
+
const out = createOrderedReplaySink();
|
|
1018
1081
|
const seenToolCalls = new Set<string>();
|
|
1019
1082
|
for (const entry of selectReplayEntries(turns, options)) {
|
|
1020
1083
|
switch (entry.kind) {
|
|
@@ -1035,7 +1098,7 @@ export function buildReplayAgentMessagesFromTurns(
|
|
|
1035
1098
|
recordToolCallsFromMessage(message, seenToolCalls);
|
|
1036
1099
|
}
|
|
1037
1100
|
} else if (entry.role === "tool_result") {
|
|
1038
|
-
out.
|
|
1101
|
+
out.stageToolResult(toolResultMessageFromEntry(entry));
|
|
1039
1102
|
} else if (entry.role === "system") {
|
|
1040
1103
|
appendContextMessage(out, "user", `System note: ${text}`, entry.timestamp);
|
|
1041
1104
|
}
|
|
@@ -1082,7 +1145,8 @@ export function buildReplayAgentMessagesFromTurns(
|
|
|
1082
1145
|
break;
|
|
1083
1146
|
}
|
|
1084
1147
|
}
|
|
1085
|
-
|
|
1148
|
+
out.flush();
|
|
1149
|
+
return out.messages;
|
|
1086
1150
|
}
|
|
1087
1151
|
|
|
1088
1152
|
/**
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Editor,
|
|
3
|
+
getKeybindings,
|
|
4
|
+
stripTerminalSequences,
|
|
5
|
+
type TUI,
|
|
6
|
+
truncateToWidth,
|
|
7
|
+
visibleWidth,
|
|
8
|
+
} from "../engine/tui.js";
|
|
9
|
+
import { guardPastedEditorOperator } from "./editor-bash.js";
|
|
2
10
|
import { fitHintEntries } from "./overlay-frame.js";
|
|
3
11
|
import { type PermissionInspectionHint, permissionHintEntries } from "./permission-hint.js";
|
|
4
12
|
import type { ClioTheme } from "./theme/index.js";
|
|
@@ -154,7 +162,50 @@ function findBottomRail(lines: readonly string[], width: number): number {
|
|
|
154
162
|
return -1;
|
|
155
163
|
}
|
|
156
164
|
|
|
165
|
+
function cursorEndsDirectoryPath(editor: Editor): boolean {
|
|
166
|
+
const cursor = editor.getCursor();
|
|
167
|
+
const line = editor.getLines()[cursor.line] ?? "";
|
|
168
|
+
return line.slice(0, cursor.col).endsWith("/");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function remapPastedBangOffsets(
|
|
172
|
+
before: string,
|
|
173
|
+
after: string,
|
|
174
|
+
offsets: ReadonlySet<number>,
|
|
175
|
+
markInsertedAsPasted: boolean,
|
|
176
|
+
): Set<number> {
|
|
177
|
+
let prefix = 0;
|
|
178
|
+
while (prefix < before.length && prefix < after.length && before[prefix] === after[prefix]) prefix += 1;
|
|
179
|
+
let beforeEnd = before.length;
|
|
180
|
+
let afterEnd = after.length;
|
|
181
|
+
while (beforeEnd > prefix && afterEnd > prefix && before[beforeEnd - 1] === after[afterEnd - 1]) {
|
|
182
|
+
beforeEnd -= 1;
|
|
183
|
+
afterEnd -= 1;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const next = new Set<number>();
|
|
187
|
+
const shift = afterEnd - prefix - (beforeEnd - prefix);
|
|
188
|
+
for (const offset of offsets) {
|
|
189
|
+
if (offset < prefix) next.add(offset);
|
|
190
|
+
else if (offset >= beforeEnd) next.add(offset + shift);
|
|
191
|
+
}
|
|
192
|
+
if (markInsertedAsPasted) {
|
|
193
|
+
for (let offset = prefix; offset < afterEnd; offset += 1) {
|
|
194
|
+
if (after[offset] === "!") next.add(offset);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return next;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function startsWithPastedOperator(text: string, pastedBangOffsets: ReadonlySet<number>): boolean {
|
|
201
|
+
const first = text.search(/\S/u);
|
|
202
|
+
return first >= 0 && text[first] === "!" && pastedBangOffsets.has(first);
|
|
203
|
+
}
|
|
204
|
+
|
|
157
205
|
export class ClioEditor extends Editor {
|
|
206
|
+
private pastedBangOffsets = new Set<number>();
|
|
207
|
+
private bracketedPasteActive = false;
|
|
208
|
+
|
|
158
209
|
constructor(
|
|
159
210
|
tui: TUI,
|
|
160
211
|
private readonly chrome: EditorChrome,
|
|
@@ -213,6 +264,15 @@ export class ClioEditor extends Editor {
|
|
|
213
264
|
return lines;
|
|
214
265
|
}
|
|
215
266
|
|
|
267
|
+
/**
|
|
268
|
+
* Preserve paste provenance for every immediate-send binding, including the
|
|
269
|
+
* alternate paths that invoke the submit controller without an Editor Enter.
|
|
270
|
+
*/
|
|
271
|
+
getTextForSubmit(): string {
|
|
272
|
+
const text = this.getExpandedText();
|
|
273
|
+
return startsWithPastedOperator(this.getText(), this.pastedBangOffsets) ? guardPastedEditorOperator(text) : text;
|
|
274
|
+
}
|
|
275
|
+
|
|
216
276
|
/**
|
|
217
277
|
* pi-tui's bracketed-paste handling inserts pasted text (including a
|
|
218
278
|
* trailing newline the paste carried) without submitting: a pasted
|
|
@@ -222,8 +282,46 @@ export class ClioEditor extends Editor {
|
|
|
222
282
|
* through the same handler the typed-Enter path uses.
|
|
223
283
|
*/
|
|
224
284
|
override handleInput(data: string): void {
|
|
285
|
+
const openedPaste = data.includes("\x1b[200~");
|
|
225
286
|
const closedPaste = data.includes("\x1b[201~");
|
|
287
|
+
const pasteMutation = this.bracketedPasteActive || openedPaste;
|
|
288
|
+
const textBeforeInput = this.getText();
|
|
289
|
+
const keybindings = getKeybindings();
|
|
290
|
+
// Pi expands and trims the buffer immediately before onSubmit. Envelope a
|
|
291
|
+
// pasted bang draft for that synchronous handoff so the Bash parser can
|
|
292
|
+
// distinguish it from a typed operator; the submit controller unwraps it
|
|
293
|
+
// before sending the literal prompt onward.
|
|
294
|
+
if (
|
|
295
|
+
startsWithPastedOperator(textBeforeInput, this.pastedBangOffsets) &&
|
|
296
|
+
keybindings.matches(data, "tui.input.submit")
|
|
297
|
+
) {
|
|
298
|
+
const pastedText = this.getTextForSubmit();
|
|
299
|
+
this.pastedBangOffsets.clear();
|
|
300
|
+
this.bracketedPasteActive = false;
|
|
301
|
+
super.setText(pastedText);
|
|
302
|
+
super.handleInput(data);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const completingDirectory =
|
|
306
|
+
this.isShowingAutocomplete() &&
|
|
307
|
+
(keybindings.matches(data, "tui.input.tab") || keybindings.matches(data, "tui.select.confirm"));
|
|
308
|
+
const textBeforeCompletion = completingDirectory ? this.getText() : "";
|
|
226
309
|
super.handleInput(data);
|
|
310
|
+
if (completingDirectory && this.getText() !== textBeforeCompletion && cursorEndsDirectoryPath(this)) {
|
|
311
|
+
// Directory rows are submenus on the same provider. Re-open immediately
|
|
312
|
+
// after acceptance so ↑/↓ continues in the child tree without requiring
|
|
313
|
+
// a second Tab. Pi's provider request remains the only completion path.
|
|
314
|
+
super.handleInput("\t");
|
|
315
|
+
}
|
|
316
|
+
const textAfterInput = this.getText();
|
|
317
|
+
this.pastedBangOffsets = remapPastedBangOffsets(
|
|
318
|
+
textBeforeInput,
|
|
319
|
+
textAfterInput,
|
|
320
|
+
this.pastedBangOffsets,
|
|
321
|
+
pasteMutation,
|
|
322
|
+
);
|
|
323
|
+
if (openedPaste) this.bracketedPasteActive = true;
|
|
324
|
+
if (closedPaste) this.bracketedPasteActive = false;
|
|
227
325
|
if (!closedPaste) return;
|
|
228
326
|
const text = this.getText();
|
|
229
327
|
if (!text.endsWith("\n")) return;
|
|
@@ -232,4 +330,10 @@ export class ClioEditor extends Editor {
|
|
|
232
330
|
this.setText("");
|
|
233
331
|
this.onSubmit?.(command);
|
|
234
332
|
}
|
|
333
|
+
|
|
334
|
+
override setText(text: string): void {
|
|
335
|
+
this.pastedBangOffsets.clear();
|
|
336
|
+
this.bracketedPasteActive = false;
|
|
337
|
+
super.setText(text);
|
|
338
|
+
}
|
|
235
339
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type ContextActivityStatus,
|
|
7
7
|
} from "../core/bus-events.js";
|
|
8
8
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
9
|
+
import { wrapTextWithAnsi } from "../engine/tui.js";
|
|
9
10
|
import { type ClioTheme, clioTheme, formatCompactMs, frame, GLYPH, padAnsi, spinnerFrame } from "./theme/index.js";
|
|
10
11
|
|
|
11
12
|
export interface ContextActivitySnapshot {
|
|
@@ -152,17 +153,18 @@ export function formatContextActivityIslandLines(
|
|
|
152
153
|
const percent = `${Math.round(activityProgress(activity) * 100)}%`.padStart(4);
|
|
153
154
|
const progressLine = `${progressBar(theme, activity, barWidth)} ${theme.fg("dim", percent)}`;
|
|
154
155
|
const message = theme.fg(activity.status === "failed" ? "error" : "muted", activity.message);
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
// explicitly. The progress bar is sized to fit and never cuts.
|
|
156
|
+
// The trail is compact navigation chrome and marks its cut. The message and
|
|
157
|
+
// detail are the only explanation of this operation, so they wrap in full.
|
|
158
|
+
// The progress bar is sized to fit and never cuts.
|
|
159
159
|
const body = [
|
|
160
160
|
padAnsi(topLine, bodyWidth, GLYPH.ellipsis),
|
|
161
161
|
padAnsi(progressLine, bodyWidth),
|
|
162
162
|
phaseTrail(theme, activity, bodyWidth),
|
|
163
|
-
|
|
163
|
+
...wrapTextWithAnsi(message, bodyWidth).map((line) => padAnsi(line, bodyWidth)),
|
|
164
164
|
];
|
|
165
|
-
if (activity.detail)
|
|
165
|
+
if (activity.detail) {
|
|
166
|
+
body.push(...wrapTextWithAnsi(theme.fg("dim", activity.detail), bodyWidth).map((line) => padAnsi(line, bodyWidth)));
|
|
167
|
+
}
|
|
166
168
|
return frame(theme, "Context", body, width);
|
|
167
169
|
}
|
|
168
170
|
|
|
@@ -23,7 +23,7 @@ export const CONTEXT_CATEGORY_TOKEN: Readonly<Record<ContextLedgerCategory, Clio
|
|
|
23
23
|
streaming: "accent",
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
function contextCategoryGlyph(category: ContextLedgerCategory): string {
|
|
27
27
|
const filled = visibleSingle(GLYPH.contextFull) ? GLYPH.contextFull : GLYPH.barFull;
|
|
28
28
|
const free = visibleSingle(GLYPH.contextFree) ? GLYPH.contextFree : GLYPH.barEmpty;
|
|
29
29
|
// The autocompact reserve is held-back headroom, not consumed context; it
|
|
@@ -187,7 +187,7 @@ export type WorkerContextSeverity = "healthy" | "warn" | "critical";
|
|
|
187
187
|
export const WORKER_CONTEXT_WARN_PCT = 80;
|
|
188
188
|
export const WORKER_CONTEXT_CRITICAL_PCT = 95;
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
function workerContextSeverity(pct: number): WorkerContextSeverity {
|
|
191
191
|
if (pct >= WORKER_CONTEXT_CRITICAL_PCT) return "critical";
|
|
192
192
|
if (pct >= WORKER_CONTEXT_WARN_PCT) return "warn";
|
|
193
193
|
return "healthy";
|
|
@@ -211,10 +211,7 @@ export interface WorkerContextView {
|
|
|
211
211
|
* usage has been observed yet. The percentage is capped at 100: a provider
|
|
212
212
|
* report past the window is a full window, not a >100% claim.
|
|
213
213
|
*/
|
|
214
|
-
|
|
215
|
-
usedTokens: number,
|
|
216
|
-
contextWindow: number | undefined | null,
|
|
217
|
-
): WorkerContextView | null {
|
|
214
|
+
function workerContextView(usedTokens: number, contextWindow: number | undefined | null): WorkerContextView | null {
|
|
218
215
|
if (contextWindow === undefined || contextWindow === null || contextWindow <= 0) return null;
|
|
219
216
|
if (!Number.isFinite(usedTokens) || usedTokens <= 0) return null;
|
|
220
217
|
const pct = Math.min(100, Math.round((usedTokens / contextWindow) * 100));
|
|
@@ -166,7 +166,7 @@ function renderWorkingSetLines(view: WorkingSetView, config: WorkingSetConfigVie
|
|
|
166
166
|
];
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
|
|
169
|
+
function renderContextLedgerLines(
|
|
170
170
|
ledger: ContextLedger,
|
|
171
171
|
contentWidth: number,
|
|
172
172
|
workingSet?: WorkingSetView | null,
|