@iowarp/clio-coder 0.4.6 → 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 (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  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-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.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-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  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-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -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
+ }
@@ -1,139 +1,86 @@
1
- import type { ClioKeybinding } from "../domains/config/keybindings.js";
2
- import { isKeyRelease, type KeyId, matchesKey } from "../engine/tui.js";
1
+ import { decodePrintableKey, isKeyRelease, isKeyRepeat, type Keybinding, matchesKey } from "../engine/tui.js";
3
2
 
4
3
  export interface LeaderTarget {
5
4
  key: string;
6
- id: ClioKeybinding;
5
+ id: Keybinding;
6
+ label?: string;
7
+ disabledReason?: string;
7
8
  }
8
-
9
- export type LeaderKeyState = { status: "idle" } | { status: "pending"; expiresAt: number };
10
-
9
+ export type LeaderKeyState = { status: "idle" } | { status: "pending"; selected: number; notice?: string };
10
+ export const IDLE_LEADER_STATE: LeaderKeyState = { status: "idle" };
11
11
  export interface LeaderKeyRouteDeps {
12
- matchesLeader: (data: string) => boolean;
12
+ matchesLeader(data: string): boolean;
13
13
  leaderTargets: ReadonlyArray<LeaderTarget>;
14
- dispatchAction: (id: ClioKeybinding) => boolean;
15
- now: number;
16
- timeoutMs?: number;
14
+ dispatchAction(id: Keybinding): boolean;
17
15
  isRelease?: (data: string) => boolean;
18
16
  }
19
-
20
17
  export interface LeaderKeyRouteResult {
21
18
  state: LeaderKeyState;
22
19
  consumed: boolean;
23
20
  }
24
21
 
25
- export const LEADER_TIMEOUT_MS = 1500;
26
- export const IDLE_LEADER_STATE: LeaderKeyState = { status: "idle" };
27
-
28
- function baseLetterFromInput(data: string): string | null {
29
- if (data.length === 1) {
30
- const lower = data.toLowerCase();
31
- return lower >= "a" && lower <= "z" ? lower : null;
32
- }
33
- for (let code = 97; code <= 122; code += 1) {
34
- const key = String.fromCharCode(code) as KeyId;
35
- if (matchesKey(data, key) || matchesKey(data, `shift+${key}` as KeyId)) return key;
36
- }
37
- return null;
38
- }
39
-
40
- function isEscapeKey(data: string): boolean {
41
- return matchesKey(data, "escape") && !isKeyRelease(data);
42
- }
43
-
44
- /** Pure leader-key router: returns the next leader state and whether input was swallowed. */
45
22
  export function routeLeaderKey(data: string, state: LeaderKeyState, deps: LeaderKeyRouteDeps): LeaderKeyRouteResult {
46
- const timeoutMs = deps.timeoutMs ?? LEADER_TIMEOUT_MS;
47
- if (state.status === "pending") {
48
- if (deps.now > state.expiresAt) return { state: IDLE_LEADER_STATE, consumed: true };
49
- if (deps.isRelease?.(data) ?? false) return { state, consumed: true };
50
- if (isEscapeKey(data)) return { state: IDLE_LEADER_STATE, consumed: true };
51
- const base = baseLetterFromInput(data);
52
- const target = base ? deps.leaderTargets.find((entry) => entry.key === base) : undefined;
53
- if (target) {
54
- deps.dispatchAction(target.id);
55
- return { state: IDLE_LEADER_STATE, consumed: true };
56
- }
57
- return { state: IDLE_LEADER_STATE, consumed: true };
23
+ if (isKeyRelease(data)) return { state, consumed: state.status === "pending" };
24
+ if (matchesKey(data, "ctrl+c")) return { state: IDLE_LEADER_STATE, consumed: false };
25
+ if (state.status === "idle") {
26
+ return deps.matchesLeader(data) && !isKeyRepeat(data)
27
+ ? { state: { status: "pending", selected: 0 }, consumed: true }
28
+ : { state, consumed: false };
58
29
  }
59
- if (deps.isRelease?.(data) ?? false) return { state, consumed: false };
60
- if (!deps.matchesLeader(data)) return { state, consumed: false };
61
- return { state: { status: "pending", expiresAt: deps.now + timeoutMs }, consumed: true };
62
- }
63
-
64
- export interface LeaderKeyTimeout {
65
- unref?(): void;
30
+ if (isKeyRepeat(data) && !matchesKey(data, "up") && !matchesKey(data, "down")) return { state, consumed: true };
31
+ if (matchesKey(data, "escape") || deps.matchesLeader(data)) return { state: IDLE_LEADER_STATE, consumed: true };
32
+ const count = deps.leaderTargets.length;
33
+ if (matchesKey(data, "up") || matchesKey(data, "down")) {
34
+ const delta = matchesKey(data, "up") ? -1 : 1;
35
+ return {
36
+ state: { status: "pending", selected: count ? (state.selected + delta + count) % count : 0 },
37
+ consumed: true,
38
+ };
39
+ }
40
+ const key = data.includes("\x1b[200~")
41
+ ? null
42
+ : (decodePrintableKey(data) ?? (data.length === 1 ? data : undefined))?.toLowerCase();
43
+ const target = matchesKey(data, "enter")
44
+ ? deps.leaderTargets[state.selected]
45
+ : deps.leaderTargets.find(
46
+ (entry) =>
47
+ entry.key &&
48
+ (entry.key === key ||
49
+ (entry.key === "home" && matchesKey(data, "home")) ||
50
+ (entry.key === "end" && matchesKey(data, "end"))),
51
+ );
52
+ if (!target) return { state: { ...state, notice: "No action for this key" }, consumed: true };
53
+ if (target.disabledReason) return { state: { ...state, notice: target.disabledReason }, consumed: true };
54
+ deps.dispatchAction(target.id);
55
+ return { state: IDLE_LEADER_STATE, consumed: true };
66
56
  }
67
57
 
68
58
  export interface LeaderKeyControllerDeps {
69
- matchesLeader: (data: string) => boolean;
70
- leaderTargets: () => ReadonlyArray<LeaderTarget>;
71
- dispatchAction: (id: ClioKeybinding) => boolean;
59
+ matchesLeader(data: string): boolean;
60
+ leaderTargets(): ReadonlyArray<LeaderTarget>;
61
+ dispatchAction(id: Keybinding): boolean;
72
62
  isRelease: (data: string) => boolean;
73
- now?: () => number;
74
- timeoutMs?: number;
75
- scheduleTimeout?: (callback: () => void, delayMs: number) => LeaderKeyTimeout;
76
- clearScheduledTimeout?: (timeout: LeaderKeyTimeout) => void;
77
- /**
78
- * Fired when the leader arms or disarms, including on timeout.
79
- *
80
- * Ctrl+G is the fallback for terminals where Alt is broken, and the frame
81
- * between it and the next key was identical to the idle frame: nothing said
82
- * the leader had taken, on the one surface whose users cannot test it with a
83
- * working Alt shortcut.
84
- */
85
63
  onStateChange?: (pending: boolean) => void;
64
+ onMenuChange?: (state: LeaderKeyState, targets: ReadonlyArray<LeaderTarget>) => void;
86
65
  }
87
-
88
66
  export interface LeaderKeyController {
89
67
  isPending(): boolean;
90
68
  route(data: string): boolean;
91
69
  reset(): void;
92
70
  dispose(): void;
93
71
  }
94
-
95
72
  export function createLeaderKeyController(deps: LeaderKeyControllerDeps): LeaderKeyController {
96
- const now = deps.now ?? Date.now;
97
- const scheduleTimeout = deps.scheduleTimeout ?? ((callback, delayMs) => setTimeout(callback, delayMs));
98
- const clearScheduledTimeout =
99
- deps.clearScheduledTimeout ?? ((timeout: LeaderKeyTimeout) => clearTimeout(timeout as ReturnType<typeof setTimeout>));
100
73
  let state: LeaderKeyState = IDLE_LEADER_STATE;
101
- let timer: LeaderKeyTimeout | null = null;
102
-
103
74
  const setState = (next: LeaderKeyState): void => {
104
- const wasPending = state.status === "pending";
75
+ const changed = state.status !== next.status;
105
76
  state = next;
106
- if (timer) {
107
- clearScheduledTimeout(timer);
108
- timer = null;
109
- }
110
- if (next.status !== "pending") {
111
- if (wasPending) deps.onStateChange?.(false);
112
- return;
113
- }
114
- if (!wasPending) deps.onStateChange?.(true);
115
- timer = scheduleTimeout(
116
- () => {
117
- state = IDLE_LEADER_STATE;
118
- timer = null;
119
- deps.onStateChange?.(false);
120
- },
121
- Math.max(0, next.expiresAt - now()),
122
- );
123
- timer.unref?.();
77
+ deps.onMenuChange?.(state, deps.leaderTargets());
78
+ if (changed) deps.onStateChange?.(state.status === "pending");
124
79
  };
125
-
126
80
  return {
127
81
  isPending: () => state.status === "pending",
128
- route: (data) => {
129
- const result = routeLeaderKey(data, state, {
130
- matchesLeader: deps.matchesLeader,
131
- leaderTargets: deps.leaderTargets(),
132
- dispatchAction: deps.dispatchAction,
133
- now: now(),
134
- ...(deps.timeoutMs === undefined ? {} : { timeoutMs: deps.timeoutMs }),
135
- isRelease: deps.isRelease,
136
- });
82
+ route(data) {
83
+ const result = routeLeaderKey(data, state, { ...deps, leaderTargets: deps.leaderTargets() });
137
84
  if (result.state !== state) setState(result.state);
138
85
  return result.consumed;
139
86
  },
@@ -0,0 +1,45 @@
1
+ import { type Component, type OverlayHandle, type TUI, truncateToWidth } from "../engine/tui.js";
2
+ import type { LeaderKeyState, LeaderTarget } from "./leader-key.js";
3
+ import { showClioOverlayFrame } from "./overlay-frame.js";
4
+ import { clioTheme } from "./theme/index.js";
5
+
6
+ /** Noncapturing presentation: controller retains the underlying cancellation owner. */
7
+ export function createLeaderMenu(tui: TUI, scope: () => string, keyLabel: (id: LeaderTarget["id"]) => string) {
8
+ let handle: OverlayHandle | null = null;
9
+ let state: LeaderKeyState = { status: "idle" };
10
+ let targets: ReadonlyArray<LeaderTarget> = [];
11
+ const component: Component = {
12
+ render(width) {
13
+ if (state.status === "idle") return [];
14
+ const selected = state.selected;
15
+ const count = Math.max(1, Math.min(10, tui.terminal.rows - 8));
16
+ const start = Math.max(0, Math.min(selected - Math.floor(count / 2), targets.length - count));
17
+ return [
18
+ `${scope()} · letters select actions · close, then /help for commands`,
19
+ ...targets.slice(start, start + count).map((entry, index) => {
20
+ const text = `${start + index === selected ? "›" : " "} ${entry.key || "·"} ${entry.label ?? entry.id} ${keyLabel(entry.id)}${entry.disabledReason ? ` (${entry.disabledReason})` : ""}`;
21
+ return truncateToWidth(start + index === selected ? clioTheme().fg("accent", text) : text, width);
22
+ }),
23
+ `${targets.length ? `${selected + 1}/${targets.length}` : "No actions in this scope"} · ${state.notice ?? "Up/Down select · Enter run · Esc close · Ctrl+C cancel"}`,
24
+ ].map((line) => truncateToWidth(line, width));
25
+ },
26
+ invalidate() {},
27
+ };
28
+ return (next: LeaderKeyState, entries: ReadonlyArray<LeaderTarget>): void => {
29
+ state = next;
30
+ targets = entries;
31
+ if (state.status === "idle") {
32
+ handle?.hide();
33
+ handle = null;
34
+ } else if (!handle)
35
+ handle = showClioOverlayFrame(tui, component, {
36
+ title: "Actions",
37
+ markerId: "keyboard-actions",
38
+ anchor: "top-center",
39
+ width: 88,
40
+ nonCapturing: true,
41
+ footerHint: () => `${keyLabel("clio-coder.leader")} or Esc closes this menu`,
42
+ });
43
+ tui.requestRender();
44
+ };
45
+ }
@@ -1,5 +1,10 @@
1
1
  import type { TUI } from "../engine/tui.js";
2
- import { type AskUserHandler, cancelledAskUserResult } from "../tools/ask-user.js";
2
+ import {
3
+ type AskUserAnswer,
4
+ type AskUserHandler,
5
+ type AskUserQuestion,
6
+ cancelledAskUserResult,
7
+ } from "../tools/ask-user.js";
3
8
  import type { OverlayState } from "./overlay-key-routing.js";
4
9
  import { type AskUserOverlaySession, openAskUserOverlay } from "./overlays/ask-user.js";
5
10
 
@@ -19,6 +24,8 @@ export interface OverlayAskUserLifecycleDeps {
19
24
  * overlay session opens, not per question, so one interview notifies once.
20
25
  */
21
26
  onOperatorParked?(): void;
27
+ /** A round the operator answered, for the transcript record. Not fired on cancel. */
28
+ onRoundAnswered?(questions: ReadonlyArray<AskUserQuestion>, answers: ReadonlyArray<AskUserAnswer>): void;
22
29
  }
23
30
 
24
31
  export interface OverlayAskUserLifecycle {
@@ -84,6 +91,7 @@ export function createOverlayAskUserLifecycle(deps: OverlayAskUserLifecycleDeps)
84
91
  if (!activeSession) return cancelledAskUserResult();
85
92
  pendingCancel = cancel;
86
93
  const result = await activeSession.ask(questions, invokeOptions?.decisionPresentation);
94
+ if (result.cancelled !== true && result.answers.length > 0) deps.onRoundAnswered?.(questions, result.answers);
87
95
  if (result.cancelled === true || !toolBacked) {
88
96
  if (result.cancelled === true) cancelledForTurn = true;
89
97
  close();
@@ -11,6 +11,7 @@ import {
11
11
  truncateToWidth,
12
12
  visibleWidth,
13
13
  } from "../engine/tui.js";
14
+ import { keyboardOwner } from "./keyboard-owner.js";
14
15
  import { enterModal, type ModalMarkerSink } from "./modal-marker.js";
15
16
  import { type ClioToken, clioTheme, padAnsi, screenTitle, selectListTheme, settingsListTheme } from "./theme/index.js";
16
17
 
@@ -43,6 +44,13 @@ export class FocusBox extends Box {
43
44
  this.onInput = options?.onInput;
44
45
  }
45
46
 
47
+ get keyboardScope() {
48
+ return keyboardOwner(this.inputTarget).keyboardScope;
49
+ }
50
+ undoInput(): boolean {
51
+ return keyboardOwner(this.inputTarget).undoInput?.() ?? false;
52
+ }
53
+
46
54
  handleInput(data: string): void {
47
55
  if (this.onInput) {
48
56
  this.onInput(data);
@@ -427,6 +435,13 @@ export class ClioOverlayFrame implements Component {
427
435
  return lines;
428
436
  }
429
437
 
438
+ get keyboardScope() {
439
+ return keyboardOwner(this.child).keyboardScope;
440
+ }
441
+ undoInput(): boolean {
442
+ return keyboardOwner(this.child).undoInput?.() ?? false;
443
+ }
444
+
430
445
  handleInput(data: string): void {
431
446
  this.child.handleInput?.(data);
432
447
  }