@iowarp/clio-coder 0.4.0 → 0.4.2

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 (751) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +407 -375
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
  6. package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
  9. package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
  10. package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
  11. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  12. package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
  13. package/dist/chunk-2X4RYJTJ.js +39 -0
  14. package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
  15. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  16. package/dist/chunk-34BHNEE3.js +1846 -0
  17. package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
  18. package/dist/chunk-3EBYEESD.js +314 -0
  19. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  20. package/dist/chunk-3KIPBMUA.js +308 -0
  21. package/dist/chunk-3M6DQK6S.js +362 -0
  22. package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
  23. package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
  24. package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
  25. package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
  26. package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
  27. package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
  28. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  29. package/dist/chunk-77QIVUZB.js +1334 -0
  30. package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
  33. package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
  34. package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
  35. package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
  36. package/dist/chunk-BTK3SSSK.js +67 -0
  37. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  38. package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
  39. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  40. package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
  41. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  42. package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
  43. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  44. package/dist/chunk-D7E7WCDF.js +27 -0
  45. package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
  46. package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
  47. package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
  48. package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
  49. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  50. package/dist/chunk-F2I26BDK.js +66 -0
  51. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  52. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  53. package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
  54. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  55. package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
  56. package/dist/chunk-HJWWJ6IL.js +184 -0
  57. package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
  58. package/dist/chunk-HLAFFSEK.js +360 -0
  59. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  60. package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
  61. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  62. package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
  63. package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
  64. package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
  65. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  66. package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
  67. package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
  68. package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
  69. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  70. package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
  71. package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
  72. package/dist/chunk-KPXDY6QF.js +47 -0
  73. package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
  74. package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
  75. package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
  76. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  77. package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
  78. package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
  79. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  80. package/dist/chunk-NDDGJUXD.js +81 -0
  81. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  82. package/dist/chunk-NMJXSHBJ.js +283 -0
  83. package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
  86. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  87. package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
  88. package/dist/chunk-PJX3WQUQ.js +42 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
  91. package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
  92. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  93. package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
  94. package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
  95. package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
  96. package/dist/chunk-SZAA6XDG.js +30 -0
  97. package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
  98. package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
  99. package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
  100. package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
  101. package/dist/chunk-UXCU4E3T.js +303 -0
  102. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  103. package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
  104. package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
  105. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  106. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  107. package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
  108. package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
  109. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  110. package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
  111. package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
  112. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  113. package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
  114. package/dist/chunk-XQRY4DTA.js +657 -0
  115. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  116. package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
  117. package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
  118. package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
  119. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  120. package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
  121. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  122. package/dist/cli/index.js +38 -37
  123. package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
  124. package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
  125. package/dist/codewiki/build-worker.js +1 -1
  126. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  127. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  128. package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
  129. package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
  130. package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
  131. package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
  132. package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
  133. package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
  134. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
  135. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
  136. package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
  137. package/dist/doctor-LHBD36VU.js +773 -0
  138. package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
  139. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
  140. package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
  141. package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
  142. package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
  143. package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
  144. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
  145. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
  146. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
  147. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
  148. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
  149. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
  150. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
  151. package/dist/fleet-view-TWHJKCN6.js +96 -0
  152. package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
  153. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  154. package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
  155. package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
  156. package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
  157. package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
  158. package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
  159. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
  160. package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
  161. package/dist/panes-IXKLOKA2.js +75 -0
  162. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  163. package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
  164. package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
  165. package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
  166. package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
  167. package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
  168. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
  169. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
  170. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
  171. package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
  172. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  173. package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
  174. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
  175. package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
  176. package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
  177. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  178. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  179. package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
  180. package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
  181. package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
  182. package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
  183. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
  184. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
  185. package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
  186. package/dist/worker/entry.js +83 -63
  187. package/docs/README.md +176 -81
  188. package/docs/{acp.md → architecture/acp.md} +36 -20
  189. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  190. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  191. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  192. package/docs/architecture/artifact-versions.md +90 -0
  193. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  194. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  195. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  196. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  197. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  198. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  199. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  200. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  201. package/docs/{observability.md → architecture/observability.md} +26 -13
  202. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  203. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  204. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  205. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  206. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  207. package/docs/architecture/time-conventions.md +125 -0
  208. package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
  209. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  210. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  211. package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
  212. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
  213. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
  214. package/docs/guide/configuration-reference.md +1158 -0
  215. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
  216. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
  217. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  218. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
  219. package/docs/{glossary.md → guide/glossary.md} +14 -11
  220. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
  221. package/docs/guide/panes-and-files.md +290 -0
  222. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  223. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  224. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  225. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  226. package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
  227. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
  228. package/docs/history/release-cut-checklist.md +207 -0
  229. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  230. package/docs/process/documentation-coverage.md +100 -0
  231. package/docs/process/documentation-guide.md +187 -0
  232. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  233. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  234. package/docs/{evolution.md → process/evolution.md} +2 -2
  235. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
  236. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  237. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  238. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  239. package/evals/README.md +5 -0
  240. package/evals/behavioral-corpus-grader.mjs +103 -0
  241. package/evals/behavioral-machinery-baseline.json +2276 -0
  242. package/evals/behavioral-machinery-driver.ts +250 -0
  243. package/evals/behavioral-machinery-support.ts +253 -0
  244. package/evals/behavioral-machinery.yaml +614 -0
  245. package/evals/behavioral-model-negative-control.yaml +68 -0
  246. package/evals/behavioral-model.yaml +216 -0
  247. package/evals/fixtures/behavioral-facts.txt +3 -0
  248. package/evals/fixtures/behavioral-main.ts +7 -0
  249. package/evals/fixtures/decoy/note.txt +2 -0
  250. package/evals/fixtures/private/credentials.txt +1 -0
  251. package/evals/tracked-metrics-baseline.yaml +229 -0
  252. package/evals/tracked-metrics-grader.mjs +129 -0
  253. package/package.json +13 -21
  254. package/skills/README.md +51 -42
  255. package/skills/coding/ast-grep/SKILL.md +9 -3
  256. package/skills/coding/coding-standards/SKILL.md +9 -3
  257. package/skills/coding/prototype/SKILL.md +9 -3
  258. package/skills/coding/tdd/SKILL.md +9 -3
  259. package/skills/context/context-handoff/SKILL.md +13 -4
  260. package/skills/context/context-handoff/evals.md +3 -3
  261. package/skills/context/context-prime/SKILL.md +9 -3
  262. package/skills/context/context-prime/evals.md +2 -2
  263. package/skills/git/file-ticket/SKILL.md +10 -5
  264. package/skills/git/file-ticket/evals.md +2 -2
  265. package/skills/git/fix-issue/SKILL.md +12 -5
  266. package/skills/git/fix-issue/evals.md +4 -4
  267. package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
  268. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  269. package/skills/git/ship/SKILL.md +10 -4
  270. package/skills/git/ship/evals.md +4 -4
  271. package/skills/git/worktree-create/SKILL.md +8 -3
  272. package/skills/git/worktree-create/evals.md +6 -6
  273. package/skills/git/worktree-merge/SKILL.md +8 -3
  274. package/skills/git/worktree-merge/evals.md +6 -6
  275. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
  276. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
  277. package/skills/meta/clio-coder-test/SKILL.md +146 -0
  278. package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
  279. package/skills/meta/clio-coder-test/references/harness.md +102 -0
  280. package/skills/meta/clio-coder-test/references/test-map.md +96 -0
  281. package/skills/meta/credentials/SKILL.md +10 -3
  282. package/skills/meta/find-skills/SKILL.md +9 -3
  283. package/skills/meta/herdr/SKILL.md +9 -3
  284. package/skills/meta/skill-craft/SKILL.md +39 -16
  285. package/skills/planning/architecture/SKILL.md +9 -3
  286. package/skills/planning/backlog/SKILL.md +9 -3
  287. package/skills/planning/prd/SKILL.md +9 -3
  288. package/skills/planning/product-intent/SKILL.md +9 -3
  289. package/skills/planning/tech-spec/SKILL.md +9 -3
  290. package/skills/registry.yaml +66 -66
  291. package/skills/research/arxiv-literature/SKILL.md +9 -3
  292. package/skills/research/experiment-protocol/SKILL.md +10 -3
  293. package/skills/research/scientific-debugging/SKILL.md +10 -3
  294. package/skills/research/scientific-debugging/evals.md +2 -2
  295. package/skills/research/scientific-modernization/SKILL.md +10 -3
  296. package/skills/skill-marketplace.json +285 -66
  297. package/skills/workflow/cut-it/SKILL.md +11 -3
  298. package/skills/workflow/design-council/SKILL.md +12 -3
  299. package/skills/workflow/grill-me/SKILL.md +9 -3
  300. package/skills/workflow/workflow-distiller/SKILL.md +9 -3
  301. package/src/cli/acp.ts +2 -2
  302. package/src/cli/args.ts +2 -2
  303. package/src/cli/auth.ts +2 -2
  304. package/src/cli/bootstrap-generate.ts +6 -6
  305. package/src/cli/clio.ts +6 -1
  306. package/src/cli/config-inspect.ts +68 -15
  307. package/src/cli/configure-interop.ts +1 -1
  308. package/src/cli/configure.ts +27 -31
  309. package/src/cli/default-target.ts +1 -1
  310. package/src/cli/docs.ts +28 -20
  311. package/src/cli/doctor-naming.ts +323 -0
  312. package/src/cli/doctor-panes.ts +46 -14
  313. package/src/cli/doctor-toolchain.ts +31 -10
  314. package/src/cli/doctor.ts +15 -1
  315. package/src/cli/eval-inventory.ts +8 -8
  316. package/src/cli/eval.ts +1 -2
  317. package/src/cli/evidence-detail.ts +1 -1
  318. package/src/cli/evidence-inventory.ts +1 -1
  319. package/src/cli/extensions.ts +2 -1
  320. package/src/cli/fleet-decisions.ts +1 -1
  321. package/src/cli/fleet-inspect.ts +1 -1
  322. package/src/cli/fleet-preflight.ts +1 -1
  323. package/src/cli/fleet-verify.ts +1 -1
  324. package/src/cli/fleet-view.ts +40 -23
  325. package/src/cli/fleet.ts +9 -6
  326. package/src/cli/index.ts +2 -1
  327. package/src/cli/internal-dispatch.ts +3 -4
  328. package/src/cli/interop-inspect.ts +2 -2
  329. package/src/cli/models.ts +3 -3
  330. package/src/cli/modes/print.ts +1 -1
  331. package/src/cli/panes.ts +19 -5
  332. package/src/cli/reset.ts +1 -1
  333. package/src/cli/run.ts +13 -17
  334. package/src/cli/share.ts +6 -2
  335. package/src/cli/skills-eval.ts +14 -14
  336. package/src/cli/targets.ts +25 -30
  337. package/src/cli/trace-inspect.ts +1 -1
  338. package/src/cli/trace.ts +96 -4
  339. package/src/cli/uninstall.ts +2 -2
  340. package/src/cli/upgrade.ts +29 -34
  341. package/src/cli/usage.ts +2 -2
  342. package/src/cli/validate-model.ts +1 -1
  343. package/src/cli/verifiers-inspect.ts +1 -1
  344. package/src/cli/wiki-generate.ts +6 -6
  345. package/src/core/artifact-paths.ts +1 -1
  346. package/src/core/bash-exec.ts +132 -87
  347. package/src/core/boot-trace.ts +3 -3
  348. package/src/core/bus-events.ts +51 -6
  349. package/src/core/bus-trace.ts +2 -2
  350. package/src/core/compile-cache.ts +1 -1
  351. package/src/core/config.ts +1066 -886
  352. package/src/core/defaults.ts +326 -530
  353. package/src/core/dispatch-outcome.ts +16 -0
  354. package/src/core/domain-loader.ts +6 -4
  355. package/src/core/event-bus.ts +1 -1
  356. package/src/core/file-references.ts +78 -88
  357. package/src/core/git-commit-attribution.ts +3 -9
  358. package/src/core/guardrails.ts +33 -52
  359. package/src/core/naming-compat.ts +45 -0
  360. package/src/core/naming-events.ts +62 -0
  361. package/src/core/prompt-hint.ts +9 -0
  362. package/src/core/recent-models.ts +1 -7
  363. package/src/core/residency-protection.ts +4 -8
  364. package/src/core/resolve-config-value.ts +1 -1
  365. package/src/core/response-model-id.ts +0 -14
  366. package/src/core/session-routing.ts +84 -74
  367. package/src/core/skill-activation.ts +18 -0
  368. package/src/core/termination.ts +4 -4
  369. package/src/core/timers.ts +2 -12
  370. package/src/domains/agents/builtins/architect.md +2 -3
  371. package/src/domains/agents/builtins/coder.md +3 -2
  372. package/src/domains/agents/builtins/debugger.md +2 -2
  373. package/src/domains/agents/builtins/documenter.md +2 -2
  374. package/src/domains/agents/builtins/git-master.md +1 -1
  375. package/src/domains/agents/builtins/oracle.md +1 -1
  376. package/src/domains/agents/builtins/provenance.md +1 -1
  377. package/src/domains/agents/builtins/researcher.md +1 -1
  378. package/src/domains/agents/builtins/scout.md +1 -1
  379. package/src/domains/agents/builtins/tester.md +2 -2
  380. package/src/domains/agents/builtins/verifier.md +2 -2
  381. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  382. package/src/domains/agents/catalog.ts +14 -26
  383. package/src/domains/agents/contract.ts +2 -0
  384. package/src/domains/agents/extension.ts +26 -4
  385. package/src/domains/agents/registry.ts +7 -7
  386. package/src/domains/agents/result-contract.ts +1 -1
  387. package/src/domains/agents/spec.ts +0 -11
  388. package/src/domains/config/classify.ts +35 -47
  389. package/src/domains/config/extension.ts +5 -5
  390. package/src/domains/config/keybindings.ts +56 -47
  391. package/src/domains/config/watcher.ts +1 -1
  392. package/src/domains/context/codewiki/indexer.ts +1 -1
  393. package/src/domains/context/extension.ts +3 -6
  394. package/src/domains/context/prompt-context.ts +1 -1
  395. package/src/domains/context/wiki/assemble.ts +2 -2
  396. package/src/domains/context/working-set/path-index.ts +1 -0
  397. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  398. package/src/domains/context/working-set/replay/report.ts +1 -1
  399. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  400. package/src/domains/dispatch/active-route-planner.ts +2 -2
  401. package/src/domains/dispatch/agent-candidates.ts +1 -1
  402. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  403. package/src/domains/dispatch/agent-ledger.ts +1 -1
  404. package/src/domains/dispatch/assignment.ts +5 -5
  405. package/src/domains/dispatch/capability-match.ts +10 -0
  406. package/src/domains/dispatch/capacity-lease.ts +2 -5
  407. package/src/domains/dispatch/code-step.ts +1 -1
  408. package/src/domains/dispatch/contract.ts +2 -2
  409. package/src/domains/dispatch/extension.ts +169 -82
  410. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  411. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  412. package/src/domains/dispatch/fleet-run.ts +0 -7
  413. package/src/domains/dispatch/gate-decisions.ts +25 -14
  414. package/src/domains/dispatch/host-verification.ts +435 -39
  415. package/src/domains/dispatch/intent-requirements.ts +10 -0
  416. package/src/domains/dispatch/intent.ts +18 -1
  417. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  418. package/src/domains/dispatch/path-scope.ts +220 -70
  419. package/src/domains/dispatch/placement.ts +2 -2
  420. package/src/domains/dispatch/receipt-findings.ts +1 -1
  421. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  422. package/src/domains/dispatch/reservation-store.ts +0 -23
  423. package/src/domains/dispatch/route-decision.ts +1 -1
  424. package/src/domains/dispatch/route-history.ts +1 -1
  425. package/src/domains/dispatch/route-policy.ts +1 -1
  426. package/src/domains/dispatch/route-readiness.ts +0 -28
  427. package/src/domains/dispatch/run-event-journal.ts +9 -19
  428. package/src/domains/dispatch/state.ts +2 -3
  429. package/src/domains/dispatch/tool-stats.ts +1 -1
  430. package/src/domains/dispatch/transport.ts +47 -40
  431. package/src/domains/dispatch/types.ts +58 -6
  432. package/src/domains/dispatch/worker-protocol.ts +2 -2
  433. package/src/domains/eval/artifacts/store.ts +10 -4
  434. package/src/domains/eval/compare/thresholds.ts +0 -8
  435. package/src/domains/eval/execution-provenance.ts +1 -1
  436. package/src/domains/eval/metrics/token-stream.ts +0 -7
  437. package/src/domains/eval/report.ts +1 -1
  438. package/src/domains/eval/runner.ts +1 -1
  439. package/src/domains/eval/runners/clio-run.ts +7 -6
  440. package/src/domains/eval/runners/external-command.ts +4 -3
  441. package/src/domains/eval/schema/artifact.ts +1 -1
  442. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  443. package/src/domains/eval/schema/behavioral.ts +7 -6
  444. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  445. package/src/domains/eval/schema/naming.ts +10 -0
  446. package/src/domains/eval/schema/suite.ts +2 -2
  447. package/src/domains/eval/schema/validate.ts +9 -5
  448. package/src/domains/eval/schema/verdict.ts +4 -2
  449. package/src/domains/eval/store.ts +20 -3
  450. package/src/domains/eval/suites/run.ts +12 -6
  451. package/src/domains/eval/types.ts +1 -1
  452. package/src/domains/eval/workspaces/git.ts +1 -1
  453. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  454. package/src/domains/evidence/build.ts +13 -5
  455. package/src/domains/evidence/trust-status.ts +10 -1
  456. package/src/domains/extensions/contract.ts +15 -1
  457. package/src/domains/extensions/discovery.ts +238 -41
  458. package/src/domains/extensions/extension.ts +105 -6
  459. package/src/domains/extensions/index.ts +24 -0
  460. package/src/domains/extensions/integrity.ts +189 -0
  461. package/src/domains/extensions/manager.ts +17 -1
  462. package/src/domains/extensions/resource-path.ts +27 -0
  463. package/src/domains/extensions/resources.ts +18 -38
  464. package/src/domains/extensions/snapshot-store.ts +39 -0
  465. package/src/domains/extensions/snapshot.ts +180 -0
  466. package/src/domains/extensions/state.ts +385 -57
  467. package/src/domains/extensions/types.ts +118 -1
  468. package/src/domains/interop/consent.ts +7 -7
  469. package/src/domains/interop/extension.ts +1 -1
  470. package/src/domains/lifecycle/doctor.ts +27 -21
  471. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  472. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  473. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  474. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  475. package/src/domains/lifecycle/migrations/index.ts +22 -1
  476. package/src/domains/lifecycle/naming-history.ts +153 -0
  477. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  478. package/src/domains/lifecycle/naming-resources.ts +276 -0
  479. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  480. package/src/domains/lifecycle/naming-yazi.ts +86 -0
  481. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  482. package/src/domains/memory/task-memory-handoff.ts +6 -3
  483. package/src/domains/middleware/contract.ts +26 -0
  484. package/src/domains/middleware/extension.ts +24 -24
  485. package/src/domains/middleware/hook-receipts.ts +27 -4
  486. package/src/domains/middleware/hooks-io.ts +65 -32
  487. package/src/domains/middleware/hooks.ts +64 -0
  488. package/src/domains/middleware/index.ts +35 -4
  489. package/src/domains/middleware/marketplace-offer.ts +339 -0
  490. package/src/domains/middleware/registrations.ts +326 -0
  491. package/src/domains/middleware/runtime.ts +30 -2
  492. package/src/domains/middleware/snapshot.ts +20 -7
  493. package/src/domains/mux/contract.ts +195 -25
  494. package/src/domains/mux/detect.ts +23 -6
  495. package/src/domains/mux/dock-controller.ts +365 -0
  496. package/src/domains/mux/extension.ts +7 -1
  497. package/src/domains/mux/index.ts +21 -1
  498. package/src/domains/mux/operations.ts +72 -5
  499. package/src/domains/mux/protocol.ts +19 -6
  500. package/src/domains/mux/socket-client.ts +167 -19
  501. package/src/domains/mux/types.ts +49 -6
  502. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  503. package/src/domains/mux/yazi/event-stream.ts +6 -4
  504. package/src/domains/mux/yazi/profile.ts +1 -1
  505. package/src/domains/mux/yazi/session.ts +79 -7
  506. package/src/domains/mux/yazi/theme.ts +117 -17
  507. package/src/domains/observability/contract.ts +10 -11
  508. package/src/domains/observability/extension.ts +12 -4
  509. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  510. package/src/domains/observability/projection.ts +15 -91
  511. package/src/domains/observability/trace-store.ts +65 -19
  512. package/src/domains/prompts/compiler.ts +75 -55
  513. package/src/domains/prompts/contract.ts +15 -3
  514. package/src/domains/prompts/extension.ts +100 -12
  515. package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
  516. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  517. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  518. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  519. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  520. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  521. package/src/domains/prompts/fragments/operating/skills.md +11 -18
  522. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  523. package/src/domains/providers/extension.ts +5 -5
  524. package/src/domains/providers/index.ts +1 -1
  525. package/src/domains/providers/knowledge-base-path.ts +1 -1
  526. package/src/domains/providers/model-runtime-capabilities.ts +99 -23
  527. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  528. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
  529. package/src/domains/providers/plugins.ts +1 -1
  530. package/src/domains/providers/resolver.ts +1 -1
  531. package/src/domains/providers/runtime-resolution.ts +31 -0
  532. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  533. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  534. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
  536. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  537. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  538. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  539. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  540. package/src/domains/providers/types/cost-provenance.ts +19 -0
  541. package/src/domains/providers/types/knowledge-base.ts +13 -0
  542. package/src/domains/providers/types/local-model-quirks.ts +87 -39
  543. package/src/domains/providers/types/target-descriptor.ts +3 -3
  544. package/src/domains/resources/extension.ts +1 -1
  545. package/src/domains/resources/library.ts +6 -6
  546. package/src/domains/resources/prompts/loader.ts +1 -1
  547. package/src/domains/resources/skills/content-hash.ts +7 -6
  548. package/src/domains/resources/skills/evals.ts +1 -1
  549. package/src/domains/resources/skills/install.ts +36 -12
  550. package/src/domains/resources/skills/loader.ts +41 -18
  551. package/src/domains/resources/skills/marketplace.ts +21 -2
  552. package/src/domains/resources/skills/promotion.ts +214 -0
  553. package/src/domains/safety/audit.ts +2 -2
  554. package/src/domains/safety/call-target.ts +1 -1
  555. package/src/domains/safety/finish-contract.ts +2 -1
  556. package/src/domains/safety/loop-detector.ts +7 -4
  557. package/src/domains/safety/run-effects.ts +1 -1
  558. package/src/domains/scheduling/extension.ts +4 -4
  559. package/src/domains/session/archive-readers.ts +9 -1
  560. package/src/domains/session/compaction/branch-summary.ts +4 -0
  561. package/src/domains/session/compaction/compact.ts +1 -1
  562. package/src/domains/session/compaction/tokens.ts +4 -0
  563. package/src/domains/session/context-accounting.ts +1 -1
  564. package/src/domains/session/decision-board.ts +1 -1
  565. package/src/domains/session/extension.ts +1 -1
  566. package/src/domains/session/handoff.ts +2 -2
  567. package/src/domains/session/prompt-manifest.ts +0 -5
  568. package/src/domains/session/protected-artifact-journal.ts +12 -6
  569. package/src/domains/session/retry.ts +1 -1
  570. package/src/domains/session/task-board.ts +10 -9
  571. package/src/domains/share/archive.ts +249 -43
  572. package/src/domains/toolchain/install.ts +1 -1
  573. package/src/engine/acp/adapter.ts +3 -3
  574. package/src/engine/acp/event-mapper.ts +3 -3
  575. package/src/engine/acp/server.ts +89 -35
  576. package/src/engine/acp/tool-mediator.ts +2 -2
  577. package/src/engine/acp/types.ts +1 -1
  578. package/src/engine/alcf-oauth.ts +5 -5
  579. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  580. package/src/engine/api-registry.ts +1 -1
  581. package/src/engine/apis/llamacpp-residency.ts +4 -23
  582. package/src/engine/apis/lmstudio.ts +4 -9
  583. package/src/engine/apis/ollama-native.ts +9 -9
  584. package/src/engine/apis/openai-completions.ts +30 -27
  585. package/src/engine/apis/output-budget.ts +8 -18
  586. package/src/engine/apis/residency.ts +10 -35
  587. package/src/engine/claude/sdk-module.ts +1 -12
  588. package/src/engine/claude/sdk-runtime.ts +6 -6
  589. package/src/engine/claude/subprocess-runtime.ts +1 -1
  590. package/src/engine/claude/tool-safety.ts +4 -4
  591. package/src/engine/gemma-channel-filter.ts +19 -0
  592. package/src/engine/loop-guard.ts +92 -17
  593. package/src/engine/session.ts +14 -7
  594. package/src/engine/tui-primitives.ts +1 -1
  595. package/src/engine/worker-events.ts +6 -6
  596. package/src/engine/worker-runtime.ts +54 -24
  597. package/src/engine/worker-tools.ts +3 -1
  598. package/src/entry/extension-hook-sources.ts +28 -0
  599. package/src/entry/extension-reload.ts +309 -0
  600. package/src/entry/orchestrator.ts +163 -120
  601. package/src/interactive/application-controller.ts +23 -22
  602. package/src/interactive/bus-notices.ts +10 -3
  603. package/src/interactive/chat-loop-messages.ts +3 -13
  604. package/src/interactive/chat-loop.ts +18 -9
  605. package/src/interactive/chat-panel.ts +37 -14
  606. package/src/interactive/chat-renderer.ts +71 -7
  607. package/src/interactive/clio-editor.ts +105 -1
  608. package/src/interactive/context-activity.ts +8 -6
  609. package/src/interactive/context-meter.ts +3 -6
  610. package/src/interactive/context-overlay.ts +1 -1
  611. package/src/interactive/cost-overlay.ts +1 -1
  612. package/src/interactive/council-grid.ts +2 -2
  613. package/src/interactive/dispatch-board.ts +36 -44
  614. package/src/interactive/editor-bash.ts +21 -0
  615. package/src/interactive/editor-steer.ts +9 -4
  616. package/src/interactive/editor-submit.ts +24 -18
  617. package/src/interactive/external-editor.ts +1 -1
  618. package/src/interactive/file-reference-completion.ts +360 -0
  619. package/src/interactive/footer/dashboard.ts +15 -17
  620. package/src/interactive/footer/notifications.ts +14 -8
  621. package/src/interactive/footer/widgets.ts +15 -44
  622. package/src/interactive/interactive-application.ts +116 -61
  623. package/src/interactive/interactive-event-projection.ts +1 -1
  624. package/src/interactive/interactive-input-runtime.ts +6 -2
  625. package/src/interactive/interactive-presentation.ts +22 -17
  626. package/src/interactive/interactive-shell.ts +2 -2
  627. package/src/interactive/interactive-slash-runtime.ts +65 -17
  628. package/src/interactive/interactive-subscriptions.ts +1 -1
  629. package/src/interactive/interactive-tickers.ts +1 -1
  630. package/src/interactive/keybinding-manager.ts +4 -4
  631. package/src/interactive/layout.ts +1 -1
  632. package/src/interactive/memory-overlay.ts +2 -2
  633. package/src/interactive/modal-marker.ts +2 -21
  634. package/src/interactive/mutation-preview.ts +1 -1
  635. package/src/interactive/overlay-frame.ts +4 -12
  636. package/src/interactive/overlay-general-openers.ts +6 -2
  637. package/src/interactive/overlay-key-routing.ts +7 -7
  638. package/src/interactive/overlay-lifecycle.ts +1 -1
  639. package/src/interactive/overlay-model-selectors.ts +3 -3
  640. package/src/interactive/overlays/agents.ts +2 -2
  641. package/src/interactive/overlays/ask-user.ts +25 -11
  642. package/src/interactive/overlays/context-reset.ts +28 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  644. package/src/interactive/overlays/decisions.ts +4 -2
  645. package/src/interactive/overlays/extensions.ts +9 -1
  646. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  647. package/src/interactive/overlays/handoff-review.ts +2 -2
  648. package/src/interactive/overlays/help-reference.ts +13 -0
  649. package/src/interactive/overlays/interop.ts +1 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  651. package/src/interactive/overlays/message-picker.ts +1 -1
  652. package/src/interactive/overlays/model-selector.ts +39 -31
  653. package/src/interactive/overlays/prompts.ts +10 -4
  654. package/src/interactive/overlays/session-selector.ts +2 -2
  655. package/src/interactive/overlays/settings.ts +360 -303
  656. package/src/interactive/overlays/side-question.ts +2 -2
  657. package/src/interactive/overlays/skills-hub.ts +8 -8
  658. package/src/interactive/overlays/tree-selector.ts +2 -2
  659. package/src/interactive/panes-runtime.ts +145 -43
  660. package/src/interactive/permission-overlay.ts +2 -2
  661. package/src/interactive/prompt-cache-identity.ts +88 -0
  662. package/src/interactive/renderers/retry-status.ts +12 -4
  663. package/src/interactive/renderers/tool-execution.ts +4 -4
  664. package/src/interactive/session-transcript.ts +3 -3
  665. package/src/interactive/slash-autocomplete.ts +454 -165
  666. package/src/interactive/slash-commands.ts +401 -190
  667. package/src/interactive/slash-spec.ts +160 -17
  668. package/src/interactive/status/controller.ts +2 -2
  669. package/src/interactive/stream-pacing-policy.ts +1 -24
  670. package/src/interactive/tasks-overlay.ts +20 -13
  671. package/src/interactive/terminal-lease.ts +6 -7
  672. package/src/interactive/turn-context.ts +41 -26
  673. package/src/interactive/turn-persistence.ts +2 -2
  674. package/src/interactive/turn-prewarm.ts +2 -2
  675. package/src/interactive/turn-runtime.ts +8 -8
  676. package/src/interactive/turn-state.ts +1 -1
  677. package/src/interactive/view/artifacts.ts +12 -9
  678. package/src/interactive/view/view-overlay.ts +13 -10
  679. package/src/interactive/watch-pane.ts +38 -10
  680. package/src/interactive/welcome-dashboard.ts +15 -15
  681. package/src/interactive/worker-progress.ts +4 -4
  682. package/src/interactive/worker-receipts.ts +1 -1
  683. package/src/interactive/worker-stream.ts +1 -4
  684. package/src/interactive/yazi-bridge.ts +72 -11
  685. package/src/tools/agent-tools.ts +30 -1
  686. package/src/tools/artifact.ts +2 -2
  687. package/src/tools/ask-user.ts +6 -6
  688. package/src/tools/bash.ts +2 -2
  689. package/src/tools/bootstrap.ts +4 -0
  690. package/src/tools/builtin-tool-catalog.ts +52 -22
  691. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  692. package/src/tools/codewiki/code-nav.ts +99 -13
  693. package/src/tools/compete-worktrees.ts +27 -17
  694. package/src/tools/context/docs-engine.ts +20 -7
  695. package/src/tools/context/index.ts +44 -13
  696. package/src/tools/core-bootstrap.ts +28 -6
  697. package/src/tools/credential-present.ts +1 -2
  698. package/src/tools/dispatch-admission.ts +4 -2
  699. package/src/tools/dispatch-arguments.ts +6 -2
  700. package/src/tools/dispatch-plan.ts +48 -15
  701. package/src/tools/dispatch-run-events.ts +13 -11
  702. package/src/tools/dispatch-runner.ts +11 -6
  703. package/src/tools/dispatch-schema.ts +338 -0
  704. package/src/tools/dispatch-types.ts +3 -0
  705. package/src/tools/dispatch.ts +9 -254
  706. package/src/tools/find.ts +1 -6
  707. package/src/tools/ledger.ts +3 -5
  708. package/src/tools/monitor-surface.ts +5 -13
  709. package/src/tools/monitor.ts +4 -4
  710. package/src/tools/observation.ts +4 -5
  711. package/src/tools/observers.ts +0 -33
  712. package/src/tools/panes-surface.ts +4 -11
  713. package/src/tools/panes.ts +4 -2
  714. package/src/tools/policy.ts +15 -2
  715. package/src/tools/read.ts +5 -6
  716. package/src/tools/registry.ts +30 -7
  717. package/src/tools/result-shaping.ts +18 -14
  718. package/src/tools/steer-surface.ts +1 -1
  719. package/src/tools/task-worktree.ts +28 -7
  720. package/src/tools/tasks.ts +1 -1
  721. package/src/tools/truncate.ts +6 -5
  722. package/src/tools/verify/authoring.ts +3 -6
  723. package/src/tools/verify/frontend.ts +1 -1
  724. package/src/tools/verify/surface.ts +6 -12
  725. package/src/tools/web-fetch-surface.ts +1 -3
  726. package/src/tools/web-fetch.ts +1 -1
  727. package/src/worker/entry.ts +4 -3
  728. package/src/worker/protocol.ts +16 -14
  729. package/src/worker/spec-contract.ts +2 -2
  730. package/src/worker/stdin-demux.ts +2 -2
  731. package/dist/chunk-36EJLSQQ.js +0 -814
  732. package/dist/chunk-GXNLGKAB.js +0 -571
  733. package/dist/chunk-K7VKOLQQ.js +0 -15
  734. package/dist/chunk-PMZCIOCJ.js +0 -25
  735. package/dist/chunk-SUCTJL45.js +0 -45
  736. package/dist/chunk-SUW5DORT.js +0 -819
  737. package/dist/chunk-TZ3SGWZZ.js +0 -48
  738. package/dist/chunk-UOV2BYIW.js +0 -107
  739. package/dist/chunk-VFA6GDY5.js +0 -1625
  740. package/dist/doctor-QOA5FNY5.js +0 -313
  741. package/dist/fleet-view-ZCON35AG.js +0 -102
  742. package/dist/panes-HMABYVO4.js +0 -58
  743. package/docs/artifact-versions.md +0 -67
  744. package/docs/documentation-coverage.md +0 -46
  745. package/docs/documentation-guide.md +0 -167
  746. package/docs/release-cut-checklist.md +0 -193
  747. package/docs/time-conventions.md +0 -101
  748. package/skills/meta/clio-test/SKILL.md +0 -133
  749. package/skills/meta/clio-test/references/harness.md +0 -126
  750. package/skills/meta/clio-test/references/test-map.md +0 -69
  751. package/src/engine/apis/degraded-inference.ts +0 -95
@@ -6,32 +6,33 @@ import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-life
6
6
  export const APPLICATION_DOUBLE_TAP_MS = 500;
7
7
 
8
8
  const CLOSED_ACTION_ORDER = [
9
- "clio.notifications.dismiss",
10
- "clio.tool.expand",
11
- "clio.tool.expandAll",
12
- "clio.tool.liveOutput",
13
- "clio.editor.external",
14
- "clio.message.followUp",
15
- "clio.message.interrupt",
16
- "clio.message.dequeue",
17
- "clio.thinking.expand",
18
- "clio.thinking.expandAll",
9
+ "clio-coder.notifications.dismiss",
10
+ "clio-coder.tool.expand",
11
+ "clio-coder.tool.expandAll",
12
+ "clio-coder.tool.liveOutput",
13
+ "clio-coder.editor.external",
14
+ "clio-coder.message.followUp",
15
+ "clio-coder.message.interrupt",
16
+ "clio-coder.message.dequeue",
17
+ "clio-coder.thinking.expand",
18
+ "clio-coder.thinking.expandAll",
19
19
  ] as const satisfies ReadonlyArray<ClioKeybinding>;
20
20
 
21
- const GLOBAL_ACTION_ORDER = [
22
- "clio.status.toggle",
23
- "clio.thinking.cycle",
24
- "clio.session.tree",
25
- "clio.dispatchBoard.toggle",
26
- "clio.tasks.open",
27
- "clio.decisions.open",
28
- "clio.dispatch.background",
29
- "clio.model.select",
21
+ export const GLOBAL_ACTION_ORDER = [
22
+ "clio-coder.status.toggle",
23
+ "clio-coder.thinking.cycle",
24
+ "clio-coder.session.tree",
25
+ "clio-coder.dispatchBoard.toggle",
26
+ "clio-coder.files.toggle",
27
+ "clio-coder.tasks.open",
28
+ "clio-coder.decisions.open",
29
+ "clio-coder.dispatch.background",
30
+ "clio-coder.model.select",
30
31
  // Backward stays ahead of forward so prefix-overlapping user bindings keep
31
32
  // the same more-specific-first behavior as the original input listener.
32
- "clio.model.cycleBackward",
33
- "clio.model.cycleForward",
34
- "clio.exit",
33
+ "clio-coder.model.cycleBackward",
34
+ "clio-coder.model.cycleForward",
35
+ "clio-coder.exit",
35
36
  ] as const satisfies ReadonlyArray<ClioKeybinding>;
36
37
 
37
38
  export type CtrlCAction = "cancel-stream" | "close-overlay" | "clear-editor" | "arm-shutdown" | "shutdown";
@@ -72,7 +72,7 @@ function isSafetyBlockedPayload(value: unknown): value is SafetyBlockedPayload {
72
72
  function isMiddlewareHookFailedPayload(value: unknown): value is MiddlewareHookFailedPayload {
73
73
  if (!value || typeof value !== "object") return false;
74
74
  const p = value as Record<string, unknown>;
75
- if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded") return false;
75
+ if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded" && p.kind !== "registration_conflict") return false;
76
76
  if (typeof p.registrationId !== "string" || p.registrationId.length === 0) return false;
77
77
  if (typeof p.hook !== "string" || p.hook.length === 0) return false;
78
78
  if (p.message !== undefined && typeof p.message !== "string") return false;
@@ -125,7 +125,7 @@ function workerEscalationAxis(
125
125
  return null;
126
126
  }
127
127
 
128
- export function middlewareBudgetWarningKey(payload: unknown): string | null {
128
+ function middlewareBudgetWarningKey(payload: unknown): string | null {
129
129
  if (!isMiddlewareHookFailedPayload(payload)) return null;
130
130
  if (payload.kind !== "budget_exceeded") return null;
131
131
  return `${payload.registrationId}\u0000${payload.hook}`;
@@ -137,11 +137,18 @@ export function middlewareBudgetWarningKey(payload: unknown): string | null {
137
137
  * either way; this warn notice is the operator's only interactive signal
138
138
  * that a guard or assessor is misbehaving.
139
139
  */
140
- export function middlewareHookFailedNotice(
140
+ function middlewareHookFailedNotice(
141
141
  payload: unknown,
142
142
  options: MiddlewareHookFailedNoticeOptions = {},
143
143
  ): BusNotice | null {
144
144
  if (!isMiddlewareHookFailedPayload(payload)) return null;
145
+ if (payload.kind === "registration_conflict") {
146
+ const detail =
147
+ payload.message !== undefined && payload.message.length > 0
148
+ ? payload.message
149
+ : `registration '${payload.registrationId}' conflicts with an existing id`;
150
+ return { level: "warn", text: `[middleware] ${detail}` };
151
+ }
145
152
  if (payload.kind === "hook_failed") {
146
153
  const detail = payload.message !== undefined && payload.message.length > 0 ? `: ${payload.message}` : "";
147
154
  return {
@@ -21,12 +21,13 @@ import {
21
21
  } from "../core/response-model-id.js";
22
22
  import type { PendingSkillRequest, PendingSkillToolPolicy, SkillDeclaredToolPolicy } from "../core/skill-activation.js";
23
23
  import { ToolNames } from "../core/tool-names.js";
24
- import { canonicalJson, sha256 } from "../domains/prompts/hash.js";
24
+ import { sha256 } from "../domains/prompts/hash.js";
25
25
  import { toContextOverflowError } from "../domains/providers/errors.js";
26
26
  import type { ResolvedRuntimeTarget } from "../domains/providers/index.js";
27
27
  import { ceilChars, extractReasoningTokens } from "../domains/session/context-accounting.js";
28
28
  import type { AgentMessage } from "../engine/types.js";
29
29
  import type { AskUserToolPolicy } from "../tools/registry.js";
30
+ import { attachedToolSchemaBytes, attachedToolSchemasFromState } from "./prompt-cache-identity.js";
30
31
 
31
32
  /** Minimal structural view of the engine agent used by state-inspection helpers. */
32
33
  export interface AgentStateView {
@@ -291,18 +292,7 @@ export function pendingSkillRequestPreamble(requests: ReadonlyArray<PendingSkill
291
292
  * tool-surface change.
292
293
  */
293
294
  export function toolSignatureFromState(tools: ReadonlyArray<unknown>): string {
294
- const schemas: Array<{ name: string; description: string; parameters: unknown }> = [];
295
- for (const tool of tools) {
296
- if (!tool || typeof tool !== "object" || Array.isArray(tool)) continue;
297
- const record = tool as Record<string, unknown>;
298
- schemas.push({
299
- name: typeof record.name === "string" ? record.name : "",
300
- description: typeof record.description === "string" ? record.description : "",
301
- parameters: record.parameters ?? null,
302
- });
303
- }
304
- schemas.sort((a, b) => a.name.localeCompare(b.name));
305
- return sha256(canonicalJson(schemas));
295
+ return sha256(attachedToolSchemaBytes(attachedToolSchemasFromState(tools)));
306
296
  }
307
297
 
308
298
  /**
@@ -215,7 +215,7 @@ export interface ChatSubmitOptions {
215
215
  * the turn runtime's own local fallback, so a `/btw` round against a local
216
216
  * server authenticates exactly the way a turn against it does.
217
217
  */
218
- const LOCAL_SIDE_QUESTION_API_KEY = "clio-local-target";
218
+ const LOCAL_SIDE_QUESTION_API_KEY = "clio-coder-local-target";
219
219
 
220
220
  /** Closing notice an operator interrupt leaves in the transcript and the ledger. */
221
221
  const INTERRUPT_CANCEL_REASON = "[Clio Coder] run interrupted by operator; delivering the new message now.";
@@ -372,7 +372,7 @@ export interface CreateChatLoopDeps {
372
372
  /**
373
373
  * Whitelist of target ids that the chat-loop is allowed to drive. The
374
374
  * orchestrator composes this from `providers.list()` so an unknown
375
- * `settings.orchestrator.target` surfaces a configuration error before
375
+ * `settings.chat.target` surfaces a configuration error before
376
376
  * the agent is constructed.
377
377
  */
378
378
  knownTargets: () => ReadonlySet<string>;
@@ -527,7 +527,7 @@ export interface CreateChatLoopDeps {
527
527
  registerPrewarmEndpointSlot?: (runtime: AgentRuntime) => (() => void) | null;
528
528
  }
529
529
 
530
- export function reloadProtectedArtifactsForSession(
530
+ function reloadProtectedArtifactsForSession(
531
531
  protectedArtifacts: NonNullable<CreateChatLoopDeps["protectedArtifacts"]>,
532
532
  readSessionEntries: (() => ReadonlyArray<SessionEntry>) | undefined,
533
533
  ): void {
@@ -547,7 +547,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
547
547
  const sideQuestionRound = deps.runSideQuestion ?? runSideQuestion;
548
548
  const handoffRound = deps.runHandoffRound ?? runHandoffRound;
549
549
  const middlewareToolChoice = deps.middlewareToolChoice ?? createMiddlewareToolChoiceControl();
550
- const state = createTurnState(deps.getSettings().orchestrator.thinkingLevel ?? "off");
550
+ const state = createTurnState(deps.getSettings().chat.thinkingLevel ?? "off");
551
551
  const toolStartTimes = new Map<string, number>();
552
552
 
553
553
  const preparationListeners = new Set<(phase: TurnPreparationPhase) => void>();
@@ -639,16 +639,18 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
639
639
  * collapsing them sent a client with a configured target to the wrong fix.
640
640
  */
641
641
  const nullRuntimeAdmissionReason = (): string => {
642
- const orchestrator = deps.getSettings().orchestrator;
642
+ const orchestrator = deps.getSettings().chat;
643
643
  const target = orchestrator.target?.trim() ?? "";
644
644
  const model = orchestrator.model?.trim() ?? "";
645
645
  return target.length > 0 && model.length === 0 ? "model-not-configured" : "orchestrator-not-configured";
646
646
  };
647
647
 
648
- const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().retry);
648
+ const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().chat.retry);
649
649
 
650
650
  const currentToolInvokeOptions = (): Partial<ToolInvokeOptions> => {
651
- const options: Partial<ToolInvokeOptions> = {};
651
+ const options: Partial<ToolInvokeOptions> = {
652
+ toolResultMaxBytes: deps.getSettings().context.toolResultMaxBytes,
653
+ };
652
654
  const sessionId = deps.session?.current()?.id ?? null;
653
655
  if (sessionId) options.sessionId = sessionId;
654
656
  const turnId = state.activeUserTurnId ?? state.lastTurnId;
@@ -764,6 +766,12 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
764
766
  deps.bus?.on(BusChannels.ConfigHotReload, () => {
765
767
  context.invalidateSessionPromptCache();
766
768
  }) ?? null;
769
+ // A committed extension generation with new content can change the skill
770
+ // and prompt inputs the session prompt compiles from; same invalidation.
771
+ const unsubscribeExtensionsReload =
772
+ deps.bus?.on(BusChannels.ExtensionsReloaded, (payload) => {
773
+ if (payload.changed) context.invalidateSessionPromptCache();
774
+ }) ?? null;
767
775
 
768
776
  const unsubscribeSynthesisLock =
769
777
  deps.bus?.on(BusChannels.LoopBlocked, (payload) => {
@@ -1088,7 +1096,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1088
1096
  // 4. Preflight overflow check, before the user turn is committed.
1089
1097
  // A blocked request must not leave a dangling user entry that the
1090
1098
  // next replay would treat as an unanswered turn.
1091
- const compactionThreshold = deps.getSettings().compaction?.threshold ?? null;
1099
+ const compactionThreshold = deps.getSettings().context.compaction?.threshold ?? null;
1092
1100
  const captureTurnSnapshot = (turnId: string): ContextSnapshot =>
1093
1101
  context.captureRuntimeContextSnapshot(agentRuntime, turnId, compactionThreshold, {
1094
1102
  promptSegments: compiledPrompt
@@ -1179,7 +1187,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1179
1187
  runtimeId: agentRuntime.runtimeId,
1180
1188
  runtimeKind: agentRuntime.runtimeResolution.runtimeKind,
1181
1189
  wireModelId: agentRuntime.wireModelId,
1182
- autonomy: deps.getSettings().autonomy,
1190
+ autonomy: deps.getSettings().safety.autonomy,
1183
1191
  compiledPromptHash: promptHash,
1184
1192
  staticCompositionHash: promptHash,
1185
1193
  promptSignature: promptHash,
@@ -1417,6 +1425,7 @@ export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
1417
1425
 
1418
1426
  dispose(): void {
1419
1427
  unsubscribeConfigReload?.();
1428
+ unsubscribeExtensionsReload?.();
1420
1429
  unsubscribeSynthesisLock?.();
1421
1430
  unsubscribePrewarmCompaction();
1422
1431
  prewarm.dispose();
@@ -384,7 +384,7 @@ export interface ChatPanel extends Component {
384
384
 
385
385
  export interface ChatPanelOptions {
386
386
  /**
387
- * Resolves the user-visible key string for the `clio.tool.expand`
387
+ * Resolves the user-visible key string for the `clio-coder.tool.expand`
388
388
  * action, which folds and unfolds the newest tool call or worker block.
389
389
  * Returning a non-empty string surfaces a dim ` (<key>)` hint on the one
390
390
  * surface the key would act on: the latest finished collapsed tool subline,
@@ -603,30 +603,53 @@ function hasStreamingText(entry: Extract<TranscriptEntry, { role: "assistant" }>
603
603
  }
604
604
 
605
605
  /**
606
- * Split a reply that opens with the skill-suggestion protocol line into that
607
- * line and the answer beneath it.
606
+ * Locate the skill-suggestion protocol line inside a reply.
608
607
  *
609
- * The prompt asks the model to *begin its reply* with the suggestion, so the
610
- * usual shape is one segment holding both. Classifying that whole segment as
611
- * advisory left the turn with no voice glyph at all: the suggestion did not
612
- * claim it and the answer never got the chance. Returns null when the segment
613
- * is only a suggestion, which stays advisory in full.
608
+ * The prompt asks the model to begin its reply with the line, but a model
609
+ * that narrates its work first puts the line at the end of the final message
610
+ * about half the time (round-4 skill batches: 1/2 and 0/2 opened, 2/2 fired).
611
+ * The line is recognized at the start of any line, provided it is complete
612
+ * (a newline follows it, or the segment is finalized), so a partially
613
+ * streamed line stays ordinary prose until it is whole. Returns the line's
614
+ * byte range or null.
615
+ */
616
+ function findSkillSuggestionLine(seg: TextSegment): { start: number; end: number } | null {
617
+ const text = seg.text;
618
+ let at = text.startsWith(SKILL_SUGGESTION_PREFIX) ? 0 : text.indexOf(`\n${SKILL_SUGGESTION_PREFIX}`);
619
+ if (at < 0) return null;
620
+ if (at > 0) at += 1;
621
+ const lineEnd = text.indexOf("\n", at);
622
+ if (lineEnd < 0) return seg.finalized ? { start: at, end: text.length } : null;
623
+ return { start: at, end: lineEnd };
624
+ }
625
+
626
+ /**
627
+ * Split a reply that carries the skill-suggestion protocol line into that
628
+ * line and the answer around it.
629
+ *
630
+ * The usual shape is one segment holding both. Classifying that whole segment
631
+ * as advisory left the turn with no voice glyph at all: the suggestion did not
632
+ * claim it and the answer never got the chance. The suggestion renders first
633
+ * wherever the model put it, and the answer is the rest of the segment with
634
+ * that line removed. Returns null when the segment is only a suggestion,
635
+ * which stays advisory in full.
614
636
  */
615
637
  function skillSuggestionSplit(seg: TextSegment): { suggestion: string; answer: TextSegment } | null {
616
- if (!seg.text.startsWith(SKILL_SUGGESTION_PREFIX)) return null;
617
- const breakIndex = seg.text.indexOf("\n");
618
- if (breakIndex < 0) return null;
638
+ const found = findSkillSuggestionLine(seg);
639
+ if (!found) return null;
640
+ const before = seg.text.slice(0, found.start).replace(/\n+$/, "");
641
+ const after = seg.text.slice(found.end + 1).replace(/^\n+/, "");
619
642
  // A model that puts a blank line between the suggestion and the answer left
620
643
  // the remainder opening with a newline, so the first rendered row was empty
621
644
  // and took the glyph the answer's own text row was owed.
622
- const answerText = seg.text.slice(breakIndex + 1).replace(/^\n+/, "");
645
+ const answerText = before.length > 0 && after.length > 0 ? `${before}\n${after}` : before + after;
623
646
  if (answerText.trim().length === 0) return null;
624
647
  const split = seg.suggestionSplit ?? {
625
648
  suggestion: "",
626
649
  answer: { kind: "text", text: answerText, finalized: seg.finalized } as TextSegment,
627
650
  };
628
651
  seg.suggestionSplit = split;
629
- split.suggestion = seg.text.slice(0, breakIndex);
652
+ split.suggestion = seg.text.slice(found.start, found.end).replace(/\r$/, "");
630
653
  const answer = split.answer;
631
654
  if (answer.text === answerText && answer.finalized === seg.finalized) return split;
632
655
  // The answer half follows the same cache rules as any other segment: the
@@ -1113,7 +1136,7 @@ function renderEntryLines(
1113
1136
  const rendered =
1114
1137
  seg.kind === "text" ? renderTextSegmentLines(seg, proseWidth) : renderErrorSegmentLines(seg, proseWidth);
1115
1138
  if (rendered.length === 0) continue;
1116
- const isSkillSuggestion = seg.kind === "text" && seg.text.startsWith(SKILL_SUGGESTION_PREFIX);
1139
+ const isSkillSuggestion = seg.kind === "text" && findSkillSuggestionLine(seg) !== null;
1117
1140
  if (!labeled && !isSkillSuggestion) {
1118
1141
  lines.push(...hangProseLines(rendered, clioPrefix));
1119
1142
  labeled = true;
@@ -460,15 +460,73 @@ function richMessageFromEntry(entry: MessageEntry, maxTextChars?: number): Agent
460
460
  return message as unknown as AgentMessage;
461
461
  }
462
462
 
463
- function recordToolCallsFromMessage(message: AgentMessage, seen: Set<string>): void {
463
+ function toolCallIdsFromMessage(message: AgentMessage): string[] {
464
464
  const content = (message as { content?: unknown }).content;
465
- if (!Array.isArray(content)) return;
465
+ if (!Array.isArray(content)) return [];
466
+ const ids: string[] = [];
466
467
  for (const block of content) {
467
468
  if (!block || typeof block !== "object") continue;
468
469
  const b = block as Record<string, unknown>;
469
470
  if (b.type !== "toolCall") continue;
470
- if (typeof b.id === "string" && b.id.length > 0) seen.add(b.id);
471
+ if (typeof b.id === "string" && b.id.length > 0) ids.push(b.id);
471
472
  }
473
+ return ids;
474
+ }
475
+
476
+ function recordToolCallsFromMessage(message: AgentMessage, seen: Set<string>): void {
477
+ for (const id of toolCallIdsFromMessage(message)) seen.add(id);
478
+ }
479
+
480
+ /**
481
+ * Replay sink that hands tool results to the model in the order the assistant
482
+ * issued the calls.
483
+ *
484
+ * The ledger appends a tool result when its tool finishes, while the live loop
485
+ * appends a parallel batch's results by call index (pi executes the batch and
486
+ * pushes results in the assistant's order). A two-call turn whose second call
487
+ * finished first is therefore recorded as [b, a] and was sent as [a, b]. A
488
+ * resume that replayed the ledger order sent different bytes from that point
489
+ * on, and the provider's prefix cache missed for the rest of the session.
490
+ * Results are staged until the next non-result message and released in call
491
+ * order; an id the staged assistant turn never issued keeps its ledger order
492
+ * after the known ones.
493
+ */
494
+ function createOrderedReplaySink(): {
495
+ messages: AgentMessage[];
496
+ push(message: AgentMessage): void;
497
+ stageToolResult(message: AgentMessage): void;
498
+ flush(): void;
499
+ } {
500
+ const messages: AgentMessage[] = [];
501
+ let callOrder: string[] = [];
502
+ let staged: AgentMessage[] = [];
503
+ const rank = (message: AgentMessage): number => {
504
+ const id = (message as { toolCallId?: unknown }).toolCallId;
505
+ const index = typeof id === "string" ? callOrder.indexOf(id) : -1;
506
+ return index < 0 ? Number.MAX_SAFE_INTEGER : index;
507
+ };
508
+ const flush = (): void => {
509
+ if (staged.length === 0) return;
510
+ staged.sort((a, b) => rank(a) - rank(b));
511
+ messages.push(...staged);
512
+ staged = [];
513
+ callOrder = [];
514
+ };
515
+ return {
516
+ messages,
517
+ flush,
518
+ push(message) {
519
+ flush();
520
+ messages.push(message);
521
+ // Consecutive assistant messages (one legacy standalone tool_call entry
522
+ // per call) share one batch; anything else starts a new one.
523
+ if (message.role === "assistant") callOrder.push(...toolCallIdsFromMessage(message));
524
+ else callOrder = [];
525
+ },
526
+ stageToolResult(message) {
527
+ staged.push(message);
528
+ },
529
+ };
472
530
  }
473
531
 
474
532
  function toolCallMessageFromEntry(entry: MessageEntry): AgentMessage {
@@ -998,7 +1056,12 @@ function bashContextText(entry: BashExecutionEntry): string {
998
1056
  return bashExecutionToText(message);
999
1057
  }
1000
1058
 
1001
- function appendContextMessage(out: AgentMessage[], role: "user" | "assistant", text: string, timestamp: string): void {
1059
+ function appendContextMessage(
1060
+ out: { push(message: AgentMessage): void },
1061
+ role: "user" | "assistant",
1062
+ text: string,
1063
+ timestamp: string,
1064
+ ): void {
1002
1065
  const trimmed = text.trim();
1003
1066
  if (trimmed.length === 0) return;
1004
1067
  out.push(makeTextMessage(role, truncateReplayText(trimmed), timestamp));
@@ -1014,7 +1077,7 @@ export function buildReplayAgentMessagesFromTurns(
1014
1077
  turns: ReadonlyArray<SessionEntry>,
1015
1078
  options: RehydrateChatPanelOptions = {},
1016
1079
  ): AgentMessage[] {
1017
- const out: AgentMessage[] = [];
1080
+ const out = createOrderedReplaySink();
1018
1081
  const seenToolCalls = new Set<string>();
1019
1082
  for (const entry of selectReplayEntries(turns, options)) {
1020
1083
  switch (entry.kind) {
@@ -1035,7 +1098,7 @@ export function buildReplayAgentMessagesFromTurns(
1035
1098
  recordToolCallsFromMessage(message, seenToolCalls);
1036
1099
  }
1037
1100
  } else if (entry.role === "tool_result") {
1038
- out.push(toolResultMessageFromEntry(entry));
1101
+ out.stageToolResult(toolResultMessageFromEntry(entry));
1039
1102
  } else if (entry.role === "system") {
1040
1103
  appendContextMessage(out, "user", `System note: ${text}`, entry.timestamp);
1041
1104
  }
@@ -1082,7 +1145,8 @@ export function buildReplayAgentMessagesFromTurns(
1082
1145
  break;
1083
1146
  }
1084
1147
  }
1085
- return out;
1148
+ out.flush();
1149
+ return out.messages;
1086
1150
  }
1087
1151
 
1088
1152
  /**
@@ -1,4 +1,12 @@
1
- import { Editor, stripTerminalSequences, type TUI, truncateToWidth, visibleWidth } from "../engine/tui.js";
1
+ import {
2
+ Editor,
3
+ getKeybindings,
4
+ stripTerminalSequences,
5
+ type TUI,
6
+ truncateToWidth,
7
+ visibleWidth,
8
+ } from "../engine/tui.js";
9
+ import { guardPastedEditorOperator } from "./editor-bash.js";
2
10
  import { fitHintEntries } from "./overlay-frame.js";
3
11
  import { type PermissionInspectionHint, permissionHintEntries } from "./permission-hint.js";
4
12
  import type { ClioTheme } from "./theme/index.js";
@@ -154,7 +162,50 @@ function findBottomRail(lines: readonly string[], width: number): number {
154
162
  return -1;
155
163
  }
156
164
 
165
+ function cursorEndsDirectoryPath(editor: Editor): boolean {
166
+ const cursor = editor.getCursor();
167
+ const line = editor.getLines()[cursor.line] ?? "";
168
+ return line.slice(0, cursor.col).endsWith("/");
169
+ }
170
+
171
+ function remapPastedBangOffsets(
172
+ before: string,
173
+ after: string,
174
+ offsets: ReadonlySet<number>,
175
+ markInsertedAsPasted: boolean,
176
+ ): Set<number> {
177
+ let prefix = 0;
178
+ while (prefix < before.length && prefix < after.length && before[prefix] === after[prefix]) prefix += 1;
179
+ let beforeEnd = before.length;
180
+ let afterEnd = after.length;
181
+ while (beforeEnd > prefix && afterEnd > prefix && before[beforeEnd - 1] === after[afterEnd - 1]) {
182
+ beforeEnd -= 1;
183
+ afterEnd -= 1;
184
+ }
185
+
186
+ const next = new Set<number>();
187
+ const shift = afterEnd - prefix - (beforeEnd - prefix);
188
+ for (const offset of offsets) {
189
+ if (offset < prefix) next.add(offset);
190
+ else if (offset >= beforeEnd) next.add(offset + shift);
191
+ }
192
+ if (markInsertedAsPasted) {
193
+ for (let offset = prefix; offset < afterEnd; offset += 1) {
194
+ if (after[offset] === "!") next.add(offset);
195
+ }
196
+ }
197
+ return next;
198
+ }
199
+
200
+ function startsWithPastedOperator(text: string, pastedBangOffsets: ReadonlySet<number>): boolean {
201
+ const first = text.search(/\S/u);
202
+ return first >= 0 && text[first] === "!" && pastedBangOffsets.has(first);
203
+ }
204
+
157
205
  export class ClioEditor extends Editor {
206
+ private pastedBangOffsets = new Set<number>();
207
+ private bracketedPasteActive = false;
208
+
158
209
  constructor(
159
210
  tui: TUI,
160
211
  private readonly chrome: EditorChrome,
@@ -213,6 +264,15 @@ export class ClioEditor extends Editor {
213
264
  return lines;
214
265
  }
215
266
 
267
+ /**
268
+ * Preserve paste provenance for every immediate-send binding, including the
269
+ * alternate paths that invoke the submit controller without an Editor Enter.
270
+ */
271
+ getTextForSubmit(): string {
272
+ const text = this.getExpandedText();
273
+ return startsWithPastedOperator(this.getText(), this.pastedBangOffsets) ? guardPastedEditorOperator(text) : text;
274
+ }
275
+
216
276
  /**
217
277
  * pi-tui's bracketed-paste handling inserts pasted text (including a
218
278
  * trailing newline the paste carried) without submitting: a pasted
@@ -222,8 +282,46 @@ export class ClioEditor extends Editor {
222
282
  * through the same handler the typed-Enter path uses.
223
283
  */
224
284
  override handleInput(data: string): void {
285
+ const openedPaste = data.includes("\x1b[200~");
225
286
  const closedPaste = data.includes("\x1b[201~");
287
+ const pasteMutation = this.bracketedPasteActive || openedPaste;
288
+ const textBeforeInput = this.getText();
289
+ const keybindings = getKeybindings();
290
+ // Pi expands and trims the buffer immediately before onSubmit. Envelope a
291
+ // pasted bang draft for that synchronous handoff so the Bash parser can
292
+ // distinguish it from a typed operator; the submit controller unwraps it
293
+ // before sending the literal prompt onward.
294
+ if (
295
+ startsWithPastedOperator(textBeforeInput, this.pastedBangOffsets) &&
296
+ keybindings.matches(data, "tui.input.submit")
297
+ ) {
298
+ const pastedText = this.getTextForSubmit();
299
+ this.pastedBangOffsets.clear();
300
+ this.bracketedPasteActive = false;
301
+ super.setText(pastedText);
302
+ super.handleInput(data);
303
+ return;
304
+ }
305
+ const completingDirectory =
306
+ this.isShowingAutocomplete() &&
307
+ (keybindings.matches(data, "tui.input.tab") || keybindings.matches(data, "tui.select.confirm"));
308
+ const textBeforeCompletion = completingDirectory ? this.getText() : "";
226
309
  super.handleInput(data);
310
+ if (completingDirectory && this.getText() !== textBeforeCompletion && cursorEndsDirectoryPath(this)) {
311
+ // Directory rows are submenus on the same provider. Re-open immediately
312
+ // after acceptance so ↑/↓ continues in the child tree without requiring
313
+ // a second Tab. Pi's provider request remains the only completion path.
314
+ super.handleInput("\t");
315
+ }
316
+ const textAfterInput = this.getText();
317
+ this.pastedBangOffsets = remapPastedBangOffsets(
318
+ textBeforeInput,
319
+ textAfterInput,
320
+ this.pastedBangOffsets,
321
+ pasteMutation,
322
+ );
323
+ if (openedPaste) this.bracketedPasteActive = true;
324
+ if (closedPaste) this.bracketedPasteActive = false;
227
325
  if (!closedPaste) return;
228
326
  const text = this.getText();
229
327
  if (!text.endsWith("\n")) return;
@@ -232,4 +330,10 @@ export class ClioEditor extends Editor {
232
330
  this.setText("");
233
331
  this.onSubmit?.(command);
234
332
  }
333
+
334
+ override setText(text: string): void {
335
+ this.pastedBangOffsets.clear();
336
+ this.bracketedPasteActive = false;
337
+ super.setText(text);
338
+ }
235
339
  }
@@ -6,6 +6,7 @@ import {
6
6
  type ContextActivityStatus,
7
7
  } from "../core/bus-events.js";
8
8
  import type { SafeEventBus } from "../core/event-bus.js";
9
+ import { wrapTextWithAnsi } from "../engine/tui.js";
9
10
  import { type ClioTheme, clioTheme, formatCompactMs, frame, GLYPH, padAnsi, spinnerFrame } from "./theme/index.js";
10
11
 
11
12
  export interface ContextActivitySnapshot {
@@ -152,17 +153,18 @@ export function formatContextActivityIslandLines(
152
153
  const percent = `${Math.round(activityProgress(activity) * 100)}%`.padStart(4);
153
154
  const progressLine = `${progressBar(theme, activity, barWidth)} ${theme.fg("dim", percent)}`;
154
155
  const message = theme.fg(activity.status === "failed" ? "error" : "muted", activity.message);
155
- // Every row here can outrun a narrow island: at 40 columns the trail stopped
156
- // at "sta" and the message at "refreshed pr", each reading as the whole
157
- // value. padAnsi's default marker is empty, so the marker is passed
158
- // explicitly. The progress bar is sized to fit and never cuts.
156
+ // The trail is compact navigation chrome and marks its cut. The message and
157
+ // detail are the only explanation of this operation, so they wrap in full.
158
+ // The progress bar is sized to fit and never cuts.
159
159
  const body = [
160
160
  padAnsi(topLine, bodyWidth, GLYPH.ellipsis),
161
161
  padAnsi(progressLine, bodyWidth),
162
162
  phaseTrail(theme, activity, bodyWidth),
163
- padAnsi(message, bodyWidth, GLYPH.ellipsis),
163
+ ...wrapTextWithAnsi(message, bodyWidth).map((line) => padAnsi(line, bodyWidth)),
164
164
  ];
165
- if (activity.detail) body.push(padAnsi(theme.fg("dim", activity.detail), bodyWidth, GLYPH.ellipsis));
165
+ if (activity.detail) {
166
+ body.push(...wrapTextWithAnsi(theme.fg("dim", activity.detail), bodyWidth).map((line) => padAnsi(line, bodyWidth)));
167
+ }
166
168
  return frame(theme, "Context", body, width);
167
169
  }
168
170
 
@@ -23,7 +23,7 @@ export const CONTEXT_CATEGORY_TOKEN: Readonly<Record<ContextLedgerCategory, Clio
23
23
  streaming: "accent",
24
24
  };
25
25
 
26
- export function contextCategoryGlyph(category: ContextLedgerCategory): string {
26
+ function contextCategoryGlyph(category: ContextLedgerCategory): string {
27
27
  const filled = visibleSingle(GLYPH.contextFull) ? GLYPH.contextFull : GLYPH.barFull;
28
28
  const free = visibleSingle(GLYPH.contextFree) ? GLYPH.contextFree : GLYPH.barEmpty;
29
29
  // The autocompact reserve is held-back headroom, not consumed context; it
@@ -187,7 +187,7 @@ export type WorkerContextSeverity = "healthy" | "warn" | "critical";
187
187
  export const WORKER_CONTEXT_WARN_PCT = 80;
188
188
  export const WORKER_CONTEXT_CRITICAL_PCT = 95;
189
189
 
190
- export function workerContextSeverity(pct: number): WorkerContextSeverity {
190
+ function workerContextSeverity(pct: number): WorkerContextSeverity {
191
191
  if (pct >= WORKER_CONTEXT_CRITICAL_PCT) return "critical";
192
192
  if (pct >= WORKER_CONTEXT_WARN_PCT) return "warn";
193
193
  return "healthy";
@@ -211,10 +211,7 @@ export interface WorkerContextView {
211
211
  * usage has been observed yet. The percentage is capped at 100: a provider
212
212
  * report past the window is a full window, not a >100% claim.
213
213
  */
214
- export function workerContextView(
215
- usedTokens: number,
216
- contextWindow: number | undefined | null,
217
- ): WorkerContextView | null {
214
+ function workerContextView(usedTokens: number, contextWindow: number | undefined | null): WorkerContextView | null {
218
215
  if (contextWindow === undefined || contextWindow === null || contextWindow <= 0) return null;
219
216
  if (!Number.isFinite(usedTokens) || usedTokens <= 0) return null;
220
217
  const pct = Math.min(100, Math.round((usedTokens / contextWindow) * 100));
@@ -166,7 +166,7 @@ function renderWorkingSetLines(view: WorkingSetView, config: WorkingSetConfigVie
166
166
  ];
167
167
  }
168
168
 
169
- export function renderContextLedgerLines(
169
+ function renderContextLedgerLines(
170
170
  ledger: ContextLedger,
171
171
  contentWidth: number,
172
172
  workingSet?: WorkingSetView | null,
@@ -271,7 +271,7 @@ function modelBlock(row: CostRow): string[] {
271
271
  ]);
272
272
  }
273
273
 
274
- export function formatCostOverlayBodyLines(
274
+ function formatCostOverlayBodyLines(
275
275
  totalCost: CostAggregate,
276
276
  totalTokens: number,
277
277
  rows: ReadonlyArray<CostRow>,