@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,7 +6,7 @@ import type { ToolSurface } from "./lazy-tool.js";
|
|
|
6
6
|
export const monitorToolSurface = {
|
|
7
7
|
name: ToolNames.Monitor,
|
|
8
8
|
description:
|
|
9
|
-
"Inspect
|
|
9
|
+
"Inspect dispatched runs: list enumerates them; status, peek, receipt, and tools observe one run; wait blocks on one run without collecting; collect is the terminal operation for a detached batch or run list, required before final synthesis.",
|
|
10
10
|
parameters: Type.Object({
|
|
11
11
|
run_id: Type.Optional(
|
|
12
12
|
Type.String({ description: "Run id from dispatch output or monitor list; omit with mode=list." }),
|
|
@@ -14,21 +14,13 @@ export const monitorToolSurface = {
|
|
|
14
14
|
mode: Type.Optional(
|
|
15
15
|
StringEnum(["status", "peek", "receipt", "list", "wait", "collect", "tools"], {
|
|
16
16
|
description:
|
|
17
|
-
"
|
|
18
|
-
}),
|
|
19
|
-
),
|
|
20
|
-
batch_id: Type.Optional(Type.String({ description: "Detached batch id from dispatch detach:true (mode=collect)." })),
|
|
21
|
-
run_ids: Type.Optional(
|
|
22
|
-
Type.Array(Type.String(), {
|
|
23
|
-
description:
|
|
24
|
-
"Explicit run ids for mode=collect; a one-element array is also accepted by single-run modes when run_id is absent.",
|
|
17
|
+
"Defaults to status with run_id and list without. tools lists a run's tool calls with outcomes and per-tool totals.",
|
|
25
18
|
}),
|
|
26
19
|
),
|
|
20
|
+
batch_id: Type.Optional(Type.String({ description: "Detached batch id (mode=collect)." })),
|
|
21
|
+
run_ids: Type.Optional(Type.Array(Type.String(), { description: "Run ids to collect (mode=collect)." })),
|
|
27
22
|
timeout_ms: Type.Optional(
|
|
28
|
-
Type.Number({
|
|
29
|
-
description:
|
|
30
|
-
"mode=wait: max ms to block (default 60000, capped at 600000); mode=collect never blocks and ignores this value with a notice.",
|
|
31
|
-
}),
|
|
23
|
+
Type.Number({ description: "mode=wait: max ms to block (default 60000, max 600000); collect never blocks." }),
|
|
32
24
|
),
|
|
33
25
|
}),
|
|
34
26
|
baseActionClass: "read",
|
package/src/tools/monitor.ts
CHANGED
|
@@ -214,16 +214,16 @@ const TOOLS_MAX_BYTES = 8 * 1024;
|
|
|
214
214
|
const TOOLS_ARGUMENTS_CHARS = 160;
|
|
215
215
|
|
|
216
216
|
/**
|
|
217
|
-
* Tail event types that describe one tool call. `
|
|
217
|
+
* Tail event types that describe one tool call. `clio_coder_tool_finish` is the
|
|
218
218
|
* authoritative per-call outcome (it distinguishes a permission block from a
|
|
219
219
|
* command that ran and exited nonzero); the engine's own `tool_execution_end`
|
|
220
220
|
* is kept only when the tail recorded a detail for it, since a bare type line
|
|
221
221
|
* says nothing the finish event does not.
|
|
222
222
|
*/
|
|
223
223
|
const TOOL_CALL_EVENT_TYPES: ReadonlySet<string> = new Set([
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
224
|
+
"clio_coder_tool_finish",
|
|
225
|
+
"clio_coder_permission_resolved",
|
|
226
|
+
"clio_coder_permission_escalated",
|
|
227
227
|
]);
|
|
228
228
|
|
|
229
229
|
function toolCallLines(entries: ReadonlyArray<{ at: string; type: string; detail?: string }>): string[] {
|
package/src/tools/observation.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GUARDRAIL_DEFAULTS,
|
|
1
|
+
import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
|
|
2
2
|
import type { ToolInvokeOptions, ToolResult } from "./registry.js";
|
|
3
3
|
import { offloadPointer, writeToolOffload } from "./result-shaping.js";
|
|
4
4
|
import { formatSize } from "./truncate.js";
|
|
@@ -64,9 +64,8 @@ export const OBSERVE_SELF_CAPS = {
|
|
|
64
64
|
|
|
65
65
|
// Per-turn observation budget pool. One pool per sessionId:turnId shared by
|
|
66
66
|
// every OBSERVE tool; LRU-pruned so abandoned turns cannot grow the map.
|
|
67
|
-
//
|
|
67
|
+
// The configurable value lives at safety.limits.observationBytesPerTurn.
|
|
68
68
|
export const DEFAULT_OBSERVATION_TURN_BUDGET_BYTES = GUARDRAIL_DEFAULTS.observationTurnBudgetBytes;
|
|
69
|
-
export const OBSERVATION_TURN_BUDGET_ENV = GUARDRAIL_ENV_VARS.observationTurnBudgetBytes;
|
|
70
69
|
const MIN_BUDGET_SLICE_BYTES = 1024;
|
|
71
70
|
const BUDGET_TRACK_LIMIT = 256;
|
|
72
71
|
|
|
@@ -130,8 +129,8 @@ function boundContinuation(next: string | undefined): string | undefined {
|
|
|
130
129
|
return `${Array.from(next).slice(0, MAX_CONTINUATION_CHARS).join("")}…`;
|
|
131
130
|
}
|
|
132
131
|
|
|
133
|
-
function observationTurnBudgetLimit(
|
|
134
|
-
return Math.max(MIN_BUDGET_SLICE_BYTES, resolveGuardrail("observationTurnBudgetBytes"
|
|
132
|
+
function observationTurnBudgetLimit(): number {
|
|
133
|
+
return Math.max(MIN_BUDGET_SLICE_BYTES, resolveGuardrail("observationTurnBudgetBytes"));
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
function budgetKey(options: ToolInvokeOptions | undefined): string | null {
|
package/src/tools/observers.ts
CHANGED
|
@@ -44,39 +44,6 @@ export interface FileMutationEvent {
|
|
|
44
44
|
toolName: string;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
/**
|
|
48
|
-
* Defers file-mutation sinks off the after_tool hot path and coalesces rapid
|
|
49
|
-
* events into one best-effort batch. Lifecycle-owned sinks that must drain at
|
|
50
|
-
* shutdown should admit work synchronously instead of using this convenience.
|
|
51
|
-
*/
|
|
52
|
-
export function coalescePathSink(sink: (paths: string[]) => void): (event: FileMutationEvent) => void {
|
|
53
|
-
const pending = new Set<string>();
|
|
54
|
-
let flushScheduled = false;
|
|
55
|
-
|
|
56
|
-
const scheduleFlush = (): void => {
|
|
57
|
-
if (flushScheduled) return;
|
|
58
|
-
flushScheduled = true;
|
|
59
|
-
setImmediate(() => {
|
|
60
|
-
flushScheduled = false;
|
|
61
|
-
if (pending.size === 0) return;
|
|
62
|
-
const paths = [...pending];
|
|
63
|
-
pending.clear();
|
|
64
|
-
try {
|
|
65
|
-
sink(paths);
|
|
66
|
-
} catch {
|
|
67
|
-
// Incremental indexing is best-effort and must not change tool execution.
|
|
68
|
-
}
|
|
69
|
-
if (pending.size > 0) scheduleFlush();
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
return (event) => {
|
|
74
|
-
if (event.paths.length === 0) return;
|
|
75
|
-
for (const path of event.paths) pending.add(path);
|
|
76
|
-
scheduleFlush();
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
47
|
/** Notifies the caller after a successful file-mutating tool, for incremental indexing. */
|
|
81
48
|
export function createFileMutationObserver(sink: (event: FileMutationEvent) => void): MiddlewareHookRegistration {
|
|
82
49
|
return {
|
|
@@ -15,23 +15,16 @@ import type { ToolSurface } from "./lazy-tool.js";
|
|
|
15
15
|
export const panesToolSurface = {
|
|
16
16
|
name: ToolNames.Panes,
|
|
17
17
|
description:
|
|
18
|
-
"
|
|
18
|
+
"Manage the terminal panes Clio owns beside this session: show focuses a dispatched run's viewer pane, open starts a fixed utility preset (files, logs, or shell; never an arbitrary command) or focuses it when it is already open, close removes a Clio-created pane, list reports the inventory and the pane layer's health.",
|
|
19
19
|
parameters: Type.Object({
|
|
20
|
-
action: StringEnum(["show", "open", "close", "list"], {
|
|
21
|
-
description:
|
|
22
|
-
"show focuses a run's viewer pane; open starts a preset utility pane; close removes a Clio-owned pane; list reports the inventory.",
|
|
23
|
-
}),
|
|
20
|
+
action: StringEnum(["show", "open", "close", "list"], { description: "Pane action." }),
|
|
24
21
|
target: Type.Optional(
|
|
25
22
|
Type.String({
|
|
26
23
|
description:
|
|
27
|
-
'
|
|
28
|
-
}),
|
|
29
|
-
),
|
|
30
|
-
preset: Type.Optional(
|
|
31
|
-
StringEnum([...PANES_PRESET_IDS], {
|
|
32
|
-
description: "action=open: which fixed utility pane to start.",
|
|
24
|
+
'show: an agent id or run id prefix, most recent match wins. close: a pane id, label, agent id, or "all".',
|
|
33
25
|
}),
|
|
34
26
|
),
|
|
27
|
+
preset: Type.Optional(StringEnum([...PANES_PRESET_IDS], { description: "open: which utility pane to start." })),
|
|
35
28
|
}),
|
|
36
29
|
baseActionClass: "read",
|
|
37
30
|
executionMode: "sequential",
|
package/src/tools/panes.ts
CHANGED
|
@@ -78,8 +78,10 @@ export function createPanesTool(deps: PanesToolDeps): ToolSpec {
|
|
|
78
78
|
kind: "ok",
|
|
79
79
|
output:
|
|
80
80
|
result.paneId === null
|
|
81
|
-
? `completed the ${result.label}
|
|
82
|
-
:
|
|
81
|
+
? `completed the ${result.label} pick.`
|
|
82
|
+
: result.existing
|
|
83
|
+
? `the ${result.label} pane was already open and is now focused (${result.paneId}).`
|
|
84
|
+
: `opened the ${result.label} pane (${result.paneId}).`,
|
|
83
85
|
details: { action: "open", preset, paneId: result.paneId },
|
|
84
86
|
};
|
|
85
87
|
}
|
package/src/tools/policy.ts
CHANGED
|
@@ -81,6 +81,13 @@ const DISPATCH_BOUND_TOOLS = new Set<ToolName>([ToolNames.Dispatch, ToolNames.Mo
|
|
|
81
81
|
const INTERACTIVE_BOUND_TOOLS = new Set<ToolName>([ToolNames.AskUser]);
|
|
82
82
|
/** Registered only when a pane host answered detection and the mux is live. */
|
|
83
83
|
const PANES_BOUND_TOOLS = new Set<ToolName>([ToolNames.Panes]);
|
|
84
|
+
/**
|
|
85
|
+
* Registered only when a dispatch bound an agent-ledger port to this registry,
|
|
86
|
+
* which only a worker process does. The session has no peers to coordinate
|
|
87
|
+
* with, so on that surface the tool could only answer "no ledger" and its
|
|
88
|
+
* schema was 444 tokens of every first turn for nothing.
|
|
89
|
+
*/
|
|
90
|
+
const LEDGER_BOUND_TOOLS = new Set<ToolName>([ToolNames.Ledger]);
|
|
84
91
|
/** The RETRIEVE plane, omitted wholesale by a hermetic run (tools/network-policy.ts). */
|
|
85
92
|
const NETWORK_BOUND_TOOLS = new Set<ToolName>([ToolNames.WebFetch]);
|
|
86
93
|
|
|
@@ -89,15 +96,19 @@ export interface BuiltinToolPolicyOptions {
|
|
|
89
96
|
includeDispatchTools?: boolean;
|
|
90
97
|
includeInteractiveTools?: boolean;
|
|
91
98
|
includePanesTools?: boolean;
|
|
99
|
+
includeLedgerTools?: boolean;
|
|
92
100
|
/**
|
|
93
|
-
* Unlike the
|
|
101
|
+
* Unlike the others, this defaults to true: every registry registers
|
|
94
102
|
* the network plane unless a run explicitly asked to be hermetic, so an
|
|
95
103
|
* unset option must keep demanding it.
|
|
96
104
|
*/
|
|
97
105
|
includeNetworkTools?: boolean;
|
|
98
106
|
}
|
|
99
107
|
|
|
100
|
-
function validateBuiltinToolPolicy(
|
|
108
|
+
export function validateBuiltinToolPolicy(
|
|
109
|
+
specs: ReadonlyArray<ToolSpec>,
|
|
110
|
+
options: BuiltinToolPolicyOptions = {},
|
|
111
|
+
): string[] {
|
|
101
112
|
const errors: string[] = [];
|
|
102
113
|
const registered = new Map<ToolName, ToolSpec>();
|
|
103
114
|
|
|
@@ -140,6 +151,7 @@ function validateBuiltinToolPolicy(specs: ReadonlyArray<ToolSpec>, options: Buil
|
|
|
140
151
|
const includeDispatchTools = options.includeDispatchTools ?? false;
|
|
141
152
|
const includeInteractiveTools = options.includeInteractiveTools ?? false;
|
|
142
153
|
const includePanesTools = options.includePanesTools ?? false;
|
|
154
|
+
const includeLedgerTools = options.includeLedgerTools ?? false;
|
|
143
155
|
const includeNetworkTools = options.includeNetworkTools ?? true;
|
|
144
156
|
const required = new Set<ToolName>(Object.values(ToolNames));
|
|
145
157
|
for (const tool of [...required]) {
|
|
@@ -147,6 +159,7 @@ function validateBuiltinToolPolicy(specs: ReadonlyArray<ToolSpec>, options: Buil
|
|
|
147
159
|
if (!includeDispatchTools && DISPATCH_BOUND_TOOLS.has(tool)) required.delete(tool);
|
|
148
160
|
if (!includeInteractiveTools && INTERACTIVE_BOUND_TOOLS.has(tool)) required.delete(tool);
|
|
149
161
|
if (!includePanesTools && PANES_BOUND_TOOLS.has(tool)) required.delete(tool);
|
|
162
|
+
if (!includeLedgerTools && LEDGER_BOUND_TOOLS.has(tool)) required.delete(tool);
|
|
150
163
|
if (!includeNetworkTools && NETWORK_BOUND_TOOLS.has(tool)) required.delete(tool);
|
|
151
164
|
}
|
|
152
165
|
for (const tool of required) {
|
package/src/tools/read.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync, statSync } from "node:fs";
|
|
2
2
|
import { Type } from "typebox";
|
|
3
|
-
import { GUARDRAIL_DEFAULTS,
|
|
3
|
+
import { GUARDRAIL_DEFAULTS, resolveGuardrail } from "../core/guardrails.js";
|
|
4
4
|
import { ToolNames } from "../core/tool-names.js";
|
|
5
5
|
import { finalizeObservation, observationBudgetExhausted, reserveObservation } from "./observation.js";
|
|
6
6
|
import { resolveReadPath } from "./path-utils.js";
|
|
@@ -19,14 +19,13 @@ import { truncateUtf8 } from "./truncate-utf8.js";
|
|
|
19
19
|
// Per-call read cap. Raised from the 16KB per-observation source cap toward
|
|
20
20
|
// pi's 50KB so large source/generated files finish in fewer calls (a 144KB file
|
|
21
21
|
// took ~9 sequential 16KB reads before). The per-turn observation budget
|
|
22
|
-
// (src/tools/observation.ts) still bounds the aggregate.
|
|
23
|
-
//
|
|
22
|
+
// (src/tools/observation.ts) still bounds the aggregate. The configurable
|
|
23
|
+
// value lives at safety.limits.readBytesPerCall.
|
|
24
24
|
export const DEFAULT_READ_MAX_BYTES = GUARDRAIL_DEFAULTS.readMaxBytes;
|
|
25
|
-
export const READ_MAX_BYTES_ENV = GUARDRAIL_ENV_VARS.readMaxBytes;
|
|
26
25
|
const MIN_READ_CAP_BYTES = 1024;
|
|
27
26
|
|
|
28
|
-
export function readMaxBytes(
|
|
29
|
-
return Math.max(MIN_READ_CAP_BYTES, resolveGuardrail("readMaxBytes"
|
|
27
|
+
export function readMaxBytes(): number {
|
|
28
|
+
return Math.max(MIN_READ_CAP_BYTES, resolveGuardrail("readMaxBytes"));
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
export const readTool: ToolSpec = {
|
package/src/tools/registry.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { createHash, randomBytes } from "node:crypto";
|
|
|
2
2
|
import type { TSchema } from "typebox";
|
|
3
3
|
import { isWorkerToolCallCapExceededReason } from "../core/guardrails.js";
|
|
4
4
|
import { HEADLESS_PERMISSION_DENIED_MARKER } from "../core/headless-permission.js";
|
|
5
|
+
import { normalizePromptHint } from "../core/prompt-hint.js";
|
|
5
6
|
import {
|
|
6
7
|
evaluateSkillToolSurface,
|
|
7
8
|
type PendingSkillToolPolicy,
|
|
@@ -49,6 +50,27 @@ export type ToolExecutionMode = "sequential" | "parallel";
|
|
|
49
50
|
export type ToolSourceScope = "core" | "domain";
|
|
50
51
|
export type ToolRetrySafety = "idempotent" | "retry_safe" | "not_retry_safe" | "unknown";
|
|
51
52
|
export type ToolCostLatencyClass = "local_fast" | "local_medium" | "local_slow" | "network" | "agent";
|
|
53
|
+
export type ToolPromptHintRole = "session" | "worker" | "bound-worker";
|
|
54
|
+
|
|
55
|
+
export interface ToolPromptHintVariants {
|
|
56
|
+
session?: string;
|
|
57
|
+
worker?: string;
|
|
58
|
+
boundWorker?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type ToolPromptHintMetadata = string | ToolPromptHintVariants;
|
|
62
|
+
|
|
63
|
+
/** Resolve one tool's guidance for the exact prompt role being compiled. */
|
|
64
|
+
export function resolveToolPromptHint(
|
|
65
|
+
hint: ToolPromptHintMetadata | undefined,
|
|
66
|
+
role: ToolPromptHintRole,
|
|
67
|
+
): string | undefined {
|
|
68
|
+
if (typeof hint === "string") return normalizePromptHint(hint);
|
|
69
|
+
if (!hint) return undefined;
|
|
70
|
+
const selected =
|
|
71
|
+
role === "session" ? hint.session : role === "bound-worker" ? (hint.boundWorker ?? hint.worker) : hint.worker;
|
|
72
|
+
return normalizePromptHint(selected);
|
|
73
|
+
}
|
|
52
74
|
|
|
53
75
|
export interface ToolSourceInfo {
|
|
54
76
|
path: string;
|
|
@@ -77,12 +99,11 @@ export interface ToolMetadata {
|
|
|
77
99
|
/** Coarse cost/latency bucket for dashboard diagnostics. */
|
|
78
100
|
costLatency: ToolCostLatencyClass;
|
|
79
101
|
/**
|
|
80
|
-
* One sentence of usage guidance rendered
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* need none; the schema description covers them.
|
|
102
|
+
* One sentence of usage guidance rendered when this tool is on the frozen
|
|
103
|
+
* surface. A string applies to every role; variants keep session consent
|
|
104
|
+
* rules out of ordinary and recipe-bound workers. Most tools need none.
|
|
84
105
|
*/
|
|
85
|
-
promptHint?:
|
|
106
|
+
promptHint?: ToolPromptHintMetadata;
|
|
86
107
|
/**
|
|
87
108
|
* How transcript surfaces present this tool's block under `/output default`.
|
|
88
109
|
* Optional: tools that declare nothing fold like every other tool.
|
|
@@ -199,6 +220,8 @@ export interface ToolInvokeOptions {
|
|
|
199
220
|
turnId?: string;
|
|
200
221
|
toolCallId?: string;
|
|
201
222
|
correlationId?: string;
|
|
223
|
+
/** Session-effective ceiling for one tool result, read again before every invocation. */
|
|
224
|
+
toolResultMaxBytes?: number;
|
|
202
225
|
pendingSkillPolicy?: PendingSkillToolPolicy;
|
|
203
226
|
askUserPolicy?: AskUserToolPolicy;
|
|
204
227
|
/** Host-derived display copy for an ask_user round. It has no admission authority. */
|
|
@@ -442,14 +465,14 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
|
|
|
442
465
|
const preparedArgs = prepareToolArgs(spec, call.args ?? {});
|
|
443
466
|
resultDisposition = resolveToolResultDisposition(spec, preparedArgs);
|
|
444
467
|
const result = await spec.run(preparedArgs, options);
|
|
445
|
-
const digest = toolResultDigestFor(spec, result, resultDisposition);
|
|
468
|
+
const digest = toolResultDigestFor(spec, result, resultDisposition, options);
|
|
446
469
|
const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
|
|
447
470
|
const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
|
|
448
471
|
return { kind: "ok", result: finalResult, decision };
|
|
449
472
|
} catch (err) {
|
|
450
473
|
const message = err instanceof Error ? err.message : String(err);
|
|
451
474
|
const result: ToolResult = { kind: "error", message };
|
|
452
|
-
const digest = toolResultDigestFor(spec, result, resultDisposition);
|
|
475
|
+
const digest = toolResultDigestFor(spec, result, resultDisposition, options);
|
|
453
476
|
const afterEffects = runToolHook("after_tool", spec, call, decision, options, result, digest);
|
|
454
477
|
return {
|
|
455
478
|
kind: "ok",
|
|
@@ -16,27 +16,30 @@ import {
|
|
|
16
16
|
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateTail } from "./truncate.js";
|
|
17
17
|
import { byteLength, truncateUtf8 } from "./truncate-utf8.js";
|
|
18
18
|
|
|
19
|
-
// Backstop for tools without an explicit resultSizePolicy.
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
// being cut again and replaced by a generic hint.
|
|
23
|
-
export const DEFAULT_TOOL_RESULT_MAX_BYTES = DEFAULT_MAX_BYTES + 2 * 1024;
|
|
19
|
+
// Backstop for tools without an explicit resultSizePolicy. Session settings may
|
|
20
|
+
// lower or raise this fallback, while explicit per-tool policies remain tighter.
|
|
21
|
+
export const DEFAULT_TOOL_RESULT_MAX_BYTES = DEFAULT_MAX_BYTES;
|
|
24
22
|
const RESULT_TRUNCATION_MARKER = "\n[tool result truncated]";
|
|
25
23
|
const RESULT_OFFLOAD_MAX_BYTES = 10 * 1024 * 1024;
|
|
26
24
|
const TAIL_NOTICE_RESERVE_BYTES = 512;
|
|
27
25
|
export const TOOL_OFFLOAD_MAX_AGE_MS = 14 * 24 * 60 * 60 * 1000;
|
|
28
26
|
|
|
29
|
-
type ToolResultShapeContext = Pick<ToolInvokeOptions, "sessionId" | "toolCallId">;
|
|
27
|
+
type ToolResultShapeContext = Pick<ToolInvokeOptions, "sessionId" | "toolCallId" | "toolResultMaxBytes">;
|
|
30
28
|
|
|
31
29
|
function mergeDetails(details: ToolResultDetails | undefined, resultSize: Record<string, unknown>): ToolResultDetails {
|
|
32
30
|
return { ...(details ?? {}), resultSize };
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
function maxBytesFor(spec: ToolSpec): number {
|
|
33
|
+
function maxBytesFor(spec: ToolSpec, context?: ToolResultShapeContext): number {
|
|
36
34
|
const configured = spec.metadata?.resultSizePolicy?.maxBytes;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
const policyMax =
|
|
36
|
+
typeof configured === "number" && Number.isFinite(configured) && configured > 0
|
|
37
|
+
? Math.floor(configured)
|
|
38
|
+
: DEFAULT_TOOL_RESULT_MAX_BYTES;
|
|
39
|
+
const sessionMax = context?.toolResultMaxBytes;
|
|
40
|
+
return typeof sessionMax === "number" && Number.isFinite(sessionMax) && sessionMax > 0
|
|
41
|
+
? Math.min(policyMax, Math.floor(sessionMax))
|
|
42
|
+
: policyMax;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
function followUpHint(spec: ToolSpec): string {
|
|
@@ -61,11 +64,12 @@ export function toolResultDigestFor(
|
|
|
61
64
|
spec: ToolSpec,
|
|
62
65
|
result: ToolResult,
|
|
63
66
|
requestedDisposition?: ToolResultDisposition,
|
|
67
|
+
context?: ToolResultShapeContext,
|
|
64
68
|
): ToolResultDigest {
|
|
65
69
|
const text = resultText(result);
|
|
66
|
-
const disposition = normalizeToolResultDisposition(spec, maxBytesFor(spec), requestedDisposition);
|
|
70
|
+
const disposition = normalizeToolResultDisposition(spec, maxBytesFor(spec, context), requestedDisposition);
|
|
67
71
|
if (disposition === null) {
|
|
68
|
-
const projected = shapeLegacyToolResult(spec, result);
|
|
72
|
+
const projected = shapeLegacyToolResult(spec, result, context);
|
|
69
73
|
return legacyToolResultDigest(resultText(projected), { outcome: result.kind });
|
|
70
74
|
}
|
|
71
75
|
const capturedBytes = capturedBytesFor(result, text);
|
|
@@ -298,7 +302,7 @@ function shapeLegacyToolResult(
|
|
|
298
302
|
overflow: "head" | "tail" = "head",
|
|
299
303
|
): ToolResult {
|
|
300
304
|
if (existingOffloadPath(result.details) !== null) return result;
|
|
301
|
-
const maxBytes = maxBytesFor(spec);
|
|
305
|
+
const maxBytes = maxBytesFor(spec, context);
|
|
302
306
|
const offloadMaxBytes = offloadMaxBytesFor(spec);
|
|
303
307
|
const text = result.kind === "ok" ? result.output : result.message;
|
|
304
308
|
const bytes = byteLength(text);
|
|
@@ -410,7 +414,7 @@ export function shapeToolResult(
|
|
|
410
414
|
requestedDisposition?: ToolResultDisposition,
|
|
411
415
|
): ToolResult {
|
|
412
416
|
if (existingDisposition(result.details) !== null) return result;
|
|
413
|
-
const hardMaxBytes = maxBytesFor(spec);
|
|
417
|
+
const hardMaxBytes = maxBytesFor(spec, context);
|
|
414
418
|
const disposition = normalizeToolResultDisposition(spec, hardMaxBytes, requestedDisposition);
|
|
415
419
|
if (disposition === null) return shapeLegacyToolResult(spec, result, context);
|
|
416
420
|
|
|
@@ -6,7 +6,7 @@ import type { ToolSurface } from "./lazy-tool.js";
|
|
|
6
6
|
export const steerToolSurface = {
|
|
7
7
|
name: ToolNames.Steer,
|
|
8
8
|
description:
|
|
9
|
-
"
|
|
9
|
+
"Guide or cancel a running native worker by run id. Only a detached run can be steered from here, because an ordinary dispatch auto-waits; ACP runs have no input channel.",
|
|
10
10
|
parameters: Type.Object({
|
|
11
11
|
run_id: Type.String({ description: "Run id from dispatch output or monitor list." }),
|
|
12
12
|
action: StringEnum(["guide", "cancel"], { description: "What to do." }),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
-
import { existsSync, mkdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
5
5
|
|
|
6
6
|
export type TaskWorktreeApply = "merge" | "preserve";
|
|
@@ -25,7 +25,9 @@ export interface TaskWorktreeReceipt {
|
|
|
25
25
|
|
|
26
26
|
const SAFE_RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
|
|
27
27
|
const OWNER_FILE_SUFFIX = ".task-owner.json";
|
|
28
|
-
const
|
|
28
|
+
const TASK_WORKTREE_KIND = "clio-coder-task-worktree";
|
|
29
|
+
const LEGACY_TASK_WORKTREE_KIND = "clio-task-worktree";
|
|
30
|
+
const COMMIT_IDENTITY = "clio-coder-task";
|
|
29
31
|
|
|
30
32
|
function gitBytes(root: string, args: string[]): Buffer {
|
|
31
33
|
return execFileSync("git", ["-C", root, ...args], {
|
|
@@ -160,7 +162,7 @@ export function createTaskWorktree(root: string, runId: string, base?: string):
|
|
|
160
162
|
const resolvedBase = base ?? git(canonical, ["rev-parse", "HEAD"]);
|
|
161
163
|
const parent = join(canonical, ".clio-coder", "worktrees");
|
|
162
164
|
const path = join(parent, runId);
|
|
163
|
-
const branch = `clio/task/${runId}`;
|
|
165
|
+
const branch = `clio-coder/task/${runId}`;
|
|
164
166
|
mkdirSync(parent, { recursive: true });
|
|
165
167
|
if (!isCanonicalWorktreePathInside(parent, path))
|
|
166
168
|
throw new Error(`task worktree path escapes its parent for run ${runId}`);
|
|
@@ -168,7 +170,7 @@ export function createTaskWorktree(root: string, runId: string, base?: string):
|
|
|
168
170
|
const ownerToken = randomBytes(16).toString("hex");
|
|
169
171
|
writeFileSync(
|
|
170
172
|
`${path}${OWNER_FILE_SUFFIX}`,
|
|
171
|
-
`${JSON.stringify({ version: 1, kind:
|
|
173
|
+
`${JSON.stringify({ version: 1, kind: TASK_WORKTREE_KIND, root: canonical, runId, branch, base: resolvedBase, ownerToken }, null, 2)}\n`,
|
|
172
174
|
{ encoding: "utf8", flag: "wx" },
|
|
173
175
|
);
|
|
174
176
|
return { root: canonical, runId, path, branch, base: resolvedBase, ownerToken };
|
|
@@ -182,11 +184,30 @@ function assertOwnership(worktree: TaskWorktree): void {
|
|
|
182
184
|
) {
|
|
183
185
|
throw new Error(`task worktree ${worktree.runId} has an invalid ownership path`);
|
|
184
186
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
const ownerPath = `${worktree.path}${OWNER_FILE_SUFFIX}`;
|
|
188
|
+
if (!existsSync(ownerPath)) throw new Error(`task worktree ${worktree.runId} has no ownership file`);
|
|
189
|
+
let marker: Record<string, unknown>;
|
|
190
|
+
try {
|
|
191
|
+
const value = JSON.parse(readFileSync(ownerPath, "utf8")) as unknown;
|
|
192
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error("not an object");
|
|
193
|
+
marker = value as Record<string, unknown>;
|
|
194
|
+
} catch {
|
|
195
|
+
throw new Error(`task worktree ${worktree.runId} has an invalid ownership file`);
|
|
196
|
+
}
|
|
197
|
+
if (
|
|
198
|
+
marker.version !== 1 ||
|
|
199
|
+
(marker.kind !== TASK_WORKTREE_KIND && marker.kind !== LEGACY_TASK_WORKTREE_KIND) ||
|
|
200
|
+
marker.root !== worktree.root ||
|
|
201
|
+
marker.runId !== worktree.runId ||
|
|
202
|
+
marker.branch !== worktree.branch ||
|
|
203
|
+
marker.base !== worktree.base ||
|
|
204
|
+
marker.ownerToken !== worktree.ownerToken
|
|
205
|
+
) {
|
|
206
|
+
throw new Error(`task worktree ${worktree.runId} ownership facts do not match`);
|
|
207
|
+
}
|
|
187
208
|
}
|
|
188
209
|
|
|
189
|
-
function commitTaskWorktree(worktree: TaskWorktree, message = `Clio task ${worktree.runId}`): boolean {
|
|
210
|
+
function commitTaskWorktree(worktree: TaskWorktree, message = `Clio Coder task ${worktree.runId}`): boolean {
|
|
190
211
|
assertOwnership(worktree);
|
|
191
212
|
return commitWorktreePath(worktree.path, COMMIT_IDENTITY, message);
|
|
192
213
|
}
|
package/src/tools/tasks.ts
CHANGED
|
@@ -139,7 +139,7 @@ export function createTasksTool(deps: TasksToolDeps): ToolSpec {
|
|
|
139
139
|
description:
|
|
140
140
|
"Session task board. plan declares a titled board (replaces any prior board); add appends tasks; " +
|
|
141
141
|
"pick moves one operator task uN onto the board; start marks one task active (the current focus); " +
|
|
142
|
-
"done completes a started
|
|
142
|
+
"done completes a task (started or still pending) and requires note as the " +
|
|
143
143
|
"evidence the work actually finished; block parks it with a required reason; drop cancels it; list shows the board. " +
|
|
144
144
|
"Work that did not happen is blocked or dropped, never done.",
|
|
145
145
|
parameters: Type.Object({
|
package/src/tools/truncate.ts
CHANGED
|
@@ -8,12 +8,13 @@ import {
|
|
|
8
8
|
truncateTail as truncatePiTail,
|
|
9
9
|
} from "../engine/truncate.js";
|
|
10
10
|
|
|
11
|
-
// Per-observation source cap. Pi defaults to 50 KiB; Clio
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
11
|
+
// Per-observation source cap. Pi defaults to 50 KiB; Clio allows 64 KiB while
|
|
12
|
+
// its default 192 KiB turn pool remains authoritative across calls. Three full
|
|
13
|
+
// results consume that pool, so a fourth finds it filled. The wrappers below
|
|
14
|
+
// retain only that product-level delta while Pi owns UTF-8-safe head/tail
|
|
15
|
+
// truncation, line limits, grep-line clipping, and size formatting.
|
|
15
16
|
export const DEFAULT_MAX_LINES = 2000;
|
|
16
|
-
export const DEFAULT_MAX_BYTES =
|
|
17
|
+
export const DEFAULT_MAX_BYTES = 64 * 1024;
|
|
17
18
|
export type { TruncationResult };
|
|
18
19
|
export { formatSize, GREP_MAX_LINE_LENGTH, truncateLine };
|
|
19
20
|
|
|
@@ -234,7 +234,7 @@ function boundedId(base: string, suffix = ""): string {
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
/** Allocate the same stable suffix for the same ordered set of occupied IDs. */
|
|
237
|
-
|
|
237
|
+
function deterministicVerifierId(preferredId: string, occupied: ReadonlySet<string>): string {
|
|
238
238
|
const base = boundedId(slug(preferredId, "check"));
|
|
239
239
|
if (!occupied.has(base) && base !== "frontend") return base;
|
|
240
240
|
for (let index = 2; index <= PROJECT_VERIFIER_CATALOG_CAPS.checks + 2; index += 1) {
|
|
@@ -892,7 +892,7 @@ function serializeVerifierDraft(draft: VerifierDraft): string {
|
|
|
892
892
|
}
|
|
893
893
|
|
|
894
894
|
/** Validate with the same production parser used by verify(). */
|
|
895
|
-
|
|
895
|
+
function validateVerifierDraft(draft: VerifierDraft): VerifierDraftValidation {
|
|
896
896
|
const text = serializeVerifierDraft(draft);
|
|
897
897
|
const parsed = parseProjectVerifierCatalogText(text, draft.workspaceRoot, draft.catalogPath);
|
|
898
898
|
if (!parsed.ok) return { ok: false, reason: parsed.reason, text };
|
|
@@ -944,10 +944,7 @@ function cloneDraft(draft: VerifierDraft): VerifierDraft {
|
|
|
944
944
|
}
|
|
945
945
|
|
|
946
946
|
/** Apply edits to a copy so a collision or schema failure leaves the prior draft intact. */
|
|
947
|
-
|
|
948
|
-
draft: VerifierDraft,
|
|
949
|
-
revisions: ReadonlyArray<VerifierRevision>,
|
|
950
|
-
): VerifierRevisionResult {
|
|
947
|
+
function reviseVerifierDraft(draft: VerifierDraft, revisions: ReadonlyArray<VerifierRevision>): VerifierRevisionResult {
|
|
951
948
|
const next = cloneDraft(draft);
|
|
952
949
|
const diagnostics: string[] = [];
|
|
953
950
|
for (const revision of revisions) {
|
|
@@ -447,7 +447,7 @@ async function checkModuleJavaScript(
|
|
|
447
447
|
label: string,
|
|
448
448
|
options: ValidationOptions,
|
|
449
449
|
): Promise<string | null> {
|
|
450
|
-
const dir = mkdtempSync(path.join(tmpdir(), "clio-frontend-check-"));
|
|
450
|
+
const dir = mkdtempSync(path.join(tmpdir(), "clio-coder-frontend-check-"));
|
|
451
451
|
const file = path.join(dir, "module.mjs");
|
|
452
452
|
try {
|
|
453
453
|
writeFileSync(file, source, "utf8");
|
|
@@ -28,20 +28,14 @@ export const verifyToolSurface = {
|
|
|
28
28
|
parameters: Type.Object({
|
|
29
29
|
check: Type.Optional(
|
|
30
30
|
Type.String({
|
|
31
|
-
description: `
|
|
31
|
+
description: `Check id, package script (${VERIFICATION_SCRIPT_FAMILY_HINT}), or "frontend"; omit to list.`,
|
|
32
32
|
}),
|
|
33
33
|
),
|
|
34
|
-
path: Type.Optional(Type.String({ description: "
|
|
35
|
-
args: Type.Optional(
|
|
36
|
-
|
|
37
|
-
),
|
|
38
|
-
|
|
39
|
-
StringEnum(BROWSER_MODES, { description: "check=frontend: headless browser mode (default auto)." }),
|
|
40
|
-
),
|
|
41
|
-
cwd: Type.Optional(Type.String({ description: "Package-script working directory; ignored by project checks." })),
|
|
42
|
-
timeout_ms: Type.Optional(
|
|
43
|
-
Type.Number({ description: "Package/frontend timeout in ms; project checks use their declared timeoutMs." }),
|
|
44
|
-
),
|
|
34
|
+
path: Type.Optional(Type.String({ description: "frontend: artifact file under the workspace root." })),
|
|
35
|
+
args: Type.Optional(Type.Array(Type.String(), { description: "Package scripts only: arguments after --." })),
|
|
36
|
+
browser: Type.Optional(StringEnum(BROWSER_MODES, { description: "frontend: headless browser mode (default auto)." })),
|
|
37
|
+
cwd: Type.Optional(Type.String({ description: "Package scripts only: working directory." })),
|
|
38
|
+
timeout_ms: Type.Optional(Type.Number({ description: "Package and frontend checks only: timeout in ms." })),
|
|
45
39
|
max_output_bytes: Type.Optional(Type.Number({ description: "Output cap in bytes (default 600000)." })),
|
|
46
40
|
}),
|
|
47
41
|
baseActionClass: "execute",
|
|
@@ -13,9 +13,7 @@ export const webFetchToolSurface = {
|
|
|
13
13
|
timeout_ms: Type.Optional(Type.Number({ description: "Timeout ms (default 30000)." })),
|
|
14
14
|
max_bytes: Type.Optional(Type.Number({ description: "Max bytes returned (default 600000)." })),
|
|
15
15
|
format: Type.Optional(
|
|
16
|
-
Type.String({
|
|
17
|
-
description: "auto (default: HTML is cleaned to Markdown, other content passes through) or raw (no conversion).",
|
|
18
|
-
}),
|
|
16
|
+
Type.String({ description: "auto (default) converts HTML to Markdown; raw returns the body unconverted." }),
|
|
19
17
|
),
|
|
20
18
|
}),
|
|
21
19
|
baseActionClass: "read",
|
package/src/tools/web-fetch.ts
CHANGED
package/src/worker/entry.ts
CHANGED
|
@@ -122,7 +122,7 @@ async function main(): Promise<number> {
|
|
|
122
122
|
setResidencyNoticeSink((notice) => {
|
|
123
123
|
process.stderr.write(`[worker] residency ${notice.kind}: ${notice.message}\n`);
|
|
124
124
|
if (notice.kind === "will-not-fit") {
|
|
125
|
-
emitEvent({ type: "
|
|
125
|
+
emitEvent({ type: "clio_coder_run_outcome", payload: { outcomeCode: "vram_capacity_fit_failure" } });
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
128
|
const demux = createWorkerStdinDemux();
|
|
@@ -227,12 +227,13 @@ async function main(): Promise<number> {
|
|
|
227
227
|
const handle = startWorkerRun(input, (event) => emitEvent(projectWorkerEventForStdout(event)));
|
|
228
228
|
// The demux buffers lines that landed before the runtime handle existed.
|
|
229
229
|
// Single-shot subprocesses expose no steer method, and an SDK query can race
|
|
230
|
-
// completion. The runtime emits the receipt-bearing
|
|
230
|
+
// completion. The runtime emits the receipt-bearing clio_coder_steer_received event
|
|
231
231
|
// only after it accepts the message; rejected input is diagnostic-only.
|
|
232
232
|
demux.onSteer(
|
|
233
233
|
createOrderedSteerHandler(
|
|
234
234
|
(text) => handle.steer?.(text) ?? false,
|
|
235
|
-
({ text, sequence }) =>
|
|
235
|
+
({ text, sequence }) =>
|
|
236
|
+
emitEvent({ type: "clio_coder_steer_received", payload: { chars: text.trim().length, sequence } }),
|
|
236
237
|
(reason) => process.stderr.write(`[worker] dropped steer: ${reason}\n`),
|
|
237
238
|
),
|
|
238
239
|
);
|