@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
|
@@ -18,7 +18,13 @@ import {
|
|
|
18
18
|
} from "../../engine/tui.js";
|
|
19
19
|
import type { AskUserAnswer, AskUserQuestion, AskUserResult } from "../../tools/ask-user.js";
|
|
20
20
|
import { ASK_USER_OTHER_LABEL, cancelledAskUserResult } from "../../tools/ask-user.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
buildHint,
|
|
23
|
+
DEFAULT_SELECT_THEME,
|
|
24
|
+
type HintEntry,
|
|
25
|
+
type OverlayEscVerb,
|
|
26
|
+
showClioOverlayFrame,
|
|
27
|
+
} from "../overlay-frame.js";
|
|
22
28
|
import { type ClioToken, clioTheme, dotSep, GLYPH, screenTitle } from "../theme/index.js";
|
|
23
29
|
import { nextContentScrollOffset, type ViewScrollAction } from "../view/view-overlay.js";
|
|
24
30
|
|
|
@@ -91,6 +97,8 @@ const MIN_VISIBLE_OPTIONS = 3;
|
|
|
91
97
|
/** Interview rows spent on chrome before an option row: strip, header, blanks, status, one question row. */
|
|
92
98
|
const INTERVIEW_CHROME_ROWS = 7;
|
|
93
99
|
const MAX_VISIBLE_OPTIONS = 12;
|
|
100
|
+
/** Below this the second column is too narrow to wrap a sentence into. */
|
|
101
|
+
const MIN_DESCRIPTION_COLUMN = 28;
|
|
94
102
|
const ELLIPSIS = "…";
|
|
95
103
|
|
|
96
104
|
/**
|
|
@@ -102,7 +110,7 @@ const ELLIPSIS = "…";
|
|
|
102
110
|
* should not take the screen. A round that follows an answered one has captured
|
|
103
111
|
* answers to keep on screen, which is the full surface's whole job.
|
|
104
112
|
*/
|
|
105
|
-
|
|
113
|
+
function askUserSurface(questions: ReadonlyArray<AskUserQuestion>, priorRounds = 0): AskUserSurface {
|
|
106
114
|
if (priorRounds > 0 || questions.length !== 1) return "interview";
|
|
107
115
|
const question = questions[0];
|
|
108
116
|
if (!question) return "interview";
|
|
@@ -237,6 +245,16 @@ function fitLine(text: string, width: number): string {
|
|
|
237
245
|
return truncateToWidth(text, safeWidth, ELLIPSIS, true);
|
|
238
246
|
}
|
|
239
247
|
|
|
248
|
+
/** Wrap a prose value inside the columns left by its one-time row label. */
|
|
249
|
+
function wrapLabeledValue(prefix: string, value: string, width: number): string[] {
|
|
250
|
+
const safeWidth = Math.max(1, width);
|
|
251
|
+
const prefixWidth = visibleWidth(prefix);
|
|
252
|
+
const valueWidth = Math.max(1, safeWidth - prefixWidth);
|
|
253
|
+
return wrapTextWithAnsi(value, valueWidth).map((line, index) =>
|
|
254
|
+
fitLine(`${index === 0 ? prefix : " ".repeat(prefixWidth)}${line}`, safeWidth),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
240
258
|
function compactTitle(question: AskUserQuestion): string {
|
|
241
259
|
return (question.header ?? question.question).replace(/\s+/g, " ").trim();
|
|
242
260
|
}
|
|
@@ -390,7 +408,8 @@ class AskUserOverlayView implements Component {
|
|
|
390
408
|
|
|
391
409
|
this.contentOverflows = false;
|
|
392
410
|
const controlLines = this.renderControlLines(safeWidth);
|
|
393
|
-
const statusLines =
|
|
411
|
+
const statusLines =
|
|
412
|
+
this.status.length > 0 ? ["", ...wrapTextWithAnsi(clioTheme().fg("dim", this.status), safeWidth)] : [];
|
|
394
413
|
const headerLine = this.renderQuestionHeader(question, safeWidth);
|
|
395
414
|
const headerLines = headerLine.length > 0 ? [headerLine] : [];
|
|
396
415
|
const bottom = [...statusLines, "", ...controlLines];
|
|
@@ -418,7 +437,7 @@ class AskUserOverlayView implements Component {
|
|
|
418
437
|
private renderInterview(question: AskUserQuestion, width: number, maxRows: number): string[] {
|
|
419
438
|
const theme = clioTheme();
|
|
420
439
|
const controlLines = this.renderControlLines(width);
|
|
421
|
-
const statusLines = this.status.length > 0 ? ["",
|
|
440
|
+
const statusLines = this.status.length > 0 ? ["", ...wrapTextWithAnsi(theme.fg("dim", this.status), width)] : [];
|
|
422
441
|
const headerLine = this.renderQuestionHeader(question, width);
|
|
423
442
|
const headerLines = headerLine.length > 0 ? [headerLine] : [];
|
|
424
443
|
const stripLines = [this.renderQuestionStrip(width), ""];
|
|
@@ -511,16 +530,24 @@ class AskUserOverlayView implements Component {
|
|
|
511
530
|
this.presentation.requiredActions.find((action) => action.id === "record-answer")?.label.toLowerCase() ??
|
|
512
531
|
"record answer";
|
|
513
532
|
if (state.mode === "text") {
|
|
533
|
+
// Esc means two different things depending on what is behind the field.
|
|
534
|
+
// A question with options has a list to fall back to, so the key goes
|
|
535
|
+
// back; a question without one has nothing behind it and the key still
|
|
536
|
+
// leaves the interview. The footer says which one this is.
|
|
537
|
+
const escapeVerb: OverlayEscVerb = questionHasOptions(question) ? "back" : "close";
|
|
514
538
|
return this.questions.length > 1
|
|
515
|
-
? this.withScrollHint(
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
539
|
+
? this.withScrollHint(
|
|
540
|
+
[
|
|
541
|
+
{ key: "Enter", verb: recordAnswer },
|
|
542
|
+
{ key: "Alt+Left/Right", verb: "question" },
|
|
543
|
+
],
|
|
544
|
+
escapeVerb,
|
|
545
|
+
)
|
|
546
|
+
: this.withScrollHint([{ key: "Enter", verb: recordAnswer }], escapeVerb);
|
|
520
547
|
}
|
|
521
548
|
// The classified action label distinguishes recording an answer from
|
|
522
|
-
// granting authority. Esc
|
|
523
|
-
//
|
|
549
|
+
// granting authority. Esc on the option list is the way out of the whole
|
|
550
|
+
// interview, which is the one place the product spells `close`.
|
|
524
551
|
// `t` is on every select footer because the operator cannot tell from a
|
|
525
552
|
// label whether the option needs a figure attached until they read it.
|
|
526
553
|
const addText: HintEntry = { key: "t", verb: "add text", short: "text" };
|
|
@@ -558,9 +585,9 @@ class AskUserOverlayView implements Component {
|
|
|
558
585
|
* scroll. A footer that always advertised PgUp would be advertising a key that
|
|
559
586
|
* does nothing on most rounds.
|
|
560
587
|
*/
|
|
561
|
-
private withScrollHint(entries: ReadonlyArray<HintEntry
|
|
562
|
-
if (this.surface !== "interview" || !this.contentOverflows) return buildHint(entries);
|
|
563
|
-
return buildHint([...entries, { key: "PgUp/PgDn", verb: "scroll" }]);
|
|
588
|
+
private withScrollHint(entries: ReadonlyArray<HintEntry>, esc: OverlayEscVerb = "close"): string {
|
|
589
|
+
if (this.surface !== "interview" || !this.contentOverflows) return buildHint(entries, esc);
|
|
590
|
+
return buildHint([...entries, { key: "PgUp/PgDn", verb: "scroll" }], esc);
|
|
564
591
|
}
|
|
565
592
|
|
|
566
593
|
private setSurface(next: AskUserSurface): void {
|
|
@@ -590,11 +617,14 @@ class AskUserOverlayView implements Component {
|
|
|
590
617
|
const lines = [
|
|
591
618
|
screenTitle(theme, "Interview"),
|
|
592
619
|
"",
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
620
|
+
...wrapTextWithAnsi(
|
|
621
|
+
theme.fg(
|
|
622
|
+
"muted",
|
|
623
|
+
this.history.length > 0
|
|
624
|
+
? "Answer sent. Waiting for Clio to prepare the next interview question."
|
|
625
|
+
: "Waiting for Clio to prepare the interview.",
|
|
626
|
+
),
|
|
627
|
+
width,
|
|
598
628
|
),
|
|
599
629
|
];
|
|
600
630
|
if (this.history.length > 0) {
|
|
@@ -602,7 +632,7 @@ class AskUserOverlayView implements Component {
|
|
|
602
632
|
for (let index = 0; index < this.history.length; index += 1) {
|
|
603
633
|
const answer = this.history[index];
|
|
604
634
|
if (!answer) continue;
|
|
605
|
-
lines.push(
|
|
635
|
+
lines.push(...wrapLabeledValue(`${theme.fg("dim", `${index + 1}.`)} `, theme.fg("muted", answer.answer), width));
|
|
606
636
|
}
|
|
607
637
|
}
|
|
608
638
|
return lines.map((line) => fitLine(line, width)).slice(0, maxRows);
|
|
@@ -751,7 +781,7 @@ class AskUserOverlayView implements Component {
|
|
|
751
781
|
for (let index = 0; index < this.history.length; index += 1) {
|
|
752
782
|
const answer = this.history[index];
|
|
753
783
|
if (!answer) continue;
|
|
754
|
-
rows.push(
|
|
784
|
+
rows.push(...wrapLabeledValue(`${theme.fg("dim", `${index + 1}.`)} `, theme.fg("muted", answer.answer), width));
|
|
755
785
|
}
|
|
756
786
|
// A round of one question needs no per-question roll: the strip already
|
|
757
787
|
// names the round and the question is on screen above this.
|
|
@@ -759,7 +789,7 @@ class AskUserOverlayView implements Component {
|
|
|
759
789
|
for (let index = 0; index < this.questions.length; index += 1) {
|
|
760
790
|
const answer = this.states[index]?.answer.trim();
|
|
761
791
|
const value = answer && answer.length > 0 ? theme.fg("muted", answer) : theme.fg("dim", "pending");
|
|
762
|
-
rows.push(
|
|
792
|
+
rows.push(...wrapLabeledValue(`${theme.fg("dim", `Q${index + 1}`)} `, value, width));
|
|
763
793
|
}
|
|
764
794
|
}
|
|
765
795
|
if (rows.length === 0) return [];
|
|
@@ -784,17 +814,29 @@ class AskUserOverlayView implements Component {
|
|
|
784
814
|
0,
|
|
785
815
|
items.findIndex((item) => item.value === selectedItem.value),
|
|
786
816
|
);
|
|
787
|
-
const
|
|
817
|
+
const primaryColumnWidth = this.primaryColumnWidth(items, width);
|
|
818
|
+
const acceptKey = question.multi_select === true ? "Space" : "Enter";
|
|
819
|
+
// The focused option's description wraps in full, so the rows it needs come
|
|
820
|
+
// out of the list rather than out of the sentence. Options the operator
|
|
821
|
+
// cannot currently read are what a windowed list is for, and one arrow key
|
|
822
|
+
// brings any of them back; a cut explanation has no such recovery.
|
|
823
|
+
const focusedRows = this.renderOptionRow(
|
|
824
|
+
items[selectedIndex] as SelectItem,
|
|
825
|
+
true,
|
|
826
|
+
width,
|
|
827
|
+
primaryColumnWidth,
|
|
828
|
+
acceptKey,
|
|
829
|
+
).length;
|
|
830
|
+
const budget = Math.max(1, this.maxVisibleOptions() - (focusedRows - 1));
|
|
831
|
+
const visibleCount = Math.min(budget, Math.max(1, items.length));
|
|
788
832
|
const start = Math.max(0, Math.min(selectedIndex - Math.floor(visibleCount / 2), items.length - visibleCount));
|
|
789
833
|
const end = Math.min(items.length, start + visibleCount);
|
|
790
|
-
const primaryColumnWidth = this.primaryColumnWidth(items, width);
|
|
791
834
|
const lines: string[] = [];
|
|
792
835
|
|
|
793
|
-
const acceptKey = question.multi_select === true ? "Space" : "Enter";
|
|
794
836
|
for (let index = start; index < end; index += 1) {
|
|
795
837
|
const item = items[index];
|
|
796
838
|
if (!item) continue;
|
|
797
|
-
lines.push(this.renderOptionRow(item, index === selectedIndex, width, primaryColumnWidth, acceptKey));
|
|
839
|
+
lines.push(...this.renderOptionRow(item, index === selectedIndex, width, primaryColumnWidth, acceptKey));
|
|
798
840
|
}
|
|
799
841
|
|
|
800
842
|
if (start > 0 || end < items.length) {
|
|
@@ -809,13 +851,22 @@ class AskUserOverlayView implements Component {
|
|
|
809
851
|
return Math.max(1, Math.min(bounded, Math.max(1, width - 4)));
|
|
810
852
|
}
|
|
811
853
|
|
|
854
|
+
/**
|
|
855
|
+
* One option, as the rows it needs.
|
|
856
|
+
*
|
|
857
|
+
* The focused option's description wraps under its own column and is never
|
|
858
|
+
* cut: a description is what the operator is choosing between, and half of
|
|
859
|
+
* one reads as the whole thing. An unfocused row stays a one-line table cell
|
|
860
|
+
* whose ellipsis says there is more, which the operator reads by moving to
|
|
861
|
+
* it.
|
|
862
|
+
*/
|
|
812
863
|
private renderOptionRow(
|
|
813
864
|
item: SelectItem,
|
|
814
865
|
selected: boolean,
|
|
815
866
|
width: number,
|
|
816
867
|
primaryColumnWidth: number,
|
|
817
868
|
acceptKey: string,
|
|
818
|
-
): string {
|
|
869
|
+
): string[] {
|
|
819
870
|
const theme = clioTheme();
|
|
820
871
|
const prefix = selected ? theme.fg("accent", `${GLYPH.cursor} `) : " ";
|
|
821
872
|
// The key that answers rides on the focused row. An operator whose eyes are
|
|
@@ -825,22 +876,40 @@ class AskUserOverlayView implements Component {
|
|
|
825
876
|
const available = Math.max(1, width - 2 - visibleWidth(affordance));
|
|
826
877
|
const description = item.description?.replace(/[\r\n]+/g, " ").trim();
|
|
827
878
|
|
|
828
|
-
|
|
829
|
-
if (description && width > 40) {
|
|
830
|
-
const labelWidth = Math.max(1, Math.min(primaryColumnWidth - 2, available - 4));
|
|
831
|
-
const label = truncateToWidth(item.label, labelWidth, ELLIPSIS, false);
|
|
832
|
-
const spacing = " ".repeat(Math.max(1, primaryColumnWidth - visibleWidth(label)));
|
|
833
|
-
const descriptionWidth = Math.max(1, available - visibleWidth(label) - visibleWidth(spacing));
|
|
834
|
-
const desc = truncateToWidth(description, descriptionWidth, ELLIPSIS, false);
|
|
835
|
-
body = selected
|
|
836
|
-
? theme.style("accent", `${label}${spacing}${desc}`, { bold: true })
|
|
837
|
-
: `${label}${theme.fg("muted", `${spacing}${desc}`)}`;
|
|
838
|
-
} else {
|
|
879
|
+
if (!description || width <= 40) {
|
|
839
880
|
const label = truncateToWidth(item.label, available, ELLIPSIS, false);
|
|
840
|
-
body = selected ? theme.style("accent", label, { bold: true }) : label;
|
|
881
|
+
const body = selected ? theme.style("accent", label, { bold: true }) : label;
|
|
882
|
+
return [fitLine(`${prefix}${body}${affordance}`, width)];
|
|
841
883
|
}
|
|
842
884
|
|
|
843
|
-
|
|
885
|
+
const labelWidth = Math.max(1, Math.min(primaryColumnWidth - 2, available - 4));
|
|
886
|
+
const label = truncateToWidth(item.label, labelWidth, ELLIPSIS, false);
|
|
887
|
+
const spacing = " ".repeat(Math.max(1, primaryColumnWidth - visibleWidth(label)));
|
|
888
|
+
const descriptionWidth = Math.max(1, available - visibleWidth(label) - visibleWidth(spacing));
|
|
889
|
+
if (!selected) {
|
|
890
|
+
const desc = truncateToWidth(description, descriptionWidth, ELLIPSIS, false);
|
|
891
|
+
return [fitLine(`${prefix}${label}${theme.fg("muted", `${spacing}${desc}`)}`, width)];
|
|
892
|
+
}
|
|
893
|
+
// A gutter this narrow wraps a sentence into slivers and breaks words, so
|
|
894
|
+
// below the floor the description drops to its own full-width lines under
|
|
895
|
+
// the label instead of squeezing into the second column.
|
|
896
|
+
if (descriptionWidth < MIN_DESCRIPTION_COLUMN) {
|
|
897
|
+
const indent = " ";
|
|
898
|
+
const body = theme.style("accent", label, { bold: true });
|
|
899
|
+
return [
|
|
900
|
+
fitLine(`${prefix}${body}${affordance}`, width),
|
|
901
|
+
...wrapTextWithAnsi(description, Math.max(1, width - indent.length)).map((line) =>
|
|
902
|
+
fitLine(`${indent}${theme.style("accent", line, { bold: true })}`, width),
|
|
903
|
+
),
|
|
904
|
+
];
|
|
905
|
+
}
|
|
906
|
+
const wrapped = wrapTextWithAnsi(description, descriptionWidth);
|
|
907
|
+
const head = wrapped[0] ?? "";
|
|
908
|
+
const indent = " ".repeat(visibleWidth(prefix) + visibleWidth(label) + visibleWidth(spacing));
|
|
909
|
+
return [
|
|
910
|
+
fitLine(`${prefix}${theme.style("accent", `${label}${spacing}${head}`, { bold: true })}${affordance}`, width),
|
|
911
|
+
...wrapped.slice(1).map((line) => fitLine(`${indent}${theme.style("accent", line, { bold: true })}`, width)),
|
|
912
|
+
];
|
|
844
913
|
}
|
|
845
914
|
|
|
846
915
|
private ensureControl(): void {
|
|
@@ -889,7 +958,7 @@ class AskUserOverlayView implements Component {
|
|
|
889
958
|
state.answer = questionHasOptions(question) ? answerText(question, state.selected, state.customAnswer) : answer;
|
|
890
959
|
this.finishIfCompleteOrAdvance();
|
|
891
960
|
};
|
|
892
|
-
activeInput.onEscape = () => this.
|
|
961
|
+
activeInput.onEscape = () => this.escapeFromTextInput(question, state);
|
|
893
962
|
this.input = activeInput;
|
|
894
963
|
this.list = null;
|
|
895
964
|
}
|
|
@@ -960,6 +1029,53 @@ class AskUserOverlayView implements Component {
|
|
|
960
1029
|
return 0;
|
|
961
1030
|
}
|
|
962
1031
|
|
|
1032
|
+
/**
|
|
1033
|
+
* Esc in the text field.
|
|
1034
|
+
*
|
|
1035
|
+
* The field used to resolve the whole round as cancelled, which made a typed
|
|
1036
|
+
* draft unrecoverable: a single-question round had no other question to answer
|
|
1037
|
+
* first, so the only way off `t` was to abandon the interview (issue #260). A
|
|
1038
|
+
* question with options has a surface behind the field, so Esc goes back to it
|
|
1039
|
+
* and drops the draft. A question with no options has nothing behind it, so Esc
|
|
1040
|
+
* keeps its old meaning and leaves the interview; the footer says which.
|
|
1041
|
+
*
|
|
1042
|
+
* The draft is dropped rather than parked because Esc is the discard gesture.
|
|
1043
|
+
* It never reached `answer`, `options`, or `value` in the first place, since
|
|
1044
|
+
* only a submit writes those, so #228's clearing rule holds either way.
|
|
1045
|
+
*/
|
|
1046
|
+
private escapeFromTextInput(question: AskUserQuestion, state: QuestionState): void {
|
|
1047
|
+
if (!questionHasOptions(question)) {
|
|
1048
|
+
this.cancel();
|
|
1049
|
+
return;
|
|
1050
|
+
}
|
|
1051
|
+
state.inputValue = "";
|
|
1052
|
+
state.mode = "select";
|
|
1053
|
+
this.status = "";
|
|
1054
|
+
this.rebuildSelectList(question, state);
|
|
1055
|
+
this.deps.requestRender();
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* Leave a question the operator is walking away from on its option list.
|
|
1060
|
+
*
|
|
1061
|
+
* The mode used to belong to the question for the rest of the round, so a
|
|
1062
|
+
* question opened with `t` came back as a prefilled field however the operator
|
|
1063
|
+
* returned to it, and the option list was gone for good. Navigating away is not
|
|
1064
|
+
* the discard gesture, so the draft stays in `inputValue` and `t` finds it
|
|
1065
|
+
* again; what does not survive is the field being the thing that greets them.
|
|
1066
|
+
*
|
|
1067
|
+
* A question whose value was actually submitted keeps its field, because
|
|
1068
|
+
* coming back to a recorded figure is how it gets revised (issue #228).
|
|
1069
|
+
*/
|
|
1070
|
+
private parkTextMode(): void {
|
|
1071
|
+
const question = this.currentQuestion();
|
|
1072
|
+
const state = this.currentState();
|
|
1073
|
+
if (!question || !state) return;
|
|
1074
|
+
if (state.mode !== "text" || !questionHasOptions(question)) return;
|
|
1075
|
+
if (state.rawValue.length > 0) return;
|
|
1076
|
+
state.mode = "select";
|
|
1077
|
+
}
|
|
1078
|
+
|
|
963
1079
|
private openTextInput(nextStatus: string): void {
|
|
964
1080
|
const state = this.currentState();
|
|
965
1081
|
const question = this.currentQuestion();
|
|
@@ -1077,6 +1193,7 @@ class AskUserOverlayView implements Component {
|
|
|
1077
1193
|
private goToRelativeQuestion(delta: -1 | 1): void {
|
|
1078
1194
|
if (this.questions.length <= 1) return;
|
|
1079
1195
|
this.syncActiveControl();
|
|
1196
|
+
this.parkTextMode();
|
|
1080
1197
|
this.index = (this.index + delta + this.questions.length) % this.questions.length;
|
|
1081
1198
|
this.status = "";
|
|
1082
1199
|
this.resetContentScroll();
|
|
@@ -1128,6 +1245,9 @@ export function openAskUserOverlay(tui: TUI, deps: OpenAskUserOverlayDeps): AskU
|
|
|
1128
1245
|
// the terminal has left after the margins.
|
|
1129
1246
|
...(geometry.maxInnerRows > 0 ? { maxHeight: geometry.maxInnerRows + ASK_USER_FRAME_ROWS } : {}),
|
|
1130
1247
|
margin: geometry.margin,
|
|
1248
|
+
// Not derived from the title: this modal swaps between a waiting title
|
|
1249
|
+
// and a classified decision title without ever changing hands.
|
|
1250
|
+
markerId: "ask-user",
|
|
1131
1251
|
title: () => (view.isDecisionPending() ? view.decisionTitle() : ASK_USER_WAITING_TITLE),
|
|
1132
1252
|
tone: () => (view.isDecisionPending() ? view.decisionTone() : undefined),
|
|
1133
1253
|
footerHint: () => view.footerHint(),
|
|
@@ -211,6 +211,7 @@ export function openAuthDialog(tui: TUI, title: string, onCancel: () => void): A
|
|
|
211
211
|
const handle = showClioOverlayFrame(tui, box, {
|
|
212
212
|
anchor: "center",
|
|
213
213
|
width: AUTH_DIALOG_WIDTH,
|
|
214
|
+
markerId: "auth",
|
|
214
215
|
title: "Authentication",
|
|
215
216
|
footerHint: getHint,
|
|
216
217
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type Component,
|
|
2
3
|
type OverlayHandle,
|
|
3
4
|
type SelectItem,
|
|
4
5
|
SelectList,
|
|
@@ -6,6 +7,7 @@ import {
|
|
|
6
7
|
type TUI,
|
|
7
8
|
truncateToWidth,
|
|
8
9
|
visibleWidth,
|
|
10
|
+
wrapTextWithAnsi,
|
|
9
11
|
} from "../../engine/tui.js";
|
|
10
12
|
import { buildHint, DEFAULT_SELECT_THEME, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
|
|
11
13
|
import type { ContextClearCommandOptions } from "../slash-commands.js";
|
|
@@ -29,7 +31,7 @@ export function contextResetOptions(choice: ContextResetMutationChoice): Context
|
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
/** Three intentional outcomes, ordered with the least destructive action first. */
|
|
32
|
-
|
|
34
|
+
function buildContextResetItems(): SelectItem[] {
|
|
33
35
|
return [
|
|
34
36
|
{
|
|
35
37
|
value: "preserve-clio-md",
|
|
@@ -67,6 +69,10 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
|
|
|
67
69
|
truncatePrimary: ({ text, maxWidth, item, isSelected }) => {
|
|
68
70
|
const label = singleLine(text);
|
|
69
71
|
const description = descriptions.get(item.value) ?? "";
|
|
72
|
+
// The focused description is rendered in full below the list. Keeping
|
|
73
|
+
// only its label here prevents the same explanation appearing once cut
|
|
74
|
+
// and once wrapped on the same decision surface.
|
|
75
|
+
if (isSelected) return truncateToWidth(label, maxWidth, ELLIPSIS, true);
|
|
70
76
|
if (description.length === 0 || maxWidth < 44) {
|
|
71
77
|
return truncateToWidth(label, maxWidth, ELLIPSIS, true);
|
|
72
78
|
}
|
|
@@ -76,13 +82,31 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
|
|
|
76
82
|
const spacing = " ".repeat(Math.max(1, labelWidth + 2 - visibleWidth(fittedLabel)));
|
|
77
83
|
const descriptionWidth = Math.max(1, maxWidth - visibleWidth(fittedLabel) - visibleWidth(spacing));
|
|
78
84
|
const fittedDescription = truncateToWidth(description, descriptionWidth, ELLIPSIS, true);
|
|
79
|
-
|
|
80
|
-
return isSelected ? body : `${fittedLabel}${clioTheme().fg("muted", `${spacing}${fittedDescription}`)}`;
|
|
85
|
+
return `${fittedLabel}${clioTheme().fg("muted", `${spacing}${fittedDescription}`)}`;
|
|
81
86
|
},
|
|
82
87
|
},
|
|
83
88
|
};
|
|
84
89
|
}
|
|
85
90
|
|
|
91
|
+
function describedSelect(list: SelectList, choices: ReadonlyArray<SelectItem>): Component {
|
|
92
|
+
return {
|
|
93
|
+
render(width: number): string[] {
|
|
94
|
+
const rows = list.render(width);
|
|
95
|
+
const selected = list.getSelectedItem();
|
|
96
|
+
const description = choices.find((choice) => choice.value === selected?.value)?.description;
|
|
97
|
+
if (!description) return rows;
|
|
98
|
+
const indent = " ";
|
|
99
|
+
const wrapped = wrapTextWithAnsi(
|
|
100
|
+
clioTheme().fg("muted", singleLine(description)),
|
|
101
|
+
Math.max(1, width - visibleWidth(indent)),
|
|
102
|
+
).map((line) => `${indent}${line}`);
|
|
103
|
+
return [...rows, ...wrapped];
|
|
104
|
+
},
|
|
105
|
+
handleInput: (data: string) => list.handleInput(data),
|
|
106
|
+
invalidate: () => list.invalidate(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
86
110
|
/** Open the `/context reset` choice dialog. Cancel paths never reach onReset. */
|
|
87
111
|
export function openContextResetOverlay(tui: TUI, deps: OpenContextResetOverlayDeps): OverlayHandle {
|
|
88
112
|
const choices = buildContextResetItems();
|
|
@@ -99,9 +123,10 @@ export function openContextResetOverlay(tui: TUI, deps: OpenContextResetOverlayD
|
|
|
99
123
|
deps.onCancel();
|
|
100
124
|
};
|
|
101
125
|
|
|
102
|
-
return showClioOverlayFrame(tui, new FocusBox(list), {
|
|
126
|
+
return showClioOverlayFrame(tui, new FocusBox(describedSelect(list, choices)), {
|
|
103
127
|
anchor: "center",
|
|
104
128
|
width: CONTEXT_RESET_OVERLAY_WIDTH,
|
|
129
|
+
markerId: "context-reset",
|
|
105
130
|
title: "Reset Project Context",
|
|
106
131
|
footerHint: buildHint([{ key: "Enter", verb: "select" }]),
|
|
107
132
|
});
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
+
type Component,
|
|
14
15
|
type OverlayHandle,
|
|
15
16
|
type SelectItem,
|
|
16
17
|
SelectList,
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
type TUI,
|
|
19
20
|
truncateToWidth,
|
|
20
21
|
visibleWidth,
|
|
22
|
+
wrapTextWithAnsi,
|
|
21
23
|
} from "../../engine/tui.js";
|
|
22
24
|
import { buildHint, DEFAULT_SELECT_THEME, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
|
|
23
25
|
import { clioTheme } from "../theme/index.js";
|
|
@@ -69,6 +71,10 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
|
|
|
69
71
|
truncatePrimary: ({ text, maxWidth, item, isSelected }) => {
|
|
70
72
|
const label = singleLine(text);
|
|
71
73
|
const description = descriptions.get(item.value) ?? "";
|
|
74
|
+
// The selected explanation is the recovery decision the operator is
|
|
75
|
+
// reading, so it renders in full beneath the list instead of appearing
|
|
76
|
+
// here as an ellipsized fragment.
|
|
77
|
+
if (isSelected) return truncateToWidth(label, maxWidth, ELLIPSIS, true);
|
|
72
78
|
if (description.length === 0 || maxWidth < 32) {
|
|
73
79
|
return truncateToWidth(label, maxWidth, ELLIPSIS, true);
|
|
74
80
|
}
|
|
@@ -80,18 +86,36 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
|
|
|
80
86
|
const spacing = " ".repeat(Math.max(1, labelWidth + 2 - visibleWidth(fittedLabel)));
|
|
81
87
|
const descWidth = Math.max(1, maxWidth - visibleWidth(fittedLabel) - visibleWidth(spacing));
|
|
82
88
|
const fittedDescription = truncateToWidth(description, descWidth, ELLIPSIS, true);
|
|
83
|
-
|
|
84
|
-
return isSelected ? body : `${fittedLabel}${theme.fg("muted", `${spacing}${fittedDescription}`)}`;
|
|
89
|
+
return `${fittedLabel}${theme.fg("muted", `${spacing}${fittedDescription}`)}`;
|
|
85
90
|
},
|
|
86
91
|
},
|
|
87
92
|
};
|
|
88
93
|
}
|
|
89
94
|
|
|
95
|
+
function describedSelect(list: SelectList, choices: ReadonlyArray<SelectItem>): Component {
|
|
96
|
+
return {
|
|
97
|
+
render(width: number): string[] {
|
|
98
|
+
const rows = list.render(width);
|
|
99
|
+
const selected = list.getSelectedItem();
|
|
100
|
+
const description = choices.find((choice) => choice.value === selected?.value)?.description;
|
|
101
|
+
if (!description) return rows;
|
|
102
|
+
const indent = " ";
|
|
103
|
+
const wrapped = wrapTextWithAnsi(
|
|
104
|
+
clioTheme().fg("muted", singleLine(description)),
|
|
105
|
+
Math.max(1, width - visibleWidth(indent)),
|
|
106
|
+
).map((line) => `${indent}${line}`);
|
|
107
|
+
return [...rows, ...wrapped];
|
|
108
|
+
},
|
|
109
|
+
handleInput: (data: string) => list.handleInput(data),
|
|
110
|
+
invalidate: () => list.invalidate(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
90
114
|
/**
|
|
91
115
|
* Pure builder. Exposed so tests can assert row shape without booting the TUI.
|
|
92
116
|
* Two rows: Continue (uses process cwd) and Cancel (returns to picker).
|
|
93
117
|
*/
|
|
94
|
-
|
|
118
|
+
function buildCwdFallbackItems(args: {
|
|
95
119
|
currentCwd: string;
|
|
96
120
|
sessionCwd: string;
|
|
97
121
|
reason: CwdFallbackReason;
|
|
@@ -131,10 +155,11 @@ export function openCwdFallbackOverlay(tui: TUI, deps: OpenCwdFallbackOverlayDep
|
|
|
131
155
|
deps.onCancel();
|
|
132
156
|
deps.onClose();
|
|
133
157
|
};
|
|
134
|
-
const box = new FocusBox(list);
|
|
158
|
+
const box = new FocusBox(describedSelect(list, items));
|
|
135
159
|
return showClioOverlayFrame(tui, box, {
|
|
136
160
|
anchor: "center",
|
|
137
161
|
width: CWD_FALLBACK_OVERLAY_WIDTH,
|
|
162
|
+
markerId: "cwd-fallback",
|
|
138
163
|
title: "Session Working Directory",
|
|
139
164
|
footerHint: buildHint([{ key: "Enter", verb: "select" }]),
|
|
140
165
|
});
|
|
@@ -94,27 +94,26 @@ function decisionLines(decision: DecisionRecord, selected: boolean, expanded: bo
|
|
|
94
94
|
const label = decision.status === "superseded" ? theme.fg("dim", labelText) : theme.fg("muted", labelText);
|
|
95
95
|
const value = decision.status === "superseded" ? theme.fg("dim", decision.value) : decision.value;
|
|
96
96
|
const lines = [fitLine(`${cursor} ${status} ${label}${theme.fg("dim", ":")} ${value}`, width)];
|
|
97
|
+
// The indent belongs to the container, so this text wraps inside what is left
|
|
98
|
+
// of the row. Wrapping to the full width and then indenting cost every line
|
|
99
|
+
// its last six columns to a cut that landed mid-sentence.
|
|
100
|
+
const indent = " ";
|
|
101
|
+
const indented = Math.max(1, width - indent.length);
|
|
102
|
+
const wrapIndented = (text: string): string[] =>
|
|
103
|
+
wrapTextWithAnsi(text, indented).map((line) => fitLine(`${indent}${line}`, width));
|
|
97
104
|
if (decision.status === "superseded" && decision.correction) {
|
|
98
|
-
lines.push(
|
|
105
|
+
lines.push(...wrapIndented(`${theme.fg("dim", "correction")} ${theme.fg("muted", decision.correction)}`));
|
|
99
106
|
}
|
|
100
107
|
if (selected && expanded) {
|
|
101
108
|
if (decision.source_question) {
|
|
102
|
-
lines.push(
|
|
103
|
-
...wrapTextWithAnsi(`${theme.fg("dim", "question")} ${theme.fg("muted", decision.source_question)}`, width).map(
|
|
104
|
-
(line) => fitLine(` ${line}`, width),
|
|
105
|
-
),
|
|
106
|
-
);
|
|
109
|
+
lines.push(...wrapIndented(`${theme.fg("dim", "question")} ${theme.fg("muted", decision.source_question)}`));
|
|
107
110
|
}
|
|
108
|
-
lines.push(
|
|
109
|
-
...wrapTextWithAnsi(`${theme.fg("dim", "answer")} ${theme.fg("muted", decision.value)}`, width).map((line) =>
|
|
110
|
-
fitLine(` ${line}`, width),
|
|
111
|
-
),
|
|
112
|
-
);
|
|
111
|
+
lines.push(...wrapIndented(`${theme.fg("dim", "answer")} ${theme.fg("muted", decision.value)}`));
|
|
113
112
|
}
|
|
114
113
|
return lines;
|
|
115
114
|
}
|
|
116
115
|
|
|
117
|
-
|
|
116
|
+
function formatDecisionsOverlayBodyLines(
|
|
118
117
|
interviews: ReadonlyArray<DecisionLedgerEntry>,
|
|
119
118
|
selectedIndex = 0,
|
|
120
119
|
expandedKey: string | null = null,
|
|
@@ -184,7 +183,9 @@ class DecisionsOverlayBody implements Component {
|
|
|
184
183
|
),
|
|
185
184
|
);
|
|
186
185
|
}
|
|
187
|
-
if (this.status)
|
|
186
|
+
if (this.status) {
|
|
187
|
+
body.push("", ...wrapTextWithAnsi(clioTheme().fg("warning", this.status), Math.max(1, width)));
|
|
188
|
+
}
|
|
188
189
|
return body;
|
|
189
190
|
}
|
|
190
191
|
|
|
@@ -296,6 +297,7 @@ export function openDecisionsOverlay(
|
|
|
296
297
|
return showClioOverlayFrame(tui, body, {
|
|
297
298
|
anchor: "center",
|
|
298
299
|
width: DECISIONS_OVERLAY_WIDTH,
|
|
300
|
+
markerId: "decisions",
|
|
299
301
|
title: () => "Decisions",
|
|
300
302
|
footerHint: () => body.footerHint(),
|
|
301
303
|
});
|
|
@@ -51,14 +51,14 @@ export interface OpenFleetRunApprovalOverlayOptions {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/** The declared boundary as one phrase: an empty allowlist is a claim, not an absence. */
|
|
54
|
-
|
|
54
|
+
function formatWriteBoundary(writes: ReadonlyArray<string> | undefined): string {
|
|
55
55
|
if (writes === undefined) return "writes unenforced";
|
|
56
56
|
if (writes.length === 0) return "writes nothing";
|
|
57
57
|
return `writes ${writes.join(", ")}`;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/** One step as its facts: kind, who runs it, where, its scope, and its boundary. */
|
|
61
|
-
|
|
61
|
+
function formatFleetRunPreviewStep(step: FleetRunPreviewStep): string {
|
|
62
62
|
const loop = step.loop === undefined ? "" : ` (${step.loop.loopId} ${step.loop.role} ${step.loop.attempt})`;
|
|
63
63
|
if (step.kind === "code") {
|
|
64
64
|
const gate = step.gate === undefined ? "" : ` · gate path ${step.gate.path}`;
|
|
@@ -95,7 +95,7 @@ function formatBudgetLine(preview: FleetRunPreview): string {
|
|
|
95
95
|
* Render the body. Waves in order, each step with its facts, then the argv a
|
|
96
96
|
* code step will actually run, and last the budget the run is admitted under.
|
|
97
97
|
*/
|
|
98
|
-
|
|
98
|
+
function formatFleetRunApprovalBody(subject: FleetRunApprovalSubject, width: number, scroll: number): string[] {
|
|
99
99
|
const theme = clioTheme();
|
|
100
100
|
const contentWidth = Math.max(1, Math.floor(width));
|
|
101
101
|
const rows: string[] = [];
|
|
@@ -191,6 +191,7 @@ export function openFleetRunApprovalOverlay(tui: TUI, options: OpenFleetRunAppro
|
|
|
191
191
|
const handle = showClioOverlayFrame(tui, focus, {
|
|
192
192
|
anchor: "center",
|
|
193
193
|
width: fleetRunApprovalOverlayWidth(options.columns),
|
|
194
|
+
markerId: "fleet-run-approval",
|
|
194
195
|
title: FLEET_RUN_APPROVAL_OVERLAY_TITLE,
|
|
195
196
|
footerHint: buildResponsiveHint(
|
|
196
197
|
[...(acceptable ? [{ key: "Enter", verb: "dispatch" }] : []), { key: "↑↓", verb: "scroll" }],
|
|
@@ -27,7 +27,7 @@ const HANDOFF_REVIEW_MAX_WIDTH = 100;
|
|
|
27
27
|
/** Rows of document shown at once. Anything longer scrolls. */
|
|
28
28
|
export const HANDOFF_REVIEW_VISIBLE_ROWS = 20;
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
function handoffReviewOverlayWidth(columns: number): number {
|
|
31
31
|
return Math.max(HANDOFF_REVIEW_MIN_WIDTH, Math.min(HANDOFF_REVIEW_MAX_WIDTH, columns - 4));
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -57,7 +57,7 @@ export interface HandoffReviewOverlaySession extends OverlayHandle {
|
|
|
57
57
|
* Render the body. Pure so the layout is testable without a TUI: the goal, a
|
|
58
58
|
* rule, then the scrolled document window.
|
|
59
59
|
*/
|
|
60
|
-
|
|
60
|
+
function formatHandoffReviewBody(goal: string, document: string, width: number, scroll: number): string[] {
|
|
61
61
|
const theme = clioTheme();
|
|
62
62
|
const contentWidth = Math.max(1, Math.floor(width));
|
|
63
63
|
const lines: string[] = [];
|
|
@@ -163,6 +163,7 @@ export function openHandoffReviewOverlay(
|
|
|
163
163
|
const handle = showClioOverlayFrame(tui, focus, {
|
|
164
164
|
anchor: "center",
|
|
165
165
|
width: handoffReviewOverlayWidth(options.columns),
|
|
166
|
+
markerId: "handoff-review",
|
|
166
167
|
title: HANDOFF_REVIEW_OVERLAY_TITLE,
|
|
167
168
|
footerHint: buildResponsiveHint(
|
|
168
169
|
[
|
|
@@ -94,6 +94,7 @@ export function openHelpOverlay(
|
|
|
94
94
|
detail: () => [
|
|
95
95
|
"# Fleet runs & steering",
|
|
96
96
|
"**Fleet Runs board**: open it with the configured Dispatch Board key (Alt+W by default). Use Up/Down or `j`/`k` to select a live or recent run.",
|
|
97
|
+
"**Enter**: on a live run in a `--with-panes` session, Enter opens (or retargets) the watch pane beside Clio, rendering that run's stream; the arrow keys then move it between runs. On a finished run, or without panes, Enter toggles the inline worker-progress detail instead.",
|
|
97
98
|
"**Steer**: press `s` on a live native run to close the board and prefill `@<runId> `. Add guidance and submit it normally. The first notice means queued; a received notice confirms worker delivery.",
|
|
98
99
|
"**Cancel**: press `x` on a running, stale, queued, or retry-waiting run. The row changes to cancelling while the worker or retry is being stopped.",
|
|
99
100
|
"**Capabilities**: ACP delegation runs cannot accept live steering. The board footer only advertises actions supported by the selected row.",
|
|
@@ -140,6 +141,7 @@ export function openHelpOverlay(
|
|
|
140
141
|
const items = [...commands, ...keys, ...topics];
|
|
141
142
|
|
|
142
143
|
return openListOverlay(tui, {
|
|
144
|
+
markerId: "help",
|
|
143
145
|
title: "Help Center",
|
|
144
146
|
items,
|
|
145
147
|
filterable: true,
|