@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
@@ -10,7 +10,8 @@ import {
10
10
  visibleWidth,
11
11
  wrapTextWithAnsi,
12
12
  } from "../../engine/tui.js";
13
- import { buildHint, FILTER_HINT, type HintEntry, showClioOverlayFrame } from "../overlay-frame.js";
13
+ import { localKey } from "../keyboard-owner.js";
14
+ import { buildHint, FILTER_HINT, type HintEntry, type OverlayEscVerb, showClioOverlayFrame } from "../overlay-frame.js";
14
15
  import { clioTheme, GLYPH, listGroupHeader, markdownTheme, rule, selectListTheme } from "../theme/index.js";
15
16
 
16
17
  const ELLIPSIS = "…";
@@ -48,6 +49,8 @@ export interface ListOverlayTab {
48
49
 
49
50
  export interface ListOverlayOptions {
50
51
  title: string;
52
+ /** Opt-in terminal-sized layout; ordinary list modals retain their compact size. */
53
+ fullScreen?: boolean;
51
54
  items: ReadonlyArray<ListOverlayItem>;
52
55
  /**
53
56
  * Tabs, drawn as a bar above the filter row and switched with ←/→, which is
@@ -62,12 +65,31 @@ export interface ListOverlayOptions {
62
65
  onTabChange?: (tabId: string) => void;
63
66
  /** Enables the type-to-filter input row. */
64
67
  filterable?: boolean;
65
- /** Pre-applied filter text (e.g. /skill <query> in milestone 04). */
68
+ /** Start in the list; / enters search, whose letters and arrows belong to the input. */
69
+ explicitSearch?: boolean;
70
+ /** Persistent, width-aware scope/mode text, including when the selected tab is empty. */
71
+ status?: (width: number) => string;
72
+ /** Actions that do not require a selected row, such as scope or view mode. */
73
+ globalActions?: Record<string, () => void>;
74
+ globalHints?: ReadonlyArray<HintEntry>;
75
+ /**
76
+ * An inner level Esc leaves before it closes the overlay, such as a package's
77
+ * member list. `active` is asked by the footer so the key it advertises is the
78
+ * key the operator gets; `back` is called only when Esc actually fires.
79
+ */
80
+ onBack?: { active: () => boolean; back: () => void };
81
+ /** Pre-applied filter text. */
66
82
  initialFilter?: string;
67
- /** Extra hint entries beyond movement/filter/Esc (builder appends Esc). */
68
- hints?: ReadonlyArray<{ key: string; verb: string }>;
69
- /** Custom message when list is empty. */
70
- emptyMessage?: string;
83
+ /**
84
+ * Extra hint entries beyond movement/filter/Esc (builder appends Esc). A
85
+ * function is asked per frame and is handed the selected row, so a footer can
86
+ * advertise the keys that row actually offers rather than a fixed set.
87
+ */
88
+ hints?:
89
+ | ReadonlyArray<{ key: string; verb: string }>
90
+ | ((selected: ListOverlayItem | undefined) => ReadonlyArray<{ key: string; verb: string }>);
91
+ /** Custom message when list is empty; a function is asked per frame. */
92
+ emptyMessage?: string | (() => string);
71
93
  /** Layout mode: stack (detail below list) or split (detail to the right). */
72
94
  layout?: "stack" | "split";
73
95
  /** Primary action; omitted means Enter toggles the detail pane. */
@@ -78,6 +100,7 @@ export interface ListOverlayOptions {
78
100
  }
79
101
 
80
102
  export class ListOverlayView implements Component {
103
+ private viewportRows = 24;
81
104
  private selectedIndex = 0;
82
105
  private filterText = "";
83
106
  private isFilterFocused = false;
@@ -125,7 +148,7 @@ export class ListOverlayView implements Component {
125
148
  private readonly options: ListOverlayOptions,
126
149
  private readonly onChange: () => void,
127
150
  ) {
128
- this.isFilterFocused = !!options.filterable;
151
+ this.isFilterFocused = !!options.filterable && !options.explicitSearch;
129
152
  this.filterText = options.initialFilter ?? "";
130
153
  this.items = options.items;
131
154
  this.detailPaneDrawn = options.layout === "split";
@@ -168,6 +191,28 @@ export class ListOverlayView implements Component {
168
191
  this.setItems(activeItems);
169
192
  }
170
193
 
194
+ /**
195
+ * Move the cursor onto a row by id, reporting whether that row is here.
196
+ *
197
+ * A command that names one package opens the browser on it rather than at the
198
+ * top of a list the operator then has to search. A miss is reported instead of
199
+ * silently landing on row zero, because "not found" and "found, first" are
200
+ * different answers.
201
+ */
202
+ selectById(id: string): boolean {
203
+ const index = this.filteredItems().findIndex((item) => item.id === id);
204
+ if (index === -1) return false;
205
+ this.selectIndex(index);
206
+ this.renderMemo = null;
207
+ return true;
208
+ }
209
+
210
+ /** Show or hide the stacked detail pane, for callers that bind their own key to it. */
211
+ toggleDetail(): void {
212
+ this.showDetail = !this.showDetail;
213
+ this.renderMemo = null;
214
+ }
215
+
171
216
  /** Switch tabs and rebuild. A tab id this overlay does not carry is ignored. */
172
217
  setActiveTab(tabId: string): void {
173
218
  const tabs = this.options.tabs;
@@ -198,8 +243,11 @@ export class ListOverlayView implements Component {
198
243
  const current = tabs.findIndex((tab) => tab.id === this.activeTabId);
199
244
  const next = tabs[((((current === -1 ? 0 : current) + delta) % tabs.length) + tabs.length) % tabs.length];
200
245
  if (!next || next.id === this.activeTabId) return false;
201
- this.setActiveTab(next.id);
246
+ // The owner is told first: it keeps its own view state keyed on the tab, and
247
+ // rebuilding the rows before it knew which tab they were for built one tab's
248
+ // rows against the previous tab's subjects.
202
249
  this.options.onTabChange?.(next.id);
250
+ this.setActiveTab(next.id);
203
251
  this.onChange();
204
252
  return true;
205
253
  }
@@ -215,7 +263,23 @@ export class ListOverlayView implements Component {
215
263
  ? theme.style("accent", `${GLYPH.cursor} ${text}`, { bold: true })
216
264
  : theme.fg("dim", ` ${text}`);
217
265
  });
218
- return [this.padLine(parts.join(theme.fg("frame", " │ ")), width)];
266
+ const full = parts.join(theme.fg("frame", " │ "));
267
+ if (visibleWidth(full) > width) {
268
+ const active = this.activeTab();
269
+ if (active) {
270
+ const position = tabs.findIndex((tab) => tab.id === active.id) + 1;
271
+ return [
272
+ this.padLine(
273
+ theme.fg(
274
+ "accent",
275
+ `${GLYPH.cursor} ${active.label} ${this.tabCounts.get(active.id) ?? 0} · ${position}/${tabs.length} ←→`,
276
+ ),
277
+ width,
278
+ ),
279
+ ];
280
+ }
281
+ }
282
+ return [this.padLine(full, width)];
219
283
  }
220
284
 
221
285
  /**
@@ -260,6 +324,12 @@ export class ListOverlayView implements Component {
260
324
  * than letting one fall through to the filter.
261
325
  */
262
326
  private runAction(data: string, filteredItems: ReadonlyArray<ListOverlayItem>): boolean {
327
+ const global = this.options.globalActions?.[data];
328
+ if (global) {
329
+ global();
330
+ this.onChange();
331
+ return true;
332
+ }
263
333
  const action = this.options.actions?.[data];
264
334
  if (!action) return false;
265
335
  const selectedItem = filteredItems[this.selectedIndex];
@@ -268,8 +338,8 @@ export class ListOverlayView implements Component {
268
338
  }
269
339
 
270
340
  /**
271
- * Esc semantics shared by every list overlay regardless of which pane has
272
- * focus: first Esc clears a nonempty filter, second Esc closes.
341
+ * Esc clears a nonempty filter first. Explicit search then returns to the
342
+ * list before a further Esc closes the overlay.
273
343
  */
274
344
  private clearFilterOrClose(): void {
275
345
  if (this.filterText.length > 0) {
@@ -279,9 +349,29 @@ export class ListOverlayView implements Component {
279
349
  this.onChange();
280
350
  return;
281
351
  }
352
+ if (this.options.explicitSearch && this.isFilterFocused) {
353
+ this.isFilterFocused = false;
354
+ this.onChange();
355
+ return;
356
+ }
357
+ // An inner level is left before the overlay is. Drilling into a package's
358
+ // members and pressing Esc should return to the packages, not close the
359
+ // Library and lose the category, mode and scope the operator set.
360
+ if (this.options.onBack?.active()) {
361
+ this.options.onBack.back();
362
+ this.onChange();
363
+ return;
364
+ }
282
365
  this.options.onClose();
283
366
  }
284
367
 
368
+ /** The verb Esc carries right now, following clearFilterOrClose exactly. */
369
+ private escapeVerb(): OverlayEscVerb {
370
+ if (this.filterText.length > 0) return "clear filter";
371
+ if (this.options.onBack?.active()) return "back";
372
+ return "close";
373
+ }
374
+
285
375
  /**
286
376
  * The tab entry a tabbed footer carries. The verb names the active tab and
287
377
  * how many rows it holds, so the count a reader sees is the count of the tab
@@ -295,18 +385,26 @@ export class ListOverlayView implements Component {
295
385
  }
296
386
 
297
387
  getHint(): string {
388
+ if (this.options.explicitSearch && this.isFilterFocused) {
389
+ return buildHint(
390
+ [{ key: "Enter", verb: "back to list", critical: true }],
391
+ this.filterText.length > 0 ? "clear filter" : "back",
392
+ );
393
+ }
298
394
  const tabEntry = this.tabHintEntry();
299
395
  // A list with no rows has no row to select, invoke, or act on. Offering
300
396
  // those keys anyway is the same lie the empty state exists to stop telling.
301
397
  // A tab key is the exception: on an empty tab it is the way to a full one.
302
- if (this.items.length === 0) return buildHint(tabEntry ? [tabEntry] : [], "close");
398
+ if (this.items.length === 0)
399
+ return buildHint([...(tabEntry ? [tabEntry] : []), ...(this.options.globalHints ?? [])], this.escapeVerb());
303
400
 
304
401
  const hintEntries: HintEntry[] = [];
305
402
  if (tabEntry) hintEntries.push(tabEntry);
306
403
  hintEntries.push({ key: "↑↓", verb: "select" });
307
404
  if (this.options.filterable) {
308
- hintEntries.push(FILTER_HINT);
405
+ hintEntries.push(this.options.explicitSearch ? { key: "/", verb: "search", critical: true } : FILTER_HINT);
309
406
  }
407
+ hintEntries.push(...(this.options.globalHints ?? []));
310
408
 
311
409
  // Navigation before actions, which is the order a narrowing footer drops in:
312
410
  // droppable entries go left to right, so the last one written is the last one
@@ -322,14 +420,18 @@ export class ListOverlayView implements Component {
322
420
  hintEntries.push({ key: this.options.onSelect ? "Tab" : "Enter/Tab", verb: "detail" });
323
421
  }
324
422
 
325
- if (this.options.hints) {
326
- hintEntries.push(...this.options.hints);
423
+ const hints =
424
+ typeof this.options.hints === "function"
425
+ ? this.options.hints(this.filteredItems()[this.selectedIndex])
426
+ : this.options.hints;
427
+ if (hints) {
428
+ hintEntries.push(...hints);
327
429
  }
328
430
 
329
431
  // The footer follows clearFilterOrClose(). With a filter typed, Esc does
330
432
  // not close, and saying it does sent operators out of an overlay they were
331
433
  // still in and back in again to find out.
332
- return buildHint(hintEntries, this.filterText.length > 0 ? "clear filter" : "close");
434
+ return buildHint(hintEntries, this.escapeVerb());
333
435
  }
334
436
 
335
437
  private padLine(line: string, targetWidth: number): string {
@@ -391,7 +493,9 @@ export class ListOverlayView implements Component {
391
493
  // A list with nothing in it and a filter that matched nothing are
392
494
  // different states. Only the first one is the caller's empty state, and
393
495
  // it wraps rather than truncating so a remedy survives a narrow pane.
394
- const text = allItems.length === 0 ? (this.options.emptyMessage ?? "No matches found") : "No matches found";
496
+ const empty =
497
+ typeof this.options.emptyMessage === "function" ? this.options.emptyMessage() : this.options.emptyMessage;
498
+ const text = allItems.length === 0 ? (empty ?? "No matches found") : "No matches found";
395
499
  for (const wrapped of wrapTextWithAnsi(text, Math.max(1, width - 2))) {
396
500
  lines.push(this.padLine(clioTheme().fg("muted", ` ${wrapped}`), width));
397
501
  }
@@ -426,7 +530,20 @@ export class ListOverlayView implements Component {
426
530
  const prefix = isSelected ? theme.selectedPrefix(`${GLYPH.cursor} `) : " ";
427
531
  const prefixLen = 2;
428
532
  const availableWidth = width - prefixLen;
429
- const metaStr = item.meta ?? "";
533
+ // The name comes first at every width. Metadata used to take whatever
534
+ // it wanted, so at 48 columns a row of origin, scope and state left
535
+ // the package name as a single ellipsis: a list of rows nobody could
536
+ // identify. The label keeps at least half the row, and the metadata
537
+ // compacts into what is left or drops out entirely.
538
+ const rawMeta = item.meta ?? "";
539
+ const reservedLabel = Math.min(visibleWidth(item.label), Math.max(8, Math.floor(availableWidth * 0.5)));
540
+ const maxMetaWidth = Math.max(0, availableWidth - reservedLabel - 2);
541
+ const metaStr =
542
+ rawMeta.length === 0 || maxMetaWidth === 0
543
+ ? ""
544
+ : visibleWidth(rawMeta) > maxMetaWidth
545
+ ? truncateToWidth(rawMeta, maxMetaWidth, ELLIPSIS, true)
546
+ : rawMeta;
430
547
  const metaLen = metaStr ? visibleWidth(metaStr) : 0;
431
548
 
432
549
  const maxLabelWidth = Math.max(1, availableWidth - (metaLen > 0 ? metaLen + 2 : 0));
@@ -497,8 +614,14 @@ export class ListOverlayView implements Component {
497
614
  return padded;
498
615
  }
499
616
 
617
+ /** Called by the mounted overlay's visibility callback before each render. */
618
+ setViewportRows(rows: number): void {
619
+ this.viewportRows = Math.max(1, Math.floor(rows));
620
+ }
621
+
500
622
  render(width: number): string[] {
501
623
  const filteredItems = this.filteredItems();
624
+ const status = this.options.status?.(width);
502
625
 
503
626
  if (this.selectedIndex >= filteredItems.length) {
504
627
  this.selectIndex(Math.max(0, filteredItems.length - 1));
@@ -515,6 +638,7 @@ export class ListOverlayView implements Component {
515
638
  // overlay frame's childLines identity cache short-circuit the whole frame.
516
639
  const memoKey = [
517
640
  width,
641
+ this.options.fullScreen ? this.viewportRows : 0,
518
642
  this.filterText,
519
643
  this.selectedIndex,
520
644
  this.isFilterFocused,
@@ -524,12 +648,14 @@ export class ListOverlayView implements Component {
524
648
  this.inputEpoch,
525
649
  this.itemsEpoch,
526
650
  this.activeTabId,
651
+ status,
527
652
  ].join("|");
528
653
  if (this.renderMemo?.key === memoKey) return this.renderMemo.lines;
529
654
 
530
655
  const lines: string[] = [];
531
656
 
532
657
  lines.push(...this.renderTabBar(width));
658
+ if (status !== undefined) lines.push(this.padLine(status, width));
533
659
 
534
660
  if (this.options.filterable) {
535
661
  this.input.focused = this.isFilterFocused;
@@ -537,8 +663,9 @@ export class ListOverlayView implements Component {
537
663
  lines.push(...inputLines);
538
664
  }
539
665
 
666
+ const availableRows = Math.max(1, this.viewportRows - 2 - lines.length);
540
667
  if (isSplit) {
541
- const listMaxLines = 14;
668
+ const listMaxLines = this.options.fullScreen ? availableRows : 14;
542
669
  const detailWidth = Math.max(32, Math.floor(width * 0.45));
543
670
  const listWidth = width - detailWidth - 1;
544
671
 
@@ -552,30 +679,62 @@ export class ListOverlayView implements Component {
552
679
  lines.push(`${left}${separator}${right}`);
553
680
  }
554
681
  } else {
555
- const listMaxLines = this.showDetail && hasDetail ? 6 : 12;
682
+ const showDetail = this.showDetail && hasDetail;
683
+ const listMaxLines = this.options.fullScreen
684
+ ? showDetail
685
+ ? Math.max(1, Math.floor((availableRows - 1) / 2))
686
+ : availableRows
687
+ : showDetail
688
+ ? 6
689
+ : 12;
556
690
  const listLines = this.renderList(width, listMaxLines, filteredItems, false);
557
691
  lines.push(...listLines);
558
692
 
559
693
  if (this.showDetail && hasDetail) {
560
694
  lines.push(rule(clioTheme(), width));
561
- const detailLines = this.renderDetail(width, 10, selectedItem);
695
+ const detailRows = this.options.fullScreen ? Math.max(1, availableRows - listMaxLines - 1) : 10;
696
+ const detailLines = this.renderDetail(width, detailRows, selectedItem);
562
697
  lines.push(...detailLines);
563
698
  }
564
699
  }
565
700
 
701
+ if (this.options.fullScreen) {
702
+ while (lines.length < this.viewportRows - 2) lines.push(" ".repeat(width));
703
+ }
566
704
  this.renderMemo = { key: memoKey, lines };
567
705
  return lines;
568
706
  }
569
707
 
570
708
  private detailPaneVisible(): boolean {
571
- return this.options.layout === "split" || this.showDetail;
709
+ return this.detailPaneDrawn;
572
710
  }
573
711
 
712
+ get keyboardScope(): "edit" | "browse" {
713
+ return this.isFilterFocused ? "edit" : "browse";
714
+ }
715
+ undoInput(): boolean {
716
+ if (!this.isFilterFocused) return false;
717
+ this.input.applyEdit("undo");
718
+ this.filterText = this.input.getValue();
719
+ this.inputEpoch += 1;
720
+ this.selectIndex(0);
721
+ this.onChange();
722
+ return true;
723
+ }
574
724
  handleInput(data: string): void {
575
- // ←/→ switch tabs from either pane, ahead of the filter input, which is
576
- // the arrangement the Settings Center already uses to move between
577
- // sections. On an untabbed overlay both keys fall through untouched.
578
- if (this.options.tabs && this.options.tabs.length > 0) {
725
+ data = localKey(data);
726
+ if (matchesKey(data, "escape")) {
727
+ this.clearFilterOrClose();
728
+ return;
729
+ }
730
+ if (this.options.filterable && this.options.explicitSearch && !this.isFilterFocused && data === "/") {
731
+ this.isFilterFocused = true;
732
+ this.onChange();
733
+ return;
734
+ }
735
+ // Explicit search owns its cursor arrows. Otherwise ←/→ switch tabs,
736
+ // matching the Settings Center's section navigation.
737
+ if (this.options.tabs && this.options.tabs.length > 0 && !(this.options.explicitSearch && this.isFilterFocused)) {
579
738
  if (matchesKey(data, "left")) {
580
739
  this.stepTab(-1);
581
740
  return;
@@ -588,7 +747,7 @@ export class ListOverlayView implements Component {
588
747
 
589
748
  // PgDn / Ctrl+D and PgUp / Ctrl+U scroll the detail pane, but only
590
749
  // while one is visible; otherwise the keys fall through untouched.
591
- if (this.detailPaneVisible()) {
750
+ if (this.detailPaneVisible() && !(this.options.explicitSearch && this.isFilterFocused)) {
592
751
  if (data === "\x1b[6~" || data === "\x04") {
593
752
  this.detailScrollOffset += 5;
594
753
  this.onChange();
@@ -621,6 +780,11 @@ export class ListOverlayView implements Component {
621
780
  return;
622
781
  }
623
782
  if (matchesKey(data, "enter") || data === "\n") {
783
+ if (this.options.explicitSearch) {
784
+ this.isFilterFocused = false;
785
+ this.onChange();
786
+ return;
787
+ }
624
788
  if (this.options.onSelect) {
625
789
  const selectedItem = filteredItems[this.selectedIndex];
626
790
  if (selectedItem) {
@@ -642,22 +806,14 @@ export class ListOverlayView implements Component {
642
806
  return;
643
807
  }
644
808
 
645
- // The footer advertises the action keys from the moment the overlay opens
646
- // and the filter input holds focus then, so the first `d` an operator
647
- // pressed in /interop landed in the filter box instead of declining the
648
- // selected row. An empty query has nothing to narrow, so a bound key acts
649
- // on the selection. Once a query is typed the letters belong to it, and
650
- // ↑/↓ hands focus back to the list where the same keys act again.
651
- if (this.filterText.length === 0 && data.length === 1 && this.runAction(data, filteredItems)) return;
652
-
653
809
  this.inputEpoch += 1;
654
810
  this.input.handleInput(data);
655
811
  const next = this.input.getValue();
656
812
  if (next !== this.filterText) {
657
813
  this.filterText = next;
658
814
  this.selectIndex(0);
659
- this.onChange();
660
815
  }
816
+ this.onChange();
661
817
  } else {
662
818
  if (matchesKey(data, "up") || data === "k") {
663
819
  if (filteredItems.length > 0) {
@@ -697,7 +853,7 @@ export class ListOverlayView implements Component {
697
853
 
698
854
  if (this.runAction(data, filteredItems)) return;
699
855
 
700
- if (this.options.filterable && matchesKey(data, "backspace")) {
856
+ if (this.options.filterable && !this.options.explicitSearch && matchesKey(data, "backspace")) {
701
857
  this.isFilterFocused = true;
702
858
  this.inputEpoch += 1;
703
859
  this.input.handleInput(data);
@@ -707,7 +863,7 @@ export class ListOverlayView implements Component {
707
863
  return;
708
864
  }
709
865
 
710
- if (this.options.filterable && data.length === 1 && !matchesKey(data, "space")) {
866
+ if (this.options.filterable && !this.options.explicitSearch && data.length === 1 && !matchesKey(data, "space")) {
711
867
  this.isFilterFocused = true;
712
868
  this.inputEpoch += 1;
713
869
  this.input.handleInput(data);
@@ -740,6 +896,10 @@ export interface ListOverlayHandle extends OverlayHandle {
740
896
  setActiveTab(tabId: string): void;
741
897
  /** The active tab's id, or the empty string on an untabbed overlay. */
742
898
  activeTabId(): string;
899
+ /** Move the cursor onto a row by id; false when this view has no such row. */
900
+ selectById(id: string): boolean;
901
+ /** Show or hide the stacked detail pane. */
902
+ toggleDetail(): void;
743
903
  }
744
904
 
745
905
  /**
@@ -754,7 +914,17 @@ export function openListOverlay(tui: TUI, options: ListOverlayOptions & { marker
754
914
  const view = new ListOverlayView(options, () => tui.requestRender());
755
915
  const handle = showClioOverlayFrame(tui, view, {
756
916
  anchor: "center",
757
- width: 100,
917
+ width: options.fullScreen ? "100%" : 100,
918
+ ...(options.fullScreen
919
+ ? {
920
+ margin: 0,
921
+ maxHeight: "100%" as const,
922
+ visible: (_width: number, rows: number) => {
923
+ view.setViewportRows(rows);
924
+ return true;
925
+ },
926
+ }
927
+ : {}),
758
928
  markerId: options.markerId,
759
929
  // A function, not the string: on a tabbed overlay the title names the tab
760
930
  // and must be re-read after every switch.
@@ -777,5 +947,14 @@ export function openListOverlay(tui: TUI, options: ListOverlayOptions & { marker
777
947
  activeTabId(): string {
778
948
  return view.activeTab()?.id ?? "";
779
949
  },
950
+ selectById(id: string): boolean {
951
+ const found = view.selectById(id);
952
+ if (found) tui.requestRender();
953
+ return found;
954
+ },
955
+ toggleDetail(): void {
956
+ view.toggleDetail();
957
+ tui.requestRender();
958
+ },
780
959
  });
781
960
  }
@@ -24,6 +24,7 @@ import {
24
24
  type Component,
25
25
  fuzzyFilter,
26
26
  getKeybindings,
27
+ Input,
27
28
  matchesKey,
28
29
  type OverlayHandle,
29
30
  type SelectItem,
@@ -32,6 +33,7 @@ import {
32
33
  visibleWidth,
33
34
  wrapTextWithAnsi,
34
35
  } from "../../engine/tui.js";
36
+ import { localKey } from "../keyboard-owner.js";
35
37
  import {
36
38
  buildHint,
37
39
  clioError,
@@ -62,9 +64,6 @@ const RUNTIME_COL_WIDTH_NARROW = 10;
62
64
  const RUNTIME_COL_WIDTH_MEDIUM = 14;
63
65
  const RUNTIME_COL_WIDTH_WIDE = 18;
64
66
  const SELECTED_PREFIX_WIDTH = 6;
65
- const BACKSPACE = "\x7f";
66
- const BACKSPACE_ALT = "\b";
67
- const CTRL_U = "\x15";
68
67
  const TAB = "\t";
69
68
 
70
69
  function resolveOverlayWidth(terminalColumns: number): number {
@@ -814,6 +813,16 @@ interface ModelRefreshActions {
814
813
  export class ModelOverlayView implements Component {
815
814
  private selectedIndex = 0;
816
815
  private query = "";
816
+ private readonly queryInput = new Input();
817
+ get keyboardScope(): "edit" | "browse" {
818
+ return this.query ? "edit" : "browse";
819
+ }
820
+ undoInput(): boolean {
821
+ this.queryInput.applyEdit("undo");
822
+ this.query = this.queryInput.getValue();
823
+ this.selectedIndex = 0;
824
+ return true;
825
+ }
817
826
  private showAll = false;
818
827
  private rows: ModelRow[];
819
828
  private summary: ModelOverlaySummary;
@@ -890,23 +899,11 @@ export class ModelOverlayView implements Component {
890
899
  this.selectedIndex = (this.selectedIndex + delta + count) % count;
891
900
  }
892
901
 
893
- private appendQuery(data: string): void {
894
- this.selectionError = null;
895
- this.query += data;
896
- this.selectedIndex = 0;
897
- }
898
-
899
- private deleteQueryChar(): void {
900
- if (this.query.length === 0) return;
901
- this.selectionError = null;
902
- this.query = this.query.slice(0, -1);
903
- this.selectedIndex = 0;
904
- }
905
-
906
902
  private clearQuery(): void {
907
903
  if (this.query.length === 0) return;
908
904
  this.selectionError = null;
909
905
  this.query = "";
906
+ this.queryInput.setValue("");
910
907
  this.selectedIndex = 0;
911
908
  }
912
909
 
@@ -980,7 +977,14 @@ export class ModelOverlayView implements Component {
980
977
  invalidate(): void {}
981
978
 
982
979
  handleInput(data: string): void {
980
+ data = localKey(data);
983
981
  if (this.lifecycle.signal.aborted) return;
982
+ if (matchesKey(data, "escape")) {
983
+ if (this.query) this.clearQuery();
984
+ else this.onClose();
985
+ this.refreshActions.requestRender?.();
986
+ return;
987
+ }
984
988
  const kb = getKeybindings();
985
989
  if (kb.matches(data, "tui.select.up")) {
986
990
  this.move(-1);
@@ -1022,14 +1026,6 @@ export class ModelOverlayView implements Component {
1022
1026
  this.onClose();
1023
1027
  return;
1024
1028
  }
1025
- if (data === BACKSPACE || data === BACKSPACE_ALT) {
1026
- this.deleteQueryChar();
1027
- return;
1028
- }
1029
- if (data === CTRL_U) {
1030
- this.clearQuery();
1031
- return;
1032
- }
1033
1029
  if (data === TAB) {
1034
1030
  this.toggleShowAll();
1035
1031
  return;
@@ -1046,7 +1042,14 @@ export class ModelOverlayView implements Component {
1046
1042
  this.toggleFavorite();
1047
1043
  return;
1048
1044
  }
1049
- if (data.length === 1 && data >= " " && data !== "\x7f") this.appendQuery(data);
1045
+ this.queryInput.handleInput(data);
1046
+ const next = this.queryInput.getValue();
1047
+ if (next !== this.query) {
1048
+ this.query = next;
1049
+ this.selectedIndex = 0;
1050
+ this.selectionError = null;
1051
+ this.refreshActions.requestRender?.();
1052
+ }
1050
1053
  }
1051
1054
  }
1052
1055
 
@@ -131,7 +131,13 @@ function createSessionOverlayBox(
131
131
  let list = buildList(filtered);
132
132
  let pendingEscape = "";
133
133
  let pendingEscapeTimer: ReturnType<typeof setTimeout> | null = null;
134
- const box = new FocusBox([], { onInput: handleInput }) as FocusBox & { dispose(): void };
134
+ const box = new FocusBox(input, { onInput: handleInput }) as FocusBox & { dispose(): void };
135
+ box.undoInput = () => {
136
+ input.applyEdit("undo");
137
+ lastQuery = input.getValue();
138
+ applyFilter();
139
+ return true;
140
+ };
135
141
  box.dispose = (): void => {
136
142
  clearPendingEscape();
137
143
  };
@@ -218,11 +224,11 @@ function createSessionOverlayBox(
218
224
  moveSelectionByPage(1);
219
225
  return;
220
226
  }
221
- if (matchesKey(data, "up") || matchesKey(data, "down")) {
227
+ if (keybindings.matches(data, "tui.select.up") || keybindings.matches(data, "tui.select.down")) {
222
228
  list.handleInput(data);
223
229
  return;
224
230
  }
225
- if (matchesKey(data, "enter") || data === "\n") {
231
+ if (keybindings.matches(data, "tui.select.confirm") || data === "\n") {
226
232
  list.handleInput(data);
227
233
  return;
228
234
  }