@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
@@ -17,7 +17,7 @@ import {
17
17
  type ThinkingLevel,
18
18
  thinkingLevelChoiceLabel,
19
19
  } from "../domains/providers/index.js";
20
- import type { LibraryEntryKind, ResourcesContract } from "../domains/resources/index.js";
20
+ import type { ResourcesContract } from "../domains/resources/index.js";
21
21
  import { installSkill } from "../domains/resources/skills/marketplace.js";
22
22
  import { foldDecisionBoard } from "../domains/session/decision-board.js";
23
23
  import type { SessionContract, SessionEntry } from "../domains/session/index.js";
@@ -33,7 +33,7 @@ import type { ChatLoop } from "./chat-loop.js";
33
33
  import { type ChatPanel, createChatPanel } from "./chat-panel.js";
34
34
  import { rehydrateChatPanelFromTurns } from "./chat-renderer.js";
35
35
  import { runCompactWithNotice } from "./command-fallbacks.js";
36
- import { appendNotice, appendOperatorCommand } from "./command-output.js";
36
+ import { appendNotice, appendOperatorAside, appendOperatorCommand, appendReferenceCard } from "./command-output.js";
37
37
  import { runOperatorRecall } from "./context-recall-command.js";
38
38
  import { renderSessionHtml } from "./export-html/index.js";
39
39
  import { dateLocal } from "./format-time.js";
@@ -44,6 +44,7 @@ import {
44
44
  type CouncilDispatchOutcome,
45
45
  dispatchSlashCommand,
46
46
  type InitCommandOptions,
47
+ type LibraryBrowseRequest,
47
48
  parseSlashCommand,
48
49
  type RunIo,
49
50
  type SettingsAreaId,
@@ -61,10 +62,12 @@ export interface InteractiveSlashSubmitExpansion {
61
62
  images: ImageContent[];
62
63
  workingContextPaths: string[];
63
64
  pendingSkillRequests: PendingSkillRequest[];
65
+ /** The typed line and a template note to paint instead of `text`; see `InteractiveSubmitExpansion`. */
66
+ display?: { text: string; note: string };
64
67
  }
65
68
 
66
69
  type SlashChat = Pick<ChatLoop, "clearSkillSurface" | "getSessionId" | "isStreaming" | "submit">;
67
- type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
70
+ type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser">;
68
71
  type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
69
72
  type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
70
73
  type SlashExtensions = Pick<ExtensionsContract, "list">;
@@ -72,6 +75,9 @@ type SlashAgents = Pick<AgentsContract, "getSpec" | "listSpecs">;
72
75
  type SlashShare = Pick<ShareContract, "writeArchive" | "planImport" | "importArchive">;
73
76
 
74
77
  export interface InteractiveSlashRuntimeDeps {
78
+ keyboardActions?: SlashCommandContext["keyboardActions"];
79
+ operatorExtensions?: SlashCommandContext["operatorExtensions"];
80
+ showExtensionOutput?: SlashCommandContext["showExtensionOutput"];
75
81
  io: RunIo;
76
82
  bus: SafeEventBus;
77
83
  dispatch: DispatchContract;
@@ -82,6 +88,7 @@ export interface InteractiveSlashRuntimeDeps {
82
88
  resources?: SlashResources;
83
89
  extensions?: SlashExtensions;
84
90
  reloadExtensions?: SlashCommandContext["reloadExtensions"];
91
+ reloadPlugins?: SlashCommandContext["reloadPlugins"];
85
92
  interop?: SlashCommandContext["interop"];
86
93
  agents?: SlashAgents;
87
94
  share?: SlashShare;
@@ -119,7 +126,7 @@ export interface InteractiveSlashRuntimeDeps {
119
126
  session?: Pick<SessionContract, "tree" | "current" | "appendEntry">;
120
127
  expandSubmit: (text: string) => Promise<InteractiveSlashSubmitExpansion>;
121
128
  openAskUser: AskUserHandler;
122
- openSkillsHub: (tab?: LibraryEntryKind) => void;
129
+ openSkillsHub: (request?: LibraryBrowseRequest) => void;
123
130
  openCost: () => void;
124
131
  /** Run one `/btw` side question in its own overlay. */
125
132
  openSideQuestion: (question: string) => void;
@@ -155,8 +162,6 @@ export interface InteractiveSlashRuntimeDeps {
155
162
  openTree: () => void;
156
163
  openMessagePicker: () => void;
157
164
  openHelp: (query?: string) => void;
158
- openAgents: () => void;
159
- openPrompts: () => void;
160
165
  openExtensions: () => void;
161
166
  openInterop?: () => void;
162
167
  openContextReset: () => void;
@@ -178,7 +183,6 @@ export interface InteractiveSlashRuntime {
178
183
  }
179
184
 
180
185
  /** Owns slash-command context construction and its asynchronous command state. */
181
- const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["interface"]["outputDetail"]> = ["minimal", "default", "verbose"];
182
186
 
183
187
  /** Thinking capability of the active orchestrator target and model, or null when unresolved. */
184
188
  export function resolveThinkingCapability(
@@ -261,13 +265,22 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
261
265
  // is in the ledger yet, and a refused preflight must not leave a row
262
266
  // that reads like a committed turn (issue #251).
263
267
  let rowStatus: UserTurnStatus = "pending";
264
- if (!willQueue) deps.chatPanel.appendUser(sub.text, () => rowStatus);
268
+ if (!willQueue) {
269
+ deps.chatPanel.appendUser(sub.display?.text ?? sub.text, () => rowStatus);
270
+ if (sub.display) {
271
+ appendOperatorAside(sub.display.note, {
272
+ appendReplayBlock: (renderBlock) => deps.chatPanel.appendReplayBlock(renderBlock),
273
+ requestRender: deps.requestRender,
274
+ });
275
+ }
276
+ }
265
277
  deps.requestRender();
266
278
  let acknowledgeAdmission = (): void => {};
267
279
  const admitted = new Promise<void>((resolve) => {
268
280
  acknowledgeAdmission = resolve;
269
281
  });
270
282
  const turn = deps.chat.submit(sub.text, {
283
+ ...(sub.display ? { display: sub.display } : {}),
271
284
  ...(sub.images.length > 0 ? { images: sub.images } : {}),
272
285
  ...(sub.workingContextPaths.length > 0 ? { workingContextPaths: sub.workingContextPaths } : {}),
273
286
  ...(sub.pendingSkillRequests.length > 0 ? { pendingSkillRequests: sub.pendingSkillRequests } : {}),
@@ -311,6 +324,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
311
324
  const admitChat = async (text: string, signal?: AbortSignal): Promise<void> => {
312
325
  try {
313
326
  signal?.throwIfAborted();
327
+ // submitChat can be called directly, bypassing command dispatch. Keep
328
+ // the reserved clear command ahead of skill lookup and installation.
329
+ const command = parseSlashCommand(text);
330
+ if (command.kind === "skill-surface-clear") {
331
+ dispatchSlashCommand(command, context);
332
+ return;
333
+ }
314
334
  const submitted = await deps.expandSubmit(text);
315
335
  signal?.throwIfAborted();
316
336
  const uninstalled = submitted.pendingSkillRequests.find((request) => !request.installed);
@@ -380,6 +400,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
380
400
  requestRender: deps.requestRender,
381
401
  });
382
402
  },
403
+ showReference: (card) => {
404
+ appendReferenceCard(card, {
405
+ appendReplayBlock: (renderBlock) => deps.chatPanel.appendReplayBlock(renderBlock),
406
+ requestRender: deps.requestRender,
407
+ });
408
+ },
383
409
  dispatch: deps.dispatch,
384
410
  ...(deps.getDecisionBoard ? { getDecisionBoard: deps.getDecisionBoard } : {}),
385
411
  bus: deps.bus,
@@ -394,6 +420,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
394
420
  openSkillsHub: deps.openSkillsHub,
395
421
  clearSkillSurface: () => deps.chat.clearSkillSurface(),
396
422
  listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
423
+ ...(deps.keyboardActions ? { keyboardActions: deps.keyboardActions } : {}),
424
+ ...(deps.operatorExtensions ? { operatorExtensions: deps.operatorExtensions } : {}),
425
+ ...(deps.showExtensionOutput ? { showExtensionOutput: deps.showExtensionOutput } : {}),
397
426
  listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
398
427
  listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
399
428
  exportShareArchive: (outPath) => {
@@ -466,7 +495,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
466
495
  if (!match) {
467
496
  return { status: "unsupported", level, supported: supported.map(labelFor) };
468
497
  }
469
- // Session scope, like /output: onSetThinkingLevel writes the level
498
+ // Session scope, like Alt+O: onSetThinkingLevel writes the level
470
499
  // through to settings.yaml as the new default, which a slash command
471
500
  // has no mandate to do.
472
501
  if (deps.commitSetting) {
@@ -508,42 +537,6 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
508
537
  if (selected) dispatchSlashCommand({ kind: "thinking-set", level: selected.value }, context);
509
538
  });
510
539
  },
511
- setOutputVerbosity: (verbosity) => {
512
- if (!deps.getSettings || !(deps.commitSetting || deps.writeSettings)) return { status: "unavailable" };
513
- const requested = verbosity.trim().toLowerCase();
514
- const match = OUTPUT_VERBOSITIES.find((candidate) => candidate === requested);
515
- if (!match) return { status: "unsupported", verbosity, supported: OUTPUT_VERBOSITIES };
516
- const next = structuredClone(deps.getSettings()) as ClioSettings;
517
- next.interface.outputDetail = match;
518
- // Session scope: /output changes this session and leaves settings.yaml
519
- // alone. Saving it as the default is what Settings → Terminal is for.
520
- if (deps.commitSetting) deps.commitSetting("interface.outputDetail", next, "session");
521
- else deps.writeSettings?.(next);
522
- // `/output` is also the explicit reset action for transcript folds. Do
523
- // this even when the requested level already matches the current one;
524
- // the render-time change detector cannot observe a same-value command.
525
- deps.chatPanel.clearFoldOverrides();
526
- deps.refreshFooter();
527
- return { status: "applied", verbosity: match };
528
- },
529
- openOutputPicker: () => {
530
- void deps
531
- .openAskUser([
532
- {
533
- question: "Choose transcript detail for this session.",
534
- header: "Output",
535
- options: OUTPUT_VERBOSITIES.map((value) => ({
536
- label: `${value[0]?.toUpperCase()}${value.slice(1)}`,
537
- })),
538
- },
539
- ])
540
- .then((result) => {
541
- if (result.cancelled) return;
542
- const answer = result.answers[0]?.answer.toLowerCase();
543
- const selected = OUTPUT_VERBOSITIES.find((value) => value === answer);
544
- if (selected) dispatchSlashCommand({ kind: "output-set", verbosity: selected }, context);
545
- });
546
- },
547
540
  openModel: deps.openModel,
548
541
  providers: deps.providers,
549
542
  applyModelRef: (ref) => {
@@ -568,10 +561,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
568
561
  openTree: deps.openTree,
569
562
  openMessagePicker: deps.openMessagePicker,
570
563
  openHelp: deps.openHelp,
571
- openAgents: deps.openAgents,
572
- openPrompts: deps.openPrompts,
573
564
  openExtensions: deps.openExtensions,
574
565
  ...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
566
+ ...(deps.reloadPlugins ? { reloadPlugins: deps.reloadPlugins } : {}),
575
567
  ...(deps.openInterop ? { openInterop: deps.openInterop } : {}),
576
568
  ...(deps.interop ? { interop: deps.interop } : {}),
577
569
  setEditorText: (text) => {
@@ -595,7 +587,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
595
587
  // operator overrides, and rendered at a stable width. HTML converts
596
588
  // the resulting ANSI presentation to inline styles; Markdown keeps the
597
589
  // prior plain-text fenced transcript.
598
- const exportPanel = createChatPanel({ unboundedToolBodies: true, getOutputVerbosity: () => "verbose" });
590
+ const exportPanel = createChatPanel({ unboundedToolBodies: true, getOutputStyle: () => "detailed" });
599
591
  // Scoped to the leaf the session is on, the same way /resume replays
600
592
  // (issue #107): with a /tree pin persisted and not yet extended, the
601
593
  // file still holds the abandoned branch after the pin, and an unscoped
@@ -64,20 +64,27 @@ export interface PlatformKeybindingWarning {
64
64
 
65
65
  export interface LeaderTarget {
66
66
  key: string;
67
- id: ClioKeybinding;
67
+ id: Keybinding;
68
+ label?: string;
69
+ disabledReason?: string;
68
70
  }
69
71
 
70
72
  export interface ClioKeybindingManager {
71
73
  matches(data: string, id: Keybinding): boolean;
72
74
  getKeys(id: Keybinding): ReadonlyArray<KeyId>;
73
- getDescription(id: ClioKeybinding): string;
75
+ getDescription(id: Keybinding): string;
76
+ readonly generation: number;
77
+ reload(overrides: Readonly<Record<string, string | string[]>>): void;
78
+ onReload(listener: () => void): () => void;
79
+ isDisabled(id: Keybinding): boolean;
80
+ actionLabel(id: Keybinding): string;
74
81
  getConflicts(): ReadonlyArray<KeybindingConflict>;
75
82
  overrideCount(): number;
76
83
  invalidCount(): number;
77
84
  invalidBindings(): ReadonlyArray<InvalidKeybinding>;
78
85
  platformWarnings(): ReadonlyArray<PlatformKeybindingWarning>;
79
86
  leaderTargets(): ReadonlyArray<LeaderTarget>;
80
- hotkeyEntries(): ReadonlyArray<{ id: ClioKeybinding; keys: string; description: string; source: "default" | "user" }>;
87
+ hotkeyEntries(): ReadonlyArray<{ id: Keybinding; keys: string; description: string; source: "default" | "user" }>;
81
88
  }
82
89
 
83
90
  const BASE_SPECIAL_KEYS = new Set([
@@ -156,6 +163,15 @@ const MODIFIERS = new Set(["ctrl", "shift", "alt", "super"]);
156
163
  * attempt to exercise pi-tui's matcher; we just reject identifiers that
157
164
  * would silently fail at match time.
158
165
  */
166
+ function canonicalKey(key: string): string {
167
+ const parts = key.toLowerCase().split("+");
168
+ let base = parts.pop() ?? "";
169
+ if (base === "esc") base = "escape";
170
+ if (base === "return") base = "enter";
171
+ const modifiers = ["ctrl", "alt", "shift", "super"].filter((mod) => parts.includes(mod));
172
+ return [...modifiers, base].join("+");
173
+ }
174
+
159
175
  function isValidKeyId(keyId: unknown): boolean {
160
176
  if (typeof keyId !== "string" || keyId.length === 0) return false;
161
177
  const parts = keyId.toLowerCase().split("+");
@@ -192,10 +208,13 @@ export function validateKeybindings(raw: Readonly<Record<string, string | string
192
208
  const valid: KeybindingsConfig = {};
193
209
  const invalid: InvalidKeybinding[] = [];
194
210
  for (const [id, value] of Object.entries(raw)) {
211
+ if (!Object.hasOwn(CLIO_KEYBINDINGS, id)) {
212
+ invalid.push({ id, keys: ["unknown action ID; use /help"] });
213
+ continue;
214
+ }
195
215
  if (typeof value === "string") {
196
- if (value.length === 0) continue;
197
216
  if (isValidKeyId(value)) {
198
- valid[id] = value as KeyId;
217
+ valid[id] = canonicalKey(value) as KeyId;
199
218
  } else {
200
219
  invalid.push({ id, keys: [value] });
201
220
  }
@@ -205,14 +224,17 @@ export function validateKeybindings(raw: Readonly<Record<string, string | string
205
224
  const accepted: KeyId[] = [];
206
225
  const rejected: string[] = [];
207
226
  for (const entry of value) {
208
- if (typeof entry !== "string" || entry.length === 0) continue;
227
+ if (typeof entry !== "string") {
228
+ rejected.push(String(entry));
229
+ continue;
230
+ }
209
231
  if (isValidKeyId(entry)) {
210
- accepted.push(entry as KeyId);
232
+ accepted.push(canonicalKey(entry) as KeyId);
211
233
  } else {
212
234
  rejected.push(entry);
213
235
  }
214
236
  }
215
- if (accepted.length > 0) valid[id] = accepted;
237
+ if (accepted.length > 0 || value.length === 0) valid[id] = accepted;
216
238
  if (rejected.length > 0) invalid.push({ id, keys: rejected });
217
239
  }
218
240
  }
@@ -329,8 +351,10 @@ function keyUsesAltLetter(keyId: string): boolean {
329
351
 
330
352
  function terminalReservedReason(keyId: string): string | null {
331
353
  const key = normalizeKeyForRisk(keyId);
332
- if (key === "ctrl+s" || key === "ctrl+q") return "terminal flow control may intercept this chord";
333
- if (key === "ctrl+z") return "shell job control may suspend the process";
354
+ if (key === "ctrl+s")
355
+ return "an intermediary may intercept this chord; Node raw mode normally disables terminal flow control";
356
+ if (key === "ctrl+z")
357
+ return "an intermediary may intercept this chord; Node raw mode normally disables signal generation";
334
358
  return null;
335
359
  }
336
360
 
@@ -342,7 +366,7 @@ function keyRiskReason(keyId: string, support: TerminalKeySupport): string | nul
342
366
  return terminalReservedReason(key);
343
367
  }
344
368
 
345
- const MACOS_OPTION_DEFAULT_WARNING_ID = "clio.macos.option-letter.defaults";
369
+ const MACOS_OPTION_DEFAULT_WARNING_ID = "clio-coder.macos.option-letter.defaults";
346
370
 
347
371
  export function detectPlatformKeybindingWarnings(
348
372
  userBindings: Readonly<KeybindingsConfig>,
@@ -403,94 +427,147 @@ function joinKeys(keys: ReadonlyArray<KeyId>): string {
403
427
  return keys.join(" / ");
404
428
  }
405
429
 
406
- function deriveLeaderTargets(inner: KeybindingsManager): LeaderTarget[] {
407
- const targets: LeaderTarget[] = [];
408
- for (const id of CLIO_APP_KEYBINDING_IDS) {
409
- for (const key of inner.getKeys(id as Keybinding)) {
410
- const base = altLetterBase(String(key));
411
- if (base) targets.push({ key: base, id });
430
+ const VIEWPORT_LEADER_TARGETS: LeaderTarget[] = [
431
+ { key: "z", id: "tui.editor.undo" },
432
+ { key: "r", id: "tui.altScreen.search" },
433
+ { key: "p", id: "tui.altScreen.pageUp" },
434
+ { key: "n", id: "tui.altScreen.pageDown" },
435
+ { key: "home", id: "tui.altScreen.top" },
436
+ { key: "end", id: "tui.altScreen.bottom" },
437
+ { key: "", id: "tui.altScreen.previousPrompt" },
438
+ { key: "", id: "tui.altScreen.nextPrompt" },
439
+ ];
440
+
441
+ function keybindingScope(id: string): string {
442
+ if (id.startsWith("clio-coder.")) return "composer";
443
+ if (id.startsWith("tui.select.")) return "selection";
444
+ if (/tui.altScreen.search(Next|Previous|Close)/u.test(id)) return "search";
445
+ if (id.startsWith("tui.altScreen.")) return "fullscreen composer";
446
+ return "editable field";
447
+ }
448
+
449
+ function legacyKey(key: string): string {
450
+ const canonical = canonicalKey(key);
451
+ return (
452
+ ({ "ctrl+i": "tab", "ctrl+m": "enter", "ctrl+[": "escape", "ctrl+_": "ctrl+-" } as Record<string, string>)[
453
+ canonical
454
+ ] ?? canonical
455
+ );
456
+ }
457
+
458
+ /** Selection, search and editable input deliberately share delivered keys. */
459
+ function scopesOverlap(a: string, b: string): boolean {
460
+ const left = keybindingScope(a),
461
+ right = keybindingScope(b);
462
+ if (left === "selection" || right === "selection") return left === right;
463
+ if (left === "search" || right === "search") return left === right;
464
+ if (
465
+ (a === "clio-coder.exit" && b === "tui.editor.deleteCharForward") ||
466
+ (b === "clio-coder.exit" && a === "tui.editor.deleteCharForward")
467
+ )
468
+ return false;
469
+ return true;
470
+ }
471
+
472
+ function effectiveConflicts(inner: KeybindingsManager): KeybindingConflict[] {
473
+ const keys = new Map<string, string[]>();
474
+ for (const id of Object.keys(CLIO_KEYBINDINGS) as Keybinding[]) {
475
+ for (const key of inner.getKeys(id)) {
476
+ const canonical = legacyKey(key);
477
+ const ids = keys.get(canonical) ?? [];
478
+ if (!ids.includes(id)) ids.push(id);
479
+ keys.set(canonical, ids);
412
480
  }
413
481
  }
414
- return targets;
482
+ return [...keys]
483
+ .filter(
484
+ ([, ids]) =>
485
+ ids.length > 1 && ids.some((id, index) => ids.slice(index + 1).some((other) => scopesOverlap(id, other))),
486
+ )
487
+ .map(([key, keybindings]) => ({
488
+ key: key as KeyId,
489
+ keybindings: keybindings.filter((id) => keybindings.some((other) => other !== id && scopesOverlap(id, other))),
490
+ }));
415
491
  }
416
492
 
417
493
  function buildManager(
418
- inner: KeybindingsManager,
419
- invalid: ReadonlyArray<InvalidKeybinding>,
420
- platformWarnings: ReadonlyArray<PlatformKeybindingWarning>,
494
+ overrides: Readonly<Record<string, string | string[]>>,
495
+ env: Readonly<Record<string, string | undefined>>,
496
+ install: boolean,
421
497
  ): ClioKeybindingManager {
422
- const frozen = invalid.map((entry) => ({ id: entry.id, keys: [...entry.keys] as ReadonlyArray<string> }));
423
- const frozenPlatformWarnings = platformWarnings.map((entry) => ({
424
- id: entry.id,
425
- keys: [...entry.keys] as ReadonlyArray<string>,
426
- terminal: entry.terminal,
427
- reason: entry.reason,
428
- source: entry.source,
429
- }));
430
- const frozenLeaderTargets = deriveLeaderTargets(inner).map((entry) => ({ ...entry }));
498
+ let validated = validateKeybindings(overrides);
499
+ const inner = new KeybindingsManager(CLIO_KEYBINDINGS, validated.valid);
500
+ if (install) setKeybindings(inner);
501
+ let generation = 0;
502
+ const listeners = new Set<() => void>();
503
+ const isDisabled = (id: Keybinding): boolean => {
504
+ const value = inner.getUserBindings()[id];
505
+ return Array.isArray(value) && value.length === 0;
506
+ };
507
+ const leaderTargets = (): LeaderTarget[] => {
508
+ if (inner.getKeys("clio-coder.leader").length === 0) return [];
509
+ const app = CLIO_APP_KEYBINDING_IDS.flatMap((id) => {
510
+ const descriptor = CLIO_APP_KEYBINDINGS[id];
511
+ return "leader" in descriptor ? [{ key: descriptor.leader, id }] : [];
512
+ });
513
+ return [...app, ...VIEWPORT_LEADER_TARGETS].filter(({ id }) => !isDisabled(id));
514
+ };
515
+ const actionLabel = (id: Keybinding): string => {
516
+ const keys = inner.getKeys(id);
517
+ const suffix = leaderTargets().find((entry) => entry.id === id)?.key;
518
+ return (
519
+ [keys.join(" / "), suffix ? `${inner.getKeys("clio-coder.leader")[0]} ${suffix}` : ""].filter(Boolean).join(" · ") ||
520
+ "unbound; see /help"
521
+ );
522
+ };
431
523
  return {
432
- matches(data, id) {
433
- return inner.matches(data, id as Keybinding);
434
- },
435
- getKeys(id) {
436
- return inner.getKeys(id as Keybinding);
437
- },
438
- getDescription(id) {
439
- return inner.getDefinition(id as Keybinding).description ?? "";
440
- },
441
- getConflicts() {
442
- return inner.getConflicts();
443
- },
444
- overrideCount() {
445
- return Object.keys(inner.getUserBindings()).length;
524
+ matches: (data, id) => inner.matches(data, id),
525
+ getKeys: (id) => inner.getKeys(id),
526
+ getDescription: (id) => inner.getDefinition(id).description ?? "",
527
+ getConflicts: () => effectiveConflicts(inner),
528
+ get generation() {
529
+ return generation;
446
530
  },
447
- invalidCount() {
448
- return frozen.reduce((sum, entry) => sum + entry.keys.length, 0);
531
+ reload(next) {
532
+ validated = validateKeybindings(next);
533
+ inner.setUserBindings(validated.valid);
534
+ if (install) setKeybindings(inner);
535
+ generation += 1;
536
+ for (const listener of listeners) listener();
449
537
  },
450
- invalidBindings() {
451
- return frozen;
538
+ onReload(listener) {
539
+ listeners.add(listener);
540
+ return () => {
541
+ listeners.delete(listener);
542
+ };
452
543
  },
453
- platformWarnings() {
454
- return frozenPlatformWarnings;
455
- },
456
- leaderTargets() {
457
- return frozenLeaderTargets;
458
- },
459
- hotkeyEntries() {
460
- const userBindings = inner.getUserBindings();
461
- return CLIO_APP_KEYBINDING_IDS.map((id) => ({
544
+ isDisabled,
545
+ actionLabel,
546
+ overrideCount: () => Object.keys(validated.valid).length,
547
+ invalidCount: () => validated.invalid.reduce((sum, entry) => sum + entry.keys.length, 0),
548
+ invalidBindings: () => validated.invalid,
549
+ platformWarnings: () => detectPlatformKeybindingWarnings(validated.valid, detectTerminalKeySupport(env)),
550
+ leaderTargets,
551
+ hotkeyEntries: () =>
552
+ (Object.keys(CLIO_KEYBINDINGS) as Keybinding[]).map((id) => ({
462
553
  id,
463
- keys: joinKeys(inner.getKeys(id as Keybinding)),
464
- description: inner.getDefinition(id as Keybinding).description ?? "",
465
- source: userBindings[id] === undefined ? ("default" as const) : ("user" as const),
466
- }));
467
- },
554
+ keys: joinKeys(inner.getKeys(id)),
555
+ description: `${inner.getDefinition(id).description ?? ""} (${keybindingScope(id)}${isDisabled(id) ? "; disabled by user" : ""})${id === "tui.input.copy" ? "; composer Ctrl+C cancels; use native terminal clipboard" : ""}`,
556
+ source: validated.valid[id] === undefined ? "default" : "user",
557
+ })),
468
558
  };
469
559
  }
470
560
 
471
- /**
472
- * Build a `ClioKeybindingManager` from the provided settings snapshot. The
473
- * resulting manager is also installed as pi-tui's global so editor and
474
- * select components pick up the same overrides. Callers are expected to
475
- * recreate the manager if `settings.interface.keybindings` is replaced wholesale;
476
- * partial live updates should instead go through `manager` state.
477
- */
478
561
  export function createKeybindingManager(
479
562
  settings: Readonly<ClioSettings>,
480
- env: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,
563
+ env: Readonly<Record<string, string | undefined>> = process.env,
481
564
  ): ClioKeybindingManager {
482
- const { valid, invalid } = validateKeybindings(settings.interface.keybindings ?? {});
483
- const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
484
- setKeybindings(inner);
485
- return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
565
+ return buildManager(settings.interface.keybindings ?? {}, env, true);
486
566
  }
487
567
 
488
- /** Pure test hook: build a manager from a raw settings snapshot without touching the pi-tui global. */
489
568
  export function createKeybindingManagerForTesting(
490
569
  overrides: Readonly<Record<string, string | string[]>> = {},
491
- env: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = {},
570
+ env: Readonly<Record<string, string | undefined>> = {},
492
571
  ): ClioKeybindingManager {
493
- const { valid, invalid } = validateKeybindings(overrides);
494
- const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
495
- return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
572
+ return buildManager(overrides, env, false);
496
573
  }
@@ -0,0 +1,37 @@
1
+ import {
2
+ type Component,
3
+ decodePrintableKey,
4
+ Editor,
5
+ Input,
6
+ type TUI,
7
+ TuiAltScreen,
8
+ TuiMainScreen,
9
+ } from "../engine/tui.js";
10
+
11
+ /** Internal focus contract for Clio's existing components and frame wrappers. */
12
+ export interface KeyboardOwner {
13
+ readonly keyboardScope?: "browse" | "edit" | "review";
14
+ undoInput?(): boolean;
15
+ }
16
+
17
+ export function keyboardOwner(component: object | null): KeyboardOwner {
18
+ if (component instanceof Editor || component instanceof Input) {
19
+ return {
20
+ keyboardScope: "edit",
21
+ undoInput: () => {
22
+ component.applyEdit("undo");
23
+ return true;
24
+ },
25
+ };
26
+ }
27
+ return (component as KeyboardOwner | null) ?? {};
28
+ }
29
+
30
+ export function focusedComponent(tui: TUI): Component | null {
31
+ return tui instanceof TuiAltScreen || tui instanceof TuiMainScreen ? tui.getFocusedComponent() : null;
32
+ }
33
+
34
+ /** Preserve controls and paste packets; normalize only encoded printable keys. */
35
+ export function localKey(data: string): string {
36
+ return data.includes("\x1b[200~") ? data : (decodePrintableKey(data) ?? data);
37
+ }
@@ -13,6 +13,7 @@ export interface LayoutParts {
13
13
  export interface LayoutOptions {
14
14
  mode?: TuiMode;
15
15
  fullscreenScrollbar?: ScrollViewScrollbar;
16
+ onTranscript?: (view: ScrollView) => void;
16
17
  }
17
18
 
18
19
  export interface FullscreenLayout {
@@ -20,10 +21,7 @@ export interface FullscreenLayout {
20
21
  transcript: ScrollView;
21
22
  }
22
23
 
23
- function buildFullscreenLayout(
24
- parts: LayoutParts,
25
- options: Pick<LayoutOptions, "fullscreenScrollbar"> = {},
26
- ): FullscreenLayout {
24
+ function buildFullscreenLayout(parts: LayoutParts, options: LayoutOptions = {}): FullscreenLayout {
27
25
  const document = new Container();
28
26
  document.addChild(parts.banner);
29
27
  document.addChild(parts.chat);
@@ -36,6 +34,7 @@ function buildFullscreenLayout(
36
34
  scrollbarTrackStyle: (text) => theme.fg("frame", text),
37
35
  scrollbarThumbStyle: () => theme.fg("frameStrong", GLYPH.barFull),
38
36
  });
37
+ options.onTranscript?.(transcript);
39
38
  const dock = new VStack();
40
39
  if (parts.pending) dock.addChild(parts.pending, { shrink: 1, minSize: 0 });
41
40
  dock.addChild(parts.editor, { shrink: 1, minSize: 3 });
@@ -56,3 +55,29 @@ export function buildLayout(parts: LayoutParts, options: LayoutOptions = {}): Co
56
55
  root.addChild(parts.footer);
57
56
  return root;
58
57
  }
58
+
59
+ /** Keep the nearest surviving text at the viewport when a preset changes row counts. */
60
+ export function preserveTranscriptScroll(view: ScrollView | undefined, width: number, mutation: () => void): void {
61
+ if (!view || view.isFollowingEnd) {
62
+ mutation();
63
+ return;
64
+ }
65
+ const top = view.scrollTop;
66
+ const before = view.render(width);
67
+ mutation();
68
+ const after = view.render(width);
69
+ for (let row = top; row < Math.min(before.length, top + view.viewportHeight); row++) {
70
+ const anchor = before[row];
71
+ if (!anchor?.trim()) continue;
72
+ let match = -1;
73
+ for (let index = 0; index < after.length; index++) {
74
+ if (after[index] === anchor && (match < 0 || Math.abs(index - row) < Math.abs(match - row))) match = index;
75
+ }
76
+ if (match >= 0) {
77
+ view.updateLayout(after.length, view.viewportHeight, () => {});
78
+ view.scrollTo(Math.max(0, match - (row - top)), { disableFollow: true });
79
+ return;
80
+ }
81
+ }
82
+ view.scrollTo(top, { disableFollow: true });
83
+ }