@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.
Files changed (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. 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: $${budget.currentUsd.toFixed(4)} / $${budget.ceilingUsd.toFixed(4)}`);
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
- * future slices can layer telemetry or settings merging on top.
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
- // The board settles a finished run on the same sealed receipt the transcript
252
- // block reads, so the two surfaces agree on a worker's terminal answer.
253
- const dispatchBoardStore = factories.createDispatchBoardStore(
254
- deps.bus,
255
- () => deps.dispatch.snapshot(),
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
- listSkills: () => ({
438
- installed: deps.resources?.skills(getCwd()).items ?? [],
439
- marketplace: getMarketplaceSkills(),
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, $${preview.budget.currentUsd.toFixed(4)} spent, ${contract}`;
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
- * Phase 12 slice 12b-3 scope: current-session turns only. Multi-session picker
29
- * lives in a later slice once TreeSnapshot grows a payload preview field.
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
- // runs as `auto` until Clio can own a pane host, and the hint says so.
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; behaves as auto (guest mode inside herdr) until Clio can own a pane host",
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. Phase 12 slice 12b-2 behaviors only:
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`) land in Phase 18.
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 (Phase 12 / slice 12b).
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
- /** Slice 11 replaces the named no-op sources with read-only runtime sources. */
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
- /** Complete provider surface now, deliberately inert until slice 11 wiring. */
81
- function stubCompletionSources(): Record<CompletionSlotName, CompletionSource> {
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 = { ...stubCompletionSources(), ...sources };
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
- return `Operator task ${task.id}: ${task.title}.${note} Pick it up with tasks action="pick" id="${task.id}" and work it when appropriate.`;
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 or invoke a skill",
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
- return { kind: "skill-invocation", text: trimmed };
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 null;
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: { positionals: [{ name: "text", required: true, rest: true }] },
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
- ? { kind: "tasks-add", text: parsed.rest }
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(command.text);
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. Whole dash-separated parts are kept while the joined result
4
- * stays within 18 characters, so `claude-sonnet-5` and `claude-opus-4-8`
5
- * survive intact and `qwen3-coder-30b-a3b-instruct` collapses to
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 base = (modelId ?? "").trim().split("/").filter(Boolean).pop() ?? "";
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
- if (parts.length <= 1) return base.length > 18 ? base.slice(0, 18) : base;
13
- const kept: string[] = [];
14
- for (const part of parts) {
15
- const next = [...kept, part].join("-");
16
- if (kept.length > 0 && next.length > 18) break;
17
- kept.push(part);
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
- const joined = kept.join("-");
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 {