@iowarp/clio-coder 0.3.9 → 0.4.1
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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- 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 +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- 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 +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- 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 +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- 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 +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -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/response-schema.ts +44 -4
- 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/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -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 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- 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/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- 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/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- 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 +24 -27
- 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-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- 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/serving.ts +31 -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 +12 -2
- 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/store.ts +6 -0
- 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-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 +20 -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 +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- 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} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -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 +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- 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 +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- 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/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- 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 +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- 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 +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- 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 +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- 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 +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- 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 +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- 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-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
4
|
+
import { clioConfigDir } from "../../../core/xdg.js";
|
|
5
|
+
import type { MarketplaceSkill } from "./marketplace.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Marketplace self-promotion: local detection that an uninstalled marketplace
|
|
9
|
+
* skill serves the operator's current request, plus the two policy pieces the
|
|
10
|
+
* offer flow needs — the persistent "never offer this skill" store and the
|
|
11
|
+
* own-marketplace source gate that bounds what a promotion-flow install may
|
|
12
|
+
* ever fetch.
|
|
13
|
+
*
|
|
14
|
+
* Detection is a pure lexical match against the local catalog: no model call,
|
|
15
|
+
* no network, and no request text ever leaves the process. False positives
|
|
16
|
+
* cost operator trust, so the matcher is deliberately conservative — a
|
|
17
|
+
* trigger-phrase hit or a strong distinctive-token overlap fires; anything
|
|
18
|
+
* weaker stays silent and the broad paths (the first-turn reminder,
|
|
19
|
+
* context(scope="skills")) remain the fallback.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export interface PromotionMatch {
|
|
23
|
+
entry: MarketplaceSkill;
|
|
24
|
+
score: number;
|
|
25
|
+
/** The trigger phrase that fired, when the match came from one. */
|
|
26
|
+
matchedTrigger?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const TOKEN_STOPWORDS = new Set([
|
|
30
|
+
"the",
|
|
31
|
+
"a",
|
|
32
|
+
"an",
|
|
33
|
+
"and",
|
|
34
|
+
"or",
|
|
35
|
+
"for",
|
|
36
|
+
"with",
|
|
37
|
+
"this",
|
|
38
|
+
"that",
|
|
39
|
+
"when",
|
|
40
|
+
"what",
|
|
41
|
+
"how",
|
|
42
|
+
"into",
|
|
43
|
+
"from",
|
|
44
|
+
"use",
|
|
45
|
+
"used",
|
|
46
|
+
"using",
|
|
47
|
+
"one",
|
|
48
|
+
"not",
|
|
49
|
+
"skill",
|
|
50
|
+
"skills",
|
|
51
|
+
"clio",
|
|
52
|
+
"please",
|
|
53
|
+
"can",
|
|
54
|
+
"you",
|
|
55
|
+
"should",
|
|
56
|
+
"would",
|
|
57
|
+
"about",
|
|
58
|
+
"need",
|
|
59
|
+
"want",
|
|
60
|
+
"help",
|
|
61
|
+
"make",
|
|
62
|
+
"file",
|
|
63
|
+
"files",
|
|
64
|
+
"code",
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
function normalize(text: string): string {
|
|
68
|
+
return text
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.replace(/[^\p{L}\p{N}\s]/gu, " ")
|
|
71
|
+
.replace(/\s+/g, " ")
|
|
72
|
+
.trim();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Distinctive tokens: 4+ chars and outside the stopword set. */
|
|
76
|
+
function distinctiveTokens(text: string): Set<string> {
|
|
77
|
+
return new Set(
|
|
78
|
+
normalize(text)
|
|
79
|
+
.split(" ")
|
|
80
|
+
.filter((token) => token.length >= 4 && !TOKEN_STOPWORDS.has(token)),
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const TRIGGER_SCORE = 4;
|
|
85
|
+
/** Distinct description/name token overlaps required to fire without a trigger. */
|
|
86
|
+
const TOKEN_FIRE_THRESHOLD = 3;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Score one marketplace entry against the operator's request text. A trigger
|
|
90
|
+
* phrase is a whole-phrase substring match on normalized text; token overlap
|
|
91
|
+
* is a fallback for skills whose triggers have not been authored yet.
|
|
92
|
+
*/
|
|
93
|
+
export function scorePromotionEntry(userText: string, entry: MarketplaceSkill): PromotionMatch | null {
|
|
94
|
+
const haystack = ` ${normalize(userText)} `;
|
|
95
|
+
if (haystack.trim().length === 0) return null;
|
|
96
|
+
for (const trigger of entry.triggers ?? []) {
|
|
97
|
+
const phrase = normalize(trigger);
|
|
98
|
+
if (phrase.length >= 4 && haystack.includes(` ${phrase} `)) {
|
|
99
|
+
return { entry, score: TRIGGER_SCORE, matchedTrigger: trigger };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const requestTokens = distinctiveTokens(userText);
|
|
103
|
+
if (requestTokens.size === 0) return null;
|
|
104
|
+
const entryTokens = distinctiveTokens(`${entry.name.replace(/-/g, " ")} ${entry.description}`);
|
|
105
|
+
let overlap = 0;
|
|
106
|
+
for (const token of requestTokens) if (entryTokens.has(token)) overlap += 1;
|
|
107
|
+
return overlap >= TOKEN_FIRE_THRESHOLD ? { entry, score: overlap } : null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The uninstalled marketplace entries that match the request, best first.
|
|
112
|
+
* `excludedNames` carries installed skills plus every decline scope the
|
|
113
|
+
* caller tracks; the matcher itself is stateless.
|
|
114
|
+
*/
|
|
115
|
+
export function matchMarketplaceSkills(
|
|
116
|
+
userText: string,
|
|
117
|
+
entries: ReadonlyArray<MarketplaceSkill>,
|
|
118
|
+
excludedNames: ReadonlySet<string>,
|
|
119
|
+
): PromotionMatch[] {
|
|
120
|
+
const matches: PromotionMatch[] = [];
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
if (entry.kind !== "skill" || excludedNames.has(entry.name)) continue;
|
|
123
|
+
const match = scorePromotionEntry(userText, entry);
|
|
124
|
+
if (match) matches.push(match);
|
|
125
|
+
}
|
|
126
|
+
return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The hard runtime gate on promotion-flow installs: only Clio's own
|
|
131
|
+
* marketplace is ever an acceptable source, whether the install runs on
|
|
132
|
+
* operator consent or autonomously at full-auto. A local path is the shipped
|
|
133
|
+
* package catalog (install copies files, no network); the one acceptable URL
|
|
134
|
+
* shape is this project's own repository tree. Public skill registries and
|
|
135
|
+
* arbitrary GitHub sources are rejected here, in code — a prompt instruction
|
|
136
|
+
* is not the enforcement mechanism.
|
|
137
|
+
*
|
|
138
|
+
* This gates the promotion flow only. Operator-driven installs through
|
|
139
|
+
* `clio-coder skills install <url>` keep their existing behavior.
|
|
140
|
+
*/
|
|
141
|
+
export const OWN_MARKETPLACE_URL_PREFIX = "https://github.com/iowarp/clio-coder/";
|
|
142
|
+
|
|
143
|
+
export function isOwnMarketplaceSource(entry: Pick<MarketplaceSkill, "origin" | "sourceUrl">): boolean {
|
|
144
|
+
const source = entry.sourceUrl.trim();
|
|
145
|
+
if (/^(?:https?:\/\/|git@)/.test(source)) return source.startsWith(OWN_MARKETPLACE_URL_PREFIX);
|
|
146
|
+
// A non-URL source is a local filesystem path; only catalog discovery
|
|
147
|
+
// produces those, and it resolves them against the shipped package.
|
|
148
|
+
return entry.origin === "catalog" && path.isAbsolute(source);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function assertPromotionInstallSource(entry: MarketplaceSkill): void {
|
|
152
|
+
if (isOwnMarketplaceSource(entry)) return;
|
|
153
|
+
throw new Error(
|
|
154
|
+
`skill promotion: refusing to install "${entry.name}" from ${entry.sourceUrl}; ` +
|
|
155
|
+
"promotion installs only from Clio's own marketplace (local catalog or " +
|
|
156
|
+
`${OWN_MARKETPLACE_URL_PREFIX}). Install manually with clio-coder skills install if intended.`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Persistent "never offer this skill" store. Session-scoped declines live in
|
|
162
|
+
* the offer registration's memory and die with the session; this file holds
|
|
163
|
+
* only the explicit fourth option. It is a standalone JSON document in the
|
|
164
|
+
* config dir rather than a settings key because the settings-v2 manifest is
|
|
165
|
+
* owned elsewhere this sprint; the proposed key for a later migration is
|
|
166
|
+
* `skills.promotionDeclines`.
|
|
167
|
+
*/
|
|
168
|
+
export const PROMOTION_DECLINES_FILE = "skill-promotion-declines.json";
|
|
169
|
+
|
|
170
|
+
export interface PromotionDeclineStore {
|
|
171
|
+
/** decline key (name@version) -> ISO timestamp of the operator's "never" answer. */
|
|
172
|
+
never: Record<string, string>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The decline store key. A "never" answer is scoped to the catalog version the
|
|
177
|
+
* operator saw, so a later version of the same skill is offerable again while a
|
|
178
|
+
* re-published identical version stays declined. Absent version keys as
|
|
179
|
+
* `name@`, distinct from any real version, so it re-offers once a version
|
|
180
|
+
* appears.
|
|
181
|
+
*/
|
|
182
|
+
export function declineKey(name: string, version?: string): string {
|
|
183
|
+
return `${name}@${version ?? ""}`;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function declinesPath(configDir?: string): string {
|
|
187
|
+
return path.join(configDir ?? clioConfigDir(), PROMOTION_DECLINES_FILE);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function readPromotionDeclines(configDir?: string): PromotionDeclineStore {
|
|
191
|
+
const file = declinesPath(configDir);
|
|
192
|
+
if (!existsSync(file)) return { never: {} };
|
|
193
|
+
try {
|
|
194
|
+
const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown;
|
|
195
|
+
const never =
|
|
196
|
+
parsed && typeof parsed === "object" && !Array.isArray(parsed) ? (parsed as { never?: unknown }).never : undefined;
|
|
197
|
+
if (never && typeof never === "object" && !Array.isArray(never)) {
|
|
198
|
+
const entries = Object.entries(never as Record<string, unknown>).filter(
|
|
199
|
+
(pair): pair is [string, string] => typeof pair[1] === "string",
|
|
200
|
+
);
|
|
201
|
+
return { never: Object.fromEntries(entries) };
|
|
202
|
+
}
|
|
203
|
+
} catch {
|
|
204
|
+
// An unreadable store means no recorded declines; the worst outcome is
|
|
205
|
+
// one extra offer, which the operator can re-decline.
|
|
206
|
+
}
|
|
207
|
+
return { never: {} };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function recordPromotionNeverDecline(name: string, version?: string, configDir?: string): void {
|
|
211
|
+
const store = readPromotionDeclines(configDir);
|
|
212
|
+
store.never[declineKey(name, version)] = new Date().toISOString();
|
|
213
|
+
safeResourceWrite(declinesPath(configDir), `${JSON.stringify(store, null, 2)}\n`, { encoding: "utf8" });
|
|
214
|
+
}
|
|
@@ -104,6 +104,12 @@ function baseClassify(tool: string): ActionClass | null {
|
|
|
104
104
|
// local mirror. Neither touches the workspace, so it is never gated
|
|
105
105
|
// behind a confirmation.
|
|
106
106
|
case ToolNames.Ledger:
|
|
107
|
+
// panes focuses, opens, and closes terminal panes Clio itself created, in
|
|
108
|
+
// a pane host that lives outside the workspace. Nothing it does writes a
|
|
109
|
+
// file, runs a model-supplied command (its schema exposes presets only),
|
|
110
|
+
// or survives the session, so it is reversible, local, and never gated
|
|
111
|
+
// behind a confirmation.
|
|
112
|
+
case ToolNames.Panes:
|
|
107
113
|
return "read";
|
|
108
114
|
case ToolNames.Write:
|
|
109
115
|
case ToolNames.Edit:
|
|
@@ -11,7 +11,7 @@ import type { SafetyPolicyDecision } from "./policy-engine.js";
|
|
|
11
11
|
* rotation, and on a low-frequency background interval instead of once per
|
|
12
12
|
* row, which kept blocking the admission hot path on disk latency. Write
|
|
13
13
|
* errors never throw back to the caller because safety must not kill the hot
|
|
14
|
-
* path; they are logged to stderr with a `[clio:audit]` prefix for
|
|
14
|
+
* path; they are logged to stderr with a `[clio-coder:audit]` prefix for
|
|
15
15
|
* post-mortem review.
|
|
16
16
|
*
|
|
17
17
|
* Records are a discriminated union over `kind`:
|
|
@@ -404,7 +404,7 @@ interface OpenFile {
|
|
|
404
404
|
function logAuditError(err: unknown, path?: string): void {
|
|
405
405
|
const msg = err instanceof Error ? err.message : String(err);
|
|
406
406
|
const where = path ? ` (${path})` : "";
|
|
407
|
-
process.stderr.write(`[clio:audit] ${msg}${where}\n`);
|
|
407
|
+
process.stderr.write(`[clio-coder:audit] ${msg}${where}\n`);
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/** Cadence of the background safety flush that bounds how long rows can sit unfsynced. */
|
|
@@ -490,9 +490,10 @@ function bashExecutionEvidence(entry: unknown): FinishContractEvidence | null {
|
|
|
490
490
|
if (record.exitCode !== 0) return null;
|
|
491
491
|
const detected = detectValidationCommand(record.command);
|
|
492
492
|
if (detected.kind !== "validation") return null;
|
|
493
|
+
const contextMarker = record.excludeFromContext === true ? " [not sent to model]" : "";
|
|
493
494
|
const evidence: FinishContractEvidence = {
|
|
494
495
|
kind: "validation_command",
|
|
495
|
-
summary: `validation command passed: ${detected.matched}`,
|
|
496
|
+
summary: `validation command passed: ${detected.matched}${contextMarker}`,
|
|
496
497
|
};
|
|
497
498
|
const turnId = turnIdOf(entry);
|
|
498
499
|
if (turnId !== null) evidence.turnId = turnId;
|
|
@@ -140,7 +140,7 @@ const ENUMERABLE_ACTION_CLASSES: ReadonlySet<string> = new Set(["read", "write"]
|
|
|
140
140
|
* `unknown` and is opaque, which is the fail-closed answer for a tool whose
|
|
141
141
|
* arguments this process has no schema for.
|
|
142
142
|
*/
|
|
143
|
-
|
|
143
|
+
function toolWritesOpaquely(toolName: string): boolean {
|
|
144
144
|
return !ENUMERABLE_ACTION_CLASSES.has(classify({ tool: toolName }).actionClass);
|
|
145
145
|
}
|
|
146
146
|
|
|
@@ -28,14 +28,14 @@ export function createSchedulingBundle(context: DomainContext): DomainBundle<Sch
|
|
|
28
28
|
const observability = context.getContract<ObservabilityContract>("observability");
|
|
29
29
|
|
|
30
30
|
const settings = config.get();
|
|
31
|
-
let budget = createBudgetState(settings.
|
|
31
|
+
let budget = createBudgetState(settings.safety.limits.sessionCostUsd);
|
|
32
32
|
const fleet = createFleetRegistry(() => config.get().fleet?.nodes ?? [], {
|
|
33
|
-
localMaxWorkers: () => resolveMaxWorkers(config.get().
|
|
33
|
+
localMaxWorkers: () => resolveMaxWorkers(config.get().fleet.concurrency),
|
|
34
34
|
});
|
|
35
35
|
const unsubscribes: Array<() => void> = [];
|
|
36
36
|
|
|
37
37
|
function syncBudget(): void {
|
|
38
|
-
const nextCeiling = config.get().
|
|
38
|
+
const nextCeiling = config.get().safety.limits.sessionCostUsd;
|
|
39
39
|
if (nextCeiling === budget.ceilingUsd) return;
|
|
40
40
|
budget = createBudgetState(nextCeiling);
|
|
41
41
|
}
|
|
@@ -83,7 +83,7 @@ export function createSchedulingBundle(context: DomainContext): DomainBundle<Sch
|
|
|
83
83
|
const { verdict, currentUsd } = evaluate();
|
|
84
84
|
return { verdict, currentUsd, ceilingUsd: budget.ceilingUsd };
|
|
85
85
|
},
|
|
86
|
-
maxWorkers: () => resolveMaxWorkers(config.get().
|
|
86
|
+
maxWorkers: () => resolveMaxWorkers(config.get().fleet.concurrency),
|
|
87
87
|
fleet,
|
|
88
88
|
};
|
|
89
89
|
|
|
@@ -42,6 +42,14 @@ export interface SessionLedgerRef {
|
|
|
42
42
|
path: string;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
const ROUTING_NOTICE_CUSTOM_TYPE = "clio-coder.routing-notice";
|
|
46
|
+
const LEGACY_ROUTING_NOTICE_CUSTOM_TYPE = "clio.routing-notice";
|
|
47
|
+
|
|
48
|
+
function normalizeReleasedCustomType(entry: SessionEntry): SessionEntry {
|
|
49
|
+
if (entry.kind !== "custom" || entry.customType !== LEGACY_ROUTING_NOTICE_CUSTOM_TYPE) return entry;
|
|
50
|
+
return { ...entry, customType: ROUTING_NOTICE_CUSTOM_TYPE };
|
|
51
|
+
}
|
|
52
|
+
|
|
45
53
|
/**
|
|
46
54
|
* Read every `<stateDir>/audit/<date>.jsonl` row. Malformed lines are skipped
|
|
47
55
|
* and reported in `errors` instead of failing the read.
|
|
@@ -157,7 +165,7 @@ export function parseSessionEntries(raw: string, source: string): SessionReadRes
|
|
|
157
165
|
}
|
|
158
166
|
if (isSessionHeader(parsed)) continue;
|
|
159
167
|
if (isSessionEntry(parsed)) {
|
|
160
|
-
entries.push(parsed);
|
|
168
|
+
entries.push(normalizeReleasedCustomType(parsed));
|
|
161
169
|
continue;
|
|
162
170
|
}
|
|
163
171
|
errors.push(
|
|
@@ -162,6 +162,10 @@ export function serializeConversation(entries: ReadonlyArray<SessionEntry>): str
|
|
|
162
162
|
continue;
|
|
163
163
|
}
|
|
164
164
|
if (entry.kind === "bashExecution") {
|
|
165
|
+
// `!!` is an operator-private terminal command. Its immutable ledger
|
|
166
|
+
// entry remains available to transcript replay, but neither its command
|
|
167
|
+
// nor its output may cross a model boundary through compaction.
|
|
168
|
+
if (entry.excludeFromContext === true) continue;
|
|
165
169
|
parts.push(`[Bash]: $ ${entry.command}\n${truncate(entry.output, TOOL_RESULT_MAX_CHARS)}`);
|
|
166
170
|
continue;
|
|
167
171
|
}
|
|
@@ -497,7 +497,7 @@ interface TextBlock {
|
|
|
497
497
|
text: string;
|
|
498
498
|
}
|
|
499
499
|
|
|
500
|
-
|
|
500
|
+
function textFromAssistant(message: unknown): string {
|
|
501
501
|
if (!message || typeof message !== "object" || !("content" in message)) return "";
|
|
502
502
|
const content = (message as { content: unknown }).content;
|
|
503
503
|
if (typeof content === "string") return content;
|
|
@@ -49,6 +49,10 @@ function estimateMessage(entry: MessageEntry): number {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
function estimateBashExecution(entry: BashExecutionEntry): number {
|
|
52
|
+
// `!!` rows are transcript-only and never become provider input, including
|
|
53
|
+
// through a later compaction prompt. Charging their bytes to the model
|
|
54
|
+
// context would make the context meter claim the model can see private output.
|
|
55
|
+
if (entry.excludeFromContext === true) return 0;
|
|
52
56
|
return ceilChars(entry.command.length + entry.output.length);
|
|
53
57
|
}
|
|
54
58
|
|
|
@@ -370,7 +370,7 @@ export function lastLoadedContextWindow(meta: SessionMeta, providerId: string, m
|
|
|
370
370
|
return null;
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
|
|
373
|
+
function buildSnapshotCategories(inputs: {
|
|
374
374
|
systemPrompt?: string | undefined;
|
|
375
375
|
promptSegments?: ReadonlyArray<{ id: string; tokenEstimate: number }> | undefined;
|
|
376
376
|
tools?: ReadonlyArray<unknown> | undefined;
|
|
@@ -54,7 +54,7 @@ function answeredAtForDecision(policy: AskUserToolPolicy, sourceQuestion: string
|
|
|
54
54
|
* The policy already keeps last-value-wins decisions; the defensive map also
|
|
55
55
|
* makes conversion deterministic for hand-built policies and older callers.
|
|
56
56
|
*/
|
|
57
|
-
|
|
57
|
+
function finalizedInterviewEntryFields(policy: AskUserToolPolicy): DecisionLedgerEntryFields | null {
|
|
58
58
|
if (policy.rounds.length === 0 && policy.decisions.length === 0) return null;
|
|
59
59
|
if (!policy.turnId) throw new Error(`decision board: interview ${policy.id} has no originating user turn`);
|
|
60
60
|
if (policy.status !== "complete" && policy.status !== "cancelled") {
|
|
@@ -392,7 +392,7 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
392
392
|
await performCheckpoint(state, "shutdown");
|
|
393
393
|
} catch (err) {
|
|
394
394
|
process.stderr.write(
|
|
395
|
-
`[clio:session] shutdown checkpoint failed: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
395
|
+
`[clio-coder:session] shutdown checkpoint failed: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
396
396
|
);
|
|
397
397
|
}
|
|
398
398
|
await closeCurrent("shutdown");
|
|
@@ -176,7 +176,7 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
176
176
|
* ceiling, so the returned string is never longer than the bound, and the cut
|
|
177
177
|
* lands on a whole code point rather than mid-sequence.
|
|
178
178
|
*/
|
|
179
|
-
|
|
179
|
+
function boundHandoffString(value: string): { text: string; truncated: boolean } {
|
|
180
180
|
const text = value.trim();
|
|
181
181
|
const bytes = Buffer.byteLength(text, "utf8");
|
|
182
182
|
if (bytes <= HANDOFF_MAX_STRING_BYTES) return { text, truncated: false };
|
|
@@ -343,7 +343,7 @@ export interface HandoffReadLedgerOptions {
|
|
|
343
343
|
* absolute form, which is what makes it fail the ledger check against paths
|
|
344
344
|
* recorded relative to the workspace root.
|
|
345
345
|
*/
|
|
346
|
-
|
|
346
|
+
function normalizeHandoffPath(value: string, cwd: string | null): string {
|
|
347
347
|
const trimmed = value.trim().replace(/[\\/]+$/u, "");
|
|
348
348
|
if (trimmed.length === 0) return "";
|
|
349
349
|
const absolute = isAbsolute(trimmed) ? normalize(trimmed) : cwd === null ? normalize(trimmed) : resolve(cwd, trimmed);
|
|
@@ -155,11 +155,6 @@ function isSessionPromptCompileRecord(value: unknown): value is SessionPromptCom
|
|
|
155
155
|
);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
/** A record written before the field existed describes the 0.3.8 layout. */
|
|
159
|
-
export function promptManifestVersion(record: SessionPromptCompileRecord): number {
|
|
160
|
-
return record.version ?? 1;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
158
|
export function getPromptManifestFilePath(meta: SessionMeta, stateDir?: string): string {
|
|
164
159
|
const safeMeta = {
|
|
165
160
|
...meta,
|
|
@@ -63,9 +63,12 @@ function artifactPayload(artifact: ProtectedArtifact): Record<string, unknown> {
|
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
function recordPayload(
|
|
66
|
+
function recordPayload(
|
|
67
|
+
record: Omit<PendingProtectedArtifactRecord, "integrity">,
|
|
68
|
+
legacyNaming = false,
|
|
69
|
+
): Record<string, unknown> {
|
|
67
70
|
return {
|
|
68
|
-
contract: "clio.protectedArtifact.pending",
|
|
71
|
+
contract: legacyNaming ? "clio.protectedArtifact.pending" : "clio-coder.protectedArtifact.pending",
|
|
69
72
|
version: record.version,
|
|
70
73
|
id: record.id,
|
|
71
74
|
sessionId: record.sessionId,
|
|
@@ -81,9 +84,9 @@ function recordPayload(record: Omit<PendingProtectedArtifactRecord, "integrity">
|
|
|
81
84
|
};
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
function digest(record: Omit<PendingProtectedArtifactRecord, "integrity"
|
|
87
|
+
function digest(record: Omit<PendingProtectedArtifactRecord, "integrity">, legacyNaming = false): string {
|
|
85
88
|
return createHash("sha256")
|
|
86
|
-
.update(JSON.stringify(recordPayload(record)), "utf8")
|
|
89
|
+
.update(JSON.stringify(recordPayload(record, legacyNaming)), "utf8")
|
|
87
90
|
.digest("hex");
|
|
88
91
|
}
|
|
89
92
|
|
|
@@ -153,7 +156,10 @@ function parseRecord(value: unknown, sessionId: string): PendingProtectedArtifac
|
|
|
153
156
|
createdAt: value.createdAt,
|
|
154
157
|
integrity: { algorithm: "sha256", digest: value.integrity.digest },
|
|
155
158
|
};
|
|
156
|
-
|
|
159
|
+
const without = withoutIntegrity(parsed);
|
|
160
|
+
return digest(without) === parsed.integrity.digest || digest(without, true) === parsed.integrity.digest
|
|
161
|
+
? parsed
|
|
162
|
+
: null;
|
|
157
163
|
}
|
|
158
164
|
|
|
159
165
|
export function stagePendingProtectedArtifact(
|
|
@@ -190,7 +196,7 @@ export function clearPendingProtectedArtifact(handle: PendingProtectedArtifactHa
|
|
|
190
196
|
rmSync(handle.path, { force: true });
|
|
191
197
|
}
|
|
192
198
|
|
|
193
|
-
|
|
199
|
+
function readPendingProtectedArtifacts(sessionId: string): PendingProtectedArtifactReadResult {
|
|
194
200
|
const directory = journalDirectory(sessionId);
|
|
195
201
|
if (!existsSync(directory)) return { records: [], errors: [] };
|
|
196
202
|
const records: PendingProtectedArtifactHandle[] = [];
|
|
@@ -70,7 +70,7 @@ const MODEL_LOADING_MIN_DELAY_MS = 15000;
|
|
|
70
70
|
* True when the error says the target is loading the model, so the wait should
|
|
71
71
|
* be sized for disk and VRAM rather than for a provider backing off.
|
|
72
72
|
*/
|
|
73
|
-
|
|
73
|
+
function isModelLoadingErrorMessage(errorMessage: string | null | undefined): boolean {
|
|
74
74
|
if (!errorMessage || errorMessage.length === 0) return false;
|
|
75
75
|
return MODEL_LOADING_PATTERN.test(errorMessage);
|
|
76
76
|
}
|