@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
@@ -1,6 +1,8 @@
1
+ import { BusChannels } from "../core/bus-events.js";
1
2
  import type { WorkerRosters } from "../core/defaults.js";
2
3
  import type { SafeEventBus } from "../core/event-bus.js";
3
4
  import type { AgentSpec } from "../domains/agents/spec.js";
5
+ import type { WorkerContextSnapshot } from "../domains/context/worker/contract.js";
4
6
  import type { DispatchContract } from "../domains/dispatch/contract.js";
5
7
  import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
6
8
  import type { PanesOperations } from "../domains/mux/operations.js";
@@ -12,6 +14,7 @@ import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreT
12
14
  import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
13
15
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
14
16
  import type { DispatchSchemaComposition } from "./dispatch-schema.js";
17
+ import { registerHarnessExtensionTools } from "./harness-extensions.js";
15
18
  import { lazyTool } from "./lazy-tool.js";
16
19
  import { monitorToolSurface } from "./monitor-surface.js";
17
20
  import { panesToolSurface } from "./panes-surface.js";
@@ -21,6 +24,7 @@ import { steerToolSurface } from "./steer-surface.js";
21
24
  export { toolPromptHintsForNames };
22
25
 
23
26
  export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
27
+ captureWorkerContext?: () => WorkerContextSnapshot | null;
24
28
  dispatch?: DispatchContract;
25
29
  bus?: SafeEventBus;
26
30
  getAgentCatalog?: () => string;
@@ -59,6 +63,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
59
63
  const dispatchRunEvents = createDispatchRunEventRegistry({ journal: null });
60
64
  const dispatchToolDeps = {
61
65
  dispatch,
66
+ ...(deps.captureWorkerContext ? { captureWorkerContext: deps.captureWorkerContext } : {}),
62
67
  runEvents: dispatchRunEvents,
63
68
  getAgentSpecs: deps.getAgentSpecs ?? (() => []),
64
69
  ...(deps.bus ? { bus: deps.bus } : {}),
@@ -109,4 +114,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
109
114
  });
110
115
  }
111
116
  assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
117
+ for (const diagnostic of registerHarnessExtensionTools(registry, deps.session?.current()?.cwd ?? process.cwd())) {
118
+ deps.bus?.emit(BusChannels.ExtensionsLoadIssue, { message: diagnostic.message });
119
+ }
112
120
  }
@@ -100,11 +100,16 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
100
100
  "Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
101
101
  },
102
102
  [ToolNames.Context]: {
103
- objective: "Return workspace, bundled-docs, or skill context.",
103
+ objective: "Return workspace, bundled-docs, skill, or library-catalog context.",
104
104
  uiLabel: "Context",
105
105
  retrySafety: "idempotent",
106
106
  resultSizePolicy: observePolicy(
107
- Math.max(OBSERVE_SELF_CAPS.contextDocs, OBSERVE_SELF_CAPS.contextSkills, OBSERVE_SELF_CAPS.contextWorkspace),
107
+ Math.max(
108
+ OBSERVE_SELF_CAPS.contextDocs,
109
+ OBSERVE_SELF_CAPS.contextSkills,
110
+ OBSERVE_SELF_CAPS.contextWorkspace,
111
+ OBSERVE_SELF_CAPS.contextLibrary,
112
+ ),
108
113
  "Use a narrower query or scope to inspect omitted content.",
109
114
  ),
110
115
  costLatency: "local_fast",
@@ -9,6 +9,7 @@ import {
9
9
  SKILL_SUGGESTION_ANCHOR,
10
10
  } from "../../core/skill-activation.js";
11
11
  import { ToolNames } from "../../core/tool-names.js";
12
+ import type { WorkerRecall } from "../../domains/context/worker/recall.js";
12
13
  import { foldWorkingSet } from "../../domains/context/working-set/fold.js";
13
14
  import {
14
15
  buildRecallFields,
@@ -47,7 +48,8 @@ import { contextToolSurface } from "./surface.js";
47
48
  * workspace snapshot, scope=docs retrieves cited sections from Clio's bundled
48
49
  * documentation, scope=skills lists available skills or loads a requested
49
50
  * skill body (the skill-activation and pending-request contracts are
50
- * unchanged from the absorbed read_skill tool), scope=recall readmits an
51
+ * unchanged from the absorbed read_skill tool), scope=library reads the bounded
52
+ * body-free recipe catalog (see ./library.ts), scope=recall readmits an
51
53
  * evicted tool-result body by ref and records the `contextRecall` entry.
52
54
  */
53
55
 
@@ -72,6 +74,8 @@ export interface ContextSessionDeps {
72
74
  }
73
75
 
74
76
  export interface ContextToolDeps {
77
+ /** Run-scoped evidence port; never reads or appends the parent session. */
78
+ workerRecall?: WorkerRecall;
75
79
  getCwd?: () => string;
76
80
  getSkillLoaderOptions?: () => Pick<
77
81
  LoadSkillsInput,
@@ -479,6 +483,15 @@ function runSkillsScope(
479
483
  visible.find((item) => item.name === name) ??
480
484
  list.items.find((item) => item.name === name && operatorRequestedManualSkill(item, pendingRequest));
481
485
  if (!skill) {
486
+ const unavailable = list.items.find((item) => item.name === name);
487
+ if (unavailable) {
488
+ return {
489
+ kind: "error",
490
+ message: unavailable.trusted
491
+ ? `context: skill "${name}" requires explicit operator activation with /skill ${name}; it disables model invocation. Do not retry this load.`
492
+ : `context: skill "${name}" was discovered in an untrusted ${unavailable.source}/${unavailable.scope} source and cannot be activated. Open /library to inspect its source and trust or install a reviewed native package. Do not retry this load.`,
493
+ };
494
+ }
482
495
  // A marketplace entry is a skill that exists and is not installed. Saying
483
496
  // "unknown skill" about it denies the operator a thing the listing just
484
497
  // offered; name the state and the one move that changes it.
@@ -575,6 +588,26 @@ function runRecallScope(
575
588
  reservation: ObservationReservation,
576
589
  options: ToolInvokeOptions | undefined,
577
590
  ): ToolResult {
591
+ if (deps.workerRecall) {
592
+ const result = deps.workerRecall(args);
593
+ if ("error" in result) return { kind: "error", message: `context: ${result.error}` };
594
+ const truncated = truncateHead(result.body, {
595
+ maxBytes: reservation.callCapBytes,
596
+ maxLines: Number.MAX_SAFE_INTEGER,
597
+ });
598
+ return finalizeObservation({
599
+ tool: ToolNames.Context,
600
+ unit: "results",
601
+ output: truncated.content,
602
+ ...(truncated.truncated ? { fullOutput: result.body } : {}),
603
+ shownCount: result.shown,
604
+ totalCount: result.total,
605
+ truncated: truncated.truncated || result.nextOffset !== undefined,
606
+ details: { workerRecall: { ref: args.ref ?? null, nextOffset: result.nextOffset ?? null } },
607
+ reservation,
608
+ ...(options ? { options } : {}),
609
+ });
610
+ }
578
611
  const session = deps.session;
579
612
  if (!session?.hasSession()) {
580
613
  return { kind: "error", message: "context: recall scope requires a bound session; none is active here" };
@@ -665,20 +698,27 @@ export function createContextTool(deps: ContextToolDeps = {}): ToolSpec {
665
698
  ...contextToolSurface,
666
699
  async run(args, options): Promise<ToolResult> {
667
700
  const scope = typeof args.scope === "string" ? args.scope : "";
668
- if (scope !== "workspace" && scope !== "docs" && scope !== "skills" && scope !== "recall") {
669
- return { kind: "error", message: `context: scope must be workspace, docs, skills, or recall; got '${scope}'` };
701
+ if (scope !== "workspace" && scope !== "docs" && scope !== "skills" && scope !== "library" && scope !== "recall") {
702
+ return {
703
+ kind: "error",
704
+ message: `context: scope must be workspace, docs, skills, library, or recall; got '${scope}'`,
705
+ };
670
706
  }
671
707
  const selfCap =
672
708
  scope === "docs"
673
709
  ? OBSERVE_SELF_CAPS.contextDocs
674
710
  : scope === "skills"
675
711
  ? OBSERVE_SELF_CAPS.contextSkills
676
- : OBSERVE_SELF_CAPS.contextWorkspace;
712
+ : scope === "library"
713
+ ? OBSERVE_SELF_CAPS.contextLibrary
714
+ : OBSERVE_SELF_CAPS.contextWorkspace;
715
+ // Reserved before any scope handler runs, so an exhausted pool answers
716
+ // with the notice and the library inventory is never walked at all.
677
717
  const reservation = reserveObservation(selfCap, options);
678
718
  if (reservation.exhausted) {
679
719
  return observationBudgetExhausted({
680
720
  tool: ToolNames.Context,
681
- unit: scope === "docs" ? "sections" : scope === "skills" ? "entries" : "results",
721
+ unit: scope === "docs" ? "sections" : scope === "skills" || scope === "library" ? "entries" : "results",
682
722
  reservation,
683
723
  subject: `scope=${scope}`,
684
724
  hint: "Continue in a follow-up turn.",
@@ -687,6 +727,19 @@ export function createContextTool(deps: ContextToolDeps = {}): ToolSpec {
687
727
  if (scope === "workspace") return runWorkspaceScope(deps, reservation, options);
688
728
  if (scope === "docs") return runDocsScope(args, reservation, options);
689
729
  if (scope === "recall") return runRecallScope(deps, args, reservation, options);
730
+ if (scope === "library") {
731
+ const { runLibraryScope } = await import("./library.js");
732
+ return runLibraryScope(
733
+ {
734
+ getCwd: () => cwdFromDeps(deps),
735
+ ...(deps.skillMarketplace !== undefined ? { skillMarketplace: deps.skillMarketplace } : {}),
736
+ ...(deps.getSkillLoaderOptions ? { skillLoaderOptions: deps.getSkillLoaderOptions() } : {}),
737
+ },
738
+ args,
739
+ reservation,
740
+ options,
741
+ );
742
+ }
690
743
  return runSkillsScope(deps, args, reservation, options);
691
744
  },
692
745
  };
@@ -0,0 +1,465 @@
1
+ import { ToolNames } from "../../core/tool-names.js";
2
+ import type {
3
+ LibraryInventory,
4
+ LibraryInventoryOptions,
5
+ LibraryOrigin,
6
+ LibraryPackageRecord,
7
+ LibraryResource,
8
+ } from "../../domains/resources/library-inventory.js";
9
+ import { finalizeObservation, type ObservationReservation } from "../observation.js";
10
+ import type { ToolInvokeOptions, ToolResult } from "../registry.js";
11
+ import { byteLength } from "../truncate-utf8.js";
12
+
13
+ /**
14
+ * scope=library: one bounded, body-free READ over the shared recipe inventory.
15
+ *
16
+ * It answers what recipes exist, who owns them, how they are actually invoked,
17
+ * and what an uninstalled package would provide. It activates, registers,
18
+ * installs and pins nothing, and it never returns an instruction body. Skill
19
+ * activation stays entirely under scope=skills.
20
+ *
21
+ * Three row types, never conflated. A `resource` is a recipe that loaded and is
22
+ * usable now. A `hint` is a catalog claim about a member of a package: it names
23
+ * its installable owner and that member's honest status, and it never carries
24
+ * an invocation, because nothing has loaded it. A `package` is the install
25
+ * target itself.
26
+ *
27
+ * The inventory module is reached by dynamic import so scope=workspace,
28
+ * scope=docs and scope=skills never pay for agent, prompt and fleet discovery.
29
+ * Only the types cross statically, and those are erased.
30
+ */
31
+
32
+ const DEFAULT_LIMIT = 20;
33
+ const MAX_LIMIT = 50;
34
+ /** Hint names listed on one package row before it reports a remainder instead. */
35
+ const MAX_PROVIDES = 12;
36
+ const MAX_DESCRIPTION = 160;
37
+ const MAX_REASON = 200;
38
+ const MAX_DIAGNOSTICS = 3;
39
+ const MAX_DIAGNOSTIC = 160;
40
+ const MAX_ORIGIN_VALUE = 240;
41
+ const MAX_REQUIRES = 8;
42
+ const MAX_INVOCATION = 200;
43
+ /** How much of an echoed argument comes back in the payload header. */
44
+ const MAX_ECHO = 120;
45
+
46
+ export type LibraryRowKind = "skill" | "agent" | "prompt" | "fleet" | "plugin";
47
+
48
+ export interface LibraryScopeDeps {
49
+ getCwd(): string;
50
+ /**
51
+ * False on every native worker registry. A worker has skill discovery
52
+ * disabled and no admitted library projection of its own, so this read
53
+ * refuses there rather than handing it the global library through a new
54
+ * endpoint. Read-only is not an argument for exposure.
55
+ */
56
+ skillMarketplace?: boolean;
57
+ /** The run's skill-loader posture; `--no-skills` and compat-root trust both apply here. */
58
+ skillLoaderOptions?: { trustProjectCompatRoots?: boolean; disableDiscovery?: boolean };
59
+ }
60
+
61
+ const WORKER_UNAVAILABLE =
62
+ 'context: scope="library" is unavailable in this run; a worker has no library projection of its own and cannot install or activate anything. ' +
63
+ "Work from the resources your assignment already bound, and record the gap with the limitation tool if it blocks the task.";
64
+
65
+ const OPERATOR_NOTE =
66
+ "Read-only catalog: you cannot install or activate from here. Suggest /library to the operator for packages and /skill <name> for a skill. A hint row is a catalog claim, not a loaded recipe, and cannot be invoked.";
67
+ const NOTE_SKILLS_OFF = "Skill discovery is off for this run, so no skill rows are listed.";
68
+ const NOTE_INVENTORY_CAPPED =
69
+ "The inventory returned as many records as it carries, so this listing and its install evidence are incomplete; narrow with kind or query.";
70
+ const NOTE_AMBIGUOUS_REF = "This ref matched several records; select one by the key on its row.";
71
+ const NOTE_NO_MATCH = "Nothing matched; drop ref or query to list the catalog.";
72
+ const NOTE_NO_BUDGET = "The remaining observation budget cannot carry a row this turn; continue in a follow-up turn.";
73
+ /** Every clause at once, for measuring the envelope a page must fit inside. */
74
+ const ALL_NOTE_CLAUSES = [
75
+ OPERATOR_NOTE,
76
+ NOTE_SKILLS_OFF,
77
+ NOTE_INVENTORY_CAPPED,
78
+ NOTE_AMBIGUOUS_REF,
79
+ NOTE_NO_MATCH,
80
+ NOTE_NO_BUDGET,
81
+ ].join(" ");
82
+
83
+ function clampLimit(value: unknown): number {
84
+ if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_LIMIT;
85
+ return Math.max(1, Math.min(MAX_LIMIT, Math.floor(value)));
86
+ }
87
+
88
+ function clampOffset(value: unknown): number {
89
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return 0;
90
+ return Math.floor(value);
91
+ }
92
+
93
+ function bound(value: string, max: number): string {
94
+ return value.length <= max ? value : `${value.slice(0, max - 1)}…`;
95
+ }
96
+
97
+ function boundDiagnostics(diagnostics: ReadonlyArray<string>): string[] {
98
+ return diagnostics.slice(0, MAX_DIAGNOSTICS).map((entry) => bound(entry, MAX_DIAGNOSTIC));
99
+ }
100
+
101
+ /**
102
+ * Origin is mandatory evidence, so it is passed through rather than summarized:
103
+ * source class, URL, catalog, original agent, original path and marketplace all
104
+ * stay distinct fields. Only the individual string values are bounded, because
105
+ * a pathological path must not be able to spend the whole page budget.
106
+ */
107
+ function boundOrigin(origin: LibraryOrigin): Record<string, unknown> {
108
+ const out: Record<string, unknown> = {};
109
+ for (const [key, value] of Object.entries(origin)) {
110
+ out[key] = typeof value === "string" ? bound(value, MAX_ORIGIN_VALUE) : value;
111
+ }
112
+ return out;
113
+ }
114
+
115
+ /**
116
+ * Resource rows keep the origin evidence and the actual runtime name, and drop
117
+ * the absolute path: the model's move on a recipe is to invoke it or suggest
118
+ * it, never to open its file, and a body-free projection should not hand out
119
+ * the one field that routes around itself.
120
+ *
121
+ * `audience: "model"` already drops untrusted, invalid, shadowed, unavailable
122
+ * and manual-only rows, so availability, reason and diagnostics are emitted
123
+ * only if one ever survives that filter. They cost nothing when it does not,
124
+ * and a silently mislabelled row is worse than a redundant field.
125
+ */
126
+ function projectResource(resource: LibraryResource, ambiguous: boolean): Record<string, unknown> {
127
+ return {
128
+ row: "resource",
129
+ kind: resource.kind,
130
+ name: resource.name,
131
+ // The stable inventory key is what disambiguates two same-named
132
+ // resources from different owners; it is spent only when there are two.
133
+ ...(ambiguous ? { key: resource.key } : {}),
134
+ description: bound(resource.description, MAX_DESCRIPTION),
135
+ owner: resource.owner ? resource.owner.ref : resource.source.class,
136
+ scope: resource.source.scope,
137
+ origin: boundOrigin(resource.origin),
138
+ ...(resource.format !== undefined ? { format: resource.format } : {}),
139
+ ...(resource.availability !== "available" ? { availability: resource.availability } : {}),
140
+ ...(resource.reason !== undefined ? { reason: bound(resource.reason, MAX_REASON) } : {}),
141
+ ...(resource.invocation !== undefined ? { invocation: bound(resource.invocation, MAX_INVOCATION) } : {}),
142
+ ...(resource.diagnostics.length > 0 ? { diagnostics: boundDiagnostics(resource.diagnostics) } : {}),
143
+ };
144
+ }
145
+
146
+ /**
147
+ * The identity of a record whose full projection does not fit the remaining
148
+ * budget. A page that could carry nothing would otherwise be replaced whole by
149
+ * the envelope's JSON stub, which tells the caller less than the name of the
150
+ * thing it could not show.
151
+ */
152
+ function identityOnly(row: Record<string, unknown>): Record<string, unknown> {
153
+ return {
154
+ row: row.row,
155
+ kind: row.kind,
156
+ name: row.name,
157
+ ...(row.key !== undefined ? { key: row.key } : {}),
158
+ ...(row.ref !== undefined ? { ref: row.ref } : {}),
159
+ ...(row.owner !== undefined ? { owner: row.owner } : {}),
160
+ truncatedRecord: true,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * A hint row is a catalog claim about one member of a package. It never has an
166
+ * invocation: nothing loaded it, and a hint that looked invocable would be an
167
+ * invitation to call something that does not exist.
168
+ *
169
+ * `member` is the honest state of that member here. When the owning package is
170
+ * not installed, the member is not installed either. When the package *is*
171
+ * installed and the member did not turn up as an actual resource, this read
172
+ * cannot tell whether it is absent, untrusted, or filtered from the model's
173
+ * view, so it says `unknown` and reports the owner's real copy states rather
174
+ * than claiming the member is merely uninstalled.
175
+ *
176
+ * `copiesCapped` collapses that first case into the second. When the inventory
177
+ * truncated its copy list, an empty `owner.copies` is no longer evidence that
178
+ * nothing is installed, only that this read did not see it, and calling that
179
+ * `not-installed` would invent a fact.
180
+ */
181
+ function projectHint(
182
+ kind: string,
183
+ name: string,
184
+ description: string | undefined,
185
+ owner: LibraryPackageRecord,
186
+ copiesCapped: boolean,
187
+ ): Record<string, unknown> {
188
+ const installed = owner.copies.map((copy) => ({ scope: copy.scope, state: copy.state }));
189
+ return {
190
+ row: "hint",
191
+ kind,
192
+ name,
193
+ ...(description !== undefined ? { description: bound(description, MAX_DESCRIPTION) } : {}),
194
+ owner: owner.ref,
195
+ ownerInstalled: installed,
196
+ member: installed.length === 0 && !copiesCapped ? "not-installed" : "unknown",
197
+ origin: boundOrigin(owner.origin),
198
+ ...(owner.format !== undefined ? { format: owner.format } : {}),
199
+ };
200
+ }
201
+
202
+ /**
203
+ * Package rows are install targets. `provides` is a bounded hint list generated
204
+ * from validated payloads: it names what the package would contribute, never
205
+ * proves the package is usable, and never triggers a fetch. A row with no hints
206
+ * says so honestly instead of claiming empty contents.
207
+ */
208
+ function projectPackage(record: LibraryPackageRecord, copiesCapped: boolean): Record<string, unknown> {
209
+ const provides = record.provides ?? [];
210
+ const shownProvides = provides.slice(0, MAX_PROVIDES);
211
+ const installed = record.copies.map((copy) => ({ scope: copy.scope, state: copy.state }));
212
+ return {
213
+ row: "package",
214
+ kind: record.kind,
215
+ name: record.name,
216
+ ref: record.ref,
217
+ description: bound(record.description, MAX_DESCRIPTION),
218
+ ...(record.version !== undefined ? { version: record.version } : {}),
219
+ origin: boundOrigin(record.origin),
220
+ ...(record.format !== undefined ? { format: record.format } : {}),
221
+ installed,
222
+ // An empty list under a capped copy read is silence, not absence.
223
+ ...(installed.length === 0 && copiesCapped ? { installedUnknown: true } : {}),
224
+ ...(record.provides === undefined
225
+ ? { provides: "unknown until inspection" }
226
+ : {
227
+ provides: shownProvides.map((hint) => `${hint.kind}:${hint.name}`),
228
+ ...(provides.length > shownProvides.length ? { providesOmitted: provides.length - shownProvides.length } : {}),
229
+ }),
230
+ ...(record.requires !== undefined
231
+ ? {
232
+ requires: record.requires.slice(0, MAX_REQUIRES),
233
+ ...(record.requires.length > MAX_REQUIRES ? { requiresOmitted: record.requires.length - MAX_REQUIRES } : {}),
234
+ }
235
+ : {}),
236
+ ...(record.refusal !== undefined ? { refusal: bound(record.refusal, MAX_REASON) } : {}),
237
+ };
238
+ }
239
+
240
+ /**
241
+ * `limit` is an upper bound on rows; the byte cap is the real one. A page that
242
+ * overruns the reservation is replaced wholesale by the envelope's JSON stub,
243
+ * which costs the caller a round trip and returns nothing readable, so the page
244
+ * is cut here instead and the remainder is offered as the next offset. The
245
+ * budget is the reservation's, so a partly spent turn pool narrows the page
246
+ * rather than voiding it.
247
+ *
248
+ * `envelopeBytes` is measured, not assumed: the header echoes, the note and the
249
+ * inventory diagnostics all vary, and a fixed reserve that four diagnostics can
250
+ * exceed is how a bounded page turns back into a stub.
251
+ */
252
+ function fitPage(
253
+ candidate: ReadonlyArray<Record<string, unknown>>,
254
+ capBytes: number,
255
+ envelopeBytes: number,
256
+ ): Record<string, unknown>[] {
257
+ const budget = capBytes - envelopeBytes;
258
+ let used = 0;
259
+ const page: Record<string, unknown>[] = [];
260
+ for (const row of candidate) {
261
+ const cost = byteLength(JSON.stringify(row)) + 1;
262
+ if (used + cost <= budget) {
263
+ used += cost;
264
+ page.push(row);
265
+ continue;
266
+ }
267
+ // Nothing has fitted yet and this record is too large on its own: return
268
+ // its identity so the caller learns what is there and can ask for it by
269
+ // ref, instead of getting a stub that names nothing.
270
+ if (page.length === 0) {
271
+ const identity = identityOnly(row);
272
+ if (byteLength(JSON.stringify(identity)) + 1 <= budget) page.push(identity);
273
+ }
274
+ break;
275
+ }
276
+ return page;
277
+ }
278
+
279
+ /** Same kind and name from two different sources: the row must carry its key. */
280
+ function ambiguousNames(resources: ReadonlyArray<LibraryResource>): Set<string> {
281
+ const seen = new Map<string, number>();
282
+ for (const resource of resources) {
283
+ const id = `${resource.kind}:${resource.name}`;
284
+ seen.set(id, (seen.get(id) ?? 0) + 1);
285
+ }
286
+ return new Set([...seen].filter(([, count]) => count > 1).map(([id]) => id));
287
+ }
288
+
289
+ /**
290
+ * Which hints a `ref` admits.
291
+ *
292
+ * An exact resource key identifies one loaded resource, so it admits no hints
293
+ * at all: a package's other members are not what was asked for. A package ref
294
+ * deliberately opens that package, so it admits every member of it. A bare
295
+ * runtime name admits only the hints of that name, wherever they are owned; it
296
+ * must not pull in an owner's unrelated siblings just because the owner matched.
297
+ */
298
+ function hintSelection(
299
+ ref: string,
300
+ inventory: LibraryInventory,
301
+ ): { mode: "all" } | { mode: "none" } | { mode: "owner"; ref: string } | { mode: "name"; name: string } {
302
+ if (ref.length === 0) return { mode: "all" };
303
+ if (ref.includes("@")) return { mode: "none" };
304
+ const owner = inventory.packages.find((record) => record.ref === ref);
305
+ if (owner) return { mode: "owner", ref: owner.ref };
306
+ const colon = ref.indexOf(":");
307
+ return { mode: "name", name: colon >= 0 ? ref.slice(colon + 1) : ref };
308
+ }
309
+
310
+ function hintRows(
311
+ inventory: LibraryInventory,
312
+ resources: ReadonlyArray<LibraryResource>,
313
+ kind: LibraryRowKind | undefined,
314
+ query: string,
315
+ ref: string,
316
+ copiesCapped: boolean,
317
+ ): Record<string, unknown>[] {
318
+ if (kind === "plugin") return [];
319
+ const selection = hintSelection(ref, inventory);
320
+ if (selection.mode === "none") return [];
321
+ // A hint whose actual resource is already on the page is noise: the loaded
322
+ // row is strictly better evidence about the same member.
323
+ const actual = new Set(
324
+ resources
325
+ .filter((resource) => resource.owner)
326
+ .map((resource) => `${resource.owner?.ref}|${resource.kind}|${resource.name}`),
327
+ );
328
+ const needle = query.toLowerCase();
329
+ const rows: Record<string, unknown>[] = [];
330
+ for (const record of inventory.packages) {
331
+ if (selection.mode === "owner" && record.ref !== selection.ref) continue;
332
+ for (const hint of record.provides ?? []) {
333
+ if (kind !== undefined && hint.kind !== kind) continue;
334
+ if (selection.mode === "name" && hint.name !== selection.name) continue;
335
+ if (actual.has(`${record.ref}|${hint.kind}|${hint.name}`)) continue;
336
+ if (needle.length > 0 && !`${hint.kind}:${hint.name} ${hint.description ?? ""}`.toLowerCase().includes(needle))
337
+ continue;
338
+ rows.push(projectHint(hint.kind, hint.name, hint.description, record, copiesCapped));
339
+ }
340
+ }
341
+ return rows;
342
+ }
343
+
344
+ export async function runLibraryScope(
345
+ deps: LibraryScopeDeps,
346
+ args: Record<string, unknown>,
347
+ reservation: ObservationReservation,
348
+ options: ToolInvokeOptions | undefined,
349
+ ): Promise<ToolResult> {
350
+ if (deps.skillMarketplace === false) {
351
+ return { kind: "error", message: WORKER_UNAVAILABLE };
352
+ }
353
+ const kind = typeof args.kind === "string" ? (args.kind as LibraryRowKind) : undefined;
354
+ const query = typeof args.query === "string" ? args.query.trim() : "";
355
+ const ref = typeof args.ref === "string" ? args.ref.trim() : "";
356
+ const limit = clampLimit(args.limit);
357
+ const offset = clampOffset(args.offset);
358
+ // `--no-skills` is an explicit operator choice for this run. Listing skills
359
+ // as invocable afterwards would be a lie: nothing in this process can load
360
+ // one. Packages that provide skills stay visible; that is catalog metadata,
361
+ // not discovery.
362
+ const skillsDisabled = deps.skillLoaderOptions?.disableDiscovery === true;
363
+ // Packages are read at every kind: `kind=plugin` keeps its documented
364
+ // meaning (packages whose own kind is plugin) and a recipe kind still finds
365
+ // the installable owners that provide it.
366
+ const wantsResources = kind !== "plugin" && !(kind === "skill" && skillsDisabled);
367
+
368
+ let inventory: LibraryInventory;
369
+ try {
370
+ inventory = await loadInventory({
371
+ cwd: deps.getCwd(),
372
+ audience: "model",
373
+ include: { packages: true, copies: false, resources: wantsResources },
374
+ ...(kind !== undefined ? { kinds: [kind] } : {}),
375
+ ...(query.length > 0 ? { query } : {}),
376
+ ...(ref.length > 0 ? { ref } : {}),
377
+ ...(deps.skillLoaderOptions?.trustProjectCompatRoots !== undefined
378
+ ? { trustProjectCompatRoots: deps.skillLoaderOptions.trustProjectCompatRoots }
379
+ : {}),
380
+ });
381
+ } catch (err) {
382
+ return {
383
+ kind: "error",
384
+ message: `context: library inventory unavailable: ${err instanceof Error ? err.message : String(err)}`,
385
+ };
386
+ }
387
+
388
+ const resources = wantsResources
389
+ ? inventory.resources.filter((resource) => !(skillsDisabled && resource.kind === "skill"))
390
+ : [];
391
+ const ambiguous = ambiguousNames(resources);
392
+ // Usable now, then what a package claims it would add, then the install
393
+ // targets themselves. Each half arrives in the inventory's deterministic
394
+ // order, so the concatenation is a stable total order and paging it cannot
395
+ // repeat or skip a row between calls.
396
+ // Copies are reported as truncated even when this read did not ask for them,
397
+ // because they are the owner and install evidence behind package and hint
398
+ // rows: a capped copy list means those rows are incomplete too.
399
+ const copiesCapped = inventory.truncated.copies;
400
+ const rows: Record<string, unknown>[] = [
401
+ ...resources.map((resource) => projectResource(resource, ambiguous.has(`${resource.kind}:${resource.name}`))),
402
+ ...hintRows(inventory, resources, kind, query, ref, copiesCapped),
403
+ ...inventory.packages.map((record) => projectPackage(record, copiesCapped)),
404
+ ];
405
+ const total = rows.length;
406
+ // The inventory caps how many records it returns. When it did, `total` counts
407
+ // what came back rather than what exists, and the payload says so instead of
408
+ // implying the collection ends here.
409
+ const inventoryCapped = inventory.truncated.resources || inventory.truncated.packages || copiesCapped;
410
+ const diagnostics = boundDiagnostics(inventory.diagnostics);
411
+
412
+ const header = {
413
+ scope: "library",
414
+ ...(kind !== undefined ? { kind } : {}),
415
+ ...(query.length > 0 ? { query: bound(query, MAX_ECHO) } : {}),
416
+ ...(ref.length > 0 ? { ref: bound(ref, MAX_ECHO) } : {}),
417
+ total,
418
+ ...(inventoryCapped ? { totalIsLowerBound: true } : {}),
419
+ offset,
420
+ ...(diagnostics.length > 0 ? { diagnostics } : {}),
421
+ };
422
+ // Measure the envelope with every optional clause present, so the page that
423
+ // fits inside it still fits once the real, shorter note is written.
424
+ const envelopeBytes = byteLength(
425
+ JSON.stringify({ ...header, shown: total, nextOffset: total, rows: [], note: ALL_NOTE_CLAUSES }),
426
+ );
427
+ const page = fitPage(rows.slice(offset, offset + limit), reservation.callCapBytes, envelopeBytes);
428
+ // A page that carried nothing must not hand back an offset equal to the one
429
+ // it was given: that is a loop, not a continuation.
430
+ const exhaustedPage = page.length === 0 && total > offset;
431
+ const nextOffset = !exhaustedPage && offset + page.length < total ? offset + page.length : undefined;
432
+
433
+ const payload = {
434
+ ...header,
435
+ shown: page.length,
436
+ ...(nextOffset !== undefined ? { nextOffset } : {}),
437
+ rows: page,
438
+ note: [
439
+ OPERATOR_NOTE,
440
+ ...(skillsDisabled ? [NOTE_SKILLS_OFF] : []),
441
+ ...(inventoryCapped ? [NOTE_INVENTORY_CAPPED] : []),
442
+ ...(ref.length > 0 && total > 1 ? [NOTE_AMBIGUOUS_REF] : []),
443
+ ...(total === 0 && (ref.length > 0 || query.length > 0) ? [NOTE_NO_MATCH] : []),
444
+ ...(exhaustedPage ? [NOTE_NO_BUDGET] : []),
445
+ ].join(" "),
446
+ };
447
+
448
+ return finalizeObservation({
449
+ tool: ToolNames.Context,
450
+ unit: "entries",
451
+ format: "json",
452
+ output: JSON.stringify(payload),
453
+ shownCount: page.length,
454
+ totalCount: total,
455
+ truncated: nextOffset !== undefined || inventoryCapped || exhaustedPage,
456
+ ...(nextOffset !== undefined ? { next: `offset=${nextOffset}` } : {}),
457
+ reservation,
458
+ ...(options ? { options } : {}),
459
+ });
460
+ }
461
+
462
+ async function loadInventory(options: LibraryInventoryOptions): Promise<LibraryInventory> {
463
+ const { readLibraryInventory } = await import("../../domains/resources/library-inventory.js");
464
+ return readLibraryInventory(options);
465
+ }