@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
@@ -14,7 +14,6 @@
14
14
  */
15
15
 
16
16
  import { existsSync } from "node:fs";
17
- import { ToolNames } from "../core/tool-names.js";
18
17
  import { foldWorkingSet } from "../domains/context/working-set/fold.js";
19
18
  import { compactionCut } from "../domains/context/working-set/visible.js";
20
19
  import { captureSkillContext } from "../domains/session/compaction/compact.js";
@@ -52,7 +51,6 @@ import {
52
51
  } from "../engine/messages.js";
53
52
  import { wrapTextWithAnsi } from "../engine/tui.js";
54
53
  import type { AgentMessage } from "../engine/types.js";
55
- import { toolPresentationPolicy } from "../tools/presentation.js";
56
54
  import { toolResultPresentationText } from "../tools/result-disposition.js";
57
55
  import type { ChatLoopEvent, RetryStatusPayload } from "./chat-loop.js";
58
56
  import { isSelfExplainingAbort, toolResultSummary } from "./chat-loop-messages.js";
@@ -69,7 +67,7 @@ import {
69
67
  type StreamPacer,
70
68
  type StreamPacerSlice,
71
69
  } from "./stream-pacer.js";
72
- import { type FoldOverride, policyToolFold, resolveFold, type TranscriptDetailPolicy } from "./transcript-detail.js";
70
+ import type { TranscriptDetailPolicy } from "./transcript-detail.js";
73
71
  import { readWorkerReceiptFactsForReplay } from "./worker-receipts.js";
74
72
  import { workerEntriesFromRunEntries } from "./worker-replay.js";
75
73
  import type { WorkerReceiptReader } from "./worker-stream.js";
@@ -804,25 +802,24 @@ function appendReplayLine(chatPanel: ChatPanel, text: string): void {
804
802
  function renderBashExecutionEntry(
805
803
  entry: BashExecutionEntry,
806
804
  width: number,
807
- folded: boolean,
805
+ detail: TranscriptDetailPolicy,
808
806
  unbounded: boolean,
809
807
  ): string[] {
810
808
  const normalizedOutput = entry.output.replace(/\r\n/g, "\n").replace(/\r/g, "\n").replace(/\s+$/g, "");
811
809
  return renderBashTranscriptExecution(
812
810
  {
813
811
  command: entry.command,
814
- output: unbounded ? normalizedOutput : truncateReplayText(normalizedOutput),
812
+ output: normalizedOutput,
815
813
  running: false,
816
814
  exitCode: entry.exitCode,
817
815
  cancelled: entry.cancelled,
818
816
  truncated: entry.truncated,
819
817
  fullOutputPath: entry.fullOutputPath,
820
818
  excludeFromContext: entry.excludeFromContext,
821
- folded,
822
819
  },
823
820
  width,
824
821
  undefined,
825
- { unbounded, diffStyle: "plain" },
822
+ { unbounded, diffStyle: "plain", detail },
826
823
  );
827
824
  }
828
825
 
@@ -1259,16 +1256,16 @@ export function rehydrateChatPanelFromTurns(
1259
1256
  case "message": {
1260
1257
  if (entry.role === "user") {
1261
1258
  runAssistantMessages = [];
1262
- const text = truncateReplayText(replayedUserText(entry));
1259
+ const text = replayedUserText(entry);
1263
1260
  if (text.length > 0) chatPanel.appendUser(text);
1264
1261
  break;
1265
1262
  }
1266
1263
  if (entry.role === "assistant") {
1267
1264
  const text = chatMessageText(entry);
1268
1265
  const failure = messageFailure(entry);
1269
- const richMessage = richMessageFromEntry(entry, MAX_REPLAY_TEXT_CHARS);
1266
+ const richMessage = richMessageFromEntry(entry, Number.POSITIVE_INFINITY);
1270
1267
  if (richMessage || text.length > 0 || failure) {
1271
- const message = richMessage ?? makeTextMessage("assistant", truncateReplayText(text), entry.timestamp);
1268
+ const message = richMessage ?? makeTextMessage("assistant", text, entry.timestamp);
1272
1269
  if (failure) {
1273
1270
  (message as { stopReason?: string; errorMessage?: string }).stopReason = failure.stopReason;
1274
1271
  (message as { stopReason?: string; errorMessage?: string }).errorMessage = failure.errorMessage;
@@ -1303,7 +1300,7 @@ export function rehydrateChatPanelFromTurns(
1303
1300
  type: "tool_execution_end",
1304
1301
  toolCallId: fallbackId,
1305
1302
  toolName: result.name,
1306
- result: displayReplayToolResult(result.result, options.unboundedToolBodies === true),
1303
+ result: displayReplayToolResult(result.result, true),
1307
1304
  isError: result.isError,
1308
1305
  ...(result.durationMs !== undefined ? { durationMs: result.durationMs } : {}),
1309
1306
  ...(resultSummary !== undefined ? { resultSummary } : {}),
@@ -1312,12 +1309,12 @@ export function rehydrateChatPanelFromTurns(
1312
1309
  ...(evictedReason !== undefined ? { evictedReason } : {}),
1313
1310
  } as ChatLoopEvent);
1314
1311
  } else {
1315
- chatPanel.appendReplayBlock((width) =>
1312
+ chatPanel.appendReplayBlock((width, detail, unbounded) =>
1316
1313
  renderToolResultOnly(
1317
1314
  {
1318
1315
  toolCallId: result.id ?? "",
1319
1316
  toolName: result.name,
1320
- result: displayReplayToolResult(result.result, options.unboundedToolBodies === true),
1317
+ result: displayReplayToolResult(result.result, true),
1321
1318
  isError: result.isError,
1322
1319
  ...(result.durationMs !== undefined ? { durationMs: result.durationMs } : {}),
1323
1320
  ...(resultSummary !== undefined ? { resultSummary } : {}),
@@ -1326,7 +1323,7 @@ export function rehydrateChatPanelFromTurns(
1326
1323
  ...(evictedReason !== undefined ? { evictedReason } : {}),
1327
1324
  },
1328
1325
  width,
1329
- { unbounded: options.unboundedToolBodies === true },
1326
+ { unbounded: unbounded || options.unboundedToolBodies === true, detail },
1330
1327
  ),
1331
1328
  );
1332
1329
  }
@@ -1345,21 +1342,8 @@ export function rehydrateChatPanelFromTurns(
1345
1342
  break;
1346
1343
  }
1347
1344
  case "bashExecution": {
1348
- let fold: FoldOverride;
1349
- const presentation = toolPresentationPolicy(ToolNames.Bash, undefined);
1350
- const policyFold = (detail: TranscriptDetailPolicy) => policyToolFold(detail, presentation);
1351
- const unbounded = options.unboundedToolBodies === true;
1352
- chatPanel.appendReplayBlock(
1353
- (width, detail) =>
1354
- renderBashExecutionEntry(entry, width, resolveFold(fold, policyFold(detail)) === "folded", unbounded),
1355
- undefined,
1356
- {
1357
- policyFold,
1358
- fold: () => fold,
1359
- setFold: (next: FoldOverride) => {
1360
- fold = next;
1361
- },
1362
- },
1345
+ chatPanel.appendReplayBlock((width, detail, unbounded) =>
1346
+ renderBashExecutionEntry(entry, width, detail, unbounded || options.unboundedToolBodies === true),
1363
1347
  );
1364
1348
  break;
1365
1349
  }
@@ -1427,5 +1411,4 @@ export function rehydrateChatPanelFromTurns(
1427
1411
  // whatever the operator had opened or folded before the switch belonged to
1428
1412
  // the transcript they left. /export reaches the same policy with a verbose
1429
1413
  // panel, so nothing here is terminal-only.
1430
- chatPanel.clearFoldOverrides();
1431
1414
  }
@@ -112,7 +112,7 @@ function composerMode(chrome: EditorChrome, text: string): ComposerMode {
112
112
  function lowerRailHint(theme: ClioTheme, chrome: EditorChrome): string {
113
113
  return theme.fg(
114
114
  "dim",
115
- `${chrome.getSubmitKeyLabel?.() ?? "Enter"} send · ${chrome.getNewlineKeyLabel?.() ?? "Shift+Enter"} newline`,
115
+ `${chrome.getSubmitKeyLabel?.() ?? "Enter"} send · ${chrome.getNewlineKeyLabel?.() ?? "Ctrl+J"} newline`,
116
116
  );
117
117
  }
118
118
 
@@ -205,6 +205,25 @@ function startsWithPastedOperator(text: string, pastedBangOffsets: ReadonlySet<n
205
205
  export class ClioEditor extends Editor {
206
206
  private pastedBangOffsets = new Set<number>();
207
207
  private bracketedPasteActive = false;
208
+ private revision = 0;
209
+ private pastedOperatorTokens = new Set<string>();
210
+
211
+ get draftRevision(): number {
212
+ return this.revision;
213
+ }
214
+
215
+ /** Restored queues and external buffers are literal editor content. */
216
+ setLiteralText(text: string): void {
217
+ this.setText(text);
218
+ this.pastedBangOffsets = new Set([...text.matchAll(/!/gu)].map((match) => match.index));
219
+ }
220
+
221
+ override applyEdit(operation: Parameters<Editor["applyEdit"]>[0]): void {
222
+ const before = this.getText();
223
+ super.applyEdit(operation);
224
+ this.revision += 1;
225
+ this.pastedBangOffsets = remapPastedBangOffsets(before, this.getText(), this.pastedBangOffsets, operation === "undo");
226
+ }
208
227
 
209
228
  constructor(
210
229
  tui: TUI,
@@ -270,18 +289,20 @@ export class ClioEditor extends Editor {
270
289
  */
271
290
  getTextForSubmit(): string {
272
291
  const text = this.getExpandedText();
273
- return startsWithPastedOperator(this.getText(), this.pastedBangOffsets) ? guardPastedEditorOperator(text) : text;
292
+ return this.startsWithLiteralOperator() ? guardPastedEditorOperator(text) : text;
274
293
  }
275
294
 
276
- /**
277
- * pi-tui's bracketed-paste handling inserts pasted text (including a
278
- * trailing newline the paste carried) without submitting: a pasted
279
- * `/model\n` lands as two lines in the buffer and just sits there. Once
280
- * the base handler has applied a chunk that closed a paste, check whether
281
- * the buffer now reads as a completed slash command and, if so, submit it
282
- * through the same handler the typed-Enter path uses.
283
- */
295
+ private startsWithLiteralOperator(): boolean {
296
+ const visible = this.getText();
297
+ return (
298
+ startsWithPastedOperator(visible, this.pastedBangOffsets) ||
299
+ [...this.pastedOperatorTokens].some((token) => visible.trimStart().startsWith(token))
300
+ );
301
+ }
302
+
303
+ /** Paste is always literal; a later deliberate key submits it. */
284
304
  override handleInput(data: string): void {
305
+ this.revision += 1;
285
306
  const openedPaste = data.includes("\x1b[200~");
286
307
  const closedPaste = data.includes("\x1b[201~");
287
308
  const pasteMutation = this.bracketedPasteActive || openedPaste;
@@ -291,10 +312,7 @@ export class ClioEditor extends Editor {
291
312
  // pasted bang draft for that synchronous handoff so the Bash parser can
292
313
  // distinguish it from a typed operator; the submit controller unwraps it
293
314
  // before sending the literal prompt onward.
294
- if (
295
- startsWithPastedOperator(textBeforeInput, this.pastedBangOffsets) &&
296
- keybindings.matches(data, "tui.input.submit")
297
- ) {
315
+ if (this.startsWithLiteralOperator() && keybindings.matches(data, "tui.input.submit")) {
298
316
  const pastedText = this.getTextForSubmit();
299
317
  this.pastedBangOffsets.clear();
300
318
  this.bracketedPasteActive = false;
@@ -322,16 +340,30 @@ export class ClioEditor extends Editor {
322
340
  );
323
341
  if (openedPaste) this.bracketedPasteActive = true;
324
342
  if (closedPaste) this.bracketedPasteActive = false;
325
- if (!closedPaste) return;
326
- const text = this.getText();
327
- if (!text.endsWith("\n")) return;
328
- const command = text.trimEnd();
329
- if (!command.startsWith("/")) return;
330
- this.setText("");
331
- this.onSubmit?.(command);
343
+ if (pasteMutation && textAfterInput !== this.getExpandedText()) {
344
+ // A large paste is represented by an opaque visible token. Remember the
345
+ // inserted token through edits and undo, without depending on its format.
346
+ let start = 0;
347
+ while (
348
+ start < textBeforeInput.length &&
349
+ start < textAfterInput.length &&
350
+ textBeforeInput[start] === textAfterInput[start]
351
+ )
352
+ start++;
353
+ let oldEnd = textBeforeInput.length,
354
+ end = textAfterInput.length;
355
+ while (oldEnd > start && end > start && textBeforeInput[oldEnd - 1] === textAfterInput[end - 1]) {
356
+ oldEnd--;
357
+ end--;
358
+ }
359
+ const token = textAfterInput.slice(start, end).trimStart();
360
+ if (token && !token.startsWith("!")) this.pastedOperatorTokens.add(token);
361
+ }
332
362
  }
333
363
 
334
364
  override setText(text: string): void {
365
+ this.revision += 1;
366
+ this.pastedOperatorTokens.clear();
335
367
  this.pastedBangOffsets.clear();
336
368
  this.bracketedPasteActive = false;
337
369
  super.setText(text);
@@ -1,5 +1,6 @@
1
1
  import { wrapTextWithAnsi } from "../engine/tui.js";
2
- import type { RunIo } from "./slash-commands.js";
2
+ import { renderReferenceCard } from "./renderers/reference-card.js";
3
+ import type { PromptReferenceCard, RunIo } from "./slash-commands.js";
3
4
  import { type ClioToken, clioTheme, GLYPH } from "./theme/index.js";
4
5
 
5
6
  export type NoticeLevel = "info" | "success" | "warn" | "error";
@@ -54,6 +55,60 @@ export function appendOperatorCommand(text: string, sink: CommandOutputSink): vo
54
55
  sink.requestRender();
55
56
  }
56
57
 
58
+ /**
59
+ * Render a display-only prompt template for the operator. A replay block like
60
+ * the command echo above: it is never persisted as a session entry and never
61
+ * reaches the model, which is what "display only" promises the author.
62
+ */
63
+ export function appendReferenceCard(card: PromptReferenceCard, sink: CommandOutputSink): void {
64
+ sink.appendReplayBlock((width) => renderReferenceCard(card, width));
65
+ sink.requestRender();
66
+ }
67
+
68
+ /**
69
+ * A dim line under an operator turn, in the prose gutter, saying something
70
+ * about the turn that the operator did not type: which template expanded, how
71
+ * long it was. Transcript-only, like the echo above.
72
+ */
73
+ export function appendOperatorAside(text: string, sink: CommandOutputSink): void {
74
+ const normalized = text.replace(/\r/g, "").replace(/\n+/gu, " ").trim();
75
+ if (normalized.length === 0) return;
76
+ sink.appendReplayBlock((width) => {
77
+ const theme = clioTheme();
78
+ return wrapTextWithAnsi(theme.fg("dim", normalized), Math.max(1, width - 2)).map((line) => ` ${line}`);
79
+ });
80
+ sink.requestRender();
81
+ }
82
+
83
+ export interface InterviewRecordEntry {
84
+ /** The question's header, or its first line when it has none. */
85
+ label: string;
86
+ answer: string;
87
+ }
88
+
89
+ /**
90
+ * What a round of an interview asked and what the operator answered, kept in
91
+ * the transcript once the overlay has moved on. Without it the round left
92
+ * only a tool row reading `▸ tool action {"action":"ask",…`, and the answers
93
+ * lived on `/decisions` alone.
94
+ */
95
+ export function appendInterviewRecord(entries: ReadonlyArray<InterviewRecordEntry>, sink: CommandOutputSink): void {
96
+ const kept = entries.filter((entry) => entry.answer.trim().length > 0);
97
+ if (kept.length === 0) return;
98
+ sink.appendReplayBlock((width) => {
99
+ const theme = clioTheme();
100
+ const lines: string[] = [];
101
+ const inner = Math.max(1, width - 2);
102
+ for (const entry of kept) {
103
+ const label = entry.label.replace(/\s+/gu, " ").trim();
104
+ lines.push(...wrapTextWithAnsi(`${theme.fg("accent", GLYPH.cursor)} ${theme.fg("dim", label)}`, width));
105
+ lines.push(...wrapTextWithAnsi(theme.fg("muted", entry.answer.trim()), inner).map((line) => ` ${line}`));
106
+ }
107
+ return lines;
108
+ });
109
+ sink.requestRender();
110
+ }
111
+
57
112
  export type CommandOutputReplayBlock = (width: number) => string[];
58
113
 
59
114
  export interface CommandOutputSink {
@@ -246,9 +246,7 @@ export interface DispatchOriginPresentation {
246
246
  * surface; a board row sits under the fleet summary, which already owns the
247
247
  * quadrant's single orange, so here the filled glyph carries origin by shape.
248
248
  */
249
- export function dispatchOriginPresentation(
250
- row: Pick<DispatchBoardRow, "requestOrigin">,
251
- ): DispatchOriginPresentation | null {
249
+ function dispatchOriginPresentation(row: Pick<DispatchBoardRow, "requestOrigin">): DispatchOriginPresentation | null {
252
250
  if (row.requestOrigin === "user") return { glyph: GLYPH.workerHuman, token: "accent" };
253
251
  if (row.requestOrigin === "agent") return { glyph: GLYPH.workerAgent, token: "muted" };
254
252
  if (row.requestOrigin === "internal") return { glyph: GLYPH.workerInternal, token: "dim" };
@@ -1,9 +1,8 @@
1
1
  import { combineBashOutput, runBashCommand } from "../core/bash-exec.js";
2
+ import { type ExternalEditResult, editTextExternally, resolveExternalEditor } from "../core/external-editor.js";
2
3
  import type { PendingSkillRequest } from "../core/skill-activation.js";
3
- import { ToolNames } from "../core/tool-names.js";
4
4
  import type { DispatchContract } from "../domains/dispatch/contract.js";
5
5
  import type { SessionContract, SessionEntry } from "../domains/session/index.js";
6
- import { toolPresentationPolicy } from "../tools/presentation.js";
7
6
  import type { ChatLoop } from "./chat-loop.js";
8
7
  import type { ChatPanel } from "./chat-panel.js";
9
8
  import { bashExecutionEntryInput, parseEditorBashCommand, unguardPastedEditorOperator } from "./editor-bash.js";
@@ -13,16 +12,8 @@ import {
13
12
  type RunningDispatchRef,
14
13
  resolveSteerTarget,
15
14
  } from "./editor-steer.js";
16
- import { type ExternalEditResult, editTextExternally, resolveExternalEditor } from "./external-editor.js";
17
15
  import { type BashTranscriptExecution, renderBashTranscriptExecution } from "./renderers/tool-execution.js";
18
16
  import { parseSlashCommand, type RunIo, type SlashCommand, type SlashCommandDispatchResult } from "./slash-commands.js";
19
- import {
20
- type FoldOverride,
21
- policyRunningToolFold,
22
- policyToolFold,
23
- resolveFold,
24
- type TranscriptDetailPolicy,
25
- } from "./transcript-detail.js";
26
17
 
27
18
  const EDITOR_BASH_TIMEOUT_MS = 300_000;
28
19
  /** Existing bash TERM-to-KILL grace (5s), plus settlement and session append. */
@@ -61,6 +52,9 @@ export interface EditorSubmitEditor {
61
52
  getText(): string;
62
53
  /** Draft spelling for an immediate send, including any editor provenance envelope. */
63
54
  getTextForSubmit(): string;
55
+ getExpandedText?(): string;
56
+ readonly draftRevision?: number;
57
+ setLiteralText?(text: string): void;
64
58
  setText(text: string): void;
65
59
  addToHistory(text: string): void;
66
60
  }
@@ -86,6 +80,7 @@ export interface EditorSubmitSessionTranscript {
86
80
  }
87
81
 
88
82
  export interface EditorSubmitDeps {
83
+ onLocalBashRunning?: (running: boolean) => void;
89
84
  editor: EditorSubmitEditor;
90
85
  ui: EditorSubmitUi;
91
86
  io: RunIo;
@@ -111,7 +106,7 @@ export interface EditorSubmitDeps {
111
106
 
112
107
  export interface EditorSubmitController {
113
108
  runEditorBash(text: string): boolean;
114
- openExternalEditorForInput(): void;
109
+ openExternalEditorForInput(text?: string): boolean;
115
110
  handleEditorSteerMention(mention: { target: string; text: string }): boolean;
116
111
  submitEditorText(text: string): void;
117
112
  /** Admit an immutable boot record without reading or mutating the live draft. */
@@ -123,7 +118,7 @@ export interface EditorSubmitController {
123
118
  * refusals (attached dispatch, parked permission ask), which degrade the
124
119
  * message to next-slot delivery with a notice.
125
120
  */
126
- interruptFromEditor(): void;
121
+ interruptFromEditor(text?: string): void;
127
122
  restoreQueuedFollowUpsToEditor(): void;
128
123
  hasActiveEditorBash(): boolean;
129
124
  cancelActiveEditorBash(): boolean;
@@ -171,35 +166,19 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
171
166
  totalBytes: 0,
172
167
  excludeFromContext: parsed.excludeFromContext,
173
168
  };
174
- // The operator's bash row follows the same rule as a model bash call: the
175
- // transcript detail policy (through bash's presentation once settled)
176
- // unless the operator overrode this one block with the expand key.
177
- let fold: FoldOverride;
178
- const bashPresentation = toolPresentationPolicy(ToolNames.Bash, undefined);
179
- const policyFold = (detail: TranscriptDetailPolicy) =>
180
- execution.running ? policyRunningToolFold(detail) : policyToolFold(detail, bashPresentation);
181
169
  deps.chatPanel.appendReplayBlock(
182
- (width, detail) =>
170
+ (width, detail, unbounded) =>
183
171
  renderBashTranscriptExecution(
184
- {
185
- ...execution,
186
- folded: resolveFold(fold, policyFold(detail)) === "folded",
187
- ...(execution.running ? { elapsedMs: Math.max(0, performance.now() - startedAt) } : {}),
188
- },
172
+ { ...execution, ...(execution.running ? { elapsedMs: Math.max(0, performance.now() - startedAt) } : {}) },
189
173
  width,
174
+ undefined,
175
+ { detail, ...(unbounded ? { unbounded } : {}) },
190
176
  ),
191
177
  () => execution.running,
192
- {
193
- policyFold,
194
- fold: () => fold,
195
- setFold: (next: FoldOverride) => {
196
- fold = next;
197
- deps.ui.requestRender();
198
- },
199
- },
200
178
  );
201
179
  deps.ui.requestRender();
202
180
 
181
+ deps.onLocalBashRunning?.(true);
203
182
  let settlement!: Promise<void>;
204
183
  settlement = (async () => {
205
184
  try {
@@ -249,6 +228,7 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
249
228
  execution.error = msg;
250
229
  deps.io.stderr(`[bash] ${msg}\n`);
251
230
  } finally {
231
+ deps.onLocalBashRunning?.(false);
252
232
  if (activeEditorBash === abort) activeEditorBash = null;
253
233
  if (activeEditorBashSettlement === settlement) activeEditorBashSettlement = null;
254
234
  deps.ui.requestRender();
@@ -259,27 +239,45 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
259
239
  return true;
260
240
  };
261
241
 
262
- const openExternalEditorForInput = (): void => {
242
+ const setLiteralText = (text: string): void => {
243
+ if (deps.editor.setLiteralText) deps.editor.setLiteralText(text);
244
+ else deps.editor.setText(text);
245
+ };
246
+ const openExternalEditorForInput = (explicitText?: string): boolean => {
263
247
  const command = (deps.resolveEditor ?? resolveExternalEditor)();
264
248
  if (!command) {
265
249
  deps.io.stderr("[editor] no external editor configured; set VISUAL or EDITOR\n");
266
- return;
250
+ return false;
267
251
  }
268
- const currentText = deps.editor.getText();
252
+ const currentText =
253
+ explicitText ?? deps.editor.getExpandedText?.() ?? unguardPastedEditorOperator(deps.editor.getTextForSubmit());
269
254
  let result: ExternalEditResult;
270
255
  try {
271
256
  deps.ui.stop();
272
257
  result = (deps.editExternally ?? editTextExternally)(currentText, command);
258
+ } catch (error) {
259
+ result = { ok: false, error: error instanceof Error ? error.message : String(error) };
273
260
  } finally {
274
261
  deps.ui.start();
275
262
  deps.ui.requestRender(true);
276
263
  }
277
- if (result.ok) {
278
- deps.editor.setText(result.text ?? "");
279
- } else if (result.error) {
280
- deps.io.stderr(`[editor] ${result.error}\n`);
281
- }
264
+ if (result.ok) setLiteralText(result.text ?? "");
265
+ else if (result.error) deps.io.stderr(`[editor] ${result.error}\n`);
282
266
  deps.ui.requestRender(true);
267
+ return result.ok;
268
+ };
269
+
270
+ // A snapshot remains owned until expansion and admission finish. A second
271
+ // press on that same snapshot is inert; a newer draft has its own identity.
272
+ const pendingDrafts = new Set<string>();
273
+ const captureDraft = () => {
274
+ const text = deps.editor.getText();
275
+ const revision = deps.editor.draftRevision;
276
+ const key = JSON.stringify([revision, text]);
277
+ return {
278
+ key,
279
+ owns: () => deps.editor.getText() === text && deps.editor.draftRevision === revision,
280
+ };
283
281
  };
284
282
 
285
283
  const submitEditorSteerMention = (mention: { target: string; text: string }): EditorSteerSubmission => {
@@ -360,7 +358,12 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
360
358
  }
361
359
  }
362
360
  const command = parseSlashCommand(trimmed);
363
- if (isRejectedCommand(command)) {
361
+ if (command.kind === "editor" || command.kind === "interrupt") {
362
+ // Keep the correctable command until its owner accepts the snapshot.
363
+ deps.editor.setText(literalText);
364
+ const result = deps.dispatchCommand(trimmed);
365
+ if (result === "accepted") deps.editor.addToHistory(literalText);
366
+ } else if (isRejectedCommand(command)) {
364
367
  deps.editor.setText(literalText);
365
368
  deps.dispatchCommand(trimmed);
366
369
  } else if (command.kind === "unknown-command") {
@@ -442,7 +445,8 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
442
445
 
443
446
  const queueFollowUpFromEditor = (): void => {
444
447
  const streaming = deps.chat.isStreaming();
445
- const text = (streaming ? deps.editor.getText() : deps.editor.getTextForSubmit()).trim();
448
+ const snapshot = captureDraft();
449
+ const text = deps.editor.getTextForSubmit().trim();
446
450
  if (text.length === 0) return;
447
451
  if (!streaming) {
448
452
  deps.editor.setText("");
@@ -450,8 +454,10 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
450
454
  deps.ui.requestRender();
451
455
  return;
452
456
  }
457
+ if (pendingDrafts.has(snapshot.key)) return;
458
+ pendingDrafts.add(snapshot.key);
453
459
  void (async () => {
454
- const submitted = await deps.expandSubmit(text);
460
+ const submitted = await deps.expandSubmit(unguardPastedEditorOperator(text));
455
461
  if (submitted.images.length > 0) {
456
462
  deps.io.stderr("[follow-up] image references cannot be queued while a response is streaming\n");
457
463
  return;
@@ -462,17 +468,20 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
462
468
  return;
463
469
  }
464
470
  deps.editor.addToHistory(text);
465
- deps.editor.setText("");
471
+ if (snapshot.owns()) deps.editor.setText("");
466
472
  deps.ui.requestRender();
467
- })().catch((err) => {
468
- const msg = err instanceof Error ? err.message : String(err);
469
- deps.io.stderr(`[follow-up] ${msg}\n`);
470
- });
473
+ })()
474
+ .catch((err) => {
475
+ const msg = err instanceof Error ? err.message : String(err);
476
+ deps.io.stderr(`[follow-up] ${msg}\n`);
477
+ })
478
+ .finally(() => pendingDrafts.delete(snapshot.key));
471
479
  };
472
480
 
473
- const interruptFromEditor = (): void => {
481
+ const interruptFromEditor = (explicitText?: string): void => {
474
482
  const streaming = deps.chat.isStreaming();
475
- const text = (streaming ? deps.editor.getText() : deps.editor.getTextForSubmit()).trim();
483
+ const snapshot = captureDraft();
484
+ const text = (explicitText ?? deps.editor.getTextForSubmit()).trim();
476
485
  if (text.length === 0) return;
477
486
  if (!streaming) {
478
487
  deps.editor.setText("");
@@ -480,8 +489,10 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
480
489
  deps.ui.requestRender();
481
490
  return;
482
491
  }
492
+ if (pendingDrafts.has(snapshot.key)) return;
493
+ pendingDrafts.add(snapshot.key);
483
494
  void (async () => {
484
- const submitted = await deps.expandSubmit(text);
495
+ const submitted = await deps.expandSubmit(unguardPastedEditorOperator(text));
485
496
  if (submitted.images.length > 0) {
486
497
  deps.io.stderr("[interrupt] image references cannot be sent while a response is streaming\n");
487
498
  return;
@@ -492,7 +503,8 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
492
503
  // than vanishing with the cancelled run. A refused interrupt cancels
493
504
  // nothing, so the queue stays put.
494
505
  const restored = deps.chat.interruptRefusal() === null ? deps.chat.clearQueuedFollowUps() : [];
495
- deps.editor.setText(restored.join("\n\n"));
506
+ const newerDraft = snapshot.owns() ? "" : (deps.editor.getExpandedText?.() ?? deps.editor.getText());
507
+ setLiteralText([...restored, newerDraft].filter((part) => part.length > 0).join("\n\n"));
496
508
  deps.ui.requestRender();
497
509
  // An interrupt is a fresh prompt, so it carries what the idle path
498
510
  // carries: the launchpad collapse, the submitted-turn count, and the
@@ -509,10 +521,12 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
509
521
  ...(skillRequests.length > 0 ? { pendingSkillRequests: skillRequests } : {}),
510
522
  });
511
523
  await deps.settleVisibleFrame?.("interrupt-submit-return");
512
- })().catch((err) => {
513
- const msg = err instanceof Error ? err.message : String(err);
514
- deps.io.stderr(`[interrupt] ${msg}\n`);
515
- });
524
+ })()
525
+ .catch((err) => {
526
+ const msg = err instanceof Error ? err.message : String(err);
527
+ deps.io.stderr(`[interrupt] ${msg}\n`);
528
+ })
529
+ .finally(() => pendingDrafts.delete(snapshot.key));
516
530
  };
517
531
 
518
532
  const restoreQueuedFollowUpsToEditor = (): void => {
@@ -521,9 +535,9 @@ export function createEditorSubmitController(deps: EditorSubmitDeps): EditorSubm
521
535
  deps.io.stderr("[follow-up] no queued messages to restore\n");
522
536
  return;
523
537
  }
524
- const currentText = deps.editor.getText();
538
+ const currentText = deps.editor.getExpandedText?.() ?? deps.editor.getText();
525
539
  const queuedText = restored.join("\n\n");
526
- deps.editor.setText([queuedText, currentText].filter((part) => part.trim().length > 0).join("\n\n"));
540
+ setLiteralText([queuedText, currentText].filter((part) => part.trim().length > 0).join("\n\n"));
527
541
  deps.ui.requestRender();
528
542
  };
529
543
 
@@ -177,6 +177,8 @@ export function compileFleetRunPreview(input: FleetRunPreviewInput): FleetRunPre
177
177
  let plan: ExecutionPlan;
178
178
  try {
179
179
  plan = compileFleetExecutionPlan({
180
+ commands,
181
+ vars: input.vars,
180
182
  contract,
181
183
  task,
182
184
  resolveAgent(context) {
@@ -11,8 +11,8 @@ export interface FollowUpQueuePanelOptions {
11
11
  }
12
12
 
13
13
  /**
14
- * Keybindings are stored lowercase (`alt+up`), but the hint vocabulary spells
15
- * modifiers and keys in title case (`[Alt+Up]`). Format the bound key for
14
+ * Keybindings are stored lowercase (`alt+q`), but the hint vocabulary spells
15
+ * modifiers and keys in title case (`[Alt+Q]`). Format the bound key for
16
16
  * display so the panel reads the same whether or not the binding is customized.
17
17
  */
18
18
  function displayKey(key: string): string {
@@ -52,7 +52,7 @@ export function createFollowUpQueuePanel(options: FollowUpQueuePanelOptions = {}
52
52
  message.kind === "steer" ? theme.fg("action", `${GLYPH.user} steer`) : theme.fg("muted", `${GLYPH.queued} queued`);
53
53
  lines.push(`${marker} ${theme.fg("muted", preview)}`);
54
54
  }
55
- const restoreKey = key && key.length > 0 ? displayKey(key) : "Alt+Up";
55
+ const restoreKey = key && key.length > 0 ? displayKey(key) : "see /help";
56
56
  lines.push(theme.fg("dim", `[${restoreKey}] restore to editor`));
57
57
 
58
58
  cachedLines = frame(theme, "Steering Queue", lines, bodyWidth + 4);