@iowarp/clio-coder 0.3.8 → 0.4.0

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 (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -0,0 +1,35 @@
1
+ import { printError } from "./shared.js";
2
+ import { runToolsCommand } from "./tools.js";
3
+
4
+ const HELP = `clio-coder panes install [--force] [--json]
5
+
6
+ Install the pane multiplexer Clio drives. This is an alias for
7
+ \`clio-coder tools install herdr\`; the toolchain command is where every pinned
8
+ external program is managed, and \`clio-coder tools status herdr\` explains
9
+ which copy Clio would run.
10
+ `;
11
+
12
+ /**
13
+ * The user-facing verb for the pane layer's one setup step.
14
+ *
15
+ * Panes are the feature; herdr is the program behind it. Naming the program in
16
+ * a command an operator types is a leak, so the alias exists and routes to the
17
+ * generic installer rather than the reverse.
18
+ */
19
+ export async function runPanesCommand(argv: ReadonlyArray<string> = []): Promise<number> {
20
+ if (argv.includes("--help") || argv.includes("-h")) {
21
+ process.stdout.write(HELP);
22
+ return 0;
23
+ }
24
+ const [subcommand, ...rest] = argv;
25
+ if (subcommand === undefined) {
26
+ process.stdout.write(HELP);
27
+ return 2;
28
+ }
29
+ if (subcommand !== "install") {
30
+ printError(`unknown panes command: ${subcommand}`);
31
+ process.stderr.write(HELP);
32
+ return 2;
33
+ }
34
+ return runToolsCommand(["install", "herdr", ...rest]);
35
+ }
package/src/cli/reset.ts CHANGED
@@ -15,7 +15,7 @@ Each level clears exactly the root (or file) it names and nothing else.
15
15
  Levels (combinable except --all):
16
16
  --state state root only (default). Holds every session transcript, so a
17
17
  reset is the end of resume, /view, and the audit behind them.
18
- --data data root only: memory, evidence, evals (durable products)
18
+ --data data root only: memory, evidence, evals, vendored tools (durable products)
19
19
  --cache cache root only
20
20
  --auth credentials.yaml only
21
21
  --config settings.yaml only
@@ -42,7 +42,10 @@ Safety:
42
42
  const ROOT_NOTES: Readonly<Record<string, string>> = {
43
43
  state:
44
44
  "the state root holds every session transcript and the audit trail beside it; resume and /view lose their history",
45
- data: "the data root holds durable products (memory, evidence, evals)",
45
+ // Vendored tools are named because they are the one durable product a reset
46
+ // cannot regenerate from anything local: getting them back is a download.
47
+ data:
48
+ "the data root holds durable products (memory, evidence, evals, and any vendored external tools, which a reinstall re-downloads)",
46
49
  };
47
50
 
48
51
  interface ParsedResetArgs {
package/src/cli/run.ts CHANGED
@@ -11,6 +11,7 @@ import { createContextDomainModule } from "../domains/context/runtime.js";
11
11
  import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
12
12
  import { agentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
13
13
  import { createDispatchDomainModule } from "../domains/dispatch/index.js";
14
+ import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
14
15
  import type { RunReceipt } from "../domains/dispatch/types.js";
15
16
  import { ensureClioState, LifecycleDomainModule } from "../domains/lifecycle/index.js";
16
17
  import {
@@ -158,6 +159,45 @@ export function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): stri
158
159
  return errors;
159
160
  }
160
161
 
162
+ /**
163
+ * The TUI's verdict for a command-shaped token the registry does not own,
164
+ * applied to a headless task. Returns the refusal message, or null when the
165
+ * task is not an unknown command.
166
+ *
167
+ * `parseSlashCommand` is the canonical shape test and the canonical registry
168
+ * walk, so a token that is one word of letters, digits, hyphens, or colons and
169
+ * names no command lands here exactly as it does in the editor. Prose keeps
170
+ * reaching the model: an absolute path such as `/home/user/notes` carries a
171
+ * separator and is not one word, and `\/tmp is full` is the same escape the
172
+ * editor honors.
173
+ *
174
+ * A prompt template claims the token before the refusal does. Only membership
175
+ * is checked, not expansion: a template that exists but refuses (an untrusted
176
+ * project root, an unreadable body) has its own message, which the headless
177
+ * boot path already prints from the expansion itself. Deciding that here would
178
+ * duplicate the trust rules and put two refusals on one token.
179
+ *
180
+ * Both modules are imported lazily, so a task that does not start with a slash
181
+ * pays for neither. The laziness is a startup-cost choice and nothing more: for
182
+ * bundle partitioning a dynamic import is worse than a static one, because a
183
+ * dynamically imported module becomes a chunk split point by itself. What keeps
184
+ * this edge safe is the other end. `slash-commands.ts` is a declared CLI seam
185
+ * whose own imports stay off the interactive render graph, so reaching it does
186
+ * not make this file a second reacher of the chunk the instant shell's Stage 0
187
+ * closure sits on. Boundaries rule6 in `tests/boundaries/check-boundaries.ts`
188
+ * holds both halves of that.
189
+ */
190
+ export async function unknownSlashCommandRefusal(task: string): Promise<string | null> {
191
+ if (!task.trim().startsWith("/")) return null;
192
+ const { parseSlashCommand } = await import("../interactive/slash-commands.js");
193
+ const command = parseSlashCommand(task);
194
+ if (command.kind !== "unknown-command") return null;
195
+ const { loadPromptTemplates } = await import("../domains/resources/index.js");
196
+ const templates = loadPromptTemplates({ cwd: process.cwd() });
197
+ if (templates.items.some((template) => template.name === command.token)) return null;
198
+ return `/${command.token} is not a command. Type /help for the list.`;
199
+ }
200
+
161
201
  export async function runClioRun(
162
202
  args: ReadonlyArray<string>,
163
203
  options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
@@ -218,6 +258,15 @@ export async function runClioRun(
218
258
  if (!assembled) return 2;
219
259
 
220
260
  if (parsed.agentId === undefined) {
261
+ // A mistyped slash command is a usage error, not a task. Refusing it
262
+ // here keeps it from booting a session and spending a model turn on a
263
+ // command that was never run, which is what the TUI has always done
264
+ // and what docs/extensions-and-sharing.md documents for both surfaces.
265
+ const slashRefusal = await unknownSlashCommandRefusal(assembled.prompt);
266
+ if (slashRefusal !== null) {
267
+ process.stderr.write(`clio-coder run: ${slashRefusal}\n`);
268
+ return 2;
269
+ }
221
270
  // An explicit --target override is a one-run target; a missing id is an
222
271
  // operator config error, not an assistant response. Reject it before the
223
272
  // headless turn so the resolver diagnostic never streams to stdout as a
@@ -314,11 +363,20 @@ async function runDispatch(
314
363
  createDispatchDomainModule({
315
364
  getSettings: () => effectiveSettings,
316
365
  autonomyOverride: parsed.autonomy !== undefined,
366
+ // This path iterates `handle.events` itself and builds no dispatch
367
+ // event registry, so the domain is the only thing that can write the
368
+ // run's durable transcript.
369
+ journalRunEvents: true,
317
370
  }),
318
371
  LifecycleDomainModule,
319
372
  ]);
320
373
  const config = loaded.getContract<ConfigContract>("config");
321
374
  const baseSettings = config?.get() ?? readSettings();
375
+ // Install `panes.journal` the same way the interactive composition root
376
+ // does. The journal never reads settings.yaml itself: it sits on the
377
+ // dispatch event path, where a settings read would be both a cost and a
378
+ // throw site.
379
+ configureRunEventJournal(baseSettings.panes.journal);
322
380
  effectiveSettings =
323
381
  parsed.autonomy === undefined ? baseSettings : { ...structuredClone(baseSettings), autonomy: parsed.autonomy };
324
382
  const dispatch = loaded.getContract<DispatchContract>("dispatch");
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Fixed machine-readable projection of this installation's installed skills.
3
+ *
4
+ * `skills list --json` already emits a machine-readable listing, and a GUI host
5
+ * reading it gets two things wrong. Without `--all` it sees only the skills the
6
+ * model may load, which is `trusted && !disableModelInvocation`, so a surface
7
+ * rendering trust and invocability off that payload prints "trusted" and
8
+ * "allowed" on every row and structurally cannot print anything else. And the
9
+ * rows it does get are the full loaded records, carrying the SKILL.md body, the
10
+ * file path, the base directory, and two content hashes, so every consumer has
11
+ * to re-derive the same redaction.
12
+ *
13
+ * This command answers both. It loads once, reports every installed skill
14
+ * whether or not the model can reach it, says which ones it can, and carries
15
+ * only fields that are safe by construction. It is a separate subcommand rather
16
+ * than a flag on `skills inspect`, because that one names a skill and a fixed
17
+ * read a host may run must take no identifier at all.
18
+ *
19
+ * Held back deliberately: the skill body, its file path, its base directory,
20
+ * both hashes, the install and registry URLs, and the free-text loader
21
+ * diagnostics. Whether a skill has an upstream to update from crosses; where
22
+ * that upstream is does not.
23
+ *
24
+ * Marketplace discovery is deliberately not here. `library list --json` already
25
+ * folds `discoverMarketplaceSkills` into its catalog, so every installable
26
+ * skill already crosses through that read, and a second one would report the
27
+ * same rows under a different name.
28
+ */
29
+
30
+ import {
31
+ loadSkills,
32
+ type ResourceDiagnostic,
33
+ type Skill,
34
+ type SkillCatalogInvalidReason,
35
+ skillCatalogValidity,
36
+ } from "../domains/resources/index.js";
37
+
38
+ /** Wire bound on the emitted skill list. */
39
+ const MAX_SKILLS_INVENTORY_SKILLS = 64;
40
+ /** Wire bound on each skill's declared tool policy. */
41
+ const MAX_SKILLS_INVENTORY_TOOLS = 32;
42
+
43
+ const TOOL_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
44
+
45
+ type SkillAuditState = "pass" | "warn" | "fail" | "unknown" | "not-reported";
46
+
47
+ interface SkillsInventoryDiagnosticCounts {
48
+ readonly errors: number;
49
+ readonly warnings: number;
50
+ readonly collisions: number;
51
+ }
52
+
53
+ interface SkillsInventorySkill {
54
+ readonly name: string;
55
+ readonly description: string;
56
+ readonly scope: string;
57
+ readonly source: string;
58
+ /** Whether the skill's root is trusted enough for the model to see it at all. */
59
+ readonly trusted: boolean;
60
+ /** Whether the skill's own frontmatter permits model invocation. */
61
+ readonly modelInvocable: boolean;
62
+ /**
63
+ * The effective answer, which is both of the above.
64
+ *
65
+ * Reported rather than left to be inferred because it is the fact an
66
+ * operator is actually asking about, and because a listing filtered to it
67
+ * cannot state it.
68
+ */
69
+ readonly modelVisible: boolean;
70
+ readonly precedence: number;
71
+ readonly diagnostics: SkillsInventoryDiagnosticCounts;
72
+ /** Tools the skill narrows itself to. The harness intersects these with host policy. */
73
+ readonly allowedTools: readonly string[];
74
+ readonly disallowedTools: readonly string[];
75
+ /** True when a dispatched worker installed this, rather than the operator. */
76
+ readonly installedByWorker: boolean;
77
+ /** True when provenance records an upstream, so `skills update` has something to fetch. */
78
+ readonly updatable: boolean;
79
+ readonly audit: SkillAuditState;
80
+ readonly installedAt: string | null;
81
+ readonly updatedAt: string | null;
82
+ }
83
+
84
+ interface SkillsInventorySnapshot {
85
+ readonly version: 1;
86
+ readonly generatedAt: string;
87
+ /** The verdict `skills validate` reaches, from the rule both callers share. */
88
+ readonly valid: boolean;
89
+ readonly invalidReason: SkillCatalogInvalidReason | null;
90
+ /** Every installed skill the loader resolved, before the wire bound. */
91
+ readonly total: number;
92
+ /** How many of those the model may actually load by name. */
93
+ readonly modelVisible: number;
94
+ readonly diagnostics: SkillsInventoryDiagnosticCounts;
95
+ readonly skills: readonly SkillsInventorySkill[];
96
+ readonly skillsTruncated: boolean;
97
+ }
98
+
99
+ const AUDIT_STATES: ReadonlySet<string> = new Set(["pass", "warn", "fail", "unknown"]);
100
+
101
+ function countDiagnostics(diagnostics: ReadonlyArray<ResourceDiagnostic>): SkillsInventoryDiagnosticCounts {
102
+ let errors = 0;
103
+ let warnings = 0;
104
+ let collisions = 0;
105
+ for (const diag of diagnostics) {
106
+ if (diag.type === "error") errors += 1;
107
+ else if (diag.type === "collision") collisions += 1;
108
+ else warnings += 1;
109
+ }
110
+ return { errors, warnings, collisions };
111
+ }
112
+
113
+ /**
114
+ * Tool names are already-crossing identifiers: the agent catalog carries the
115
+ * same class. They are re-enforced structurally here anyway, because a skill's
116
+ * frontmatter is operator-authored and the loader does not hold it to a shape.
117
+ */
118
+ function toolPolicy(value: ReadonlyArray<string> | undefined): string[] {
119
+ if (value === undefined) return [];
120
+ const tools: string[] = [];
121
+ for (const tool of value) {
122
+ if (tools.length >= MAX_SKILLS_INVENTORY_TOOLS) break;
123
+ if (typeof tool !== "string" || tool.length > 64 || !TOOL_PATTERN.test(tool)) continue;
124
+ if (!tools.includes(tool)) tools.push(tool);
125
+ }
126
+ return tools;
127
+ }
128
+
129
+ function timestamp(value: string | undefined): string | null {
130
+ if (value === undefined) return null;
131
+ const parsed = Date.parse(value);
132
+ return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null;
133
+ }
134
+
135
+ function projectSkill(skill: Skill): SkillsInventorySkill {
136
+ const provenance = skill.provenance;
137
+ const audit = provenance?.audit;
138
+ return {
139
+ name: skill.name,
140
+ description: skill.description,
141
+ scope: skill.scope,
142
+ source: skill.source,
143
+ trusted: skill.trusted,
144
+ modelInvocable: !skill.disableModelInvocation,
145
+ modelVisible: skill.trusted && !skill.disableModelInvocation,
146
+ precedence: skill.precedence,
147
+ diagnostics: countDiagnostics(skill.diagnostics),
148
+ allowedTools: toolPolicy(skill.allowedTools),
149
+ disallowedTools: toolPolicy(skill.disallowedTools),
150
+ installedByWorker: provenance?.installedBy === "worker",
151
+ // The URL itself is a host-side fact; that one exists is what tells the
152
+ // operator whether an update has anywhere to come from.
153
+ updatable: provenance?.installUrl !== undefined || provenance?.registryUrl !== undefined,
154
+ audit: audit !== undefined && AUDIT_STATES.has(audit) ? (audit as SkillAuditState) : "not-reported",
155
+ installedAt: timestamp(provenance?.installedAt),
156
+ updatedAt: timestamp(provenance?.updatedAt),
157
+ };
158
+ }
159
+
160
+ function skillsInventorySnapshot(now: () => number = Date.now, cwd: string = process.cwd()): SkillsInventorySnapshot {
161
+ const list = loadSkills({ cwd });
162
+ const validity = skillCatalogValidity(list);
163
+ const projected = list.items.map(projectSkill);
164
+ const skills = projected.slice(0, MAX_SKILLS_INVENTORY_SKILLS);
165
+ return {
166
+ version: 1,
167
+ generatedAt: new Date(now()).toISOString(),
168
+ valid: validity.ok,
169
+ invalidReason: validity.reason,
170
+ total: projected.length,
171
+ modelVisible: projected.filter((skill) => skill.modelVisible).length,
172
+ diagnostics: countDiagnostics(list.diagnostics),
173
+ skills,
174
+ skillsTruncated: skills.length < projected.length,
175
+ };
176
+ }
177
+
178
+ export function runSkillsInventory(args: ReadonlyArray<string>): number {
179
+ if (args.length !== 1 || args[0] !== "--json") {
180
+ process.stderr.write("clio-coder skills inventory: usage: clio-coder skills inventory --json\n");
181
+ return 2;
182
+ }
183
+ process.stdout.write(`${JSON.stringify(skillsInventorySnapshot(), null, 2)}\n`);
184
+ return 0;
185
+ }
package/src/cli/skills.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  type ResourceDiagnostic,
9
9
  type Skill,
10
10
  type SkillUpdateReport,
11
+ skillCatalogValidity,
11
12
  updateSkills,
12
13
  } from "../domains/resources/index.js";
13
14
  import { formatColumns, printError, printOk } from "./shared.js";
@@ -18,6 +19,7 @@ Manage local Clio and Agent Skills-compatible skills.
18
19
 
19
20
  Commands:
20
21
  clio-coder skills list [--json] [--all]
22
+ clio-coder skills inventory --json
21
23
  clio-coder skills search <query> [--json]
22
24
  clio-coder skills inspect <name> [--json]
23
25
  clio-coder skills validate [path] [--json]
@@ -27,6 +29,10 @@ Commands:
27
29
  clio-coder skills sync [--force]
28
30
  clio-coder skills eval <name|path> [--scenario <id>] [--target <id>] [--workspace <path>] [--timeout <seconds>] [--trust-fixtures] [--allow-network] [--json]
29
31
 
32
+ inventory is the fixed machine-readable read a GUI host may run. Unlike a bare
33
+ list it reports every installed skill, not only the ones the model may load, and
34
+ says which are which; it carries no body, path, hash, or install URL.
35
+
30
36
  search covers installed skills plus the local marketplace: CLIO_CODER_SKILL_CATALOG_DIR,
31
37
  a repo skills/ catalog, or the catalog and skill-marketplace.json index the
32
38
  installed clio-coder package carries. Installing from the shipped catalog copies
@@ -249,6 +255,12 @@ function validationLoad(pathArg: string | undefined): ReturnType<typeof loadSkil
249
255
  }
250
256
 
251
257
  export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<number> {
258
+ // Routed before the shared parser so the fixed read stays exactly fixed: no
259
+ // skills flag can reach it, and no flag it does not name can be spent on it.
260
+ if (argv[0] === "inventory") {
261
+ const { runSkillsInventory } = await import("./skills-inventory.js");
262
+ return runSkillsInventory(argv.slice(1));
263
+ }
252
264
  let parsed: Parsed;
253
265
  try {
254
266
  parsed = parse(argv);
@@ -365,19 +377,10 @@ export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<num
365
377
  return 2;
366
378
  }
367
379
  const list = validationLoad(pathArg);
368
- // A scanned file that produced no loaded skill is malformed, and a
369
- // collision drops a skill: both make the catalog invalid, as does any
370
- // hard error. Benign warnings (name/path mismatch, name format,
371
- // description length) attach to a file that still loaded, so their path
372
- // is among the loaded skills and they do not fail validation.
373
- const loadedPaths = new Set(list.items.map((skill) => skill.filePath));
374
- const hasInvalidDiagnostic = list.diagnostics.some(
375
- (diag) =>
376
- diag.type === "error" ||
377
- diag.type === "collision" ||
378
- (diag.type === "warning" && diag.path !== undefined && !loadedPaths.has(diag.path)),
379
- );
380
- const ok = list.items.length > 0 && !hasInvalidDiagnostic;
380
+ // The rule itself lives in the loader, because `skills inspect --json`
381
+ // reports the same verdict to a GUI host and a verdict that drifts
382
+ // between the terminal and the browser is worse than no verdict.
383
+ const { ok } = skillCatalogValidity(list);
381
384
  if (parsed.json) {
382
385
  process.stdout.write(`${JSON.stringify({ ok, skills: list.items, diagnostics: list.diagnostics }, null, 2)}\n`);
383
386
  } else {
@@ -14,6 +14,7 @@ import { ConfigDomainModule } from "../domains/config/index.js";
14
14
  import { ensureClioState } from "../domains/lifecycle/index.js";
15
15
  import type { ProvidersContract, TargetStatus } from "../domains/providers/contract.js";
16
16
  import {
17
+ endpointCapacityForStatus,
17
18
  isDispatchEligibleRuntime,
18
19
  isOrchestratorEligibleRuntime,
19
20
  ProvidersDomainModule,
@@ -24,7 +25,7 @@ import type { CapabilityFlags } from "../domains/providers/types/capability-flag
24
25
  import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
25
26
  import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
26
27
  import { printError, printOk } from "./shared.js";
27
- import { column, terminalColumns, truncate } from "./text-layout.js";
28
+ import { column, terminalColumns, truncate, wrapPlain } from "./text-layout.js";
28
29
 
29
30
  const HEADER: ReadonlyArray<string> = ["id", "tier", "runtime", "auth", "url", "model", "health", "caps", "notes"];
30
31
  type ProviderOutputTier = RuntimeTier | "unknown";
@@ -805,9 +806,11 @@ export interface TargetTableRow {
805
806
  health: string;
806
807
  caps: string;
807
808
  notes: string;
809
+ /** Full degraded-health reason, kept separately so a narrow table can repeat it below the row. */
810
+ diagnostic?: string;
808
811
  }
809
812
 
810
- type TargetTableColumn = keyof TargetTableRow;
813
+ type TargetTableColumn = Exclude<keyof TargetTableRow, "diagnostic">;
811
814
  type TargetTableWidths = Record<TargetTableColumn, number>;
812
815
 
813
816
  const TABLE_COLUMNS: ReadonlyArray<TargetTableColumn> = [
@@ -918,20 +921,35 @@ export function formatTargetTable(
918
921
  rows: ReadonlyArray<TargetTableRow>,
919
922
  width: number,
920
923
  paintHealth: (cell: string, row: TargetTableRow) => string = (cell) => cell,
921
- ): { header: string; rows: ReadonlyArray<string> } {
924
+ ): { header: string; rows: ReadonlyArray<string>; details: ReadonlyArray<ReadonlyArray<string>> } {
922
925
  const widths = tableWidths(rows, width);
923
926
  const line = (cells: ReadonlyArray<string>): string => cells.join(" ".repeat(TABLE_GAP)).trimEnd();
927
+ const formatted = rows.map((row) => {
928
+ const cells = TABLE_COLUMNS.map((key) => column(row[key], widths[key]));
929
+ const plain = line(cells);
930
+ const rendered =
931
+ plain.length > width
932
+ ? truncate(plain, width)
933
+ : line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
934
+ const diagnosticFits = !row.diagnostic || (plain.length <= width && widths.notes >= row.diagnostic.length);
935
+ const details = diagnosticFits ? [] : targetDiagnosticDetails(row.diagnostic ?? "", width);
936
+ return { rendered, details };
937
+ });
924
938
  return {
925
939
  header: truncate(line(TABLE_COLUMNS.map((key, index) => column(HEADER[index] ?? key, widths[key]))), width),
926
- rows: rows.map((row) => {
927
- const cells = TABLE_COLUMNS.map((key) => column(row[key], widths[key]));
928
- const plain = line(cells);
929
- if (plain.length > width) return truncate(plain, width);
930
- return line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
931
- }),
940
+ rows: formatted.map(({ rendered }) => rendered),
941
+ details: formatted.map(({ details }) => details),
932
942
  };
933
943
  }
934
944
 
945
+ /** Indented diagnostic text that retains every word when the table row cannot. */
946
+ function targetDiagnosticDetails(diagnostic: string, width: number): string[] {
947
+ const indent = 2;
948
+ return wrapPlain(`reason: ${diagnostic}`, Math.max(8, width - indent), indent).map((line, index) =>
949
+ index === 0 ? `${" ".repeat(indent)}${line}` : line,
950
+ );
951
+ }
952
+
935
953
  function renderTable(providers: ProvidersContract, entries: ReadonlyArray<TargetStatus>): void {
936
954
  const sorted = [...entries].sort(compareStatusByTier);
937
955
  const table = formatTargetTable(
@@ -950,10 +968,12 @@ function renderTable(providers: ProvidersContract, entries: ReadonlyArray<Target
950
968
  process.stdout.write(`${chalk.bold(table.header)}\n`);
951
969
  }
952
970
  process.stdout.write(`${table.rows[index] ?? ""}\n`);
971
+ for (const detail of table.details[index] ?? []) process.stdout.write(`${detail}\n`);
953
972
  }
954
973
  }
955
974
 
956
975
  export function targetTableRow(providers: ProvidersContract, status: TargetStatus): TargetTableRow {
976
+ const diagnostic = degradedHealthDiagnostic(status);
957
977
  return {
958
978
  id: status.target.id,
959
979
  tier: statusTier(status),
@@ -964,6 +984,7 @@ export function targetTableRow(providers: ProvidersContract, status: TargetStatu
964
984
  health: status.health.status,
965
985
  caps: capabilityBadges(status.capabilities),
966
986
  notes: formatNotes(status),
987
+ ...(diagnostic ? { diagnostic } : {}),
967
988
  };
968
989
  }
969
990
 
@@ -1044,22 +1065,29 @@ export function formatContextWindow(
1044
1065
  : `ctx ${window}`;
1045
1066
  }
1046
1067
 
1047
- function formatNotes(status: TargetStatus): string {
1068
+ export function formatNotes(status: TargetStatus): string {
1048
1069
  const parts: string[] = [];
1070
+ const diagnostic = degradedHealthDiagnostic(status);
1071
+ // The health diagnosis leads because gateway, context, and residency facts
1072
+ // are supplementary once the target says it cannot serve its default model.
1073
+ if (diagnostic) parts.push(diagnostic);
1074
+ const endpoint = endpointCapacityForStatus(status);
1075
+ if (endpoint) parts.push(`slots ${endpoint.limit}`);
1049
1076
  if (status.target.gateway) parts.push("gateway");
1050
1077
  if (status.runtime?.auth === "oauth") parts.push("oauth");
1051
1078
  if (status.runtime?.auth === "claude-cli") parts.push("claude-cli");
1052
1079
  if (status.capabilities.contextWindow > 0) parts.push(formatContextWindow(status));
1053
1080
  if (!status.available && status.reason) parts.push(status.reason);
1054
- // A reachable target that cannot serve its own default is degraded, and the
1055
- // row has to say why or the model column reads as a model that works.
1056
- if (status.health.status === "degraded" && status.health.lastError) parts.push(status.health.lastError);
1057
1081
  const residency = residentModelsSummary(status.discoveredModelStates);
1058
1082
  if (residency) parts.push(residency);
1059
1083
  if (status.probeNotes && status.probeNotes.length > 0) parts.push(`note: ${status.probeNotes.join("; ")}`);
1060
1084
  return parts.join(" ");
1061
1085
  }
1062
1086
 
1087
+ function degradedHealthDiagnostic(status: TargetStatus): string | null {
1088
+ return status.health.status === "degraded" && status.health.lastError ? status.health.lastError : null;
1089
+ }
1090
+
1063
1091
  function statusTier(status: TargetStatus): ProviderOutputTier {
1064
1092
  return status.runtime?.tier ?? "unknown";
1065
1093
  }
@@ -1120,6 +1148,7 @@ interface SerializedStatus {
1120
1148
  tier: ProviderOutputTier;
1121
1149
  detectedReasoning: boolean | null;
1122
1150
  reasoningCandidateModelId: string | null;
1151
+ endpointCapacity?: ReturnType<typeof endpointCapacityForStatus>;
1123
1152
  }
1124
1153
 
1125
1154
  function serializeStatus(
@@ -1141,6 +1170,8 @@ function serializeStatus(
1141
1170
  detectedReasoning: extras.detectedReasoning,
1142
1171
  reasoningCandidateModelId: extras.candidateModelId,
1143
1172
  };
1173
+ const endpointCapacity = endpointCapacityForStatus(status);
1174
+ if (endpointCapacity !== null) out.endpointCapacity = endpointCapacity;
1144
1175
  if (status.contextWindowProvenance !== undefined) {
1145
1176
  out.contextWindowProvenance = status.contextWindowProvenance;
1146
1177
  }