@iowarp/clio-coder 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -0,0 +1,483 @@
1
+ import { type ExtensionCommandRow, extensionInvocation, resolveExtensionCommands } from "./operator-commands.js";
2
+
3
+ export {
4
+ type ExtensionCommandRow,
5
+ extensionInvocation,
6
+ isExtensionCommandToken,
7
+ resolveExtensionCommands,
8
+ } from "./operator-commands.js";
9
+
10
+ import { realpathSync } from "node:fs";
11
+ import type { ExtensionObservation, ExtensionOutput, ExtensionRuntimeSnapshot, ExtensionStatus } from "./public-api.js";
12
+ import { ExtensionRuntimeProcess, type RuntimeProcessState } from "./runtime-process.js";
13
+ import { RUNTIME_LIMITS } from "./runtime-schema.js";
14
+ import { listInstalledExtensions } from "./state.js";
15
+ import {
16
+ type ExtensionProvenance,
17
+ type InstalledExtension,
18
+ isLoadableExtension,
19
+ type LoadableExtension,
20
+ } from "./types.js";
21
+
22
+ export interface OperatorRuntimeEntry {
23
+ id: string;
24
+ scope: "user" | "project";
25
+ generation: number;
26
+ state: RuntimeProcessState | "inactive";
27
+ /** Verified owner of this instance, not a subsequent installed-inventory observation. */
28
+ provenance?: ExtensionProvenance;
29
+ reason?: string;
30
+ status?: ExtensionStatus;
31
+ /** Actual schema admission is still owned by the session/worker registry. */
32
+ newSessionReasons: string[];
33
+ toolEvidence: "frozen-registry" | "runtime-startup-observation";
34
+ }
35
+ export interface OperatorReloadResult {
36
+ status: "committed" | "deferred" | "rejected";
37
+ generation: number;
38
+ message: string;
39
+ }
40
+ export interface OperatorRuntimeOptions {
41
+ /** Captured from the existing registry, never inferred from runtime activation. */
42
+ frozenTools?: ReadonlyArray<ExtensionProvenance>;
43
+ onDiagnostic?: (message: string) => void;
44
+ context(): Omit<ExtensionRuntimeSnapshot, "generation">;
45
+ isIdle(): boolean;
46
+ list?: (cwd: string) => InstalledExtension[];
47
+ onChange?: () => void;
48
+ onReload?: (result: OperatorReloadResult) => void;
49
+ /** Synchronous paired snapshot/hook commit. Runtimes have a separate readiness clock. */
50
+ commitHooks?: () => { status: string; generation: number; reason?: string };
51
+ /** Explicit headless invocation starts only its selected owner. */
52
+ onlyId?: string;
53
+ }
54
+ function identity(entry: InstalledExtension): string {
55
+ return `${entry.id}:${entry.scope}:${entry.provenance?.canonicalRoot}:${entry.provenance?.contentDigest}`;
56
+ }
57
+ function contextIdentity(context: Omit<ExtensionRuntimeSnapshot, "generation">): string {
58
+ return JSON.stringify(context);
59
+ }
60
+ /** Owns operator processes only. Never used by native workers or model tool bootstrap. */
61
+ export class OperatorExtensionRuntime {
62
+ private processes = new Map<string, ExtensionRuntimeProcess>();
63
+ private inventory: InstalledExtension[] = [];
64
+ private failures = new Map<string, string>();
65
+ private statuses = new Map<string, ExtensionStatus>();
66
+ private initialTools: Map<string, string> | undefined;
67
+ private lastScanMs = 0;
68
+ private observationIssue: string | undefined;
69
+ private generation = 0;
70
+ private lifetime = 0;
71
+ private closed = false;
72
+ private reloading = false;
73
+ private queued = false;
74
+ private activeContext: string | undefined;
75
+ private pendingObservation: ExtensionObservation | undefined;
76
+ private observationTask: Promise<void> | undefined;
77
+ private reloadTask: Promise<OperatorReloadResult> | undefined;
78
+ private retired = new Set<Promise<void>>();
79
+ constructor(private options: OperatorRuntimeOptions) {
80
+ if (options.frozenTools)
81
+ this.initialTools = new Map(
82
+ options.frozenTools.map((provenance) => [
83
+ provenance.id,
84
+ `${provenance.id}:${provenance.scope}:${provenance.canonicalRoot}:${provenance.contentDigest}`,
85
+ ]),
86
+ );
87
+ }
88
+ /** No timer or filesystem work is needed without active runtimes or queued reload. */
89
+ get maintenanceDelayMs(): number | null {
90
+ if (this.closed || this.reloading) return null;
91
+ if (this.queued) return 250;
92
+ return [...this.processes.values()].some((process) => process.state === "ready")
93
+ ? Math.max(30000, Math.ceil(this.lastScanMs * 100))
94
+ : null;
95
+ }
96
+ maintenance(): void {
97
+ if (this.closed || this.reloading) return;
98
+ if (this.queued) {
99
+ if (!this.busy && this.options.isIdle()) void this.reload("session-change");
100
+ return;
101
+ }
102
+ if (this.maintenanceDelayMs !== null) this.reconcile();
103
+ }
104
+ private reportObservationFailure(error: unknown): void {
105
+ const message = `extension observation unavailable: ${error instanceof Error ? error.message : String(error)}`.slice(
106
+ 0,
107
+ 512,
108
+ );
109
+ if (message === this.observationIssue) return;
110
+ this.observationIssue = message;
111
+ try {
112
+ this.options.onDiagnostic?.(message);
113
+ } catch {
114
+ /* A diagnostic sink has no runtime authority. */
115
+ }
116
+ }
117
+ private context(): Omit<ExtensionRuntimeSnapshot, "generation"> {
118
+ const context = this.options.context();
119
+ return { ...context, workspace: realpathSync(context.workspace) };
120
+ }
121
+ private list(): InstalledExtension[] {
122
+ const start = performance.now();
123
+ try {
124
+ return (this.options.list ?? ((cwd) => listInstalledExtensions(cwd, { all: true })))(this.context().workspace);
125
+ } finally {
126
+ this.lastScanMs = performance.now() - start;
127
+ }
128
+ }
129
+ private changed(): void {
130
+ try {
131
+ this.options.onChange?.();
132
+ } catch {
133
+ /* Presentation cannot change runtime authority. */
134
+ }
135
+ }
136
+ private retire(process: ExtensionRuntimeProcess, reason: string): void {
137
+ this.statuses.delete(process.extension.id);
138
+ const task = process.dispose(reason);
139
+ this.retired.add(task);
140
+ void task.finally(() => this.retired.delete(task));
141
+ }
142
+ get busy(): boolean {
143
+ return this.reloading || [...this.processes.values()].some((process) => process.busy);
144
+ }
145
+ /** Synchronous fence for resume/fork/branch switch, including same-session leaf changes. */
146
+ invalidateContext(): void {
147
+ if (this.closed || (!this.processes.size && !this.reloading && !this.queued)) return;
148
+ this.lifetime++;
149
+ for (const process of this.processes.values()) this.retire(process, "session-change");
150
+ this.processes.clear();
151
+ this.queued = true;
152
+ this.changed();
153
+ }
154
+ get activeGeneration(): number {
155
+ return this.generation;
156
+ }
157
+ private eligible(process: ExtensionRuntimeProcess, list: InstalledExtension[]): boolean {
158
+ return list.some((entry) => isLoadableExtension(entry) && identity(entry) === identity(process.extension));
159
+ }
160
+ /** Reverify at command boundaries and on the host's slow lifecycle tick, never during paint. */
161
+ reconcile(): void {
162
+ if (
163
+ this.closed ||
164
+ (!this.queued && !this.reloading && ![...this.processes.values()].some((process) => process.state === "ready"))
165
+ )
166
+ return;
167
+ let context: string;
168
+ let list: InstalledExtension[];
169
+ try {
170
+ context = contextIdentity(this.context());
171
+ list = this.list();
172
+ } catch {
173
+ context = "unavailable";
174
+ list = [];
175
+ }
176
+ this.inventory = list;
177
+ if (this.activeContext !== undefined && context !== this.activeContext) {
178
+ this.lifetime++;
179
+ for (const process of this.processes.values()) this.retire(process, "session-change");
180
+ this.processes.clear();
181
+ this.activeContext = context;
182
+ this.queued = true;
183
+ this.changed();
184
+ }
185
+ for (const [id, process] of this.processes) {
186
+ if (this.eligible(process, list)) continue;
187
+ this.processes.delete(id);
188
+ this.failures.set(id, "installation disabled, removed, replaced, or changed; reload after reviewed installation");
189
+ this.retire(process, "installation-revoked");
190
+ this.changed();
191
+ }
192
+ if (this.queued && !this.busy && this.options.isIdle()) void this.reload("session-change");
193
+ }
194
+ reload(reason: "startup" | "reload" | "session-change" = "reload"): Promise<OperatorReloadResult> {
195
+ if (this.closed)
196
+ return Promise.resolve({ status: "rejected", generation: this.generation, message: "operator runtime is disposed" });
197
+ if (this.busy || !this.options.isIdle()) {
198
+ this.queued = true;
199
+ this.changed();
200
+ return Promise.resolve({
201
+ status: "deferred",
202
+ generation: this.generation,
203
+ message: "extension reload queued until the session and extension commands are idle",
204
+ });
205
+ }
206
+ this.queued = false;
207
+ this.reloading = true;
208
+ this.reloadTask = this.performReload(reason).finally(() => {
209
+ this.reloading = false;
210
+ this.changed();
211
+ });
212
+ return this.reloadTask;
213
+ }
214
+ private async performReload(reason: "startup" | "reload" | "session-change"): Promise<OperatorReloadResult> {
215
+ const staged = new Map<string, ExtensionRuntimeProcess>();
216
+ const failures = new Map<string, string>();
217
+ const lifetime = this.lifetime;
218
+ const next = this.generation + 1;
219
+ let result: OperatorReloadResult;
220
+ try {
221
+ const context = this.context();
222
+ const capturedContext = contextIdentity(context);
223
+ const list = this.list();
224
+ this.inventory = list;
225
+ this.initialTools ??= new Map(
226
+ list
227
+ .filter((entry) => entry.loadable && entry.capabilities?.tools.length)
228
+ .map((entry) => [entry.id, identity(entry)]),
229
+ );
230
+ // Explicit reload restarts every instance. Fence before any async work;
231
+ // failed activation never leaves an ineligible old process callable.
232
+ for (const process of this.processes.values()) this.retire(process, reason);
233
+ this.processes.clear();
234
+ this.statuses.clear();
235
+ await Promise.all(this.retired);
236
+ const eligible = list.filter(
237
+ (entry): entry is LoadableExtension =>
238
+ isLoadableExtension(entry) &&
239
+ entry.runtime !== undefined &&
240
+ (!this.options.onlyId || entry.id === this.options.onlyId),
241
+ );
242
+ for (const entry of eligible.slice(RUNTIME_LIMITS.processes))
243
+ failures.set(entry.id, `operator runtime limit is ${RUNTIME_LIMITS.processes}; disable another runtime and reload`);
244
+ await Promise.all(
245
+ eligible.slice(0, RUNTIME_LIMITS.processes).map(async (entry) => {
246
+ try {
247
+ const process = new ExtensionRuntimeProcess(entry, { ...context, generation: next }, () => {
248
+ if (this.processes.get(entry.id)?.state !== "ready") this.statuses.delete(entry.id);
249
+ this.changed();
250
+ });
251
+ staged.set(entry.id, process);
252
+ await process.staged;
253
+ } catch (error) {
254
+ failures.set(entry.id, error instanceof Error ? error.message : String(error));
255
+ }
256
+ }),
257
+ );
258
+ if (this.closed || lifetime !== this.lifetime || capturedContext !== contextIdentity(this.context()))
259
+ throw new Error("session or workspace changed while staging runtimes");
260
+ const current = this.list();
261
+ if (
262
+ JSON.stringify(list.map(identity)) !== JSON.stringify(current.map(identity)) ||
263
+ list.some((entry, index) => entry.loadable !== current[index]?.loadable)
264
+ )
265
+ throw new Error("extension installations changed while staging; reload again");
266
+ // Preserve the existing synchronous paired hook/snapshot transaction. UI
267
+ // readiness is deliberately reported separately and acknowledged below.
268
+ if (!this.options.isIdle()) {
269
+ this.queued = true;
270
+ throw new Error("session became busy while staging; reload queued until idle");
271
+ }
272
+ const hooks = this.options.commitHooks?.();
273
+ if (hooks && hooks.status !== "committed")
274
+ throw new Error(`hook generation rejected: ${hooks.reason ?? hooks.status}`);
275
+ this.generation = next;
276
+ this.activeContext = capturedContext;
277
+ this.processes = staged;
278
+ this.failures = failures;
279
+ await Promise.all(
280
+ [...staged].map(async ([id, process]) => {
281
+ if (failures.has(id)) return;
282
+ try {
283
+ await process.activate();
284
+ } catch (error) {
285
+ failures.set(id, error instanceof Error ? error.message : String(error));
286
+ }
287
+ }),
288
+ );
289
+ if (this.closed || lifetime !== this.lifetime || capturedContext !== contextIdentity(this.context()))
290
+ throw new Error("session or workspace changed during runtime activation");
291
+ if (context.mode === "interactive") await this.deliverObservation({ event: "session_open", reason });
292
+ const ready = [...staged.values()].filter((process) => process.state === "ready").length;
293
+ const degraded = eligible.length - ready;
294
+ result = {
295
+ status: "committed",
296
+ generation: next,
297
+ message: `operator generation ${next}: ${ready} ready, ${degraded} degraded; tool schemas remain frozen${hooks ? `; hooks/snapshot generation ${hooks.generation}` : ""}`,
298
+ };
299
+ } catch (error) {
300
+ for (const process of staged.values()) this.retire(process, "reload-rejected");
301
+ this.processes.clear();
302
+ result = {
303
+ status: this.generation === next ? "committed" : "rejected",
304
+ generation: this.generation,
305
+ message: `${this.generation === next ? "operator generation committed but degraded: " : ""}${error instanceof Error ? error.message : String(error)}`,
306
+ };
307
+ }
308
+ this.changed();
309
+ try {
310
+ this.options.onReload?.(result);
311
+ } catch {
312
+ /* Reporting follows settlement. */
313
+ }
314
+ return result;
315
+ }
316
+ commands(promptNames: readonly string[] = []): ExtensionCommandRow[] {
317
+ const rows = this.inventory
318
+ .filter((entry) => entry.effective && entry.runtime)
319
+ .flatMap((entry) =>
320
+ (entry.runtime?.commands ?? []).map((command) => {
321
+ const process = this.processes.get(entry.id);
322
+ const available = process?.state === "ready" && entry.loadable && !this.reloading;
323
+ const reason = available
324
+ ? undefined
325
+ : (this.failures.get(entry.id) ??
326
+ process?.failure ??
327
+ (!entry.loadable
328
+ ? "installation is not enabled and eligible"
329
+ : this.reloading
330
+ ? "runtime reload in progress"
331
+ : "runtime not ready; reload extensions"));
332
+ return {
333
+ origin: "extension" as const,
334
+ invocation: extensionInvocation(entry.id, command.name),
335
+ extensionId: entry.id,
336
+ scope: entry.scope,
337
+ description: command.description,
338
+ generation: this.generation,
339
+ available,
340
+ ...(reason ? { reason } : {}),
341
+ };
342
+ }),
343
+ );
344
+ return resolveExtensionCommands(rows, promptNames);
345
+ }
346
+ entries(): OperatorRuntimeEntry[] {
347
+ return this.inventory.map((entry) => {
348
+ const process = this.processes.get(entry.id);
349
+ const current = process && identity(process.extension) === identity(entry) ? process : undefined;
350
+ const reason = this.failures.get(entry.id) ?? current?.failure;
351
+ const status = current?.state === "ready" ? this.statuses.get(entry.id) : undefined;
352
+ const initial = this.initialTools?.get(entry.id);
353
+ const newSessionReasons =
354
+ (entry.capabilities?.tools.length || initial) && initial !== identity(entry)
355
+ ? [
356
+ this.options.frozenTools
357
+ ? "installed package differs from the frozen tool registry (or was not admitted there); a new session is required for tool admission"
358
+ : "package differs from the runtime-startup observation; actual frozen tool binding is unknown here, inspect the registry or start a new session",
359
+ ]
360
+ : [];
361
+ return {
362
+ id: entry.id,
363
+ scope: entry.scope,
364
+ generation: this.generation,
365
+ state: current?.state ?? "inactive",
366
+ ...(current ? { provenance: current.extension.provenance } : {}),
367
+ ...(reason ? { reason } : {}),
368
+ ...(status ? { status } : {}),
369
+ newSessionReasons,
370
+ toolEvidence: this.options.frozenTools ? "frozen-registry" : "runtime-startup-observation",
371
+ };
372
+ });
373
+ }
374
+ async invoke(
375
+ invocation: string,
376
+ args: string,
377
+ promptNames: readonly string[] = [],
378
+ signal?: AbortSignal,
379
+ ): Promise<ExtensionOutput> {
380
+ this.reconcile();
381
+ if (this.closed || !this.options.isIdle() || this.reloading)
382
+ throw new Error("extension command requires an idle session");
383
+ if (Buffer.byteLength(args) > RUNTIME_LIMITS.argumentBytes) throw new Error("extension arguments exceed 16 KiB");
384
+ const row = this.commands(promptNames).find((row) => row.invocation === invocation);
385
+ if (!row?.available) throw new Error(row?.reason ?? `/${invocation} is not an available extension command`);
386
+ const process = this.processes.get(row.extensionId);
387
+ const name = invocation.slice(invocation.lastIndexOf(":") + 1);
388
+ const command = process?.declaration.commands.find((command) => command.name === name);
389
+ if (!process || !command) throw new Error("extension command unavailable");
390
+ const context = contextIdentity(this.context());
391
+ const output = await process.request({ kind: "command", name, args }, command.timeoutMs, signal);
392
+ this.reconcile();
393
+ if (
394
+ this.closed ||
395
+ signal?.aborted ||
396
+ context !== contextIdentity(this.context()) ||
397
+ this.processes.get(row.extensionId) !== process ||
398
+ process.state !== "ready"
399
+ )
400
+ throw new Error("extension result belongs to a revoked runtime or session");
401
+ this.applyOutput(process, output);
402
+ return output;
403
+ }
404
+ private applyOutput(process: ExtensionRuntimeProcess, output: ExtensionOutput): void {
405
+ if (this.processes.get(process.extension.id) !== process || process.state !== "ready") return;
406
+ if (output.status === null) this.statuses.delete(process.extension.id);
407
+ else if (output.status) this.statuses.set(process.extension.id, output.status);
408
+ this.changed();
409
+ }
410
+ observe(observation: ExtensionObservation): void {
411
+ if (
412
+ this.closed ||
413
+ ![...this.processes.values()].some(
414
+ (process) => process.state === "ready" && process.declaration.events.includes(observation.event),
415
+ )
416
+ )
417
+ return;
418
+ this.pendingObservation = observation; // One coalesced, body-free observation; no event history.
419
+ if (this.observationTask) return;
420
+ this.observationTask = (async () => {
421
+ while (this.pendingObservation && !this.closed) {
422
+ const next = this.pendingObservation;
423
+ this.pendingObservation = undefined;
424
+ await this.deliverObservation(next);
425
+ }
426
+ })()
427
+ .catch((error) => this.reportObservationFailure(error))
428
+ .finally(() => {
429
+ this.observationTask = undefined;
430
+ });
431
+ }
432
+ private async deliverObservation(observation: ExtensionObservation): Promise<void> {
433
+ try {
434
+ const context = contextIdentity(this.context());
435
+ const candidates = [...this.processes.values()].filter(
436
+ (process) => process.state === "ready" && !process.busy && process.declaration.events.includes(observation.event),
437
+ );
438
+ if (candidates.length === 0) return;
439
+ const admitted = this.list();
440
+ const responses = await Promise.all(
441
+ candidates.map(async (process) => {
442
+ const { generation: _generation, ...processContext } = process.snapshot;
443
+ if (contextIdentity(processContext) !== context || !this.eligible(process, admitted)) return null;
444
+ try {
445
+ return { process, output: await process.request({ kind: "observe", observation }, RUNTIME_LIMITS.observationMs) };
446
+ } catch (error) {
447
+ this.reportObservationFailure(error);
448
+ if (this.processes.get(process.extension.id) === process) this.statuses.delete(process.extension.id);
449
+ this.changed();
450
+ return null;
451
+ }
452
+ }),
453
+ );
454
+ if (this.closed) return;
455
+ if (context !== contextIdentity(this.context())) {
456
+ this.reconcile();
457
+ return;
458
+ }
459
+ const current = this.list();
460
+ for (const response of responses) {
461
+ if (!response) continue;
462
+ if (this.eligible(response.process, current)) this.applyOutput(response.process, response.output);
463
+ else this.reconcile();
464
+ }
465
+ } catch (error) {
466
+ this.reportObservationFailure(error);
467
+ this.reconcile();
468
+ }
469
+ }
470
+ cancel(): void {
471
+ for (const process of this.processes.values()) if (process.busy) this.retire(process, "operator-cancelled");
472
+ }
473
+ async dispose(): Promise<void> {
474
+ this.closed = true;
475
+ this.lifetime++;
476
+ this.pendingObservation = undefined;
477
+ for (const process of this.processes.values()) this.retire(process, "session-closed");
478
+ this.processes.clear();
479
+ await this.reloadTask;
480
+ await this.observationTask;
481
+ await Promise.all(this.retired);
482
+ }
483
+ }
@@ -0,0 +1,53 @@
1
+ /** Operator runtime API v1. Import these types only; Clio injects the API. */
2
+ export type ExtensionEvent = "session_open" | "turn_end";
3
+ export type ExtensionTone = "neutral" | "positive" | "warning" | "error";
4
+ export interface ExtensionStatus {
5
+ text: string;
6
+ tone?: ExtensionTone;
7
+ }
8
+ export type ExtensionPanelSection =
9
+ | { kind: "text"; text: string }
10
+ | { kind: "metrics"; items: Array<{ label: string; value: string }> }
11
+ | { kind: "table"; columns: string[]; rows: string[][] };
12
+ export interface ExtensionPanel {
13
+ title: string;
14
+ sections: ExtensionPanelSection[];
15
+ }
16
+ /** Text is always the headless fallback; panel and status require declarations. */
17
+ export interface ExtensionOutput {
18
+ text: string;
19
+ status?: ExtensionStatus | null;
20
+ panel?: ExtensionPanel;
21
+ }
22
+ export interface ExtensionRuntimeSnapshot {
23
+ workspace: string;
24
+ sessionId: string | null;
25
+ generation: number;
26
+ mode: "interactive" | "headless";
27
+ }
28
+ export interface ExtensionCommandContext {
29
+ readonly snapshot: Readonly<ExtensionRuntimeSnapshot>;
30
+ readonly requestId: string;
31
+ readonly signal: AbortSignal;
32
+ }
33
+ export interface ExtensionObservation {
34
+ event: ExtensionEvent;
35
+ /** No conversation bodies, tool arguments, credentials, or mutable host objects. */
36
+ reason: "startup" | "reload" | "session-change" | "completed";
37
+ }
38
+ export interface ExtensionApi {
39
+ readonly apiVersion: 1;
40
+ handle(
41
+ name: string,
42
+ handler: (args: string, context: ExtensionCommandContext) => ExtensionOutput | Promise<ExtensionOutput>,
43
+ ): void;
44
+ on(
45
+ event: ExtensionEvent,
46
+ handler: (
47
+ event: ExtensionObservation,
48
+ context: ExtensionCommandContext,
49
+ ) => ExtensionOutput | undefined | Promise<ExtensionOutput | undefined>,
50
+ ): void;
51
+ onDispose(handler: (reason: string) => void | Promise<void>): void;
52
+ }
53
+ export type ExtensionFactory = (api: ExtensionApi) => void | Promise<void>;
@@ -0,0 +1,114 @@
1
+ /** Private Node IPC bootstrap. Shipped as ordinary JS: no runtime compiler or dependency install. */
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ const commands = new Map();
5
+ const observers = new Map();
6
+ const disposers = [];
7
+ let identity;
8
+ let snapshot;
9
+ let declaration;
10
+ let registering = false;
11
+ let active = false;
12
+ let request;
13
+ let disposing = false;
14
+
15
+ function send(message) {
16
+ if (process.connected) process.send({ protocol: 1, instance: identity, ...message });
17
+ }
18
+ function register(map, name, handler, allowed) {
19
+ if (!registering || !allowed.includes(name) || map.has(name) || typeof handler !== "function") {
20
+ throw new Error(`undeclared, duplicate, or late registration: ${name}`);
21
+ }
22
+ map.set(name, handler);
23
+ }
24
+ async function dispose(reason) {
25
+ if (disposing) return;
26
+ disposing = true;
27
+ active = false;
28
+ request?.controller.abort();
29
+ await Promise.allSettled(disposers.map((handler) => Promise.resolve().then(() => handler(reason))));
30
+ process.exit(0);
31
+ }
32
+ process.on("disconnect", () => {
33
+ // Parent loss must also stop idle timers, even if a disposer never resolves.
34
+ setTimeout(() => process.exit(1), 250);
35
+ void dispose("parent-disconnected");
36
+ });
37
+ process.on("message", async (message) => {
38
+ try {
39
+ if (message?.protocol !== 1 || typeof message.instance !== "string") throw new Error("invalid host protocol");
40
+ if (message.kind === "init") {
41
+ if (identity) throw new Error("duplicate initialization");
42
+ identity = message.instance;
43
+ snapshot = Object.freeze(message.snapshot);
44
+ declaration = message.declaration;
45
+ registering = true;
46
+ const module = await import(pathToFileURL(message.entrypoint).href);
47
+ if (typeof module.default !== "function") throw new Error("runtime must export a default factory");
48
+ await module.default(
49
+ Object.freeze({
50
+ apiVersion: 1,
51
+ handle: (name, handler) =>
52
+ register(
53
+ commands,
54
+ name,
55
+ handler,
56
+ declaration.commands.map((command) => command.name),
57
+ ),
58
+ on: (event, handler) => register(observers, event, handler, declaration.events),
59
+ onDispose: (handler) => {
60
+ if (!registering || typeof handler !== "function" || disposers.length >= 8)
61
+ throw new Error("invalid or late disposer registration");
62
+ disposers.push(handler);
63
+ },
64
+ }),
65
+ );
66
+ registering = false;
67
+ if (commands.size !== declaration.commands.length || observers.size !== declaration.events.length)
68
+ throw new Error("missing declared runtime handlers");
69
+ send({
70
+ kind: "ready",
71
+ commands: [...commands.keys()],
72
+ events: [...observers.keys()],
73
+ rss: process.memoryUsage().rss,
74
+ });
75
+ return;
76
+ }
77
+ if (message.instance !== identity || disposing) return;
78
+ if (message.kind === "activate") {
79
+ if (registering || !declaration || active) throw new Error("invalid activation");
80
+ active = true;
81
+ send({ kind: "active" });
82
+ return;
83
+ }
84
+ if (message.kind === "dispose") {
85
+ await dispose(message.reason);
86
+ return;
87
+ }
88
+ if (message.kind === "cancel") {
89
+ if (request?.id === message.id) request.controller.abort();
90
+ return;
91
+ }
92
+ if (message.kind !== "command" && message.kind !== "observe") throw new Error("unknown host message");
93
+ if (!active || request) throw new Error("runtime not ready or busy");
94
+ const handler = message.kind === "command" ? commands.get(message.name) : observers.get(message.observation.event);
95
+ if (!handler) throw new Error("handler unavailable");
96
+ const current = { id: message.id, controller: new AbortController() };
97
+ request = current;
98
+ try {
99
+ const output = await handler(
100
+ message.kind === "command" ? message.args : Object.freeze(message.observation),
101
+ Object.freeze({ snapshot, requestId: current.id, signal: current.controller.signal }),
102
+ );
103
+ if (!current.controller.signal.aborted && !disposing)
104
+ send({ kind: "result", id: current.id, output: output ?? { text: "" } });
105
+ } catch (error) {
106
+ send({ kind: "error", id: current.id, error: String(error).slice(0, 512) });
107
+ } finally {
108
+ if (request === current) request = undefined;
109
+ }
110
+ } catch (error) {
111
+ send({ kind: "fatal", error: String(error).slice(0, 512) });
112
+ void dispose("protocol-or-startup-failure");
113
+ }
114
+ });