@iowarp/clio-coder 0.4.5 → 0.4.7

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 (700) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +74 -0
  3. package/CONTRIBUTING.md +116 -38
  4. package/NOTICE +24 -0
  5. package/README.md +341 -682
  6. package/dist/{acp-H3CU2HBQ.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-IXQQZ7BD.js → agents-J4ICNLQ3.js} +57 -56
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-R7KYF7N3.js → auth-X2UJUMOC.js} +25 -25
  13. package/dist/{builtins-CRFDQUVP.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-SE4ZKILO.js → chunk-3XE4NRLF.js} +30 -9
  20. package/dist/{chunk-YYB3MC65.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-FKIOX6DS.js → chunk-4QKAITQT.js} +10 -5
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-VLPTKCKT.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-RXIOCVBZ.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-T53XI6I7.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-HR3HPQ76.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-WFKDPU7U.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-ZMZQEBKI.js → chunk-7EEGBKV4.js} +11 -11
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-MDU3C27C.js → chunk-BO4XV5VX.js} +8 -8
  36. package/dist/{chunk-KF6GFW6O.js → chunk-BQQ5MXUC.js} +11 -11
  37. package/dist/{chunk-K6RDB7IA.js → chunk-C3G5PNUO.js} +23 -23
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-U2JOLB7O.js → chunk-CE64C5K5.js} +227 -72
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-5DDOTTG4.js → chunk-CULVKYTK.js} +5 -5
  43. package/dist/{chunk-F34AR6O3.js → chunk-D2T66PDV.js} +6 -6
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-4SVIVOMC.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-E3BQTQUP.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/chunk-EM2WNQS2.js +93 -0
  49. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  50. package/dist/{chunk-UL36QJX6.js → chunk-EUZRMP4Y.js} +18 -16
  51. package/dist/{chunk-R6MAYTMS.js → chunk-G4LGUTOE.js} +4 -4
  52. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  53. package/dist/{chunk-XXBQKW32.js → chunk-GFQ7P2UF.js} +7 -7
  54. package/dist/{chunk-SBZX6ARC.js → chunk-GI5RRMAH.js} +14 -14
  55. package/dist/{chunk-KDWLXVMN.js → chunk-GVZFCJHE.js} +343 -113
  56. package/dist/{chunk-633EXGZA.js → chunk-GXIWHXDB.js} +3 -3
  57. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  58. package/dist/chunk-HRAKUPIH.js +57 -0
  59. package/dist/{chunk-KYKNBD4Y.js → chunk-IJMW64DX.js} +978 -258
  60. package/dist/{chunk-DIMRLNIC.js → chunk-IMOD2YPV.js} +16 -9
  61. package/dist/{chunk-6CDNRHWH.js → chunk-IQCNVLO6.js} +28 -8
  62. package/dist/{chunk-UTUNT5QL.js → chunk-ISNCCX42.js} +9 -9
  63. package/dist/{chunk-RLTT5GVY.js → chunk-IZYTT3CD.js} +9 -5
  64. package/dist/{chunk-5ZMXGW7P.js → chunk-KAFMW7WM.js} +4 -85
  65. package/dist/chunk-KKEYGFX4.js +915 -0
  66. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  67. package/dist/{chunk-UXAC2FX4.js → chunk-L3Z5ANCV.js} +7 -7
  68. package/dist/{chunk-EHCPSZJF.js → chunk-LBFQMYS3.js} +2 -2
  69. package/dist/{chunk-QEQISF75.js → chunk-LK2FN5JY.js} +1 -1
  70. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  71. package/dist/{chunk-DRD2A54W.js → chunk-MBJO5VNZ.js} +18 -18
  72. package/dist/chunk-MNQN3X6Y.js +595 -0
  73. package/dist/{chunk-GXCCHKN6.js → chunk-MZHXENL7.js} +7 -7
  74. package/dist/chunk-MZNWZUJM.js +1801 -0
  75. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  76. package/dist/{chunk-WLMSOT73.js → chunk-NCCQ6DVS.js} +7 -7
  77. package/dist/{chunk-TZ7MFRG4.js → chunk-NO7J45X6.js} +170 -53
  78. package/dist/chunk-OH3YYA3B.js +15 -0
  79. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  80. package/dist/{chunk-R6MICQYU.js → chunk-PFLOULP3.js} +4 -4
  81. package/dist/{chunk-MC3JSVR6.js → chunk-QJMRYTCX.js} +7 -7
  82. package/dist/{chunk-ILJ7DWGE.js → chunk-QKWL7SYE.js} +12 -12
  83. package/dist/chunk-R2CT5YDO.js +66 -0
  84. package/dist/chunk-RFCKPS2V.js +26 -0
  85. package/dist/{chunk-ONRTXOZY.js → chunk-RTLNFZMD.js} +12 -4
  86. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  87. package/dist/{chunk-S32UQ5GL.js → chunk-SEDI5K5B.js} +18 -18
  88. package/dist/{chunk-ICO4TQ2F.js → chunk-SELG4SUR.js} +41 -25
  89. package/dist/{chunk-YEJIG7LN.js → chunk-SER7RRAE.js} +27 -832
  90. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  91. package/dist/chunk-T7QQBNLH.js +691 -0
  92. package/dist/{chunk-HGSLRG33.js → chunk-TLTGZTXI.js} +3 -3
  93. package/dist/chunk-TZ6UVP2H.js +637 -0
  94. package/dist/{chunk-EWD5P3GK.js → chunk-TZHN5ITX.js} +13 -41
  95. package/dist/{chunk-7TKWWPD7.js → chunk-U3TPUXOQ.js} +398 -253
  96. package/dist/{chunk-GNQRWTMY.js → chunk-UA3W4FGC.js} +6 -6
  97. package/dist/{chunk-O2RQ7LCK.js → chunk-UA6W4XFJ.js} +2 -2
  98. package/dist/chunk-UWD3JD5X.js +709 -0
  99. package/dist/chunk-V4ZKOKRB.js +13433 -0
  100. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  101. package/dist/{chunk-I7VLWRK2.js → chunk-VMATUZB6.js} +12 -10
  102. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  103. package/dist/chunk-WB7POC6M.js +891 -0
  104. package/dist/{chunk-GVYWZNRK.js → chunk-WBVKKTUT.js} +2 -2
  105. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  106. package/dist/{chunk-SDWNDICN.js → chunk-WN552PKN.js} +573 -316
  107. package/dist/{chunk-TEG3RYVZ.js → chunk-WT5TRMO4.js} +51 -26
  108. package/dist/{chunk-NY6IWDVU.js → chunk-WURGVOZJ.js} +56 -12
  109. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  110. package/dist/chunk-XW2UZICE.js +372 -0
  111. package/dist/{chunk-FSTIBAGM.js → chunk-XZ6UFQ52.js} +11 -11
  112. package/dist/chunk-Y3JU5RPK.js +8 -0
  113. package/dist/chunk-YKRJTYNP.js +1143 -0
  114. package/dist/{chunk-7HBHHVCK.js → chunk-YPRSNUTC.js} +2 -2
  115. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  116. package/dist/cli/index.js +34 -36
  117. package/dist/{clio-5I2IBFYL.js → clio-L2P7S2R2.js} +9 -9
  118. package/dist/{code-nav-YXIAEZVS.js → code-nav-B5LNX4KU.js} +25 -25
  119. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  120. package/dist/{config-Y2JDJ3JJ.js → config-YXARKGTX.js} +81 -77
  121. package/dist/configure-LMVQJ46J.js +85 -0
  122. package/dist/{context-QQ53HSGJ.js → context-7HJEWTTP.js} +92 -48
  123. package/dist/{context-S2EEC3EJ.js → context-XSZKKFBW.js} +14 -14
  124. package/dist/{context-P5YSEO55.js → context-YG2LZDYZ.js} +67 -64
  125. package/dist/{context-clear-TMEQCOTH.js → context-clear-AC5NXHM2.js} +64 -61
  126. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  127. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  128. package/dist/{context-working-set-CNLSQN5K.js → context-working-set-F4Q4J3NS.js} +15 -12
  129. package/dist/{detail-5572VLBO.js → detail-H73BEF2N.js} +65 -62
  130. package/dist/{dispatch-runner-FRHD6P2O.js → dispatch-runner-3RY5FSJC.js} +83 -80
  131. package/dist/{doctor-N3LCM2LG.js → doctor-EQYJOGUG.js} +47 -32
  132. package/dist/{eval-BUU3ZOUZ.js → eval-4P7O6CCE.js} +114 -50
  133. package/dist/{evidence-DTGEN456.js → evidence-D6GUSYJW.js} +64 -61
  134. package/dist/{evidence-SQ5DNFEN.js → evidence-O76QF7TZ.js} +69 -65
  135. package/dist/{evolve-IJNUFZDS.js → evolve-H47BCETS.js} +65 -62
  136. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  137. package/dist/{fleet-ZNNVSYFO.js → fleet-KMNS6NOM.js} +115 -107
  138. package/dist/{fleet-commands-5YE7NPJL.js → fleet-commands-DOWSYCBX.js} +15 -15
  139. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  140. package/dist/{fleet-graph-6HHPWF5T.js → fleet-graph-F2DE2TME.js} +26 -24
  141. package/dist/{fleet-inspect-JEYMGCGC.js → fleet-inspect-EN2Q6IVB.js} +67 -63
  142. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  143. package/dist/{fleet-validate-4PM4GDDL.js → fleet-validate-B2XDLS57.js} +28 -29
  144. package/dist/{fleet-verify-NJDTHTO3.js → fleet-verify-4JKUWGJ7.js} +64 -61
  145. package/dist/{fleet-view-UP2BWQQY.js → fleet-view-BHJFW26B.js} +67 -63
  146. package/dist/{init-S3GZQ5ZF.js → init-XAT5N5YM.js} +86 -80
  147. package/dist/interop-FVECHFKG.js +246 -0
  148. package/dist/{inventory-K2OZ36YJ.js → inventory-7KFQGLCV.js} +67 -63
  149. package/dist/library-NY2XOT75.js +492 -0
  150. package/dist/library-QAPAO23R.js +306 -0
  151. package/dist/library-import-5Y6MAS3R.js +183 -0
  152. package/dist/library-inventory-JT6HWITQ.js +56 -0
  153. package/dist/library-validation-EQUH25DC.js +42 -0
  154. package/dist/{memory-OQOXQGYD.js → memory-DYVTTCP6.js} +65 -62
  155. package/dist/{models-3IK2Y5WE.js → models-MASFJ6Y2.js} +51 -38
  156. package/dist/{monitor-FTJLTKCQ.js → monitor-YMP4NXJJ.js} +73 -69
  157. package/dist/{orchestrator-N47O7SFD.js → orchestrator-AFQRRTEI.js} +4255 -2845
  158. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  159. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  160. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  161. package/dist/{preload-65U34NG6.js → preload-5Q7VXRFJ.js} +64 -61
  162. package/dist/{reset-MUVQDLNL.js → reset-7NKZK7JN.js} +11 -9
  163. package/dist/{resources-LM76COAO.js → resources-NILSIZAT.js} +94 -38
  164. package/dist/{run-3VFZQ33N.js → run-BPZGEBZV.js} +131 -114
  165. package/dist/{share-4JUB4BL7.js → share-EZ6ERBMH.js} +31 -28
  166. package/dist/skills-BTVVNYVM.js +100 -0
  167. package/dist/{skills-eval-G6T57L7M.js → skills-eval-UY34MNK7.js} +117 -78
  168. package/dist/{skills-inventory-WLM46PJH.js → skills-inventory-JDHSIA7I.js} +30 -25
  169. package/dist/{slash-commands-GBARG3Y7.js → slash-commands-K4FNQ2AT.js} +53 -49
  170. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  171. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  172. package/dist/{targets-N5REUETU.js → targets-44VKGFLN.js} +69 -47
  173. package/dist/{tasks-6BVY5YZF.js → tasks-3KODKFU7.js} +14 -14
  174. package/dist/{terminal-lease-57UEOJKS.js → terminal-lease-LXA7MMPO.js} +32 -19
  175. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  176. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  177. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  178. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  179. package/dist/{upgrade-4HD5HAIV.js → upgrade-7PMKM2JH.js} +17 -18
  180. package/dist/{usage-4GWM2WWP.js → usage-6EQV7EQK.js} +77 -73
  181. package/dist/{verifiers-GSKWKWVG.js → verifiers-JLITWSHU.js} +16 -16
  182. package/dist/{verify-3AS3ULCY.js → verify-T7NAEVIG.js} +13 -13
  183. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  184. package/dist/{wiki-generate-7BV7XWIY.js → wiki-generate-T2TJQJUA.js} +90 -84
  185. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  186. package/dist/worker/entry.js +297 -88
  187. package/docs/README.md +43 -0
  188. package/docs/architecture/architecture.md +8 -7
  189. package/docs/architecture/artifact-versions.md +3 -3
  190. package/docs/architecture/context-engine.md +36 -2
  191. package/docs/architecture/library.md +32 -0
  192. package/docs/architecture/middleware-and-components.md +1 -1
  193. package/docs/architecture/model-catalog.md +21 -1
  194. package/docs/architecture/pi-boundary.md +18 -0
  195. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  196. package/docs/architecture/safety-model.md +21 -2
  197. package/docs/architecture/session-lifecycle.md +12 -1
  198. package/docs/architecture/tui-design.md +153 -39
  199. package/docs/architecture/worker-context.md +106 -0
  200. package/docs/guide/authoring-plugins.md +160 -0
  201. package/docs/guide/built-in-agents.md +5 -5
  202. package/docs/guide/commands-and-modes.md +186 -80
  203. package/docs/guide/configuration-and-targets.md +123 -28
  204. package/docs/guide/configuration-reference.md +36 -38
  205. package/docs/guide/environment-variables.md +2 -2
  206. package/docs/guide/exit-codes-and-output.md +1 -1
  207. package/docs/guide/extensions-and-sharing.md +93 -53
  208. package/docs/guide/fleet-dispatch.md +32 -10
  209. package/docs/guide/glossary.md +2 -2
  210. package/docs/guide/harness-extensions.md +291 -0
  211. package/docs/guide/installation-and-lifecycle.md +53 -20
  212. package/docs/guide/interop.md +243 -0
  213. package/docs/guide/panes-and-files.md +3 -3
  214. package/docs/guide/plugins.md +80 -0
  215. package/docs/guide/resource-library.md +111 -45
  216. package/docs/guide/skills-marketplace.md +35 -72
  217. package/docs/guide/tool-usage.md +19 -7
  218. package/docs/guide/troubleshooting.md +1 -1
  219. package/docs/process/development-pipeline.md +15 -15
  220. package/docs/process/documentation-coverage.md +29 -2
  221. package/docs/process/documentation-guide.md +15 -7
  222. package/docs/process/eval-runner.md +8 -3
  223. package/docs/process/performance-methodology.md +1 -1
  224. package/docs/process/release-cut-checklist.md +22 -6
  225. package/docs/process/scientific-validation.md +23 -0
  226. package/evals/scalar-decision-machinery.ts +1 -1
  227. package/examples/extensions/README.md +67 -0
  228. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  229. package/examples/extensions/lab-status/extension.mjs +68 -0
  230. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  231. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  232. package/examples/extensions/measurements/summarize.cjs +23 -0
  233. package/library/README.md +109 -0
  234. package/library/_authoring/templates/agent/README.md +28 -0
  235. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  236. package/library/_authoring/templates/agent/plugin.json +23 -0
  237. package/library/_authoring/templates/fleet/README.md +29 -0
  238. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  239. package/library/_authoring/templates/fleet/plugin.json +23 -0
  240. package/library/_authoring/templates/plugin/README.md +37 -0
  241. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  242. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  243. package/library/_authoring/templates/plugin/plugin.json +42 -0
  244. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  245. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  246. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  247. package/library/_authoring/templates/prompt/README.md +28 -0
  248. package/library/_authoring/templates/prompt/plugin.json +23 -0
  249. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  250. package/library/_authoring/templates/skill/README.md +24 -0
  251. package/library/_authoring/templates/skill/SKILL.md +39 -0
  252. package/library/_authoring/templates/skill/evals.md +30 -0
  253. package/library/_authoring/templates/skill/plugin.json +23 -0
  254. package/library/agents/README.md +7 -0
  255. package/library/fleets/README.md +7 -0
  256. package/library/plugins/materio/README.md +137 -0
  257. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  258. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  259. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  260. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  261. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  262. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  263. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  275. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  276. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  277. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  278. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  279. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  280. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  281. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  282. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  283. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  284. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  285. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  286. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  287. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  288. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  289. package/library/plugins/materio/assets/actions/help.md +140 -0
  290. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  291. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  292. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  293. package/library/plugins/materio/assets/actions/progress.md +125 -0
  294. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  295. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  296. package/library/plugins/materio/assets/actions/settings.md +38 -0
  297. package/library/plugins/materio/assets/actions/status.md +112 -0
  298. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  299. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  300. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  301. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  302. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  303. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  304. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  305. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  306. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  307. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  308. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  309. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  310. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  311. package/library/plugins/materio/assets/templates/config.json +5 -0
  312. package/library/plugins/materio/evals/scripts.yaml +29 -0
  313. package/library/plugins/materio/plugin.json +530 -0
  314. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  315. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  316. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  317. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  318. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  319. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  320. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  321. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  322. package/library/plugins/materio/tests/test_research_state.py +291 -0
  323. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  324. package/library/prompts/README.md +7 -0
  325. package/library/registry.yaml +921 -0
  326. package/library/skills/README.md +120 -0
  327. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  329. package/library/skills/coding/ast-grep/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  332. package/library/skills/coding/coding-standards/plugin.json +23 -0
  333. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  334. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  335. package/library/skills/coding/prototype/plugin.json +23 -0
  336. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  337. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  338. package/library/skills/coding/tdd/plugin.json +23 -0
  339. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  340. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  341. package/library/skills/context/context-handoff/plugin.json +23 -0
  342. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  343. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  344. package/library/skills/context/context-prime/plugin.json +23 -0
  345. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  346. package/library/skills/git/branch-closeout/plugin.json +23 -0
  347. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  348. package/library/skills/git/file-ticket/plugin.json +23 -0
  349. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  350. package/library/skills/git/fix-issue/plugin.json +23 -0
  351. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  352. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  353. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  354. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  355. package/library/skills/git/ship/plugin.json +23 -0
  356. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  357. package/library/skills/git/worktree-create/plugin.json +23 -0
  358. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  359. package/library/skills/git/worktree-merge/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  362. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  363. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  364. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  365. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  368. package/library/skills/meta/credentials/plugin.json +23 -0
  369. package/library/skills/meta/find-skills/SKILL.md +85 -0
  370. package/library/skills/meta/find-skills/evals.md +65 -0
  371. package/library/skills/meta/find-skills/plugin.json +23 -0
  372. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  373. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  374. package/library/skills/meta/herdr/plugin.json +23 -0
  375. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  376. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  377. package/library/skills/meta/skill-craft/plugin.json +23 -0
  378. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  379. package/library/skills/planning/archify/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  382. package/library/skills/planning/architecture/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  385. package/library/skills/planning/backlog/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  388. package/library/skills/planning/prd/plugin.json +23 -0
  389. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  390. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  391. package/library/skills/planning/product-intent/plugin.json +23 -0
  392. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  393. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  394. package/library/skills/planning/tech-spec/plugin.json +23 -0
  395. package/{skills → library/skills}/registry.yaml +7 -7
  396. package/{skills → library/skills}/remote.yaml +1 -1
  397. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  399. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  400. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  402. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  403. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  404. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  405. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  406. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  407. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  408. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  409. package/{skills → library/skills}/skill-marketplace.json +37 -37
  410. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  412. package/library/skills/workflow/cut-it/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  414. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  415. package/library/skills/workflow/design-council/plugin.json +23 -0
  416. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  417. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  418. package/library/skills/workflow/grill-me/plugin.json +23 -0
  419. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  420. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  421. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  422. package/package.json +12 -5
  423. package/src/cli/agents.ts +1 -1
  424. package/src/cli/ask.ts +10 -10
  425. package/src/cli/config-inspect.ts +1 -1
  426. package/src/cli/configure-editor.ts +51 -0
  427. package/src/cli/configure-interop.ts +1 -1
  428. package/src/cli/configure-oauth.ts +1 -1
  429. package/src/cli/configure-onboarding.ts +232 -96
  430. package/src/cli/configure-prompts.ts +76 -0
  431. package/src/cli/configure-quick.ts +274 -0
  432. package/src/cli/configure-target.ts +14 -2
  433. package/src/cli/configure.ts +415 -176
  434. package/src/cli/eval.ts +40 -6
  435. package/src/cli/extensions.ts +74 -8
  436. package/src/cli/fleet-preflight.ts +2 -0
  437. package/src/cli/fleet.ts +2 -0
  438. package/src/cli/index.ts +1 -3
  439. package/src/cli/interop-inspect.ts +61 -33
  440. package/src/cli/interop.ts +79 -9
  441. package/src/cli/library-import.ts +139 -0
  442. package/src/cli/library.ts +418 -120
  443. package/src/cli/oauth-manual-input.ts +1 -1
  444. package/src/cli/reset.ts +2 -0
  445. package/src/cli/run.ts +26 -9
  446. package/src/cli/select.ts +35 -4
  447. package/src/cli/skills-eval.ts +43 -6
  448. package/src/cli/skills-inventory.ts +6 -2
  449. package/src/cli/skills.ts +44 -491
  450. package/src/cli/upgrade.ts +2 -2
  451. package/src/core/bus-events.ts +5 -0
  452. package/src/core/config.ts +6 -1
  453. package/src/core/defaults.ts +34 -12
  454. package/src/{interactive → core}/external-editor.ts +4 -4
  455. package/src/core/recent-models.ts +2 -2
  456. package/src/core/session-routing.ts +3 -3
  457. package/src/core/state-file-lock.ts +1 -1
  458. package/src/core/tool-names.ts +5 -0
  459. package/src/domains/agents/extension.ts +42 -6
  460. package/src/domains/agents/fleet-commands.ts +92 -1
  461. package/src/domains/agents/fleet-contract.ts +87 -19
  462. package/src/domains/agents/recipe.ts +5 -4
  463. package/src/domains/agents/registry.ts +80 -24
  464. package/src/domains/config/classify.ts +1 -1
  465. package/src/domains/config/keybindings.ts +156 -124
  466. package/src/domains/context/worker/contract.ts +91 -0
  467. package/src/domains/context/worker/pressure.ts +120 -0
  468. package/src/domains/context/worker/recall.ts +62 -0
  469. package/src/domains/context/worker/select.ts +164 -0
  470. package/src/domains/context/worker/snapshot.ts +35 -0
  471. package/src/domains/context/worker/store.ts +16 -0
  472. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  473. package/src/domains/dispatch/active-route-planner.ts +2 -0
  474. package/src/domains/dispatch/backoff.ts +1 -0
  475. package/src/domains/dispatch/code-step.ts +12 -2
  476. package/src/domains/dispatch/contract.ts +3 -0
  477. package/src/domains/dispatch/execution-plan.ts +2 -0
  478. package/src/domains/dispatch/extension.ts +109 -27
  479. package/src/domains/dispatch/fleet-plan.ts +10 -0
  480. package/src/domains/dispatch/fleet-run.ts +1 -0
  481. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  482. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  483. package/src/domains/dispatch/state.ts +1 -0
  484. package/src/domains/dispatch/types.ts +5 -0
  485. package/src/domains/dispatch/validation.ts +12 -0
  486. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  487. package/src/domains/evidence/failure-attribution.ts +1 -0
  488. package/src/domains/evidence/trust-status.ts +22 -3
  489. package/src/domains/extensions/command-schema.ts +145 -0
  490. package/src/domains/extensions/command-tools.ts +15 -0
  491. package/src/domains/extensions/compatibility.ts +7 -0
  492. package/src/domains/extensions/contract.ts +0 -4
  493. package/src/domains/extensions/discovery.ts +69 -205
  494. package/src/domains/extensions/extension.ts +0 -4
  495. package/src/domains/extensions/index.ts +1 -5
  496. package/src/domains/extensions/manager.ts +1 -6
  497. package/src/domains/extensions/operator-commands.ts +29 -0
  498. package/src/domains/extensions/operator-runtime.ts +483 -0
  499. package/src/domains/extensions/public-api.ts +53 -0
  500. package/src/domains/extensions/runtime-child.mjs +114 -0
  501. package/src/domains/extensions/runtime-process.ts +306 -0
  502. package/src/domains/extensions/runtime-schema.ts +146 -0
  503. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  504. package/src/domains/extensions/snapshot.ts +4 -32
  505. package/src/domains/extensions/state.ts +5 -83
  506. package/src/domains/extensions/types.ts +33 -34
  507. package/src/domains/interop/adopt.ts +546 -0
  508. package/src/domains/interop/detect.ts +50 -12
  509. package/src/domains/interop/foreign.ts +554 -0
  510. package/src/domains/interop/import.ts +277 -0
  511. package/src/domains/interop/index.ts +24 -0
  512. package/src/domains/interop/install.ts +6 -0
  513. package/src/domains/interop/inventory.ts +351 -0
  514. package/src/domains/interop/projection.ts +360 -0
  515. package/src/domains/interop/registry.ts +106 -3
  516. package/src/domains/interop/types.ts +51 -0
  517. package/src/domains/lifecycle/migrations/index.ts +0 -2
  518. package/src/domains/lifecycle/naming-resources.ts +1 -1
  519. package/src/domains/middleware/marketplace-offer.ts +1 -1
  520. package/src/domains/mux/contract.ts +1 -1
  521. package/src/domains/plugins/catalog.ts +204 -0
  522. package/src/domains/plugins/contract.ts +24 -0
  523. package/src/domains/plugins/discovery.ts +316 -0
  524. package/src/domains/plugins/extension.ts +40 -0
  525. package/src/domains/plugins/index.ts +77 -0
  526. package/src/domains/plugins/integrity.ts +6 -0
  527. package/src/domains/plugins/manifest.ts +3 -0
  528. package/src/domains/plugins/resources.ts +102 -0
  529. package/src/domains/plugins/state.ts +753 -0
  530. package/src/domains/plugins/types.ts +217 -0
  531. package/src/domains/prompts/extension.ts +9 -2
  532. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  533. package/src/domains/providers/probe/fingerprint.ts +13 -6
  534. package/src/domains/providers/probe/reasoning.ts +2 -0
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  536. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  537. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  538. package/src/domains/resources/common-loader.ts +9 -6
  539. package/src/domains/resources/index.ts +67 -0
  540. package/src/domains/resources/library-actions.ts +836 -0
  541. package/src/domains/resources/library-evals.ts +38 -0
  542. package/src/domains/resources/library-inventory.ts +1048 -0
  543. package/src/domains/resources/library-types.ts +50 -0
  544. package/src/domains/resources/library-validation.ts +634 -0
  545. package/src/domains/resources/library.ts +437 -156
  546. package/src/domains/resources/package-references.ts +66 -0
  547. package/src/domains/resources/prompts/loader.ts +75 -41
  548. package/src/domains/resources/skills/install.ts +2 -2
  549. package/src/domains/resources/skills/loader.ts +77 -22
  550. package/src/domains/resources/skills/marketplace.ts +48 -57
  551. package/src/domains/resources/skills/promotion.ts +2 -2
  552. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  553. package/src/domains/safety/action-classifier.ts +2 -2
  554. package/src/domains/safety/default-path-policy.ts +3 -1
  555. package/src/domains/safety/policy-engine.ts +1 -1
  556. package/src/domains/safety/protected-artifacts.ts +21 -5
  557. package/src/domains/safety/skill-authority.ts +5 -2
  558. package/src/domains/share/archive.ts +1 -1
  559. package/src/engine/apis/openai-completions.ts +52 -2
  560. package/src/engine/notices/pi-tui-LICENSE +21 -0
  561. package/src/engine/tui.ts +3 -0
  562. package/src/engine/worker-runtime.ts +58 -14
  563. package/src/engine/worker-tools.ts +5 -0
  564. package/src/entry/orchestrator.ts +26 -5
  565. package/src/entry/plugin-reload.ts +18 -0
  566. package/src/interactive/application-controller.ts +68 -52
  567. package/src/interactive/chat-loop.ts +32 -5
  568. package/src/interactive/chat-panel.ts +168 -638
  569. package/src/interactive/chat-renderer.ts +13 -30
  570. package/src/interactive/clio-editor.ts +53 -21
  571. package/src/interactive/command-output.ts +56 -1
  572. package/src/interactive/dispatch-board.ts +1 -3
  573. package/src/interactive/editor-submit.ts +73 -59
  574. package/src/interactive/fleet-run-preview.ts +2 -0
  575. package/src/interactive/follow-up-queue-panel.ts +3 -3
  576. package/src/interactive/footer/dashboard.ts +12 -4
  577. package/src/interactive/footer/notifications.ts +2 -2
  578. package/src/interactive/footer/widgets.ts +52 -93
  579. package/src/interactive/interactive-application.ts +225 -63
  580. package/src/interactive/interactive-event-projection.ts +2 -44
  581. package/src/interactive/interactive-input-runtime.ts +257 -35
  582. package/src/interactive/interactive-presentation.ts +71 -21
  583. package/src/interactive/interactive-slash-runtime.ts +40 -48
  584. package/src/interactive/keybinding-manager.ts +156 -79
  585. package/src/interactive/keyboard-owner.ts +37 -0
  586. package/src/interactive/layout.ts +29 -4
  587. package/src/interactive/leader-key.ts +49 -102
  588. package/src/interactive/leader-menu.ts +45 -0
  589. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  590. package/src/interactive/overlay-frame.ts +15 -0
  591. package/src/interactive/overlay-general-openers.ts +2 -0
  592. package/src/interactive/overlay-key-routing.ts +46 -47
  593. package/src/interactive/overlay-lifecycle.ts +31 -15
  594. package/src/interactive/overlay-resource-openers.ts +56 -46
  595. package/src/interactive/overlay-session-lifecycle.ts +1 -1
  596. package/src/interactive/overlays/ask-user.ts +630 -556
  597. package/src/interactive/overlays/extension-panel.ts +70 -0
  598. package/src/interactive/overlays/extensions.ts +28 -5
  599. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  600. package/src/interactive/overlays/help-reference.ts +89 -40
  601. package/src/interactive/overlays/interop.ts +122 -3
  602. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  603. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  604. package/src/interactive/overlays/library-model.ts +574 -0
  605. package/src/interactive/overlays/library-review.ts +557 -0
  606. package/src/interactive/overlays/library-tabs.ts +3 -15
  607. package/src/interactive/overlays/library.ts +602 -0
  608. package/src/interactive/overlays/list-overlay.ts +218 -39
  609. package/src/interactive/overlays/model-selector.ts +28 -25
  610. package/src/interactive/overlays/session-selector.ts +9 -3
  611. package/src/interactive/overlays/settings.ts +34 -26
  612. package/src/interactive/overlays/tree-selector.ts +16 -11
  613. package/src/interactive/permission-hint.ts +13 -0
  614. package/src/interactive/permission-overlay.ts +77 -28
  615. package/src/interactive/prompt-source-label.ts +21 -0
  616. package/src/interactive/renderers/preview.ts +16 -0
  617. package/src/interactive/renderers/reference-card.ts +35 -0
  618. package/src/interactive/renderers/tool-execution.ts +67 -160
  619. package/src/interactive/renderers/worker-entry.ts +90 -42
  620. package/src/interactive/slash-autocomplete.ts +100 -7
  621. package/src/interactive/slash-commands.ts +396 -105
  622. package/src/interactive/slash-spec.ts +0 -1
  623. package/src/interactive/status/controller.ts +0 -5
  624. package/src/interactive/status/state-machine.ts +44 -26
  625. package/src/interactive/status/types.ts +3 -0
  626. package/src/interactive/status/verbs.ts +13 -12
  627. package/src/interactive/terminal-lease.ts +44 -12
  628. package/src/interactive/transcript-detail.ts +50 -112
  629. package/src/interactive/turn-queues.ts +8 -7
  630. package/src/interactive/turn-runtime.ts +1 -1
  631. package/src/interactive/view/artifacts.ts +4 -0
  632. package/src/interactive/view/view-overlay.ts +58 -43
  633. package/src/interactive/welcome-dashboard.ts +525 -408
  634. package/src/tools/bootstrap.ts +8 -0
  635. package/src/tools/builtin-tool-catalog.ts +7 -2
  636. package/src/tools/context/index.ts +58 -5
  637. package/src/tools/context/library.ts +465 -0
  638. package/src/tools/context/surface.ts +20 -6
  639. package/src/tools/core-bootstrap.ts +3 -0
  640. package/src/tools/dispatch-admission.ts +24 -1
  641. package/src/tools/dispatch-arguments.ts +8 -0
  642. package/src/tools/dispatch-plan.ts +32 -0
  643. package/src/tools/dispatch-schema.ts +31 -1
  644. package/src/tools/dispatch-types.ts +3 -0
  645. package/src/tools/dispatch.ts +1 -1
  646. package/src/tools/harness-extensions.ts +169 -0
  647. package/src/tools/observation.ts +4 -0
  648. package/src/tools/policy.ts +7 -1
  649. package/src/tools/presentation.ts +1 -1
  650. package/src/tools/registry.ts +20 -2
  651. package/src/tools/verify/numeric.ts +4 -4
  652. package/src/tools/worker-evidence.ts +5 -0
  653. package/src/worker/context-seed.ts +192 -0
  654. package/src/worker/entry.ts +1 -0
  655. package/src/worker/spec-contract.ts +8 -1
  656. package/dist/chunk-3UW3KU4A.js +0 -21
  657. package/dist/chunk-6SYEGZI3.js +0 -433
  658. package/dist/chunk-CXQ37WJH.js +0 -45
  659. package/dist/chunk-EQEJJ53P.js +0 -399
  660. package/dist/chunk-KTFSFCVN.js +0 -46
  661. package/dist/chunk-QRFXEO6Y.js +0 -17
  662. package/dist/chunk-T7FDXNRU.js +0 -1257
  663. package/dist/chunk-U7VQ4NI4.js +0 -911
  664. package/dist/configure-SML6UBZ5.js +0 -55
  665. package/dist/interop-YOTGXFJM.js +0 -115
  666. package/dist/library-GJI6W6OK.js +0 -226
  667. package/dist/skills-S36AAJHU.js +0 -510
  668. package/skills/README.md +0 -418
  669. package/skills/meta/find-skills/SKILL.md +0 -78
  670. package/skills/meta/find-skills/evals.md +0 -47
  671. package/src/domains/extensions/resource-path.ts +0 -27
  672. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  673. package/src/interactive/overlays/agents.ts +0 -70
  674. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  675. package/src/interactive/overlays/prompts.ts +0 -89
  676. package/src/interactive/overlays/skills-hub.ts +0 -615
  677. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  678. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  679. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  680. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  681. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  682. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  683. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  684. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  685. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  686. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  687. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  688. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  689. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  690. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  691. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  692. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  693. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  694. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  695. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  696. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  697. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  698. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  699. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  700. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -1,6 +1,13 @@
1
1
  import { getTerminationCoordinator } from "../core/termination.js";
2
- import type { ClioKeybinding } from "../domains/config/keybindings.js";
3
- import { isKeyRelease, type Keybinding } from "../engine/tui.js";
2
+ import { CLIO_APP_KEYBINDING_IDS, type ClioKeybinding } from "../domains/config/keybindings.js";
3
+ import {
4
+ decodePrintableKey,
5
+ isKeyRelease,
6
+ type Keybinding,
7
+ matchesKey,
8
+ type TUI,
9
+ TuiAltScreen,
10
+ } from "../engine/tui.js";
4
11
  import {
5
12
  type ApplicationClock,
6
13
  type ApplicationController,
@@ -10,7 +17,9 @@ import {
10
17
  type ApplicationSignalCoordinator,
11
18
  createApplicationController,
12
19
  } from "./application-controller.js";
20
+ import { focusedComponent, keyboardOwner } from "./keyboard-owner.js";
13
21
  import { createLeaderKeyController, type LeaderTarget } from "./leader-key.js";
22
+ import { createLeaderMenu } from "./leader-menu.js";
14
23
  import { type OverlayState, routeOverlayKey } from "./overlay-lifecycle.js";
15
24
  import type { RenderInputAction } from "./render-trace.js";
16
25
 
@@ -26,15 +35,12 @@ export interface InteractiveInputKeyActionDeps {
26
35
  openDecisions: () => void;
27
36
  backgroundDispatch: () => void;
28
37
  openModelSelector: () => void;
38
+ openLibrary: () => void;
29
39
  openTree: () => void;
30
40
  cycleScopedModelForward: () => void;
31
41
  cycleScopedModelBackward: () => void;
32
42
  dismissNotifications: () => void;
33
- toggleToolExpansion: () => void;
34
- toggleAllToolExpansion: () => void;
35
- toggleLiveToolOutput: () => void;
36
- toggleThinkingExpansion: () => void;
37
- toggleAllThinkingExpansion: () => void;
43
+ cycleOutputStyle: () => void;
38
44
  openExternalEditor: () => void;
39
45
  queueFollowUp: () => void;
40
46
  interruptWithMessage: () => void;
@@ -42,13 +48,22 @@ export interface InteractiveInputKeyActionDeps {
42
48
  }
43
49
 
44
50
  export interface InteractiveInputRuntimeDeps {
51
+ tui?: TUI;
52
+ hasQueuedMessages?: () => boolean;
53
+ explainProtectedExit?: () => void;
54
+ explainSearchUnavailable?: () => void;
55
+ explainThinkingUnavailable?: () => void;
45
56
  keybindings: {
46
57
  matches(data: string, id: Keybinding): boolean;
47
58
  leaderTargets(): ReadonlyArray<LeaderTarget>;
59
+ getKeys?(id: Keybinding): ReadonlyArray<string>;
60
+ getDescription?(id: Keybinding): string;
61
+ onReload?(listener: () => void): () => void;
48
62
  };
49
63
  dispatchAction: (id: ClioKeybinding, deps: InteractiveInputKeyActionDeps) => boolean;
50
64
  actions: {
51
65
  canExit(): boolean;
66
+ cycleOutputStyle(): void;
52
67
  availableThinkingLevels(): ReadonlyArray<string>;
53
68
  onCycleThinking(): void;
54
69
  cycleScopedModelForward(): void;
@@ -67,10 +82,12 @@ export interface InteractiveInputRuntimeDeps {
67
82
  isInspectingMutation(): boolean;
68
83
  toggleMutationInspection(): void;
69
84
  scrollMutationInspection(delta: number): void;
85
+ togglePermissionTerms(): void;
70
86
  cancelAskUser(): void;
71
87
  toggleFooterDashboardState(): void;
72
88
  toggleDispatchBoardOverlay(): void;
73
89
  openModelOverlayState(): void;
90
+ openSkillsHubState(): void;
74
91
  openTreeOverlayState(): void;
75
92
  openTasksOverlayState(): void;
76
93
  openDecisionsOverlayState(): void;
@@ -92,7 +109,13 @@ export interface InteractiveInputRuntimeDeps {
92
109
  cancelActiveEditorBash: () => boolean;
93
110
  isStreaming: () => boolean;
94
111
  cancelActiveRun: () => void;
95
- editor: { getText(): string; setText(text: string): void; handleInput?(data: string): void };
112
+ editor: {
113
+ getText(): string;
114
+ setText(text: string): void;
115
+ handleInput?(data: string): void;
116
+ applyEdit?(operation: import("./overlay-key-routing.js").DraftEditOperation | "undo"): void;
117
+ isShowingAutocomplete?(): boolean;
118
+ };
96
119
  editorSubmit: {
97
120
  openExternalEditorForInput(): void;
98
121
  queueFollowUpFromEditor(): void;
@@ -105,13 +128,6 @@ export interface InteractiveInputRuntimeDeps {
105
128
  dismiss(id: string): void;
106
129
  dismissAll(): void;
107
130
  };
108
- chatPanel: {
109
- toggleLastToolExpanded(): boolean;
110
- toggleAllToolsExpanded(): boolean;
111
- toggleLiveToolOutput(): void;
112
- toggleLastThinking(): boolean;
113
- toggleAllThinking(): boolean;
114
- };
115
131
  shutdown: {
116
132
  stopTickers(): void;
117
133
  disposeInteractiveTickers(): void;
@@ -148,6 +164,7 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
148
164
  cycleThinking: () => {
149
165
  const available = deps.actions.availableThinkingLevels();
150
166
  if (!(available.length === 1 && available[0] === "off")) deps.actions.onCycleThinking();
167
+ else deps.explainThinkingUnavailable?.();
151
168
  deps.refreshFooter();
152
169
  deps.requestRender();
153
170
  },
@@ -159,6 +176,7 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
159
176
  backgroundDispatch: deps.actions.backgroundActiveDispatch,
160
177
  toggleFilesPane: deps.actions.toggleFilesPane,
161
178
  openModelSelector: deps.overlay.openModelOverlayState,
179
+ openLibrary: deps.overlay.openSkillsHubState,
162
180
  openTree: deps.overlay.openTreeOverlayState,
163
181
  cycleScopedModelForward: () => {
164
182
  deps.actions.cycleScopedModelForward();
@@ -171,27 +189,104 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
171
189
  deps.requestRender();
172
190
  },
173
191
  dismissNotifications: () => controller.dismissNotifications(),
174
- toggleToolExpansion: () => controller.toggleToolExpansion(),
175
- toggleAllToolExpansion: () => {
176
- if (deps.chatPanel.toggleAllToolsExpanded()) deps.requestRender();
177
- },
178
- toggleLiveToolOutput: () => {
179
- deps.chatPanel.toggleLiveToolOutput();
180
- deps.requestRender();
181
- },
182
- toggleThinkingExpansion: () => controller.toggleThinkingExpansion(),
183
- toggleAllThinkingExpansion: () => {
184
- if (deps.chatPanel.toggleAllThinking()) deps.requestRender();
185
- },
192
+ cycleOutputStyle: deps.actions.cycleOutputStyle,
186
193
  openExternalEditor: deps.editorSubmit.openExternalEditorForInput,
187
194
  queueFollowUp: deps.editorSubmit.queueFollowUpFromEditor,
188
195
  interruptWithMessage: deps.editorSubmit.interruptFromEditor,
189
196
  restoreQueuedFollowUps: deps.editorSubmit.restoreQueuedFollowUpsToEditor,
190
197
  });
198
+ const focused = () => (deps.tui ? focusedComponent(deps.tui) : null);
199
+ const search = () => (deps.tui instanceof TuiAltScreen && deps.tui.isSearchFocused ? deps.tui : null);
200
+ const owner = () => keyboardOwner(focused());
201
+ const ownerAction = (): ClioKeybinding | undefined =>
202
+ (
203
+ ({
204
+ "skills-hub": "clio-coder.library.toggle",
205
+ model: "clio-coder.model.select",
206
+ tree: "clio-coder.session.tree",
207
+ "dispatch-board": "clio-coder.dispatchBoard.toggle",
208
+ }) as Partial<Record<OverlayState, ClioKeybinding>>
209
+ )[deps.overlay.getState()];
210
+ const canToggleOwner = () => deps.overlay.getState() === "dispatch-board" || owner().keyboardScope === "browse";
211
+ const targets = (): ReadonlyArray<LeaderTarget> => {
212
+ const all = deps.keybindings.leaderTargets();
213
+ const filtered = search()
214
+ ? all.filter(({ id }) => id === "tui.editor.undo" || id === "tui.altScreen.search")
215
+ : deps.overlay.getState() === "closed"
216
+ ? all
217
+ : all.filter(
218
+ ({ id }) =>
219
+ (id === ownerAction() && canToggleOwner()) ||
220
+ (id === "tui.editor.undo" &&
221
+ (owner().keyboardScope === "edit" || deps.overlay.getState() === "permission-confirm")),
222
+ );
223
+ return filtered.map((entry) => ({
224
+ ...entry,
225
+ label: deps.keybindings.getDescription?.(entry.id) ?? entry.id,
226
+ ...(entry.id === "clio-coder.thinking.cycle" &&
227
+ deps.actions.availableThinkingLevels().every((level) => level === "off")
228
+ ? { disabledReason: "This model supports only off" }
229
+ : {}),
230
+ }));
231
+ };
232
+ const menu = deps.tui
233
+ ? createLeaderMenu(
234
+ deps.tui,
235
+ () => (search() ? "Transcript search" : overlayScopeLabel(deps.overlay.getState())),
236
+ (id) => deps.keybindings.getKeys?.(id).join(" / ") ?? "",
237
+ )
238
+ : undefined;
239
+ const dispatchLeader = (id: Keybinding): boolean => {
240
+ if (id === "tui.editor.undo") {
241
+ if (search()) search()?.undoSearchQuery();
242
+ else if (deps.overlay.getState() === "closed" || deps.overlay.getState() === "permission-confirm")
243
+ deps.editor.applyEdit?.("undo");
244
+ else owner().undoInput?.();
245
+ deps.requestRender();
246
+ return true;
247
+ }
248
+ if (id.startsWith("tui.altScreen.")) {
249
+ const tui = deps.tui;
250
+ if (!(tui instanceof TuiAltScreen)) {
251
+ deps.explainSearchUnavailable?.();
252
+ return true;
253
+ }
254
+ switch (id) {
255
+ case "tui.altScreen.search":
256
+ tui.toggleSearch();
257
+ break;
258
+ case "tui.altScreen.pageUp":
259
+ tui.scrollBy(-Math.max(1, tui.terminal.rows - 3));
260
+ break;
261
+ case "tui.altScreen.pageDown":
262
+ tui.scrollBy(Math.max(1, tui.terminal.rows - 3));
263
+ break;
264
+ case "tui.altScreen.top":
265
+ tui.scrollToTop();
266
+ break;
267
+ case "tui.altScreen.bottom":
268
+ tui.scrollToBottom();
269
+ break;
270
+ case "tui.altScreen.previousPrompt":
271
+ tui.scrollToPrompt(-1);
272
+ break;
273
+ case "tui.altScreen.nextPrompt":
274
+ tui.scrollToPrompt(1);
275
+ break;
276
+ }
277
+ return true;
278
+ }
279
+ if (deps.overlay.getState() !== "closed") {
280
+ if (id === ownerAction() && canToggleOwner()) deps.overlay.closeOverlay();
281
+ return true;
282
+ }
283
+ return deps.dispatchAction(id as ClioKeybinding, keyActionDeps());
284
+ };
191
285
  const leaderKeys = createLeaderKeyController({
192
286
  matchesLeader: (input) => deps.keybindings.matches(input, "clio-coder.leader"),
193
- leaderTargets: () => deps.keybindings.leaderTargets(),
194
- dispatchAction: (id) => deps.dispatchAction(id, keyActionDeps()),
287
+ leaderTargets: targets,
288
+ dispatchAction: dispatchLeader,
289
+ ...(menu ? { onMenuChange: menu } : {}),
195
290
  isRelease: isKeyRelease,
196
291
  onStateChange: (pending) => {
197
292
  deps.onLeaderStateChange?.(pending);
@@ -200,7 +295,101 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
200
295
  },
201
296
  });
202
297
 
298
+ const removeReload = deps.keybindings.onReload?.(() => leaderKeys.reset());
203
299
  controller = createApplicationController({
300
+ routeComposerKey: (data) => {
301
+ if (deps.keybindings.matches(data, "tui.altScreen.search") && !(deps.tui instanceof TuiAltScreen)) {
302
+ deps.explainSearchUnavailable?.();
303
+ return true;
304
+ }
305
+ return false;
306
+ },
307
+ isSearchFocused: () => search() !== null,
308
+ closeSearch: () => search()?.closeSearch(),
309
+ isAutocompleteVisible: () => deps.editor.isShowingAutocomplete?.() ?? false,
310
+ hasQueuedMessages: () => deps.hasQueuedMessages?.() ?? false,
311
+ explainProtectedExit: () => deps.explainProtectedExit?.(),
312
+ forwardFocusedInput: (data) => {
313
+ const active = search();
314
+ if (active) {
315
+ if (
316
+ deps.keybindings.matches(data, "tui.altScreen.search") ||
317
+ deps.keybindings.matches(data, "tui.altScreen.searchClose") ||
318
+ matchesKey(data, "escape")
319
+ )
320
+ active.closeSearch();
321
+ else if (deps.keybindings.matches(data, "tui.altScreen.searchNext")) active.navigateSearch(1);
322
+ else if (deps.keybindings.matches(data, "tui.altScreen.searchPrevious")) active.navigateSearch(-1);
323
+ else focused()?.handleInput?.(data);
324
+ } else focused()?.handleInput?.(data);
325
+ deps.requestRender();
326
+ },
327
+ cancelFocusedOwner: () => {
328
+ const state = deps.overlay.getState();
329
+ if (["permission-confirm", "cost", "context-view", "side-question", "dispatch-board", "auth"].includes(state))
330
+ deps.overlay.closeOverlay();
331
+ else if (focused()?.handleInput) {
332
+ focused()?.handleInput?.("\x1b");
333
+ deps.requestRender();
334
+ } else deps.overlay.closeOverlay();
335
+ },
336
+ matchesRepeatableInput: (data) => {
337
+ // Safety takes precedence over hostile user collisions.
338
+ if (CLIO_APP_KEYBINDING_IDS.some((id) => id !== "clio-coder.exit" && deps.keybindings.matches(data, id)))
339
+ return false;
340
+ if (deps.keybindings.matches(data, "clio-coder.exit"))
341
+ return matchesKey(data, "ctrl+d") && deps.editor.getText().length > 0 && deps.overlay.getState() === "closed";
342
+ if (
343
+ ["clio-coder.exit", "clio-coder.leader", "tui.input.submit", "tui.select.confirm", "tui.select.cancel"].some((id) =>
344
+ deps.keybindings.matches(data, id as Keybinding),
345
+ ) ||
346
+ matchesKey(data, "ctrl+c") ||
347
+ matchesKey(data, "escape")
348
+ )
349
+ return false;
350
+ const editable = deps.overlay.getState() === "closed" || search() !== null || owner().keyboardScope === "edit";
351
+ if (editable && (decodePrintableKey(data) !== undefined || deps.keybindings.matches(data, "tui.input.newLine")))
352
+ return true;
353
+ const navigation = ["up", "down", "left", "right", "home", "end", "pageUp", "pageDown"] as const;
354
+ if (navigation.some((key) => matchesKey(data, key))) return true;
355
+ if (
356
+ deps.overlay.getState() !== "closed" &&
357
+ ["tui.select.up", "tui.select.down"].some((id) => deps.keybindings.matches(data, id as Keybinding))
358
+ )
359
+ return true;
360
+ if (
361
+ deps.overlay.getState() === "closed" &&
362
+ ["pageUp", "pageDown", "top", "bottom", "previousPrompt", "nextPrompt"].some((name) =>
363
+ deps.keybindings.matches(data, `tui.altScreen.${name}` as Keybinding),
364
+ )
365
+ )
366
+ return true;
367
+ return (
368
+ (deps.overlay.getState() === "closed" ||
369
+ search() !== null ||
370
+ owner().keyboardScope === "edit" ||
371
+ deps.overlay.getState() === "permission-confirm") &&
372
+ [
373
+ "undo",
374
+ "yank",
375
+ "yankPop",
376
+ "cursorLeft",
377
+ "cursorRight",
378
+ "cursorWordLeft",
379
+ "cursorWordRight",
380
+ "cursorLineStart",
381
+ "cursorLineEnd",
382
+ "deleteCharBackward",
383
+ "deleteCharForward",
384
+ "deleteWordBackward",
385
+ "deleteWordForward",
386
+ "deleteToLineStart",
387
+ "deleteToLineEnd",
388
+ "historyPrevious",
389
+ "historyNext",
390
+ ].some((name) => deps.keybindings.matches(data, `tui.editor.${name}` as Keybinding))
391
+ );
392
+ },
204
393
  clock: deps.clock ?? { now: Date.now },
205
394
  signals: deps.signals ?? {
206
395
  takeInterruptOwnership: () => getTerminationCoordinator().releaseInterruptOwnership(),
@@ -227,8 +416,10 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
227
416
  isInspectingMutation: () => deps.overlay.isInspectingMutation(),
228
417
  toggleMutationInspection: () => deps.overlay.toggleMutationInspection(),
229
418
  scrollMutationInspection: (delta) => deps.overlay.scrollMutationInspection(delta),
230
- editDraft: (data) => {
231
- deps.editor.handleInput?.(data);
419
+ togglePermissionTerms: () => deps.overlay.togglePermissionTerms(),
420
+ canToggleOwner,
421
+ editDraft: (operation) => {
422
+ deps.editor.applyEdit?.(operation);
232
423
  deps.requestRender();
233
424
  },
234
425
  closeOverlay: () => deps.overlay.closeOverlay(),
@@ -277,13 +468,10 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
277
468
  listNotifications: () => deps.notifications.list(),
278
469
  dismissNotification: (id) => deps.notifications.dismiss(id),
279
470
  dismissAllNotifications: () => deps.notifications.dismissAll(),
280
- toggleLastToolExpanded: () => deps.chatPanel.toggleLastToolExpanded(),
281
- toggleAllToolsExpanded: () => deps.chatPanel.toggleAllToolsExpanded(),
282
- toggleLastThinking: () => deps.chatPanel.toggleLastThinking(),
283
- toggleAllThinking: () => deps.chatPanel.toggleAllThinking(),
284
471
  shutdownDisposers: [
285
472
  () => deps.shutdown.stopTickers(),
286
473
  () => leaderKeys.dispose(),
474
+ () => removeReload?.(),
287
475
  () => deps.shutdown.disposeInteractiveTickers(),
288
476
  () => deps.shutdown.disposeBeforeStatus(),
289
477
  () => deps.shutdown.disposeProjectionPrimary(),
@@ -312,6 +500,7 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
312
500
  });
313
501
  deps.registerInputListener((data) => {
314
502
  deps.onInputIngress?.(classifyInputAction(data, deps), data);
503
+
315
504
  return controller.handleInput(data);
316
505
  });
317
506
  return controller;
@@ -334,3 +523,36 @@ function classifyInputAction(data: string, deps: InteractiveInputRuntimeDeps): R
334
523
  if (deps.overlay.getState() !== "closed") return "overlay";
335
524
  return "editor";
336
525
  }
526
+
527
+ /** Operator-facing scope names; overlay state IDs stay inside routing. */
528
+ function overlayScopeLabel(state: OverlayState): string {
529
+ const names: Record<OverlayState, string> = {
530
+ closed: "Composer",
531
+ "permission-confirm": "Permission",
532
+ "dispatch-board": "Workers",
533
+ auth: "Authentication",
534
+ cost: "Usage",
535
+ "context-view": "Context",
536
+ "context-reset": "Context reset",
537
+ tasks: "Tasks",
538
+ decisions: "Decisions",
539
+ memory: "Memory",
540
+ view: "View",
541
+ model: "Model",
542
+ "model-scope": "Model cycle set",
543
+ settings: "Settings",
544
+ resume: "Resume",
545
+ tree: "Session tree",
546
+ "message-picker": "Messages",
547
+ "cwd-fallback": "Working directory",
548
+ "ask-user": "Interview",
549
+ help: "Help",
550
+ extensions: "Extensions",
551
+ interop: "Interop",
552
+ "skills-hub": "Library",
553
+ "side-question": "Side question",
554
+ "handoff-review": "Handoff review",
555
+ "fleet-run-approval": "Run approval",
556
+ };
557
+ return names[state];
558
+ }
@@ -17,7 +17,7 @@ import type { ResourcesContract } from "../domains/resources/index.js";
17
17
  import { ceilChars, contentChars } from "../domains/session/context-accounting.js";
18
18
  import type { SessionContract, TaskBoardSnapshot } from "../domains/session/index.js";
19
19
  import type { UserTasksStore } from "../domains/user-tasks/store.js";
20
- import type { Component, TUI } from "../engine/tui.js";
20
+ import type { Component, ScrollView, TUI } from "../engine/tui.js";
21
21
  import type { ChatLoop, ChatLoopEvent } from "./chat-loop.js";
22
22
  import { type ChatPanel, createChatPanel } from "./chat-panel.js";
23
23
  import { type CoalescingChatRenderer, createCoalescingChatRenderer } from "./chat-renderer.js";
@@ -33,7 +33,7 @@ import { createNotificationCenter, type NotificationCenter } from "./footer/noti
33
33
  import { getActiveRenderTrace } from "./interactive-shell.js";
34
34
  import type { InteractiveNoticeLevel } from "./interactive-subscriptions.js";
35
35
  import { type ClioKeybindingManager, createKeybindingManager } from "./keybinding-manager.js";
36
- import { buildLayout } from "./layout.js";
36
+ import { buildLayout, preserveTranscriptScroll } from "./layout.js";
37
37
  import type { SessionTranscript } from "./session-transcript.js";
38
38
  import { createSlashCommandAutocompleteProvider } from "./slash-autocomplete.js";
39
39
  import { parseSlashCommand, type RunIo } from "./slash-commands.js";
@@ -72,6 +72,8 @@ export interface InteractivePresentationFactories {
72
72
  }
73
73
 
74
74
  export interface InteractivePresentationDeps {
75
+ extensionCommands?: import("./slash-autocomplete.js").SlashAutocompleteOptions["extensionCommands"];
76
+ getExtensionStatus?: () => ReadonlyArray<string>;
75
77
  bus: SafeEventBus;
76
78
  providers: ProvidersContract;
77
79
  dispatch: Pick<DispatchContract, "snapshot">;
@@ -89,7 +91,7 @@ export interface InteractivePresentationDeps {
89
91
  /** Pending boot submissions remain visible until serial admission removes them. */
90
92
  bootPending?: Component;
91
93
  getSettings?: () => Readonly<ClioSettings>;
92
- resources?: Pick<ResourcesContract, "skills">;
94
+ resources?: Pick<ResourcesContract, "skills" | "prompts">;
93
95
  agents?: Pick<AgentsContract, "listSpecs">;
94
96
  session?: Pick<SessionContract, "current">;
95
97
  getSessionId?: () => string | null;
@@ -107,6 +109,12 @@ export interface InteractivePresentationDeps {
107
109
  /** Whether that prompt has a mutation to inspect, and whether it is open (issue #254). */
108
110
  getPermissionInspection?: () => import("./permission-hint.js").PermissionInspectionHint;
109
111
  getCwd?: () => string;
112
+ /**
113
+ * True when this process resumed an existing session at boot (`--continue`,
114
+ * `--session <id>`). The header opens collapsed rather than showing
115
+ * fresh-start onboarding above a conversation that already has history.
116
+ */
117
+ startsResumed?: boolean;
110
118
  resolveVisibleEventSequence?: (event: ChatLoopEvent) => number | null;
111
119
  resolveStreamIngress?: (
112
120
  event: ChatLoopEvent,
@@ -146,6 +154,8 @@ export interface InteractivePresentation {
146
154
  chatRenderer: CoalescingChatRenderer;
147
155
  io: RunIo;
148
156
  root: Component;
157
+ changeOutputStyle(mutation: () => void): void;
158
+ setLocalBashRunning(running: boolean): void;
149
159
  getObservabilitySnapshot(): ObservabilitySnapshot;
150
160
  /** Fold one raw chat event into the ephemeral throughput shown only while this turn is active. */
151
161
  recordChatEvent(event: ChatLoopEvent): void;
@@ -179,7 +189,7 @@ const DEFAULT_FACTORIES: InteractivePresentationFactories = {
179
189
  };
180
190
 
181
191
  /** Title-case a KeyId for compact chrome hints, preserving each caller's fallback. */
182
- function formatKeyLabel(keyId: string | undefined, fallback = "Alt+X"): string {
192
+ function formatKeyLabel(keyId: string | undefined, fallback = "unbound"): string {
183
193
  if (!keyId || keyId.length === 0) return fallback;
184
194
  return keyId
185
195
  .split("+")
@@ -218,32 +228,42 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
218
228
  const keybindings = deps.keybindings ?? factories.createKeybindings(settings);
219
229
  const { getExtensionStats, getLiveWorkspaceSnapshot, getWorkspaceSnapshot, refreshLiveWorkspaceGit } =
220
230
  deps.workspaceFacts;
231
+ /**
232
+ * The submit binding as the operator has it, or null when it is unbound or
233
+ * disabled. The header prints a key only when pressing it would actually
234
+ * submit, so a rebound or removed binding silently drops the hint instead of
235
+ * advertising a default that does nothing.
236
+ */
237
+ const effectiveSubmitKeyLabel = (): string | null => {
238
+ if (keybindings.isDisabled("tui.input.submit")) return null;
239
+ const key = keybindings.getKeys("tui.input.submit")[0];
240
+ return key === undefined || key.length === 0 ? null : formatKeyLabel(key, "");
241
+ };
221
242
 
222
243
  const banner = factories.createBanner({
223
244
  providers: deps.providers,
224
- observability: deps.observability,
225
- getContextUsage: () => deps.chat.contextUsage(),
226
245
  getWorkspaceSnapshot,
227
- getExtensionStats,
228
- // The repository probe runs off the render path now, so the frame that
229
- // shows its result has to be asked for when the probe lands.
246
+ // The authoritative project-context reader. It is synchronous on a cache
247
+ // miss, so the banner refreshes it off the frame rather than calling it
248
+ // during render; the frame that shows the result is asked for below.
249
+ ...(deps.getContextState ? { getContextState: deps.getContextState } : {}),
250
+ getSubmitKeyLabel: () => effectiveSubmitKeyLabel(),
230
251
  onFactsRefreshed: requestRender,
231
- ...(deps.getTaskMemoryStatus ? { getTaskMemoryStatus: deps.getTaskMemoryStatus } : {}),
232
252
  ...(deps.getSettings ? { getSettings: deps.getSettings } : {}),
233
253
  });
254
+ // A boot-time `--continue`/`--session` resume opens onto an existing
255
+ // conversation, so the launchpad's fresh-start onboarding would be a lie
256
+ // before the operator has typed anything.
257
+ if (deps.startsResumed === true) banner.collapseToSessionHeader();
234
258
  const renderTrace = getActiveRenderTrace();
235
259
  const chatPanel = factories.createChatPanel({
236
- getToolExpandKey: () => {
237
- const first = keybindings.getKeys("clio-coder.tool.expand")[0];
238
- return typeof first === "string" && first.length > 0 ? first : undefined;
239
- },
240
- getOutputVerbosity: () => deps.getSettings?.().interface.outputDetail ?? "default",
260
+ getOutputStyle: () => deps.getSettings?.().interface.outputDetail ?? "standard",
261
+ getTerminalRows: () => process.stdout.rows ?? 40,
241
262
  ...(renderTrace ? { onRenderMetrics: (metrics) => renderTrace.recordPanelRender(metrics) } : {}),
242
263
  });
243
264
  const followUpQueuePanel = factories.createFollowUpQueuePanel({
244
265
  getDequeueKey: () => {
245
- const first = keybindings.getKeys("clio-coder.message.dequeue")[0];
246
- return typeof first === "string" && first.length > 0 ? first : undefined;
266
+ return keybindings.actionLabel("clio-coder.message.dequeue");
247
267
  },
248
268
  });
249
269
  const statusController = factories.createStatusController({
@@ -359,10 +379,21 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
359
379
  );
360
380
  };
361
381
 
382
+ let localBashStartedAt: number | null = null;
362
383
  const footerDeps: FooterDashboardDeps = {
363
384
  providers: deps.providers,
364
385
  ...(deps.getSettings ? { getSettings: deps.getSettings } : {}),
365
- getAgentStatus: () => statusController.current(),
386
+ getAgentStatus: () => {
387
+ const status = statusController.current();
388
+ if (localBashStartedAt === null || (status.phase !== "idle" && status.phase !== "ended")) return status;
389
+ return {
390
+ ...status,
391
+ phase: "tool_running",
392
+ since: localBashStartedAt,
393
+ toolStartedAt: localBashStartedAt,
394
+ tool: { toolName: "bash", toolPreview: "local shell" },
395
+ };
396
+ },
366
397
  getTerminalColumns: () => deps.terminal.columns,
367
398
  getSessionTokens: () => observabilitySnapshot.session.tokens,
368
399
  getTokenThroughput: () =>
@@ -387,6 +418,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
387
418
  : {}),
388
419
  getWorkspaceSnapshot: getLiveWorkspaceSnapshot,
389
420
  getExtensionStats,
421
+ ...(deps.getExtensionStatus ? { getExtensionStatus: deps.getExtensionStatus } : {}),
390
422
  getSessionInfo: () => {
391
423
  const meta = deps.session?.current();
392
424
  return {
@@ -397,7 +429,9 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
397
429
  },
398
430
  getLastTurnSummary: () => lastTurnSummary,
399
431
  getNotifications: () => notifications.list(),
400
- dismissKeyLabel: formatKeyLabel(keybindings.getKeys("clio-coder.notifications.dismiss")[0]),
432
+ get dismissKeyLabel() {
433
+ return keybindings.actionLabel("clio-coder.notifications.dismiss");
434
+ },
401
435
  };
402
436
  footer = factories.buildFooter(footerDeps);
403
437
  const unsubscribeObservability = deps.observability.subscribe((snapshot) => {
@@ -431,11 +465,13 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
431
465
  getTurnPreparation: () => deps.chat.turnPreparation().phase,
432
466
  willEnterSteer: (text) => willEnterSteerActiveWork(deps, text),
433
467
  getSubmitKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.submit")[0], "Enter"),
434
- getNewlineKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.newLine")[0], "Shift+Enter"),
468
+ getNewlineKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.newLine")[0], "Ctrl+J"),
435
469
  };
436
470
  const editor = deps.editor ?? factories.createEditor(deps.tui, editorChrome);
437
471
  editor.focused = true;
438
472
  const autocomplete: AutocompleteProvider = factories.createAutocomplete({
473
+ promptTemplates: () => deps.resources?.prompts(getCwd()).items ?? [],
474
+ ...(deps.extensionCommands ? { extensionCommands: deps.extensionCommands } : {}),
439
475
  completionSources: {
440
476
  agents: async () =>
441
477
  (deps.agents?.listSpecs() ?? []).filter(isUserVisibleAgent).map((agent) => ({
@@ -533,6 +569,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
533
569
  },
534
570
  }
535
571
  : followUpQueuePanel;
572
+ let transcriptView: ScrollView | undefined;
536
573
  const root = factories.buildLayout(
537
574
  {
538
575
  banner,
@@ -544,6 +581,9 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
544
581
  {
545
582
  mode: settings.interface?.mode ?? "regular",
546
583
  fullscreenScrollbar: settings.interface?.fullscreenScrollbar ?? "auto",
584
+ onTranscript: (view) => {
585
+ transcriptView = view;
586
+ },
547
587
  },
548
588
  );
549
589
  deps.mount?.(root, editor);
@@ -553,7 +593,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
553
593
  deps.clearScheduledInterval ??
554
594
  ((handle: PresentationTickerHandle): void => clearInterval(handle as ReturnType<typeof setInterval>));
555
595
  const footerTicker = scheduleInterval(() => {
556
- const statusActive = statusController.current().phase !== "idle";
596
+ const statusActive = statusController.current().phase !== "idle" || localBashStartedAt !== null;
557
597
  if (!deps.chat.isStreaming() && !statusActive && !footer.isExpanded()) return;
558
598
  footer.refresh();
559
599
  requestRender();
@@ -585,6 +625,9 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
585
625
  const disposeBeforeStatus = (): void => {
586
626
  if (beforeStatusDisposed) return;
587
627
  beforeStatusDisposed = true;
628
+ // Before the subscriptions go: a project-context refresh already in flight
629
+ // must not land afterwards and ask a torn-down presentation for a frame.
630
+ banner.dispose();
588
631
  footer.dispose();
589
632
  unsubscribeObservability();
590
633
  contextActivityStore.unsubscribe();
@@ -618,6 +661,13 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
618
661
  chatRenderer,
619
662
  io,
620
663
  root,
664
+ setLocalBashRunning(running) {
665
+ localBashStartedAt = running ? Date.now() : null;
666
+ footer.refresh();
667
+ requestRender();
668
+ },
669
+ changeOutputStyle: (mutation) =>
670
+ chatRenderer.mutate(() => preserveTranscriptScroll(transcriptView, deps.terminal.columns, mutation), "output-style"),
621
671
  getObservabilitySnapshot: () => observabilitySnapshot,
622
672
  recordChatEvent,
623
673
  recordToolStart: (toolCallId, toolName) => {