@iowarp/clio-coder 0.4.2 → 0.4.4
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 +98 -0
- package/CONTRIBUTING.md +86 -19
- package/README.md +35 -6
- package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
- package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
- package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
- package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
- package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
- package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
- package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
- package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
- package/dist/chunk-2DSOYNFC.js +108 -0
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
- package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
- package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
- package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
- package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
- package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
- package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
- package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
- package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
- package/dist/chunk-57XXR6DR.js +3763 -0
- package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
- package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
- package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
- package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
- package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
- package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
- package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
- package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
- package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
- package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
- package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
- package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
- package/dist/chunk-DQOVN6KV.js +386 -0
- package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
- package/dist/chunk-DXKJURES.js +671 -0
- package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
- package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
- package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
- package/dist/chunk-EXLD33WO.js +381 -0
- package/dist/chunk-FEAXX7B6.js +101 -0
- package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
- package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
- package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
- package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
- package/dist/chunk-GX5WYQO4.js +59 -0
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/chunk-I2DWJ4GM.js +390 -0
- package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
- package/dist/chunk-IRXAATOX.js +539 -0
- package/dist/chunk-IXIY2H4R.js +44 -0
- package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
- package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
- package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
- package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
- package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
- package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
- package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
- package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
- package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
- package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
- package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
- package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
- package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
- package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
- package/dist/chunk-ODGTEFFI.js +50 -0
- package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
- package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
- package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
- package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
- package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
- package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
- package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
- package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
- package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
- package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
- package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
- package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
- package/dist/chunk-V76WTFTW.js +318 -0
- package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
- package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
- package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
- package/dist/chunk-XXYSBZIQ.js +283 -0
- package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
- package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
- package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
- package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
- package/dist/cli/index.js +42 -40
- package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
- package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
- package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
- package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
- package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
- package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
- package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
- package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
- package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
- package/dist/detail-A7JAVSIG.js +98 -0
- package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
- package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
- package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
- package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
- package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
- package/dist/evidence-4F5USFKH.js +208 -0
- package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
- package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
- package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
- package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
- package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
- package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
- package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
- package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
- package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
- package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
- package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
- package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
- package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
- package/dist/inventory-C26CFDRR.js +101 -0
- package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
- package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
- package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
- package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
- package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
- package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
- package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
- package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
- package/dist/reset-TNWTB5LU.js +343 -0
- package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
- package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
- package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
- package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
- package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
- package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
- package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
- package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
- package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
- package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
- package/dist/tasks-IPAGMEIX.js +36 -0
- package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
- package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
- package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
- package/dist/uninstall-HALS6BLF.js +407 -0
- package/dist/upgrade-MS72RJEP.js +306 -0
- package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
- package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
- package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
- package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
- package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
- package/dist/worker/entry.js +72 -68
- package/docs/README.md +3 -2
- package/docs/architecture/acp.md +17 -0
- package/docs/architecture/artifact-placement.md +1 -0
- package/docs/architecture/artifact-versions.md +2 -2
- package/docs/architecture/context-engine.md +4 -0
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +1 -1
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -10
- package/docs/architecture/observability.md +19 -2
- package/docs/architecture/prompt-envelope-and-tools.md +17 -5
- package/docs/architecture/provider-adapter-cookbook.md +63 -0
- package/docs/architecture/safety-model.md +25 -22
- package/docs/architecture/tui-design.md +1 -1
- package/docs/guide/built-in-agents.md +25 -11
- package/docs/guide/commands-and-modes.md +18 -3
- package/docs/guide/configuration-and-targets.md +100 -10
- package/docs/guide/configuration-reference.md +17 -7
- package/docs/guide/environment-variables.md +4 -2
- package/docs/guide/installation-and-lifecycle.md +37 -4
- package/docs/guide/proactive-memory.md +66 -55
- package/docs/guide/skills-marketplace.md +18 -0
- package/docs/guide/tool-usage.md +78 -3
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +40 -2
- package/docs/process/eval-runner.md +67 -3
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +2 -2
- package/skills/README.md +7 -5
- package/skills/coding/ast-grep/SKILL.md +101 -30
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +47 -2
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +87 -28
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +80 -53
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +43 -2
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +45 -15
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +77 -63
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +87 -64
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +61 -12
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +130 -14
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -6
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +57 -2
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +53 -2
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +58 -50
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +76 -18
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +20 -1
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -1
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +26 -1
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +63 -28
- package/skills/workflow/cut-it/SKILL.md +64 -5
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +112 -27
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +85 -10
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +76 -17
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +0 -8
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1084 -529
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +3 -0
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +7 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +3 -0
- package/src/cli/tasks.ts +84 -0
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +210 -150
- package/src/cli/usage.ts +92 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +1 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +56 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/run-overrides.ts +0 -5
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +92 -2
- package/src/core/tool-names.ts +5 -2
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +1 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/context/extension.ts +31 -7
- package/src/domains/context/refresh.ts +3 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +6 -0
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/wiki/prompts.ts +43 -0
- package/src/domains/dispatch/active-route-planner.ts +4 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +1 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +42 -8
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +184 -56
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +5 -3
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +20 -2
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +17 -11
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/build.ts +102 -15
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/index.ts +4 -0
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +0 -1
- package/src/domains/middleware/marketplace-offer.ts +22 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +52 -7
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +15 -6
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +394 -45
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/fragments/operating/contract.md +2 -0
- package/src/domains/prompts/fragments/wiki/page.md +8 -0
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +3 -4
- package/src/domains/providers/model-runtime-capabilities.ts +15 -5
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +7 -0
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/action-classifier.ts +7 -0
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/default-path-policy.ts +2 -0
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +21 -1
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +60 -17
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/decision-board.ts +101 -2
- package/src/domains/session/entries.ts +50 -7
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/task-board.ts +14 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +24 -6
- package/src/engine/acp/server.ts +21 -4
- package/src/engine/acp/transport.ts +53 -8
- package/src/engine/acp/types.ts +4 -0
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +117 -14
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/external-subprocess.ts +122 -6
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/orchestrator.ts +416 -218
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/chat-loop-messages.ts +13 -4
- package/src/interactive/chat-loop.ts +65 -2
- package/src/interactive/chat-renderer.ts +1 -0
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +46 -717
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +3 -2
- package/src/interactive/interactive-presentation.ts +55 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +2 -2
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +49 -45
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +9 -5
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +13 -4
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +31 -0
- package/src/tools/compete-worktrees.ts +7 -1
- package/src/tools/context/index.ts +30 -9
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +21 -0
- package/src/tools/dispatch-arguments.ts +1 -0
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +6 -2
- package/src/tools/dispatch-runner.ts +27 -1
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/limitation.ts +76 -0
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/registry.ts +11 -5
- package/src/tools/result-shaping.ts +17 -5
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +10 -1
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +298 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/chunk-2Z2IKEXI.js +0 -1554
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-VN3SHNBN.js +0 -313
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/reset-OAQP3W4O.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-PXK3S2YM.js +0 -325
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
} from "../domains/dispatch/execution-role.js";
|
|
39
39
|
import { compileFleetExecutionPlan } from "../domains/dispatch/fleet-plan.js";
|
|
40
40
|
import { preflightWriteBoundaries } from "../domains/dispatch/write-boundary-enforcer.js";
|
|
41
|
+
import { formatUsd } from "./footer/widgets.js";
|
|
41
42
|
|
|
42
43
|
/** Where a step would run, as the dispatch domain resolves it today. */
|
|
43
44
|
export interface FleetRunPreviewRoute {
|
|
@@ -263,7 +264,7 @@ export function compileFleetRunPreview(input: FleetRunPreviewInput): FleetRunPre
|
|
|
263
264
|
};
|
|
264
265
|
if (input.budget) {
|
|
265
266
|
if (input.budget.verdict === "over" || input.budget.verdict === "at") {
|
|
266
|
-
diagnostics.push(`budget ceiling crossed:
|
|
267
|
+
diagnostics.push(`budget ceiling crossed: ${formatUsd(budget.currentUsd)} / ${formatUsd(budget.ceilingUsd)}`);
|
|
267
268
|
} else if (contract.budgetUsd !== null) {
|
|
268
269
|
const remaining = budget.ceilingUsd - budget.currentUsd;
|
|
269
270
|
if (contract.budgetUsd > remaining) {
|
|
@@ -228,8 +228,8 @@ export interface InteractiveDeps {
|
|
|
228
228
|
onNewSession?: () => void;
|
|
229
229
|
/**
|
|
230
230
|
* Fork from a parent assistant turn picked in /fork. Default wiring
|
|
231
|
-
* delegates to session.fork(parentTurnId); the override exists so
|
|
232
|
-
*
|
|
231
|
+
* delegates to session.fork(parentTurnId); the override exists so a
|
|
232
|
+
* host can layer telemetry or settings merging on top.
|
|
233
233
|
*/
|
|
234
234
|
onForkSession?: (parentTurnId: string) => void;
|
|
235
235
|
/**
|
|
@@ -583,6 +583,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
583
583
|
: {}),
|
|
584
584
|
...(deps.getSettings ? { getSettings: deps.getSettings } : {}),
|
|
585
585
|
...(deps.resources ? { resources: deps.resources } : {}),
|
|
586
|
+
...(deps.agents ? { agents: deps.agents } : {}),
|
|
586
587
|
...(deps.session ? { session: deps.session } : {}),
|
|
587
588
|
...(deps.getSessionId ? { getSessionId: deps.getSessionId } : {}),
|
|
588
589
|
...(deps.getTaskBoard ? { getTaskBoard: deps.getTaskBoard } : {}),
|
|
@@ -2,6 +2,8 @@ import { performance } from "node:perf_hooks";
|
|
|
2
2
|
import type { ClioSettings } from "../core/config.js";
|
|
3
3
|
import { DEFAULT_SETTINGS } from "../core/defaults.js";
|
|
4
4
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
5
|
+
import type { AgentsContract } from "../domains/agents/contract.js";
|
|
6
|
+
import { isUserVisibleAgent } from "../domains/agents/spec.js";
|
|
5
7
|
import type { ContextState } from "../domains/context/index.js";
|
|
6
8
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
7
9
|
import type { TaskMemoryOperatorStatus } from "../domains/memory/index.js";
|
|
@@ -12,7 +14,6 @@ import type {
|
|
|
12
14
|
} from "../domains/observability/index.js";
|
|
13
15
|
import { type ProvidersContract, resolveModelRuntimeCapabilitiesForProviders } from "../domains/providers/index.js";
|
|
14
16
|
import type { ResourcesContract } from "../domains/resources/index.js";
|
|
15
|
-
import { getMarketplaceSkills } from "../domains/resources/skills/marketplace.js";
|
|
16
17
|
import { ceilChars, contentChars } from "../domains/session/context-accounting.js";
|
|
17
18
|
import type { SessionContract, TaskBoardSnapshot } from "../domains/session/index.js";
|
|
18
19
|
import type { Component, TUI } from "../engine/tui.js";
|
|
@@ -88,6 +89,7 @@ export interface InteractivePresentationDeps {
|
|
|
88
89
|
bootPending?: Component;
|
|
89
90
|
getSettings?: () => Readonly<ClioSettings>;
|
|
90
91
|
resources?: Pick<ResourcesContract, "skills">;
|
|
92
|
+
agents?: Pick<AgentsContract, "listSpecs">;
|
|
91
93
|
session?: Pick<SessionContract, "current">;
|
|
92
94
|
getSessionId?: () => string | null;
|
|
93
95
|
getTaskBoard?: () => TaskBoardSnapshot | null;
|
|
@@ -248,13 +250,11 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
|
|
|
248
250
|
bus: deps.bus,
|
|
249
251
|
...(deps.getSettings ? { getSettings: deps.getSettings } : {}),
|
|
250
252
|
});
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
(runId) => readWorkerReceiptFacts(runId),
|
|
257
|
-
);
|
|
253
|
+
const unbindRunReaders = deps.observability.bindRunReaders({
|
|
254
|
+
dispatchSnapshot: () => deps.dispatch.snapshot(),
|
|
255
|
+
readReceipt: (runId) => readWorkerReceiptFacts(runId),
|
|
256
|
+
});
|
|
257
|
+
const dispatchBoardStore = factories.createDispatchBoardStore(deps.observability);
|
|
258
258
|
const contextActivityStore = factories.createContextActivityStore(deps.bus);
|
|
259
259
|
|
|
260
260
|
const footerToolCounts = new Map<string, number>();
|
|
@@ -434,10 +434,52 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
|
|
|
434
434
|
const editor = deps.editor ?? factories.createEditor(deps.tui, editorChrome);
|
|
435
435
|
editor.focused = true;
|
|
436
436
|
const autocomplete: AutocompleteProvider = factories.createAutocomplete({
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
437
|
+
completionSources: {
|
|
438
|
+
agents: async () =>
|
|
439
|
+
(deps.agents?.listSpecs() ?? []).filter(isUserVisibleAgent).map((agent) => ({
|
|
440
|
+
id: agent.id,
|
|
441
|
+
value: agent.id,
|
|
442
|
+
label: agent.id,
|
|
443
|
+
description: agent.description,
|
|
444
|
+
})),
|
|
445
|
+
targets: async () =>
|
|
446
|
+
deps.providers.list().map(({ target, reason }) => ({
|
|
447
|
+
id: target.id,
|
|
448
|
+
value: target.id,
|
|
449
|
+
label: target.id,
|
|
450
|
+
description: reason,
|
|
451
|
+
})),
|
|
452
|
+
models: async () =>
|
|
453
|
+
deps.providers.list().flatMap(({ target, discoveredModels, discoveredModelLabels }) =>
|
|
454
|
+
[
|
|
455
|
+
...new Set([
|
|
456
|
+
...(target.defaultModel ? [target.defaultModel] : []),
|
|
457
|
+
...(target.wireModels ?? []),
|
|
458
|
+
...discoveredModels,
|
|
459
|
+
]),
|
|
460
|
+
].map((model) => ({
|
|
461
|
+
id: `${target.id}/${model}`,
|
|
462
|
+
value: model,
|
|
463
|
+
label: discoveredModelLabels?.[model] ?? model,
|
|
464
|
+
description: target.id,
|
|
465
|
+
})),
|
|
466
|
+
),
|
|
467
|
+
skills: async () =>
|
|
468
|
+
(deps.resources?.skills(getCwd()).items ?? []).map((skill) => ({
|
|
469
|
+
id: skill.name,
|
|
470
|
+
value: skill.name,
|
|
471
|
+
label: skill.name,
|
|
472
|
+
description: skill.description,
|
|
473
|
+
})),
|
|
474
|
+
tasks: async () =>
|
|
475
|
+
(deps.getTaskBoard?.()?.tasks ?? []).map((task) => ({
|
|
476
|
+
id: task.id,
|
|
477
|
+
value: task.id,
|
|
478
|
+
label: task.title,
|
|
479
|
+
description: task.status,
|
|
480
|
+
})),
|
|
481
|
+
// Other slots remain empty when this presentation has no read-only catalog for them.
|
|
482
|
+
},
|
|
441
483
|
});
|
|
442
484
|
editor.setAutocompleteProvider(autocomplete);
|
|
443
485
|
|
|
@@ -539,6 +581,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
|
|
|
539
581
|
unsubscribeObservability();
|
|
540
582
|
contextActivityStore.unsubscribe();
|
|
541
583
|
dispatchBoardStore.unsubscribe();
|
|
584
|
+
unbindRunReaders();
|
|
542
585
|
};
|
|
543
586
|
const disposeStatus = (): void => {
|
|
544
587
|
if (statusDisposed) return;
|
|
@@ -24,6 +24,7 @@ import type { SessionContract, SessionEntry } from "../domains/session/index.js"
|
|
|
24
24
|
import { foldTaskBoard } from "../domains/session/task-board.js";
|
|
25
25
|
import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
|
|
26
26
|
import type { ShareContract } from "../domains/share/index.js";
|
|
27
|
+
import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
|
|
27
28
|
import type { UserTasksStore } from "../domains/user-tasks/store.js";
|
|
28
29
|
import { stripTerminalSequences } from "../engine/tui.js";
|
|
29
30
|
import type { ImageContent } from "../engine/types.js";
|
|
@@ -62,7 +63,7 @@ export interface InteractiveSlashSubmitExpansion {
|
|
|
62
63
|
pendingSkillRequests: PendingSkillRequest[];
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
type SlashChat = Pick<ChatLoop, "getSessionId" | "isStreaming" | "submit">;
|
|
66
|
+
type SlashChat = Pick<ChatLoop, "clearSkillSurface" | "getSessionId" | "isStreaming" | "submit">;
|
|
66
67
|
type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
|
|
67
68
|
type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
|
|
68
69
|
type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
|
|
@@ -389,6 +390,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
389
390
|
listPrompts: () => deps.resources?.prompts(cwd()) ?? { items: [], diagnostics: [] },
|
|
390
391
|
...(resources ? { expandPromptTemplate: (text: string) => resources.expandPromptTemplate(text, cwd()) } : {}),
|
|
391
392
|
openSkillsHub: deps.openSkillsHub,
|
|
393
|
+
clearSkillSurface: () => deps.chat.clearSkillSurface(),
|
|
392
394
|
listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
|
|
393
395
|
listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
|
|
394
396
|
listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
|
|
@@ -431,7 +433,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
431
433
|
...(userTasks
|
|
432
434
|
? {
|
|
433
435
|
userTasks: {
|
|
434
|
-
add: (title: string) => userTasks.add(title),
|
|
436
|
+
add: (title: string, acceptance?: UserTaskAcceptance) => userTasks.add(title, undefined, acceptance),
|
|
435
437
|
hand: (id: string) => userTasks.hand(id, deps.chat.getSessionId() ?? undefined),
|
|
436
438
|
done: (id: string) => userTasks.done(id),
|
|
437
439
|
drop: (id: string) => userTasks.drop(id),
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { OracleResult } from "../domains/agents/index.js";
|
|
16
|
+
import { decisionRationale } from "../domains/session/decision-board.js";
|
|
16
17
|
import type { DecisionLedgerEntry } from "../domains/session/entries.js";
|
|
17
18
|
import type { TaskBoardTask } from "../domains/session/task-board.js";
|
|
18
19
|
|
|
@@ -89,12 +90,14 @@ function clamp(text: string, maxBytes: number): { text: string; truncated: boole
|
|
|
89
90
|
|
|
90
91
|
/** One decision line. Superseded decisions carry their correction so a reversal is visible. */
|
|
91
92
|
function decisionLine(decision: DecisionLedgerEntry["decisions"][number]): string {
|
|
93
|
+
const argument = decisionRationale(decision);
|
|
94
|
+
const details = argument ? `\n ${argument}` : "";
|
|
92
95
|
const label = decision.label ? ` (${decision.label})` : "";
|
|
93
96
|
if (decision.status === "superseded") {
|
|
94
97
|
const correction = decision.correction ? `; corrected to ${decision.correction}` : "";
|
|
95
|
-
return `- ${decision.key}${label}: ${decision.value} [superseded${correction}]`;
|
|
98
|
+
return `- ${decision.key}${label}: ${decision.value} [superseded${correction}]${details}`;
|
|
96
99
|
}
|
|
97
|
-
return `- ${decision.key}${label}: ${decision.value}`;
|
|
100
|
+
return `- ${decision.key}${label}: ${decision.value}${details}`;
|
|
98
101
|
}
|
|
99
102
|
|
|
100
103
|
function taskLine(task: TaskBoardTask): string {
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
wrapTextWithAnsi,
|
|
22
22
|
} from "../../engine/tui.js";
|
|
23
23
|
import type { FleetRunPreview, FleetRunPreviewStep } from "../fleet-run-preview.js";
|
|
24
|
+
import { formatUsd } from "../footer/widgets.js";
|
|
24
25
|
import { buildResponsiveHint, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
|
|
25
26
|
import { clioTheme, rule } from "../theme/index.js";
|
|
26
27
|
|
|
@@ -83,12 +84,12 @@ function formatFleetRunPreviewStep(step: FleetRunPreviewStep): string {
|
|
|
83
84
|
return `agent ${step.stepId}${loop} · ${step.agentId ?? "?"} · ${route}${node}${declaredRoute}${gate}${dynamicPlan} · ${step.scope} · ${formatWriteBoundary(step.writes)}`;
|
|
84
85
|
}
|
|
85
86
|
|
|
86
|
-
function formatBudgetLine(preview: FleetRunPreview): string {
|
|
87
|
+
export function formatBudgetLine(preview: FleetRunPreview): string {
|
|
87
88
|
const contract =
|
|
88
89
|
preview.budget.contractUsd === null
|
|
89
90
|
? "contract declares no ceiling"
|
|
90
91
|
: `contract ceiling $${preview.budget.contractUsd.toFixed(2)}`;
|
|
91
|
-
return `budget: admitted under $${preview.budget.ceilingUsd.toFixed(2)} session ceiling,
|
|
92
|
+
return `budget: admitted under $${preview.budget.ceilingUsd.toFixed(2)} session ceiling, ${formatUsd(preview.budget.currentUsd)} spent, ${contract}`;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
/**
|
|
@@ -25,8 +25,8 @@ const PREVIEW_WIDTH = 60;
|
|
|
25
25
|
* calls onFork(parentTurnId); the caller wires that through
|
|
26
26
|
* SessionContract.fork(parentTurnId).
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
28
|
+
* Scope: current-session turns only. A multi-session picker is not
|
|
29
|
+
* implemented; it would need TreeSnapshot to carry a payload preview field.
|
|
30
30
|
*/
|
|
31
31
|
export interface OpenMessagePickerOverlayDeps {
|
|
32
32
|
session: SessionContract;
|
|
@@ -600,10 +600,10 @@ const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string
|
|
|
600
600
|
false: "context is only compacted when you run /context compact",
|
|
601
601
|
},
|
|
602
602
|
// `embedded` is a declared rung with no implementation behind it yet; it
|
|
603
|
-
//
|
|
603
|
+
// refuses until Clio can own a pane host, and the hint says so.
|
|
604
604
|
"panes.enabled": {
|
|
605
605
|
auto: "detect a herdr session and join it as a guest; no pane host, no panes",
|
|
606
|
-
embedded: "not implemented yet;
|
|
606
|
+
embedded: "not implemented yet; use auto or guest",
|
|
607
607
|
off: "never detect or open a pane",
|
|
608
608
|
},
|
|
609
609
|
"retry.enabled": {
|
|
@@ -16,14 +16,14 @@ export const TREE_OVERLAY_WIDTH = 88;
|
|
|
16
16
|
const VISIBLE_ROWS = 16;
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
* /tree navigator overlay.
|
|
19
|
+
* /tree navigator overlay. Behaviors:
|
|
20
20
|
* - One row per node, indented two spaces per branch level (not per message)
|
|
21
21
|
* - Shift+T toggles operator-local timestamps on/off
|
|
22
22
|
* - `e` enters label edit submode (Enter commits, Esc cancels)
|
|
23
23
|
* - Enter on a row switches the active append point to that turn id
|
|
24
24
|
* - Esc closes the overlay
|
|
25
25
|
*
|
|
26
|
-
* Cwd-toggle (`p`) and sort-order (`s`)
|
|
26
|
+
* Cwd-toggle (`p`) and sort-order (`s`) are not implemented.
|
|
27
27
|
*
|
|
28
28
|
* The overlay queries `session.tree()` on open and after any mutation so
|
|
29
29
|
* label edits are reflected without a close/reopen cycle.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Renderer for BranchSummary session entries
|
|
2
|
+
* Renderer for BranchSummary session entries.
|
|
3
3
|
*
|
|
4
4
|
* A branchSummary entry is produced when a fork inherits a compacted parent
|
|
5
5
|
* context: the new session opens with a single summary block standing in for
|
|
@@ -206,6 +206,36 @@ function researchReport(value: Record<string, unknown>): PresentedContractAnswer
|
|
|
206
206
|
return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `source ${value.source}` };
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
+
function worldKnowledgeReport(value: Record<string, unknown>): PresentedContractAnswer | null {
|
|
210
|
+
if (
|
|
211
|
+
(value.discovery !== "performed" &&
|
|
212
|
+
value.discovery !== "caller-supplied-only" &&
|
|
213
|
+
value.discovery !== "unavailable") ||
|
|
214
|
+
!Array.isArray(value.facts) ||
|
|
215
|
+
!isStringArray(value.synthesis) ||
|
|
216
|
+
!isStringArray(value.uncertainties) ||
|
|
217
|
+
!isStringArray(value.followUpVerification)
|
|
218
|
+
) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const lines: string[] = [];
|
|
222
|
+
for (const raw of value.facts) {
|
|
223
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
|
|
224
|
+
const fact = raw as Record<string, unknown>;
|
|
225
|
+
const claim = reportString(fact.claim);
|
|
226
|
+
const evidence = reportString(fact.evidence);
|
|
227
|
+
if (claim === null || evidence === null || !isStringArray(fact.sources)) return null;
|
|
228
|
+
lines.push(`- ${claim}`, ` support: ${evidence}`);
|
|
229
|
+
if (fact.sources.length > 0) lines.push(` sources: ${fact.sources.join(", ")}`);
|
|
230
|
+
}
|
|
231
|
+
if (value.synthesis.length > 0) lines.push("Synthesis:", ...value.synthesis.map((item) => `- ${item}`));
|
|
232
|
+
if (value.uncertainties.length > 0) lines.push("Uncertainties:", ...value.uncertainties.map((item) => `- ${item}`));
|
|
233
|
+
if (value.followUpVerification.length > 0) {
|
|
234
|
+
lines.push("Verify next:", ...value.followUpVerification.map((item) => `- ${item}`));
|
|
235
|
+
}
|
|
236
|
+
return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `discovery ${value.discovery}` };
|
|
237
|
+
}
|
|
238
|
+
|
|
209
239
|
function scoutReport(value: Record<string, unknown>): PresentedContractAnswer | null {
|
|
210
240
|
if (!Array.isArray(value.findings) || typeof value.needsSplit !== "boolean") return null;
|
|
211
241
|
const lines: string[] = [];
|
|
@@ -250,6 +280,8 @@ function presentedContractAnswer(entry: WorkerEntryState): PresentedContractAnsw
|
|
|
250
280
|
return verifierReport(value);
|
|
251
281
|
case "research-report":
|
|
252
282
|
return researchReport(value);
|
|
283
|
+
case "world-knowledge-report":
|
|
284
|
+
return worldKnowledgeReport(value);
|
|
253
285
|
case "scout-report":
|
|
254
286
|
return scoutReport(value);
|
|
255
287
|
}
|
|
@@ -69,16 +69,14 @@ export interface SlashCompletionItem extends AutocompleteItem {
|
|
|
69
69
|
export interface SlashAutocompleteOptions {
|
|
70
70
|
basePath?: string;
|
|
71
71
|
fdPath?: string | null;
|
|
72
|
-
/**
|
|
72
|
+
/** Read-only runtime values for the named grammar slots. */
|
|
73
73
|
completionSources?: CompletionSources;
|
|
74
74
|
/** Replace the default workspace-aware `@` source without adding a second composer provider. */
|
|
75
75
|
fileReferenceSource?: FileReferenceCompletionSource;
|
|
76
|
-
/** @deprecated Dynamic skill values move to the named `skills` slot in slice 11. */
|
|
77
|
-
listSkills?: () => unknown;
|
|
78
76
|
}
|
|
79
77
|
|
|
80
|
-
/**
|
|
81
|
-
function
|
|
78
|
+
/** Slots without an in-app source return no dynamic values. */
|
|
79
|
+
function emptyCompletionSources(): Record<CompletionSlotName, CompletionSource> {
|
|
82
80
|
const sources = {} as Record<CompletionSlotName, CompletionSource>;
|
|
83
81
|
for (const slot of COMPLETION_SLOT_NAMES) sources[slot] = async () => [];
|
|
84
82
|
return sources;
|
|
@@ -308,7 +306,7 @@ class ClioAutocompleteProvider implements AutocompleteProvider {
|
|
|
308
306
|
) {
|
|
309
307
|
this.files = new CombinedAutocompleteProvider([], basePath, fdPath);
|
|
310
308
|
this.fileReferences = fileReferenceSource ?? createFileReferenceCompletionSource({ basePath });
|
|
311
|
-
this.sourceBySlot = { ...
|
|
309
|
+
this.sourceBySlot = { ...emptyCompletionSources(), ...sources };
|
|
312
310
|
}
|
|
313
311
|
|
|
314
312
|
async getSuggestions(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { acceptanceFromTaskFlags } from "../cli/tasks.js";
|
|
1
2
|
import { BusChannels } from "../core/bus-events.js";
|
|
2
3
|
import { THINKING_LEVELS } from "../core/defaults.js";
|
|
3
4
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
@@ -28,8 +29,9 @@ import type {
|
|
|
28
29
|
PromptTemplateExpansion,
|
|
29
30
|
ResourceList,
|
|
30
31
|
} from "../domains/resources/index.js";
|
|
31
|
-
import { parseSkillCommand } from "../domains/resources/index.js";
|
|
32
|
+
import { parseSkillCommand, SKILL_SURFACE_CLEAR_ARG } from "../domains/resources/index.js";
|
|
32
33
|
import type { ShareImportPlan } from "../domains/share/index.js";
|
|
34
|
+
import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
|
|
33
35
|
import type { UserTask } from "../domains/user-tasks/store.js";
|
|
34
36
|
import type { ExtensionReloadOutcome } from "../entry/extension-reload.js";
|
|
35
37
|
import { isToolProfileName, TOOL_PROFILE_NAMES, type ToolProfileName } from "../tools/profiles.js";
|
|
@@ -118,6 +120,8 @@ type SlashCommandVariant =
|
|
|
118
120
|
| { kind: "skill-selector" }
|
|
119
121
|
| { kind: "resources"; family?: "skills" | "prompts" | "extensions"; tab?: LibraryEntryKind; action?: "reload" }
|
|
120
122
|
| { kind: "skill-invocation"; text: string }
|
|
123
|
+
/** `/skill off`: drop the tool surface an activated skill armed for the session. */
|
|
124
|
+
| { kind: "skill-surface-clear" }
|
|
121
125
|
| ShareCommandVariant
|
|
122
126
|
| ArchiveCommandVariant
|
|
123
127
|
/** `source` is the line the operator typed, echoed above the run's transcript block. */
|
|
@@ -144,7 +148,7 @@ type SlashCommandVariant =
|
|
|
144
148
|
| { kind: "context-view" }
|
|
145
149
|
| { kind: "tasks" }
|
|
146
150
|
| { kind: "decisions" }
|
|
147
|
-
| { kind: "tasks-add"; text: string }
|
|
151
|
+
| { kind: "tasks-add"; text: string; expectedOutputs?: string[]; verification?: string[] }
|
|
148
152
|
| { kind: "tasks-hand"; id: string }
|
|
149
153
|
| { kind: "tasks-done"; id: string }
|
|
150
154
|
| { kind: "tasks-drop"; id: string }
|
|
@@ -595,6 +599,12 @@ export interface SlashCommandContext {
|
|
|
595
599
|
*/
|
|
596
600
|
runContextRecall?: (ref: string) => void;
|
|
597
601
|
openSkillsHub?: (tab?: LibraryEntryKind) => void;
|
|
602
|
+
/**
|
|
603
|
+
* `/skill off`: drop the tool surface an activated skill armed for the
|
|
604
|
+
* session. Returns the names that were armed. Absent on a host with no
|
|
605
|
+
* chat loop, where nothing can be armed in the first place.
|
|
606
|
+
*/
|
|
607
|
+
clearSkillSurface?: () => ReadonlyArray<string>;
|
|
598
608
|
listPrompts: () => ResourceList<PromptTemplate>;
|
|
599
609
|
/**
|
|
600
610
|
* Resolve a `/name` against the loaded prompt templates. Absent when the host
|
|
@@ -682,7 +692,7 @@ export interface SlashCommandContext {
|
|
|
682
692
|
openDecisions: () => void;
|
|
683
693
|
/** Project-scoped operator task inbox backing `/tasks` mutations. */
|
|
684
694
|
userTasks?: {
|
|
685
|
-
add(title: string): UserTask;
|
|
695
|
+
add(title: string, acceptance?: UserTaskAcceptance): UserTask;
|
|
686
696
|
hand(id: string): UserTask;
|
|
687
697
|
done(id: string): UserTask;
|
|
688
698
|
drop(id: string): UserTask;
|
|
@@ -782,9 +792,10 @@ function formatReceiptVerificationBlock(runId: string, result: SlashReceiptVerif
|
|
|
782
792
|
}
|
|
783
793
|
|
|
784
794
|
/** The one operator-authored turn used by slash and overlay handoff paths. */
|
|
785
|
-
export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note">): string {
|
|
795
|
+
export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note" | "acceptance">): string {
|
|
786
796
|
const note = task.note ? ` ${task.note}.` : "";
|
|
787
|
-
|
|
797
|
+
const acceptance = task.acceptance ? ` Acceptance: ${JSON.stringify(task.acceptance)}.` : "";
|
|
798
|
+
return `Operator task ${task.id}: ${task.title}.${note}${acceptance} Pick it up with tasks action="pick" id="${task.id}" and work it when appropriate.`;
|
|
788
799
|
}
|
|
789
800
|
|
|
790
801
|
/** The verb a command performs, in the order /help lists the groups. */
|
|
@@ -912,9 +923,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
912
923
|
},
|
|
913
924
|
{
|
|
914
925
|
name: "skill",
|
|
915
|
-
description: "Open the Skills Hub
|
|
926
|
+
description: "Open the Skills Hub, invoke a skill, or `off` to drop an active skill's tool surface",
|
|
916
927
|
group: "Work",
|
|
917
|
-
kinds: ["skill-selector", "skill-invocation"],
|
|
928
|
+
kinds: ["skill-selector", "skill-invocation", "skill-surface-clear"],
|
|
918
929
|
args: {
|
|
919
930
|
positionals: [
|
|
920
931
|
{ name: "name", required: false },
|
|
@@ -926,16 +937,26 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
926
937
|
return { kind: "skill-selector" };
|
|
927
938
|
}
|
|
928
939
|
const command = parseSkillCommand(trimmed);
|
|
929
|
-
if (command)
|
|
930
|
-
|
|
940
|
+
if (!command) return null;
|
|
941
|
+
// `off` is the one reserved name: an installed skill called `off`
|
|
942
|
+
// would still be reachable from the hub, and clearing the armed
|
|
943
|
+
// surface has to stay typeable without a second command.
|
|
944
|
+
if (command.name === SKILL_SURFACE_CLEAR_ARG && command.args.length === 0) {
|
|
945
|
+
return { kind: "skill-surface-clear" };
|
|
931
946
|
}
|
|
932
|
-
return
|
|
947
|
+
return { kind: "skill-invocation", text: trimmed };
|
|
933
948
|
},
|
|
934
949
|
handle(command, ctx) {
|
|
935
950
|
if (command.kind === "skill-selector") {
|
|
936
951
|
ctx.openSkillsHub?.();
|
|
937
952
|
} else if (command.kind === "skill-invocation") {
|
|
938
953
|
ctx.submitChat(command.text);
|
|
954
|
+
} else if (command.kind === "skill-surface-clear") {
|
|
955
|
+
const cleared = ctx.clearSkillSurface?.() ?? [];
|
|
956
|
+
ctx.notice(
|
|
957
|
+
"info",
|
|
958
|
+
cleared.length > 0 ? `Skill tool surface cleared: ${cleared.join(", ")}.` : "No skill tool surface is active.",
|
|
959
|
+
);
|
|
939
960
|
}
|
|
940
961
|
},
|
|
941
962
|
},
|
|
@@ -1501,7 +1522,14 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1501
1522
|
},
|
|
1502
1523
|
args: {
|
|
1503
1524
|
subcommands: {
|
|
1504
|
-
add: {
|
|
1525
|
+
add: {
|
|
1526
|
+
parseFlagsInRest: true,
|
|
1527
|
+
flags: [
|
|
1528
|
+
{ name: "--expect", takesValue: true, repeatable: true, valueName: "path" },
|
|
1529
|
+
{ name: "--verify", takesValue: true, repeatable: true, valueName: "checkId[:timeoutMs]" },
|
|
1530
|
+
],
|
|
1531
|
+
positionals: [{ name: "text", required: true, rest: true }],
|
|
1532
|
+
},
|
|
1505
1533
|
hand: { positionals: [{ name: "id", required: true }] },
|
|
1506
1534
|
done: { positionals: [{ name: "id", required: true }] },
|
|
1507
1535
|
drop: { positionals: [{ name: "id", required: true }] },
|
|
@@ -1512,7 +1540,12 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1512
1540
|
switch (parsed.subcommand) {
|
|
1513
1541
|
case "add":
|
|
1514
1542
|
return parsed.rest
|
|
1515
|
-
? {
|
|
1543
|
+
? {
|
|
1544
|
+
kind: "tasks-add",
|
|
1545
|
+
text: parsed.rest,
|
|
1546
|
+
...(parsed.flagValues.has("--expect") ? { expectedOutputs: parsed.flagValues.get("--expect") ?? [] } : {}),
|
|
1547
|
+
...(parsed.flagValues.has("--verify") ? { verification: parsed.flagValues.get("--verify") ?? [] } : {}),
|
|
1548
|
+
}
|
|
1516
1549
|
: { kind: "usage-error", command: "tasks", reason: "add requires task text" };
|
|
1517
1550
|
case "hand":
|
|
1518
1551
|
case "done":
|
|
@@ -1540,7 +1573,10 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1540
1573
|
}
|
|
1541
1574
|
try {
|
|
1542
1575
|
if (command.kind === "tasks-add") {
|
|
1543
|
-
const task = ctx.userTasks.add(
|
|
1576
|
+
const task = ctx.userTasks.add(
|
|
1577
|
+
command.text,
|
|
1578
|
+
acceptanceFromTaskFlags(process.cwd(), command.expectedOutputs ?? [], command.verification ?? []),
|
|
1579
|
+
);
|
|
1544
1580
|
ctx.notice("success", `logged operator task ${task.id}: ${task.title}`);
|
|
1545
1581
|
return;
|
|
1546
1582
|
}
|
|
@@ -2124,32 +2160,6 @@ const COMMAND_SHAPED_TOKEN = /^[A-Za-z][A-Za-z0-9:-]*$/u;
|
|
|
2124
2160
|
*/
|
|
2125
2161
|
const COMMAND_ESCAPE = "\\/";
|
|
2126
2162
|
|
|
2127
|
-
const RETIRED_COMMAND_HINTS: Readonly<Record<string, string>> = Object.freeze({
|
|
2128
|
-
status: "Use the footer or Alt+U for status; /cost, /context, and /fleet inspect their own domains.",
|
|
2129
|
-
receipts: "Use /view or /view verify <run-id>.",
|
|
2130
|
-
"context-init": "Use /context init.",
|
|
2131
|
-
"context-clear": "Use /context reset for project context or /new for a fresh session.",
|
|
2132
|
-
"context-view": "Use /context.",
|
|
2133
|
-
compact: "Use /context compact [instructions].",
|
|
2134
|
-
skills: "Use /skill or /resources skills.",
|
|
2135
|
-
exit: "Use /quit.",
|
|
2136
|
-
config: "Use /settings.",
|
|
2137
|
-
ctx: "Use /context.",
|
|
2138
|
-
models: "Use /model.",
|
|
2139
|
-
clear: "Use /new for a fresh session or /context reset for project context.",
|
|
2140
|
-
library: "Use /resources library [kind].",
|
|
2141
|
-
prompts: "Use /resources prompts.",
|
|
2142
|
-
extensions: "Use /resources extensions.",
|
|
2143
|
-
interop: "Use /agents connect.",
|
|
2144
|
-
targets: "Use /settings targets.",
|
|
2145
|
-
"scoped-models": "Use /settings chat model-picker.",
|
|
2146
|
-
});
|
|
2147
|
-
|
|
2148
|
-
function retiredCommandHint(token: string): string | undefined {
|
|
2149
|
-
if (/^skills?:[^\s]+$/u.test(token)) return "Use /skill <name> [task].";
|
|
2150
|
-
return RETIRED_COMMAND_HINTS[token];
|
|
2151
|
-
}
|
|
2152
|
-
|
|
2153
2163
|
/** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
|
|
2154
2164
|
/**
|
|
2155
2165
|
* One notice line for a reload outcome. Success when the generation committed
|
|
@@ -2212,12 +2222,6 @@ export function dispatchSlashCommand(command: SlashCommand, ctx: SlashCommandCon
|
|
|
2212
2222
|
return "accepted";
|
|
2213
2223
|
}
|
|
2214
2224
|
if (command.kind === "unknown-command") {
|
|
2215
|
-
const retiredHint = retiredCommandHint(command.token);
|
|
2216
|
-
if (retiredHint) {
|
|
2217
|
-
ctx.notice("error", `/${command.token} is retired and did not run. ${retiredHint}`);
|
|
2218
|
-
ctx.render();
|
|
2219
|
-
return "rejected";
|
|
2220
|
-
}
|
|
2221
2225
|
// The registry does not own the token, but a prompt template might. The
|
|
2222
2226
|
// parser stays pure, so the lookup happens here, and only for a spelling
|
|
2223
2227
|
// that matched no command: `/name` is how every other agent invokes the
|
|
@@ -72,6 +72,8 @@ export interface CommandArgsSpec {
|
|
|
72
72
|
* keep their byte-for-byte parsing.
|
|
73
73
|
*/
|
|
74
74
|
parseFlagsBeforeRest?: boolean;
|
|
75
|
+
/** Recognize flags throughout a rest positional (operator task acceptance). */
|
|
76
|
+
parseFlagsInRest?: boolean;
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
export interface ParsedArgs {
|
|
@@ -260,6 +262,32 @@ export function parseArgs(spec: CommandArgsSpec, argsLine: string): ParsedArgs {
|
|
|
260
262
|
while (index < argsLine.length) {
|
|
261
263
|
const currentPositionalSpec = positionalSpecs[positionalIndex];
|
|
262
264
|
if (currentPositionalSpec?.rest) {
|
|
265
|
+
if (currentSpec.parseFlagsInRest) {
|
|
266
|
+
const text: string[] = [];
|
|
267
|
+
while (index < argsLine.length) {
|
|
268
|
+
const start = index;
|
|
269
|
+
const read = readToken();
|
|
270
|
+
if (!read) break;
|
|
271
|
+
if (read.token === "--") {
|
|
272
|
+
text.push(argsLine.slice(index).trim());
|
|
273
|
+
index = argsLine.length;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
const flag = flagSpecs.find((item) => item.name === read.token);
|
|
277
|
+
if (flag) {
|
|
278
|
+
const error = consumeFlag(flag, read.token);
|
|
279
|
+
if (error) return errorResult(error);
|
|
280
|
+
} else if (read.token.startsWith("--")) return errorResult(`Unknown flag: ${read.token}`);
|
|
281
|
+
else text.push(argsLine.slice(start, index));
|
|
282
|
+
skipWhitespace();
|
|
283
|
+
}
|
|
284
|
+
const restVal = text.join(" ").trim();
|
|
285
|
+
if (!restVal) return errorResult(`Missing required argument: ${currentPositionalSpec.name}`);
|
|
286
|
+
positionals.push(restVal);
|
|
287
|
+
rest = restVal;
|
|
288
|
+
positionalIndex++;
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
263
291
|
if (currentSpec.parseFlagsBeforeRest) {
|
|
264
292
|
while (index < argsLine.length) {
|
|
265
293
|
const tokenStart = index;
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Abbreviate a wire model id for chips and dashboards without amputating a
|
|
3
|
-
* version suffix.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `qwen3-coder-30b`. A single part longer than 18 characters is hard-clipped.
|
|
3
|
+
* meaningful placement prefix or version suffix. `dynamo/qwen3.8-27b` remains
|
|
4
|
+
* visible as selected; only the leaf is shortened when the complete route is
|
|
5
|
+
* wider than 24 characters.
|
|
7
6
|
*/
|
|
8
7
|
export function abbreviateModelId(modelId: string | null | undefined): string {
|
|
9
|
-
const
|
|
8
|
+
const segments = (modelId ?? "").trim().split("/").filter(Boolean);
|
|
9
|
+
const base = segments.pop() ?? "";
|
|
10
10
|
if (base.length === 0) return "model";
|
|
11
|
+
const prefix = segments[0];
|
|
12
|
+
const maxLeaf = prefix ? Math.max(8, 24 - prefix.length - 1) : 18;
|
|
11
13
|
const parts = base.split("-").filter((part) => part.length > 0);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
let leaf: string;
|
|
15
|
+
if (parts.length <= 1) leaf = base.length > maxLeaf ? base.slice(0, maxLeaf) : base;
|
|
16
|
+
else {
|
|
17
|
+
const kept: string[] = [];
|
|
18
|
+
for (const part of parts) {
|
|
19
|
+
const next = [...kept, part].join("-");
|
|
20
|
+
if (kept.length > 0 && next.length > maxLeaf) break;
|
|
21
|
+
kept.push(part);
|
|
22
|
+
}
|
|
23
|
+
const joined = kept.join("-");
|
|
24
|
+
leaf = joined.length > maxLeaf ? joined.slice(0, maxLeaf) : joined;
|
|
18
25
|
}
|
|
19
|
-
|
|
20
|
-
return joined.length > 18 ? joined.slice(0, 18) : joined;
|
|
26
|
+
return prefix ? `${prefix}/${leaf}` : leaf;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
export interface TargetLabelOptions {
|