@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
|
@@ -70,7 +70,7 @@ const KEEP_ALIVE_INTERVAL_MS = 1 << 30;
|
|
|
70
70
|
* before the keep-alive anchor. Keeping that seam explicit prevents an
|
|
71
71
|
* extraction from silently changing initialization order.
|
|
72
72
|
*/
|
|
73
|
-
|
|
73
|
+
function createInteractiveShell<TTerminal extends Terminal, TTui extends InteractiveShellTui>(
|
|
74
74
|
deps: InteractiveShellDeps<TTerminal, TTui>,
|
|
75
75
|
): InteractiveShell<TTerminal, TTui> {
|
|
76
76
|
const terminal = deps.createTerminal();
|
|
@@ -175,7 +175,7 @@ export function getActiveRenderTrace(): RenderTrace | null {
|
|
|
175
175
|
* model state. After the finite pre-render bound, exactly one caller-supplied
|
|
176
176
|
* final frame is still issued; a post-render drain wait is likewise bounded.
|
|
177
177
|
*/
|
|
178
|
-
|
|
178
|
+
async function settleLatestInteractiveFrame(
|
|
179
179
|
gate: Pick<StdoutBackpressureGate, "whenWritable"> | null,
|
|
180
180
|
timeoutMs: number,
|
|
181
181
|
renderFrame: () => Promise<number>,
|
|
@@ -9,6 +9,7 @@ import type { AgentsContract } from "../domains/agents/contract.js";
|
|
|
9
9
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
10
10
|
import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
11
11
|
import type { ExtensionsContract } from "../domains/extensions/index.js";
|
|
12
|
+
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
12
13
|
import {
|
|
13
14
|
type ProvidersContract,
|
|
14
15
|
type ResolvedThinkingCapability,
|
|
@@ -36,7 +37,7 @@ import { runOperatorRecall } from "./context-recall-command.js";
|
|
|
36
37
|
import { renderSessionHtml } from "./export-html/index.js";
|
|
37
38
|
import { dateLocal } from "./format-time.js";
|
|
38
39
|
import type { OracleDigestSources } from "./oracle.js";
|
|
39
|
-
import type {
|
|
40
|
+
import type { PendingModelScope } from "./overlays/model-scope.js";
|
|
40
41
|
import {
|
|
41
42
|
type ContextClearCommandOptions,
|
|
42
43
|
type CouncilDispatchOutcome,
|
|
@@ -44,11 +45,12 @@ import {
|
|
|
44
45
|
type InitCommandOptions,
|
|
45
46
|
parseSlashCommand,
|
|
46
47
|
type RunIo,
|
|
48
|
+
type SettingsAreaId,
|
|
47
49
|
type SlashCommandContext,
|
|
48
50
|
type SlashCommandDispatchResult,
|
|
49
51
|
type TaskMemorySeedCommandResult,
|
|
50
52
|
} from "./slash-commands.js";
|
|
51
|
-
import {
|
|
53
|
+
import { verifyReceiptFileReport } from "./view/artifacts.js";
|
|
52
54
|
import type { WorkerEntryState } from "./worker-stream.js";
|
|
53
55
|
|
|
54
56
|
const EXPORT_RENDER_WIDTH = 100;
|
|
@@ -89,8 +91,8 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
89
91
|
* making a value permanent stays the Settings overlay's explicit choice.
|
|
90
92
|
*/
|
|
91
93
|
commitSetting?: (id: string, next: ClioSettings, scope: "session" | "global") => void;
|
|
92
|
-
onSelectModel?: (ref: { target: string; model: string }) => void;
|
|
93
|
-
onSetThinkingLevel?: (level: ThinkingLevel) => void;
|
|
94
|
+
onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
|
|
95
|
+
onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
|
|
94
96
|
onCompact?: (instructions: string | undefined) => Promise<void>;
|
|
95
97
|
onInit?: (options: InitCommandOptions, io?: RunIo) => Promise<void>;
|
|
96
98
|
onContextClear?: (options: ContextClearCommandOptions) => Promise<void>;
|
|
@@ -135,8 +137,16 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
135
137
|
openMemory: () => void;
|
|
136
138
|
seedTaskMemory?: () => TaskMemorySeedCommandResult;
|
|
137
139
|
openView: (filter?: string) => void;
|
|
140
|
+
/** Pane-layer operations behind `/panes`. Absent when the mux resolved to `none`. */
|
|
141
|
+
panes?: PanesOperations;
|
|
138
142
|
openModel: () => void;
|
|
139
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Ask where a resolved `/model <pattern>` swap lands before anything applies.
|
|
145
|
+
* Absent on a host with no overlay layer, where the swap stays session-scoped.
|
|
146
|
+
*/
|
|
147
|
+
openModelScope?: (ref: PendingModelScope) => void;
|
|
148
|
+
openSettings: (area?: SettingsAreaId, group?: string) => void;
|
|
149
|
+
openFleetRuns?: () => void;
|
|
140
150
|
openResume: () => void;
|
|
141
151
|
startNewSession: () => void;
|
|
142
152
|
openTree: () => void;
|
|
@@ -165,11 +175,7 @@ export interface InteractiveSlashRuntime {
|
|
|
165
175
|
}
|
|
166
176
|
|
|
167
177
|
/** Owns slash-command context construction and its asynchronous command state. */
|
|
168
|
-
const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["
|
|
169
|
-
"minimal",
|
|
170
|
-
"default",
|
|
171
|
-
"verbose",
|
|
172
|
-
];
|
|
178
|
+
const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["interface"]["outputDetail"]> = ["minimal", "default", "verbose"];
|
|
173
179
|
|
|
174
180
|
/** Thinking capability of the active orchestrator target and model, or null when unresolved. */
|
|
175
181
|
export function resolveThinkingCapability(
|
|
@@ -178,9 +184,9 @@ export function resolveThinkingCapability(
|
|
|
178
184
|
): ResolvedThinkingCapability | null {
|
|
179
185
|
const resolved = resolveModelRuntimeCapabilitiesForProviders(
|
|
180
186
|
providers,
|
|
181
|
-
settings.
|
|
182
|
-
settings.
|
|
183
|
-
settings.
|
|
187
|
+
settings.chat.target,
|
|
188
|
+
settings.chat.model,
|
|
189
|
+
settings.chat.thinkingLevel ?? "off",
|
|
184
190
|
);
|
|
185
191
|
return resolved?.thinking ?? null;
|
|
186
192
|
}
|
|
@@ -200,6 +206,7 @@ export function resolveAvailableThinkingLevels(
|
|
|
200
206
|
export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps): InteractiveSlashRuntime {
|
|
201
207
|
let activeContextInit = false;
|
|
202
208
|
let latestAdmission: Promise<void> = Promise.resolve();
|
|
209
|
+
let latestLocalOperation: Promise<void> = Promise.resolve();
|
|
203
210
|
let activeAdmissionSignal: AbortSignal | undefined;
|
|
204
211
|
const cwd = (): string => deps.getCwd?.() ?? process.cwd();
|
|
205
212
|
const resources = deps.resources;
|
|
@@ -360,7 +367,8 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
360
367
|
deps.requestRender();
|
|
361
368
|
}
|
|
362
369
|
};
|
|
363
|
-
|
|
370
|
+
let context: SlashCommandContext;
|
|
371
|
+
context = {
|
|
364
372
|
io: deps.io,
|
|
365
373
|
notice: appendCommandNotice,
|
|
366
374
|
echoOperatorCommand: (text) => {
|
|
@@ -382,7 +390,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
382
390
|
openSkillsHub: deps.openSkillsHub,
|
|
383
391
|
listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
|
|
384
392
|
listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
|
|
385
|
-
listDelegationAgents: () => deps.getSettings?.().
|
|
393
|
+
listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
|
|
386
394
|
exportShareArchive: (outPath) => {
|
|
387
395
|
if (!deps.share) throw new Error("share domain is not loaded");
|
|
388
396
|
const path = resolve(outPath);
|
|
@@ -413,7 +421,8 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
413
421
|
oracleBriefing: oracleBriefingSources,
|
|
414
422
|
startHandoff: deps.startHandoff,
|
|
415
423
|
...(deps.startFleetRun ? { startFleetRun: deps.startFleetRun } : {}),
|
|
416
|
-
...(deps.
|
|
424
|
+
...(deps.openFleetRuns ? { openFleetRuns: deps.openFleetRuns } : {}),
|
|
425
|
+
...(deps.getSettings ? { getWorkerRosters: () => deps.getSettings?.().fleet.rosters ?? {} } : {}),
|
|
417
426
|
...(deps.runCouncilDispatch ? { runCouncilDispatch: deps.runCouncilDispatch } : {}),
|
|
418
427
|
openContextView: deps.openContextView,
|
|
419
428
|
openTasks: deps.openTasks,
|
|
@@ -436,6 +445,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
436
445
|
return result;
|
|
437
446
|
},
|
|
438
447
|
openView: deps.openView,
|
|
448
|
+
...(deps.panes ? { panes: deps.panes } : {}),
|
|
439
449
|
setThinkingLevel: (level) => {
|
|
440
450
|
const settings = deps.getSettings?.();
|
|
441
451
|
if (!settings || !deps.onSetThinkingLevel) return { status: "unavailable" };
|
|
@@ -456,24 +466,53 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
456
466
|
// has no mandate to do.
|
|
457
467
|
if (deps.commitSetting) {
|
|
458
468
|
const next = structuredClone(settings) as ClioSettings;
|
|
459
|
-
next.
|
|
460
|
-
deps.commitSetting("
|
|
469
|
+
next.chat.thinkingLevel = match;
|
|
470
|
+
deps.commitSetting("chat.thinkingLevel", next, "session");
|
|
461
471
|
} else {
|
|
462
472
|
deps.onSetThinkingLevel(match);
|
|
463
473
|
}
|
|
464
474
|
deps.refreshFooter();
|
|
465
475
|
return { status: "applied", level: match, display: labelFor(match) };
|
|
466
476
|
},
|
|
477
|
+
thinkingLevelChoices: () => {
|
|
478
|
+
const settings = deps.getSettings?.();
|
|
479
|
+
if (!settings) return [];
|
|
480
|
+
const thinking = resolveThinkingCapability(deps.providers, settings);
|
|
481
|
+
return (thinking?.supportedLevels ?? (["off"] as ReadonlyArray<ThinkingLevel>)).map((value) => ({
|
|
482
|
+
value,
|
|
483
|
+
label: thinkingLevelChoiceLabel(thinking?.mechanism ?? null, value),
|
|
484
|
+
}));
|
|
485
|
+
},
|
|
486
|
+
openThinkingPicker: () => {
|
|
487
|
+
const choices = context.thinkingLevelChoices?.() ?? [];
|
|
488
|
+
if (choices.length === 0) {
|
|
489
|
+
appendCommandNotice("error", "thinking level cannot be set right now");
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
void deps
|
|
493
|
+
.openAskUser([
|
|
494
|
+
{
|
|
495
|
+
question: "Choose the thinking level for this chat.",
|
|
496
|
+
header: "Thinking",
|
|
497
|
+
options: choices.map(({ label }) => ({ label })),
|
|
498
|
+
},
|
|
499
|
+
])
|
|
500
|
+
.then((result) => {
|
|
501
|
+
const answer = result.cancelled ? undefined : result.answers[0]?.answer;
|
|
502
|
+
const selected = choices.find(({ label }) => label === answer);
|
|
503
|
+
if (selected) dispatchSlashCommand({ kind: "thinking-set", level: selected.value }, context);
|
|
504
|
+
});
|
|
505
|
+
},
|
|
467
506
|
setOutputVerbosity: (verbosity) => {
|
|
468
507
|
if (!deps.getSettings || !(deps.commitSetting || deps.writeSettings)) return { status: "unavailable" };
|
|
469
508
|
const requested = verbosity.trim().toLowerCase();
|
|
470
509
|
const match = OUTPUT_VERBOSITIES.find((candidate) => candidate === requested);
|
|
471
510
|
if (!match) return { status: "unsupported", verbosity, supported: OUTPUT_VERBOSITIES };
|
|
472
511
|
const next = structuredClone(deps.getSettings()) as ClioSettings;
|
|
473
|
-
next.
|
|
512
|
+
next.interface.outputDetail = match;
|
|
474
513
|
// Session scope: /output changes this session and leaves settings.yaml
|
|
475
514
|
// alone. Saving it as the default is what Settings → Terminal is for.
|
|
476
|
-
if (deps.commitSetting) deps.commitSetting("
|
|
515
|
+
if (deps.commitSetting) deps.commitSetting("interface.outputDetail", next, "session");
|
|
477
516
|
else deps.writeSettings?.(next);
|
|
478
517
|
// `/output` is also the explicit reset action for transcript folds. Do
|
|
479
518
|
// this even when the requested level already matches the current one;
|
|
@@ -482,12 +521,41 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
482
521
|
deps.refreshFooter();
|
|
483
522
|
return { status: "applied", verbosity: match };
|
|
484
523
|
},
|
|
524
|
+
openOutputPicker: () => {
|
|
525
|
+
void deps
|
|
526
|
+
.openAskUser([
|
|
527
|
+
{
|
|
528
|
+
question: "Choose transcript detail for this session.",
|
|
529
|
+
header: "Output",
|
|
530
|
+
options: OUTPUT_VERBOSITIES.map((value) => ({
|
|
531
|
+
label: `${value[0]?.toUpperCase()}${value.slice(1)}`,
|
|
532
|
+
})),
|
|
533
|
+
},
|
|
534
|
+
])
|
|
535
|
+
.then((result) => {
|
|
536
|
+
if (result.cancelled) return;
|
|
537
|
+
const answer = result.answers[0]?.answer.toLowerCase();
|
|
538
|
+
const selected = OUTPUT_VERBOSITIES.find((value) => value === answer);
|
|
539
|
+
if (selected) dispatchSlashCommand({ kind: "output-set", verbosity: selected }, context);
|
|
540
|
+
});
|
|
541
|
+
},
|
|
485
542
|
openModel: deps.openModel,
|
|
486
543
|
providers: deps.providers,
|
|
487
544
|
applyModelRef: (ref) => {
|
|
488
|
-
|
|
489
|
-
|
|
545
|
+
// A mid-conversation swap used to rewrite the orchestrator role in
|
|
546
|
+
// settings.yaml with no prompt, so the next launch could come up on a
|
|
547
|
+
// dead endpoint (smoke pass 2, G3). The scope dialog owns the commit
|
|
548
|
+
// now, and it applies nothing until the operator answers.
|
|
549
|
+
if (deps.openModelScope) {
|
|
550
|
+
deps.openModelScope(ref);
|
|
551
|
+
return "pending";
|
|
552
|
+
}
|
|
553
|
+
// No overlay layer to ask with: session scope is the answer that cannot
|
|
554
|
+
// outlive the session that chose it.
|
|
555
|
+
deps.onSelectModel?.({ target: ref.target, model: ref.model }, "session");
|
|
556
|
+
if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel, "session");
|
|
490
557
|
deps.requestRender();
|
|
558
|
+
return "applied";
|
|
491
559
|
},
|
|
492
560
|
openSettings: deps.openSettings,
|
|
493
561
|
openResume: deps.openResume,
|
|
@@ -634,7 +702,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
634
702
|
})
|
|
635
703
|
.finally(deps.requestRender);
|
|
636
704
|
},
|
|
637
|
-
verifyReceipt: (runId) =>
|
|
705
|
+
verifyReceipt: (runId) => verifyReceiptFileReport(deps.stateDir, runId),
|
|
638
706
|
...(deps.listWorkerRuns ? { listWorkerRuns: deps.listWorkerRuns } : {}),
|
|
639
707
|
// The user-turn path, minus expansion. A worker's answer is literal text:
|
|
640
708
|
// running it through the prompt, skill, and @file expanders would let a
|
|
@@ -644,6 +712,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
644
712
|
latestAdmission = admitChat(text, activeAdmissionSignal);
|
|
645
713
|
void latestAdmission;
|
|
646
714
|
},
|
|
715
|
+
runLocalOperation: (operation) => {
|
|
716
|
+
latestLocalOperation = latestLocalOperation.catch(() => undefined).then(operation);
|
|
717
|
+
},
|
|
647
718
|
render: deps.requestRender,
|
|
648
719
|
};
|
|
649
720
|
|
|
@@ -653,8 +724,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
653
724
|
dispatchCommand: (text) => dispatchSlashCommand(parseSlashCommand(text), context),
|
|
654
725
|
admitCommand: async (text, signal) => {
|
|
655
726
|
signal?.throwIfAborted();
|
|
727
|
+
// Pane opens and focus changes mutate a remote registry. A following
|
|
728
|
+
// slash read must observe their settled state, just as the tool path does.
|
|
729
|
+
await latestLocalOperation;
|
|
656
730
|
const command = parseSlashCommand(text);
|
|
657
731
|
const before = latestAdmission;
|
|
732
|
+
const localBefore = latestLocalOperation;
|
|
658
733
|
const previousSignal = activeAdmissionSignal;
|
|
659
734
|
activeAdmissionSignal = signal;
|
|
660
735
|
try {
|
|
@@ -663,6 +738,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
663
738
|
activeAdmissionSignal = previousSignal;
|
|
664
739
|
}
|
|
665
740
|
if (latestAdmission !== before) await latestAdmission;
|
|
741
|
+
if (latestLocalOperation !== localBefore) await latestLocalOperation;
|
|
666
742
|
},
|
|
667
743
|
};
|
|
668
744
|
}
|
|
@@ -88,7 +88,7 @@ export function createInteractiveSubscriptions(deps: InteractiveSubscriptionsDep
|
|
|
88
88
|
BusChannels.DispatchProgress,
|
|
89
89
|
folded((payload) => {
|
|
90
90
|
const workerEvent = payload.event as { type?: unknown } | null | undefined;
|
|
91
|
-
if (workerEvent?.type === "
|
|
91
|
+
if (workerEvent?.type === "clio_coder_steer_received") {
|
|
92
92
|
deps.notify("success", `steer received by ${payload.agentId} (${payload.runId})`, `steer:${payload.runId}`);
|
|
93
93
|
}
|
|
94
94
|
return workers.progress(payload);
|
|
@@ -34,7 +34,7 @@ export interface InteractiveTickersDeps {
|
|
|
34
34
|
clearScheduledInterval?: (handle: InteractiveTickerHandle) => void;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
function formatTaskBoardIslandLines(board: TaskBoardSnapshot): string[] {
|
|
38
38
|
const theme = clioTheme();
|
|
39
39
|
const counts = taskBoardCounts(board);
|
|
40
40
|
const active = board.tasks.find((task) => task.status === "active");
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* so editor/select components honor overrides out of the box.
|
|
19
19
|
*
|
|
20
20
|
* User overrides go through `validateKeybindings` first. Unmappable strings
|
|
21
|
-
* (e.g. `clio.exit: "banana"`) are dropped so they cannot silently replace
|
|
21
|
+
* (e.g. `clio-coder.exit: "banana"`) are dropped so they cannot silently replace
|
|
22
22
|
* the default binding; they still surface through `invalidBindings()` so
|
|
23
23
|
* `/settings` and the boot stderr notice can point at the offending entry.
|
|
24
24
|
*/
|
|
@@ -184,7 +184,7 @@ interface ValidationResult {
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
/**
|
|
187
|
-
* Normalize and validate the raw `settings.keybindings` block. Invalid
|
|
187
|
+
* Normalize and validate the raw `settings.interface.keybindings` block. Invalid
|
|
188
188
|
* entries are dropped from the returned `valid` config so pi-tui keeps
|
|
189
189
|
* the default binding in effect; callers render `invalid` as a diagnostic.
|
|
190
190
|
*/
|
|
@@ -472,14 +472,14 @@ function buildManager(
|
|
|
472
472
|
* Build a `ClioKeybindingManager` from the provided settings snapshot. The
|
|
473
473
|
* resulting manager is also installed as pi-tui's global so editor and
|
|
474
474
|
* select components pick up the same overrides. Callers are expected to
|
|
475
|
-
* recreate the manager if `settings.keybindings` is replaced wholesale;
|
|
475
|
+
* recreate the manager if `settings.interface.keybindings` is replaced wholesale;
|
|
476
476
|
* partial live updates should instead go through `manager` state.
|
|
477
477
|
*/
|
|
478
478
|
export function createKeybindingManager(
|
|
479
479
|
settings: Readonly<ClioSettings>,
|
|
480
480
|
env: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,
|
|
481
481
|
): ClioKeybindingManager {
|
|
482
|
-
const { valid, invalid } = validateKeybindings(settings.keybindings ?? {});
|
|
482
|
+
const { valid, invalid } = validateKeybindings(settings.interface.keybindings ?? {});
|
|
483
483
|
const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
|
|
484
484
|
setKeybindings(inner);
|
|
485
485
|
return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
|
|
@@ -29,7 +29,7 @@ const EMPTY_MESSAGE = "no approved lessons, task-bank entries, or memory steps c
|
|
|
29
29
|
* row of its own until it finishes, and an operator who cannot see it in flight
|
|
30
30
|
* reads an unchanged bank as an idle memory agent.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
function formatMemoryStatusLine(status: TaskMemoryOperatorStatus, contentWidth: number): string {
|
|
33
33
|
const theme = clioTheme();
|
|
34
34
|
const width = Math.max(1, Math.floor(contentWidth));
|
|
35
35
|
const units = [
|
|
@@ -145,7 +145,7 @@ function activityItems(events: ReadonlyArray<TaskMemoryActivityEvent>, group: st
|
|
|
145
145
|
* section titles and they are the only place a reader learns that a class is
|
|
146
146
|
* empty: a group with no rows renders no header at all.
|
|
147
147
|
*/
|
|
148
|
-
|
|
148
|
+
function buildMemoryOverlayItems(
|
|
149
149
|
status: TaskMemoryOperatorStatus,
|
|
150
150
|
records: ReadonlyArray<MemoryRecord>,
|
|
151
151
|
): ListOverlayItem[] {
|
|
@@ -358,6 +358,7 @@ export function openMemoryOverlay(
|
|
|
358
358
|
const handle = showClioOverlayFrame(tui, view, {
|
|
359
359
|
anchor: "center",
|
|
360
360
|
width: MEMORY_OVERLAY_WIDTH,
|
|
361
|
+
markerId: "memory",
|
|
361
362
|
title: () => "Memory",
|
|
362
363
|
footerHint: () => view.getHint(),
|
|
363
364
|
});
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The outward signal that a modal overlay owns the keyboard.
|
|
3
|
+
*
|
|
4
|
+
* Every framed Clio overlay captures input for as long as it is up, and until
|
|
5
|
+
* now it announced that only by being on screen. An external driver feeding
|
|
6
|
+
* keys into the pane, and herdr deciding whether the pane is idle, working, or
|
|
7
|
+
* blocked, had to infer modality from whatever the overlay happened to draw:
|
|
8
|
+
* its box title, its hint row, a footer pill. Those are per-overlay strings
|
|
9
|
+
* that move on every reskin, and the tall modals cover the very rows a screen
|
|
10
|
+
* scraper reads, so the signal is weakest exactly when a modal is largest.
|
|
11
|
+
*
|
|
12
|
+
* The marker publishes the fact out of band instead, as an OSC 0 terminal
|
|
13
|
+
* title. Three properties make the title the reliable channel here:
|
|
14
|
+
*
|
|
15
|
+
* 1. It is not screen content. No overlay can composite over it, no
|
|
16
|
+
* transcript line can counterfeit it, and no terminal height changes
|
|
17
|
+
* whether it is readable.
|
|
18
|
+
* 2. herdr already consumes it. `region = "osc_title"` is a first-class
|
|
19
|
+
* detection region (herdr `src/detect/manifest.rs`), fed from the pane's
|
|
20
|
+
* own emulator, and its rules outrank every screen rule.
|
|
21
|
+
* 3. Clio has never written a title, so the channel carries exactly one
|
|
22
|
+
* meaning and nothing else contends for it.
|
|
23
|
+
*
|
|
24
|
+
* The grammar is fixed and machine-first:
|
|
25
|
+
*
|
|
26
|
+
* clio no modal owns the keys
|
|
27
|
+
* clio [modal:permission-confirm] one modal, named
|
|
28
|
+
* clio [modal:library-install+2] top modal named, two more beneath it
|
|
29
|
+
*
|
|
30
|
+
* Nothing is written until the first modal opens, so a Clio that never opens
|
|
31
|
+
* an overlay leaves the pane's inherited title alone. From the first modal
|
|
32
|
+
* onward the title toggles between the marker and the bare base, which is what
|
|
33
|
+
* makes the absence of a marker a positive statement rather than an unknown.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/** The write side of a terminal title. `ProcessTerminal` satisfies it structurally. */
|
|
37
|
+
export interface ModalMarkerSink {
|
|
38
|
+
setTitle(title: string): void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** What the title reads when nothing modal owns the keyboard. */
|
|
42
|
+
export const MODAL_MARKER_BASE_TITLE = "clio";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The one regular expression an external reader needs. Exported so Clio's own
|
|
46
|
+
* contract test and herdr's manifest rule are written against the same shape
|
|
47
|
+
* rather than two hand-copied spellings of it.
|
|
48
|
+
*/
|
|
49
|
+
export const MODAL_MARKER_TITLE_PATTERN = /^clio \[modal:([a-z0-9][a-z0-9-]*)(?:\+([1-9]\d*))?\]$/u;
|
|
50
|
+
|
|
51
|
+
/** Render the title for a modal stack, outermost first. */
|
|
52
|
+
function formatModalMarkerTitle(stack: readonly string[]): string {
|
|
53
|
+
const top = stack.at(-1);
|
|
54
|
+
if (top === undefined) return MODAL_MARKER_BASE_TITLE;
|
|
55
|
+
const beneath = stack.length - 1;
|
|
56
|
+
return `${MODAL_MARKER_BASE_TITLE} [modal:${top}${beneath > 0 ? `+${beneath}` : ""}]`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** One modal's claim on the keyboard, released when the overlay goes away. */
|
|
60
|
+
export interface ModalMarkerHandle {
|
|
61
|
+
/** Drop this modal from the stack. Idempotent; a second call is inert. */
|
|
62
|
+
release(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Whether this modal currently owns keys. The engine's `setHidden` takes a
|
|
65
|
+
* visible overlay out of the focus order without destroying it, which is how
|
|
66
|
+
* a surface that shells out to a child process gets off the screen, so a
|
|
67
|
+
* hidden modal must stop claiming the keyboard without leaving the stack.
|
|
68
|
+
*/
|
|
69
|
+
setActive(active: boolean): void;
|
|
70
|
+
/** Bring this modal back to the top of the stack, as `handle.focus()` does on screen. */
|
|
71
|
+
raise(): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface ModalMarkerRegistry {
|
|
75
|
+
/**
|
|
76
|
+
* Push a modal. The sink is taken from the caller rather than installed at
|
|
77
|
+
* startup so the marker has no lifecycle of its own: it exists exactly when
|
|
78
|
+
* an overlay exists, and a stub terminal with no `setTitle` makes the whole
|
|
79
|
+
* mechanism inert instead of throwing.
|
|
80
|
+
*/
|
|
81
|
+
enter(id: string, sink?: ModalMarkerSink | null): ModalMarkerHandle;
|
|
82
|
+
/** The ids that currently own keys, outermost first. */
|
|
83
|
+
stack(): readonly string[];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface ModalMarkerEntry {
|
|
87
|
+
readonly id: string;
|
|
88
|
+
active: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function createModalMarkerRegistry(): ModalMarkerRegistry {
|
|
92
|
+
const entries: ModalMarkerEntry[] = [];
|
|
93
|
+
let sink: ModalMarkerSink | null = null;
|
|
94
|
+
let published: string | null = null;
|
|
95
|
+
|
|
96
|
+
function activeIds(): string[] {
|
|
97
|
+
return entries.filter((entry) => entry.active).map((entry) => entry.id);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function publish(): void {
|
|
101
|
+
if (sink === null) return;
|
|
102
|
+
const title = formatModalMarkerTitle(activeIds());
|
|
103
|
+
// Before the first marker there is no stale claim to clear, so the pane
|
|
104
|
+
// keeps whatever title the shell or the multiplexer gave it.
|
|
105
|
+
if (published === null && title === MODAL_MARKER_BASE_TITLE) return;
|
|
106
|
+
if (title === published) return;
|
|
107
|
+
published = title;
|
|
108
|
+
sink.setTitle(title);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function enter(id: string, nextSink?: ModalMarkerSink | null): ModalMarkerHandle {
|
|
112
|
+
if (nextSink) sink = nextSink;
|
|
113
|
+
const entry: ModalMarkerEntry = { id, active: true };
|
|
114
|
+
entries.push(entry);
|
|
115
|
+
publish();
|
|
116
|
+
let released = false;
|
|
117
|
+
return {
|
|
118
|
+
release(): void {
|
|
119
|
+
if (released) return;
|
|
120
|
+
released = true;
|
|
121
|
+
const index = entries.indexOf(entry);
|
|
122
|
+
if (index !== -1) entries.splice(index, 1);
|
|
123
|
+
publish();
|
|
124
|
+
},
|
|
125
|
+
setActive(active: boolean): void {
|
|
126
|
+
if (released || entry.active === active) return;
|
|
127
|
+
entry.active = active;
|
|
128
|
+
publish();
|
|
129
|
+
},
|
|
130
|
+
raise(): void {
|
|
131
|
+
if (released) return;
|
|
132
|
+
entry.active = true;
|
|
133
|
+
const index = entries.indexOf(entry);
|
|
134
|
+
if (index !== -1 && index !== entries.length - 1) {
|
|
135
|
+
entries.splice(index, 1);
|
|
136
|
+
entries.push(entry);
|
|
137
|
+
}
|
|
138
|
+
publish();
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return { enter, stack: (): readonly string[] => activeIds() };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const registry = createModalMarkerRegistry();
|
|
147
|
+
|
|
148
|
+
/** Push a modal onto the process-wide stack. See {@link ModalMarkerRegistry.enter}. */
|
|
149
|
+
export function enterModal(id: string, sink?: ModalMarkerSink | null): ModalMarkerHandle {
|
|
150
|
+
return registry.enter(id, sink);
|
|
151
|
+
}
|
|
@@ -96,7 +96,7 @@ function canonicalJson(value: unknown): string {
|
|
|
96
96
|
* anything else about the arguments does, which is the point: a call that
|
|
97
97
|
* differs from the previewed one cannot inherit its preview.
|
|
98
98
|
*/
|
|
99
|
-
|
|
99
|
+
function callArgumentsDigest(args: Record<string, unknown> | undefined): string {
|
|
100
100
|
return createHash("sha256")
|
|
101
101
|
.update(canonicalJson(args ?? {}), "utf8")
|
|
102
102
|
.digest("hex")
|