@iowarp/clio-coder 0.4.8 → 0.4.9

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 (513) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +7 -6
  3. package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
  4. package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
  7. package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
  8. package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
  9. package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
  10. package/dist/chunk-2JBZYUPY.js +105 -0
  11. package/dist/chunk-2KUBKL63.js +336 -0
  12. package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
  13. package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
  14. package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
  15. package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
  16. package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
  17. package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
  18. package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
  19. package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
  20. package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
  21. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  22. package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
  23. package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
  24. package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
  25. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  26. package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
  27. package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
  28. package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
  29. package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
  30. package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
  31. package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
  32. package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
  33. package/dist/chunk-ACCECAH4.js +49 -0
  34. package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
  35. package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
  36. package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
  37. package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
  38. package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
  39. package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
  40. package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
  41. package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
  42. package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
  43. package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
  44. package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
  45. package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
  46. package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
  47. package/dist/chunk-GHXGMFQ5.js +40 -0
  48. package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
  49. package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
  50. package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
  51. package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
  52. package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
  53. package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
  54. package/dist/chunk-HBJQQTKM.js +40 -0
  55. package/dist/chunk-HCVKSGNZ.js +990 -0
  56. package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
  57. package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
  58. package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
  59. package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
  60. package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
  61. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  62. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  63. package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
  64. package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
  65. package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
  66. package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
  67. package/dist/chunk-JURMQWVJ.js +15 -0
  68. package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
  69. package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
  70. package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
  71. package/dist/chunk-KP5BPXR3.js +73 -0
  72. package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
  73. package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
  74. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  75. package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
  76. package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
  77. package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
  78. package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
  79. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  80. package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
  81. package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
  82. package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
  83. package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
  84. package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
  85. package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
  86. package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
  87. package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
  88. package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
  89. package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
  90. package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
  91. package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
  92. package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
  93. package/dist/chunk-PP23PZEV.js +1347 -0
  94. package/dist/chunk-PPIFDSBK.js +409 -0
  95. package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
  96. package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
  97. package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
  98. package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
  99. package/dist/chunk-QKHZZFKH.js +98 -0
  100. package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
  101. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  102. package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
  103. package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
  104. package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
  105. package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
  106. package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
  107. package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
  108. package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
  109. package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
  110. package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
  111. package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
  112. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  113. package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
  114. package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
  115. package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
  116. package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
  117. package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
  118. package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
  119. package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
  120. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  121. package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
  122. package/dist/{chunk-P7GTE4FX.js → chunk-XRECG65F.js} +2 -2
  123. package/dist/chunk-XTQ7MEJG.js +457 -0
  124. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  125. package/dist/{chunk-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
  126. package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
  127. package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
  128. package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
  129. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  130. package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
  131. package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
  132. package/dist/cli/index.js +47 -37
  133. package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
  134. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  135. package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
  136. package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
  137. package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
  138. package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
  139. package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
  140. package/dist/context-72VQV7JX.js +73 -0
  141. package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
  142. package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
  143. package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
  144. package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
  145. package/dist/data-tool-KMBWKKWR.js +2987 -0
  146. package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
  147. package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
  148. package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
  149. package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
  150. package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
  151. package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
  152. package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
  153. package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
  154. package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
  155. package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
  156. package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
  157. package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
  158. package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
  159. package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
  160. package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
  161. package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
  162. package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
  163. package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
  164. package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
  165. package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
  166. package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
  167. package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
  168. package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
  169. package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
  170. package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
  171. package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
  172. package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
  173. package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
  174. package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
  175. package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
  176. package/dist/mcp-5FWZKUS6.js +26 -0
  177. package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
  178. package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
  179. package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
  180. package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
  181. package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
  182. package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
  183. package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
  184. package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
  185. package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
  186. package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
  187. package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
  188. package/dist/run-script-H2KUDIII.js +41 -0
  189. package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
  190. package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
  191. package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
  192. package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
  193. package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
  194. package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
  195. package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
  196. package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
  197. package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
  198. package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
  199. package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
  200. package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
  201. package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
  202. package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
  203. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  204. package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
  205. package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
  206. package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
  207. package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
  208. package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
  209. package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
  210. package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
  211. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  212. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  213. package/dist/web/client/assets/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
  214. package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
  215. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  216. package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
  217. package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
  218. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  219. package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
  220. package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
  221. package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
  222. package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
  223. package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
  224. package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
  225. package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
  226. package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
  227. package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
  228. package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
  229. package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
  230. package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
  231. package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
  232. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  233. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  234. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  235. package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
  236. package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
  237. package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
  238. package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
  239. package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
  240. package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
  241. package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
  242. package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
  243. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  244. package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
  245. package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
  246. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  247. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  248. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  249. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  250. package/dist/web/client/assets/{gitGraph-4MIJSDKK-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
  251. package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
  252. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  253. package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
  254. package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
  255. package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
  256. package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
  257. package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
  258. package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
  259. package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
  260. package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
  261. package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
  262. package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
  263. package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
  264. package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
  265. package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
  266. package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
  267. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  268. package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
  269. package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
  270. package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
  271. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  272. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  273. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  274. package/dist/web/client/assets/{railroadDiagram-O6MQD6OU-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
  275. package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
  276. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  277. package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
  278. package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
  279. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  280. package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
  281. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  282. package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
  283. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  284. package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
  285. package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
  286. package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
  287. package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
  288. package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
  289. package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
  290. package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
  291. package/dist/web/client/index.html +3 -1
  292. package/dist/web/reads-worker.js +17 -17
  293. package/dist/web/server.js +25 -25
  294. package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
  295. package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
  296. package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
  297. package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
  298. package/dist/worker/entry.js +101 -87
  299. package/docs/README.md +1 -1
  300. package/docs/architecture/artifact-placement.md +12 -1
  301. package/docs/architecture/library.md +1 -1
  302. package/docs/architecture/prompt-envelope-and-tools.md +37 -27
  303. package/docs/architecture/safety-model.md +19 -6
  304. package/docs/architecture/session-lifecycle.md +10 -4
  305. package/docs/architecture/tui-design.md +37 -14
  306. package/docs/guide/commands-and-modes.md +39 -19
  307. package/docs/guide/configuration-and-targets.md +7 -5
  308. package/docs/guide/configuration-reference.md +116 -13
  309. package/docs/guide/environment-variables.md +2 -5
  310. package/docs/guide/fleet-dispatch.md +3 -2
  311. package/docs/guide/glossary.md +1 -1
  312. package/docs/guide/installation-and-lifecycle.md +2 -2
  313. package/docs/guide/resource-library.md +1 -1
  314. package/docs/guide/tool-usage.md +166 -64
  315. package/docs/guide/troubleshooting.md +1 -1
  316. package/docs/process/documentation-guide.md +1 -0
  317. package/docs/process/fleet-demo-runbook.md +6 -6
  318. package/docs/process/scientific-validation.md +22 -2
  319. package/docs/process/tool-audit-v0.4.9.md +357 -0
  320. package/package.json +1 -1
  321. package/src/cli/argv.ts +31 -0
  322. package/src/cli/clio.ts +17 -13
  323. package/src/cli/config.ts +4 -0
  324. package/src/cli/doctor-panes.ts +1 -1
  325. package/src/cli/doctor.ts +3 -1
  326. package/src/cli/index.ts +14 -1
  327. package/src/cli/mcp.ts +106 -0
  328. package/src/cli/skills-eval.ts +8 -2
  329. package/src/cli/upgrade.ts +34 -38
  330. package/src/cli/verifiers.ts +1 -1
  331. package/src/core/bash-exec.ts +27 -4
  332. package/src/core/config.ts +2 -1
  333. package/src/core/defaults.ts +10 -1
  334. package/src/core/event-bus.ts +1 -1
  335. package/src/core/run-records.ts +438 -0
  336. package/src/core/safe-exec.ts +506 -56
  337. package/src/core/skill-activation.ts +5 -3
  338. package/src/core/termination.ts +3 -3
  339. package/src/core/tool-names.ts +33 -12
  340. package/src/domains/context/clio-md.ts +1 -1
  341. package/src/domains/context/worker/pressure.ts +6 -2
  342. package/src/domains/context/working-set/path-index.ts +7 -2
  343. package/src/domains/dispatch/code-step.ts +7 -2
  344. package/src/domains/dispatch/contract.ts +7 -0
  345. package/src/domains/dispatch/execution-role.ts +3 -3
  346. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  347. package/src/domains/dispatch/extension.ts +131 -14
  348. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  349. package/src/domains/dispatch/fleet-run.ts +1 -0
  350. package/src/domains/dispatch/gate-decisions.ts +3 -3
  351. package/src/domains/dispatch/heartbeat.ts +1 -1
  352. package/src/domains/dispatch/host-verification.ts +16 -14
  353. package/src/domains/dispatch/receipt-findings.ts +3 -4
  354. package/src/domains/dispatch/reservation-store.ts +7 -9
  355. package/src/domains/dispatch/route-facts.ts +1 -1
  356. package/src/domains/dispatch/state.ts +3 -3
  357. package/src/domains/dispatch/types.ts +1 -1
  358. package/src/domains/evidence/build.ts +35 -7
  359. package/src/domains/gateway/mcp/client.ts +923 -0
  360. package/src/domains/gateway/mcp/config.ts +456 -0
  361. package/src/domains/gateway/mcp/index.ts +88 -0
  362. package/src/domains/gateway/mcp/protocol.ts +273 -0
  363. package/src/domains/gateway/mcp/trust.ts +263 -0
  364. package/src/domains/lifecycle/doctor.ts +17 -3
  365. package/src/domains/mux/contract.ts +5 -9
  366. package/src/domains/mux/detect.ts +1 -1
  367. package/src/domains/mux/extension.ts +1 -1
  368. package/src/domains/mux/protocol.ts +5 -7
  369. package/src/domains/mux/socket-client.ts +3 -3
  370. package/src/domains/observability/accountability.ts +2 -2
  371. package/src/domains/observability/contract.ts +7 -3
  372. package/src/domains/observability/evidence-index.ts +2 -2
  373. package/src/domains/observability/projection.ts +10 -0
  374. package/src/domains/prompts/compiler.ts +41 -23
  375. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  376. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  377. package/src/domains/providers/index.ts +5 -1
  378. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  379. package/src/domains/providers/probe/http.ts +44 -59
  380. package/src/domains/providers/probe/reasoning.ts +2 -0
  381. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  382. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  383. package/src/domains/safety/action-classifier.ts +17 -1
  384. package/src/domains/safety/call-target.ts +14 -0
  385. package/src/domains/safety/contract.ts +1 -1
  386. package/src/domains/safety/finish-contract.ts +9 -3
  387. package/src/domains/safety/loop-detector.ts +1 -1
  388. package/src/domains/safety/policy-engine.ts +7 -0
  389. package/src/domains/safety/protected-artifacts.ts +3 -4
  390. package/src/domains/safety/rejection-feedback.ts +1 -1
  391. package/src/domains/safety/scope.ts +2 -3
  392. package/src/domains/safety/validation-contract.ts +3 -2
  393. package/src/domains/scheduling/budget.ts +5 -3
  394. package/src/domains/scheduling/contract.ts +2 -1
  395. package/src/domains/scheduling/extension.ts +3 -3
  396. package/src/domains/session/compaction/branch-summary.ts +1 -1
  397. package/src/domains/session/compaction/compact.ts +25 -2
  398. package/src/domains/session/compaction/cut-point.ts +1 -1
  399. package/src/domains/session/compaction/tokens.ts +5 -10
  400. package/src/domains/session/contract.ts +1 -1
  401. package/src/domains/session/cwd-fallback.ts +2 -2
  402. package/src/domains/session/handoff.ts +5 -1
  403. package/src/domains/session/history.ts +6 -0
  404. package/src/domains/session/manager.ts +14 -7
  405. package/src/domains/session/retry.ts +2 -1
  406. package/src/domains/session/session-artifacts.ts +12 -7
  407. package/src/domains/session/task-board.ts +2 -3
  408. package/src/engine/apis/openai-completions.ts +8 -0
  409. package/src/engine/loop-guard.ts +7 -0
  410. package/src/engine/provider-error-body.ts +65 -0
  411. package/src/engine/session.ts +118 -29
  412. package/src/engine/worker-runtime.ts +3 -0
  413. package/src/entry/boot-options.ts +2 -0
  414. package/src/entry/orchestrator.ts +18 -2
  415. package/src/interactive/chat-loop-policy.ts +1 -0
  416. package/src/interactive/chat-loop.ts +8 -4
  417. package/src/interactive/chat-panel.ts +23 -9
  418. package/src/interactive/chat-renderer.ts +33 -11
  419. package/src/interactive/clio-editor.ts +13 -5
  420. package/src/interactive/dispatch-board.ts +70 -30
  421. package/src/interactive/editor-submit.ts +30 -25
  422. package/src/interactive/footer/widgets.ts +12 -9
  423. package/src/interactive/interactive-presentation.ts +2 -3
  424. package/src/interactive/mux-bridge.ts +3 -7
  425. package/src/interactive/overlay-general-openers.ts +14 -7
  426. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  427. package/src/interactive/overlays/library-model.ts +114 -35
  428. package/src/interactive/overlays/library.ts +52 -5
  429. package/src/interactive/overlays/list-overlay.ts +4 -1
  430. package/src/interactive/overlays/session-selector.ts +28 -23
  431. package/src/interactive/overlays/settings.ts +20 -1
  432. package/src/interactive/overlays/tree-selector.ts +47 -10
  433. package/src/interactive/panes-runtime.ts +1 -1
  434. package/src/interactive/renderers/compaction-summary.ts +1 -1
  435. package/src/interactive/renderers/provider-error.ts +118 -0
  436. package/src/interactive/renderers/retry-status.ts +59 -23
  437. package/src/interactive/renderers/tool-execution.ts +67 -7
  438. package/src/interactive/renderers/worker-answer.ts +198 -0
  439. package/src/interactive/renderers/worker-entry.ts +57 -163
  440. package/src/interactive/slash-commands.ts +26 -1
  441. package/src/interactive/slash-spec.ts +2 -2
  442. package/src/interactive/theme/labels.ts +66 -30
  443. package/src/interactive/turn-persistence.ts +6 -1
  444. package/src/interactive/turn-recovery.ts +2 -1
  445. package/src/interactive/turn-runtime.ts +22 -5
  446. package/src/interactive/view/artifacts.ts +3 -2
  447. package/src/interactive/view/view-overlay.ts +96 -20
  448. package/src/tools/agent-tools.ts +21 -7
  449. package/src/tools/artifact.ts +16 -8
  450. package/src/tools/bash.ts +90 -11
  451. package/src/tools/bootstrap.ts +42 -4
  452. package/src/tools/builtin-tool-catalog.ts +72 -7
  453. package/src/tools/context/index.ts +27 -31
  454. package/src/tools/context/library.ts +3 -1
  455. package/src/tools/context/surface.ts +12 -26
  456. package/src/tools/core-bootstrap.ts +72 -1
  457. package/src/tools/data/csv.ts +1189 -0
  458. package/src/tools/data/index.ts +308 -0
  459. package/src/tools/data/json.ts +1799 -0
  460. package/src/tools/data/jsonl.ts +561 -0
  461. package/src/tools/data/shared.ts +452 -0
  462. package/src/tools/edit-diff.ts +0 -7
  463. package/src/tools/edit.ts +115 -18
  464. package/src/tools/file-mutation-queue.ts +114 -4
  465. package/src/tools/find.ts +108 -29
  466. package/src/tools/gateway/caps.ts +11 -0
  467. package/src/tools/gateway/clio-context-surface.ts +41 -0
  468. package/src/tools/gateway/clio-context-tools.ts +77 -0
  469. package/src/tools/gateway/data-surface.ts +138 -0
  470. package/src/tools/gateway/data-tool.ts +201 -0
  471. package/src/tools/gateway/index.ts +342 -0
  472. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  473. package/src/tools/grep.ts +88 -33
  474. package/src/tools/harness-extensions.ts +3 -0
  475. package/src/tools/ignore-policy.ts +7 -5
  476. package/src/tools/ls.ts +111 -20
  477. package/src/tools/policy.ts +35 -13
  478. package/src/tools/presentation.ts +6 -0
  479. package/src/tools/read.ts +634 -156
  480. package/src/tools/registry.ts +94 -6
  481. package/src/tools/run-script.ts +997 -0
  482. package/src/tools/spawn-hygiene.ts +157 -5
  483. package/src/tools/surface.ts +163 -0
  484. package/src/tools/verify/authoring.ts +8 -3
  485. package/src/tools/verify/catalog.ts +14 -1
  486. package/src/tools/verify/numeric.ts +367 -59
  487. package/src/tools/verify/perf.ts +171 -9
  488. package/src/tools/verify/scripts.ts +178 -26
  489. package/src/tools/web-fetch-surface.ts +22 -0
  490. package/src/tools/web-fetch.ts +26 -1
  491. package/src/tools/write.ts +45 -19
  492. package/dist/chunk-B6UM3OZC.js +0 -15
  493. package/dist/chunk-GJ24ODAX.js +0 -196
  494. package/dist/chunk-LZCCBLRC.js +0 -57
  495. package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
  496. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
  497. package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
  498. package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
  499. package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
  500. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
  501. package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
  502. package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
  503. package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
  504. package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
  505. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
  506. package/dist/web/client/assets/index-FSIC94pi.js +0 -83
  507. package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
  508. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
  509. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
  510. package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
  511. package/dist/web/client/assets/src-yeptRXpt.js +0 -1
  512. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
  513. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
@@ -30,7 +30,7 @@ import {
30
30
  isAgentProduct,
31
31
  isAgentProjectContextTier,
32
32
  parseResultContract
33
- } from "./chunk-ARRUMZ7X.js";
33
+ } from "./chunk-I47EJPYL.js";
34
34
  import {
35
35
  extensionContentDigest,
36
36
  isSemanticVersion
@@ -38,7 +38,7 @@ import {
38
38
  import {
39
39
  readSettings,
40
40
  updateSettings
41
- } from "./chunk-PGEFOTJB.js";
41
+ } from "./chunk-FPS4R2RN.js";
42
42
  import {
43
43
  warnLegacyNaming
44
44
  } from "./chunk-DVNAPPXU.js";
@@ -48,14 +48,14 @@ import {
48
48
  } from "./chunk-5EQO5NWP.js";
49
49
  import {
50
50
  ToolNames
51
- } from "./chunk-WLHX3MM5.js";
51
+ } from "./chunk-V4XJWDHR.js";
52
52
  import {
53
53
  require_dist
54
54
  } from "./chunk-B5GGDIHT.js";
55
55
  import {
56
56
  buildSafeToolEnv,
57
57
  runCommandVector
58
- } from "./chunk-GJ24ODAX.js";
58
+ } from "./chunk-XTQ7MEJG.js";
59
59
  import {
60
60
  withStateFileLockSync
61
61
  } from "./chunk-DVJL77SO.js";
@@ -73,234 +73,13 @@ import {
73
73
  init_esm_shims
74
74
  } from "./chunk-ECBHH7LU.js";
75
75
 
76
- // src/domains/agents/recipe.ts
77
- init_esm_shims();
78
- import path from "node:path";
79
- var AGENT_BUDGET_KEYS = ["toolCalls", "readReserve", "synthesis", "maximum"];
80
- function parseAgentBudgetPhase(value, prefix, relationTarget) {
81
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
82
- throw new Error(`${prefix} must be a non-null YAML object`);
83
- }
84
- const record = value;
85
- for (const key of Object.keys(record)) {
86
- if (key !== "toolCalls" && key !== "readReserve") throw new Error(`${prefix}.${key} is unknown`);
87
- }
88
- for (const key of ["toolCalls", "readReserve"]) {
89
- if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
90
- }
91
- const toolCalls = record.toolCalls;
92
- if (typeof toolCalls !== "number" || !Number.isSafeInteger(toolCalls)) {
93
- throw new Error(`${prefix}.toolCalls must be a finite safe integer`);
94
- }
95
- if (toolCalls <= 0) throw new Error(`${prefix}.toolCalls must be greater than 0`);
96
- const readReserve = record.readReserve;
97
- if (typeof readReserve !== "number" || !Number.isSafeInteger(readReserve)) {
98
- throw new Error(`${prefix}.readReserve must be a finite safe integer`);
99
- }
100
- if (readReserve < 0) throw new Error(`${prefix}.readReserve must be greater than or equal to 0`);
101
- if (readReserve >= toolCalls) throw new Error(`${prefix}.readReserve must be less than ${relationTarget}`);
102
- return { toolCalls, readReserve };
103
- }
104
- function parseAgentBudget(value, sourcePath) {
105
- if (value === void 0) return void 0;
106
- const prefix = `agent budget: ${sourcePath}: budget`;
107
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
108
- throw new Error(`${prefix} must be a non-null YAML object`);
109
- }
110
- const record = value;
111
- for (const key of Object.keys(record)) {
112
- if (!AGENT_BUDGET_KEYS.includes(key)) {
113
- throw new Error(`${prefix}.${key} is unknown`);
114
- }
115
- }
116
- for (const key of ["toolCalls", "readReserve", "synthesis"]) {
117
- if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
118
- }
119
- const phase = parseAgentBudgetPhase(
120
- { toolCalls: record.toolCalls, readReserve: record.readReserve },
121
- prefix,
122
- "budget.toolCalls"
123
- );
124
- const synthesis = record.synthesis;
125
- if (typeof synthesis !== "boolean") throw new Error(`${prefix}.synthesis must be a boolean`);
126
- const maximum = record.maximum === void 0 ? void 0 : parseAgentBudgetPhase(record.maximum, `${prefix}.maximum`, "budget.maximum.toolCalls");
127
- if (maximum !== void 0) {
128
- if (maximum.toolCalls < phase.toolCalls) {
129
- throw new Error(`${prefix}.maximum.toolCalls must be greater than or equal to budget.toolCalls`);
130
- }
131
- if (maximum.readReserve < phase.readReserve) {
132
- throw new Error(`${prefix}.maximum.readReserve must be greater than or equal to budget.readReserve`);
133
- }
134
- }
135
- return { ...phase, synthesis, ...maximum === void 0 ? {} : { maximum } };
136
- }
137
- function recipeIdFromPath(absPath, rootDir) {
138
- const resolvedRoot = path.resolve(rootDir);
139
- const resolvedPath = path.resolve(absPath);
140
- const relPath = path.relative(resolvedRoot, resolvedPath);
141
- if (relPath === "" || relPath.startsWith("..") || path.isAbsolute(relPath)) {
142
- throw new Error(`recipe: path must live under rootDir (${resolvedPath} not under ${resolvedRoot})`);
143
- }
144
- if (path.dirname(relPath) !== ".") {
145
- throw new Error(`recipe: recipes must live directly under rootDir (${resolvedPath})`);
146
- }
147
- if (path.extname(relPath) !== ".md") {
148
- throw new Error(`recipe: recipe files must end in .md (${resolvedPath})`);
149
- }
150
- const id = path.basename(relPath, ".md");
151
- if (id === "") {
152
- throw new Error(`recipe: recipe filename must not be empty (${resolvedPath})`);
153
- }
154
- return id;
155
- }
156
-
157
- // src/domains/agents/recipe-schema.ts
158
- init_esm_shims();
159
- var RECIPE_KEYS = [
160
- "version",
161
- "name",
162
- "description",
163
- "tools",
164
- "skills",
165
- "audience",
166
- "category",
167
- "capabilityClass",
168
- "latencyClass",
169
- "projectContextTier",
170
- "budget",
171
- "resultContract",
172
- "tags"
173
- ];
174
- var OPTIONAL_RECIPE_KEYS = ["product"];
175
- var ALL_RECIPE_KEYS = [...RECIPE_KEYS, ...OPTIONAL_RECIPE_KEYS];
176
- function requiredString(value, path6) {
177
- if (typeof value !== "string" || value.trim().length === 0)
178
- throw new Error(`agent recipe: ${path6} must be a non-empty string`);
179
- return value;
180
- }
181
- function requiredStringArray(value, path6) {
182
- if (!Array.isArray(value)) throw new Error(`agent recipe: ${path6} must be an array of strings`);
183
- const entries = value.map((entry, index) => requiredString(entry, `${path6}[${index}]`));
184
- if (new Set(entries).size !== entries.length) throw new Error(`agent recipe: ${path6} must not contain duplicates`);
185
- return entries;
186
- }
187
- function enumValue(value, path6, predicate) {
188
- if (!predicate(value)) throw new Error(`agent recipe: ${path6} has an unsupported value`);
189
- return value;
190
- }
191
- function parseAudience(value, source, filepath) {
192
- const audience = enumValue(value, `${filepath}: audience`, isAgentAudience);
193
- if (source === "builtin") {
194
- if (audience === "custom") {
195
- throw new Error(`agent recipe: ${filepath}: a builtin recipe must not declare audience 'custom'`);
196
- }
197
- return audience;
198
- }
199
- if (audience !== "custom") {
200
- throw new Error(
201
- `agent recipe: ${filepath}: a ${source} recipe must declare audience 'custom', not '${audience}'; audience follows where the recipe was discovered and cannot be claimed in frontmatter`
202
- );
203
- }
204
- return audience;
205
- }
206
- function parseTools(value, filepath) {
207
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
208
- throw new Error(`agent recipe: ${filepath}: tools must be a { required, optional } object`);
209
- }
210
- const record = value;
211
- if (Object.keys(record).some((key) => key !== "required" && key !== "optional")) {
212
- throw new Error(`agent recipe: ${filepath}: tools has an unknown key`);
213
- }
214
- if (!("required" in record) || !("optional" in record)) {
215
- throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional are required`);
216
- }
217
- if (!Array.isArray(record.required) || !Array.isArray(record.optional)) {
218
- throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional must be arrays`);
219
- }
220
- const required = record.required.map((entry, index) => {
221
- const entryPath = `${filepath}: tools.required[${index}]`;
222
- if (typeof entry === "string") return requiredString(entry, entryPath);
223
- if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
224
- throw new Error(`agent recipe: ${entryPath} must be a tool name or { anyOf: [...] }`);
225
- }
226
- const group = entry;
227
- if (Object.keys(group).length !== 1 || !("anyOf" in group)) {
228
- throw new Error(`agent recipe: ${entryPath} must contain only anyOf`);
229
- }
230
- const anyOf = requiredStringArray(group.anyOf, `${entryPath}.anyOf`);
231
- if (anyOf.length === 0) throw new Error(`agent recipe: ${entryPath}.anyOf must not be empty`);
232
- return { anyOf };
233
- });
234
- const optional = requiredStringArray(record.optional, `${filepath}: tools.optional`);
235
- const tools = [
236
- ...required.flatMap((requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf),
237
- ...optional
238
- ];
239
- if (new Set(tools).size !== tools.length)
240
- throw new Error(`agent recipe: ${filepath}: tools contains duplicate requirements`);
241
- return { tools, toolRequirements: { required, optional } };
242
- }
243
- function parseAgentRecipeSchema(input) {
244
- const { frontmatter, filepath } = input;
245
- for (const key of Object.keys(frontmatter)) {
246
- if (!ALL_RECIPE_KEYS.includes(key)) {
247
- throw new Error(`agent recipe: ${filepath}: unknown key '${key}'`);
248
- }
249
- }
250
- for (const key of RECIPE_KEYS) {
251
- if (!(key in frontmatter)) throw new Error(`agent recipe: ${filepath}: ${key} is required`);
252
- }
253
- if (frontmatter.version !== 1) throw new Error(`agent recipe: ${filepath}: version must be the supported integer 1`);
254
- if (input.body.trim().length === 0) throw new Error(`agent recipe: ${filepath}: persona body must not be empty`);
255
- const parsedTools = parseTools(frontmatter.tools, filepath);
256
- const budget = parseAgentBudget(frontmatter.budget, filepath);
257
- if (budget === void 0) throw new Error(`agent recipe: ${filepath}: budget is required`);
258
- return {
259
- version: 1,
260
- id: input.id,
261
- name: requiredString(frontmatter.name, `${filepath}: name`),
262
- description: requiredString(frontmatter.description, `${filepath}: description`),
263
- tools: parsedTools.tools,
264
- toolRequirements: parsedTools.toolRequirements,
265
- skills: requiredStringArray(frontmatter.skills, `${filepath}: skills`),
266
- boundSkillPaths: [],
267
- audience: parseAudience(frontmatter.audience, input.source, filepath),
268
- category: enumValue(frontmatter.category, `${filepath}: category`, isAgentCategory),
269
- capabilityClass: enumValue(
270
- frontmatter.capabilityClass,
271
- `${filepath}: capabilityClass`,
272
- isAgentCapabilityClass
273
- ),
274
- latencyClass: enumValue(
275
- frontmatter.latencyClass,
276
- `${filepath}: latencyClass`,
277
- isAgentLatencyClass
278
- ),
279
- projectContextTier: enumValue(
280
- frontmatter.projectContextTier,
281
- `${filepath}: projectContextTier`,
282
- isAgentProjectContextTier
283
- ),
284
- budget,
285
- resultContract: parseResultContract(frontmatter.resultContract, filepath),
286
- // Optional, but not lenient. A misspelled product silently costs the run
287
- // the delivery tools its reserve window was supposed to keep, and the
288
- // only symptom is a blocked tool call deep in a dispatch log.
289
- ...frontmatter.product === void 0 ? {} : { product: enumValue(frontmatter.product, `${filepath}: product`, isAgentProduct) },
290
- tags: requiredStringArray(frontmatter.tags, `${filepath}: tags`),
291
- source: input.source,
292
- filepath,
293
- body: input.body
294
- };
295
- }
296
-
297
76
  // src/domains/plugins/catalog.ts
298
77
  init_esm_shims();
299
78
  var import_yaml = __toESM(require_dist(), 1);
300
79
  import { execFileSync } from "node:child_process";
301
80
  import { existsSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
302
81
  import { homedir, tmpdir } from "node:os";
303
- import path2 from "node:path";
82
+ import path from "node:path";
304
83
  function parsePluginGithubSource(source) {
305
84
  const match = /^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/tree\/([A-Za-z0-9_.-]+)(?:\/(.*?))?\/?$/.exec(source);
306
85
  if (!match?.[1] || !match[2] || !match[3]) return void 0;
@@ -310,7 +89,7 @@ function parsePluginGithubSource(source) {
310
89
  return { url: `https://github.com/${match[1]}/${match[2]}.git`, ref: match[3], subdir };
311
90
  }
312
91
  function pluginLocalPath(source, cwd = process.cwd()) {
313
- return path2.resolve(cwd, source.startsWith("~/") ? path2.join(homedir(), source.slice(2)) : source);
92
+ return path.resolve(cwd, source.startsWith("~/") ? path.join(homedir(), source.slice(2)) : source);
314
93
  }
315
94
  function fetchPluginSource(source, cwd = process.cwd()) {
316
95
  const local = pluginLocalPath(source, cwd);
@@ -321,7 +100,7 @@ function fetchPluginSource(source, cwd = process.cwd()) {
321
100
  throw new Error(
322
101
  `unsupported plugin source: ${source}; use a local directory or https://github.com/owner/repo/tree/ref/path`
323
102
  );
324
- const temp = mkdtempSync(path2.join(tmpdir(), "clio-coder-plugin-"));
103
+ const temp = mkdtempSync(path.join(tmpdir(), "clio-coder-plugin-"));
325
104
  const cleanup = () => rmSync(temp, { recursive: true, force: true });
326
105
  try {
327
106
  execFileSync(
@@ -334,13 +113,13 @@ function fetchPluginSource(source, cwd = process.cwd()) {
334
113
  env: buildSafeToolEnv({ GIT_TERMINAL_PROMPT: "0", GIT_CONFIG_NOSYSTEM: "1" })
335
114
  }
336
115
  );
337
- const root = path2.join(temp, remote.subdir);
116
+ const root = path.join(temp, remote.subdir);
338
117
  if (!existsSync(root) || !statSync(root).isDirectory())
339
118
  throw new Error(`plugin source has no directory ${remote.subdir || "."}: ${source}`);
340
- const relative = path2.relative(realpathSync(temp), realpathSync(root));
341
- if (relative === ".." || relative.startsWith(`..${path2.sep}`) || path2.isAbsolute(relative))
119
+ const relative = path.relative(realpathSync(temp), realpathSync(root));
120
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
342
121
  throw new Error("plugin source escapes repository");
343
- if (!remote.subdir) rmSync(path2.join(temp, ".git"), { recursive: true, force: true });
122
+ if (!remote.subdir) rmSync(path.join(temp, ".git"), { recursive: true, force: true });
344
123
  return { root, cleanup };
345
124
  } catch (error) {
346
125
  cleanup();
@@ -406,7 +185,7 @@ function readPluginCatalog(file, diagnostics) {
406
185
  kind: item.kind,
407
186
  name: item.name,
408
187
  description: item.description,
409
- sourceUrl: remote ? item.sourceUrl : path2.resolve(path2.dirname(file), item.sourceUrl),
188
+ sourceUrl: remote ? item.sourceUrl : path.resolve(path.dirname(file), item.sourceUrl),
410
189
  version: item.version,
411
190
  sha256: item.sha256,
412
191
  origin: "catalog",
@@ -415,7 +194,7 @@ function readPluginCatalog(file, diagnostics) {
415
194
  ...Array.isArray(item.triggers) ? { triggers: item.triggers.filter((value) => typeof value === "string") } : {},
416
195
  ...Array.isArray(item.requires) ? { requires: item.requires } : {},
417
196
  ...provides ? { provides } : {},
418
- index: path2.resolve(file)
197
+ index: path.resolve(file)
419
198
  }
420
199
  ];
421
200
  });
@@ -425,7 +204,7 @@ function readPluginCatalog(file, diagnostics) {
425
204
  }
426
205
  }
427
206
  function bundledLibraryIndexPath() {
428
- return path2.join(resolvePackageRoot(), "library", "registry.yaml");
207
+ return path.join(resolvePackageRoot(), "library", "registry.yaml");
429
208
  }
430
209
  function bundledPluginCatalog(diagnostics) {
431
210
  try {
@@ -440,10 +219,10 @@ function bundledPluginCatalog(diagnostics) {
440
219
  init_esm_shims();
441
220
  var import_yaml2 = __toESM(require_dist(), 1);
442
221
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
443
- import path3 from "node:path";
222
+ import path2 from "node:path";
444
223
  function catalogPath() {
445
224
  const configured = readSettings().integrations.library.catalog;
446
- return path3.resolve(configured ?? path3.join(clioConfigDir(), "library.yaml"));
225
+ return path2.resolve(configured ?? path2.join(clioConfigDir(), "library.yaml"));
447
226
  }
448
227
  function parseCatalog(filePath, diagnostics) {
449
228
  return readPluginCatalog(filePath, diagnostics).map((entry) => ({ ...entry, origin: "index" }));
@@ -464,13 +243,13 @@ function discoverLibrary(options = {}) {
464
243
  const diagnostics = [];
465
244
  const bundledPlugins = bundledPluginCatalog(diagnostics);
466
245
  const privatePath = catalogPath();
467
- const primary = options.catalog ? parseCatalog(path3.resolve(options.catalog), diagnostics) : [];
246
+ const primary = options.catalog ? parseCatalog(path2.resolve(options.catalog), diagnostics) : [];
468
247
  const privateEntries = parseCatalog(privatePath, diagnostics);
469
248
  const byRef = /* @__PURE__ */ new Map();
470
249
  for (const entry of [
471
250
  ...bundledPlugins,
472
251
  ...privateEntries,
473
- ...parseCatalog(path3.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
252
+ ...parseCatalog(path2.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
474
253
  ...primary
475
254
  ])
476
255
  byRef.set(libraryEntryRef(entry), entry);
@@ -566,7 +345,7 @@ function registerLibraryPackage(source, options = {}) {
566
345
  origin: "index",
567
346
  ...manifest.clio.requires ? { requires: manifest.clio.requires } : {}
568
347
  };
569
- const file = options.scope === "project" ? path3.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
348
+ const file = options.scope === "project" ? path2.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
570
349
  withStateFileLockSync(file, () => {
571
350
  const diagnostics = [];
572
351
  const before = existsSync2(file) ? readFileSync2(file, "utf8") : void 0;
@@ -608,7 +387,7 @@ function installedPlugin(entry, options = {}) {
608
387
  }
609
388
  function libraryInstallPath(entry, options = {}) {
610
389
  if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.name)) throw new Error(`invalid library entry name: ${entry.name}`);
611
- return installedPlugin(entry, options)?.rootPath ?? path3.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name);
390
+ return installedPlugin(entry, options)?.rootPath ?? path2.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name);
612
391
  }
613
392
  function libraryEntryInstalled(entry, options = {}) {
614
393
  return installedPlugin(entry, options) !== void 0;
@@ -659,7 +438,7 @@ function planLibraryInstall(entry, options = {}) {
659
438
  if (entry.sha256 && sha2562 !== entry.sha256) throw new Error(`plugin_pin_mismatch: ${entry.name}`);
660
439
  return {
661
440
  entry: { ...entry, ...candidate.manifest.version ? { version: candidate.manifest.version } : {} },
662
- path: path3.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
441
+ path: path2.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
663
442
  sha256: sha2562,
664
443
  sourceRoot: fetched.root,
665
444
  cleanup: fetched.cleanup,
@@ -823,7 +602,7 @@ async function syncLibrary(direction, runner = runCommandVector) {
823
602
  const settings = readSettings().integrations.library;
824
603
  if (!settings.sync) throw new Error("library_sync_disabled");
825
604
  const remote = confirmedRemote();
826
- const cwd = path3.dirname(catalogPath());
605
+ const cwd = path2.dirname(catalogPath());
827
606
  const remoteResult = await runner("git", ["remote", "get-url", "library"], { cwd, workspaceRoot: cwd });
828
607
  if (remoteResult.exitCode !== 0 || remoteResult.stdout.trim() !== remote)
829
608
  throw new Error("library_remote_unconfirmed");
@@ -841,14 +620,14 @@ async function syncLibrary(direction, runner = runCommandVector) {
841
620
  // src/domains/resources/skills/marketplace.ts
842
621
  init_esm_shims();
843
622
  import { existsSync as existsSync4, readdirSync as readdirSync2, readFileSync as readFileSync4 } from "node:fs";
844
- import path5 from "node:path";
623
+ import path4 from "node:path";
845
624
 
846
625
  // src/domains/resources/skills/loader.ts
847
626
  init_esm_shims();
848
627
  import { createHash } from "node:crypto";
849
628
  import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync3, realpathSync as realpathSync2 } from "node:fs";
850
629
  import { homedir as homedir2 } from "node:os";
851
- import path4 from "node:path";
630
+ import path3 from "node:path";
852
631
  var MAX_NAME_LENGTH = 64;
853
632
  var MAX_DESCRIPTION_LENGTH = 1024;
854
633
  var MAX_SKILL_BYTES = 1024 * 1024;
@@ -908,7 +687,7 @@ function defaultSkillRoots(input = {}) {
908
687
  for (const kind of INTEROP_AGENT_KINDS) {
909
688
  if (kind.userSkillRoot === void 0 || kind.skillSource === void 0) continue;
910
689
  roots.push({
911
- path: path4.join(home, kind.userSkillRoot),
690
+ path: path3.join(home, kind.userSkillRoot),
912
691
  scope: "user",
913
692
  source: kind.skillSource,
914
693
  origin: `${kind.skillSource}-user`,
@@ -919,7 +698,7 @@ function defaultSkillRoots(input = {}) {
919
698
  }
920
699
  if (configDir) {
921
700
  roots.push({
922
- path: path4.join(configDir, "skills"),
701
+ path: path3.join(configDir, "skills"),
923
702
  scope: "user",
924
703
  source: "clio-coder",
925
704
  origin: "config",
@@ -931,7 +710,7 @@ function defaultSkillRoots(input = {}) {
931
710
  for (const kind of INTEROP_AGENT_KINDS) {
932
711
  if (kind.projectSkillRoot === void 0 || kind.skillSource === void 0) continue;
933
712
  roots.push({
934
- path: path4.join(cwd, kind.projectSkillRoot),
713
+ path: path3.join(cwd, kind.projectSkillRoot),
935
714
  scope: "project",
936
715
  source: kind.skillSource,
937
716
  origin: `${kind.skillSource}-project`,
@@ -941,7 +720,7 @@ function defaultSkillRoots(input = {}) {
941
720
  });
942
721
  }
943
722
  roots.push({
944
- path: path4.join(cwd, ".clio-coder", "skills"),
723
+ path: path3.join(cwd, ".clio-coder", "skills"),
945
724
  scope: "project",
946
725
  source: "clio-coder",
947
726
  origin: "project",
@@ -1015,7 +794,7 @@ function declaredToolSurface(frontmatter, key, filePath, diagnostics) {
1015
794
  return tools.length > 0 ? tools : void 0;
1016
795
  }
1017
796
  function validationSubject(filePath) {
1018
- return path4.basename(filePath) === "SKILL.md" ? path4.basename(path4.dirname(filePath)) : path4.basename(filePath, ".md");
797
+ return path3.basename(filePath) === "SKILL.md" ? path3.basename(path3.dirname(filePath)) : path3.basename(filePath, ".md");
1019
798
  }
1020
799
  function validateNameFormat(name) {
1021
800
  const errors = [];
@@ -1100,11 +879,11 @@ function canonicalizePath(filePath) {
1100
879
  try {
1101
880
  return realpathSync2.native(filePath);
1102
881
  } catch {
1103
- return path4.resolve(filePath);
882
+ return path3.resolve(filePath);
1104
883
  }
1105
884
  }
1106
885
  function pathIsInside(candidate, anchor) {
1107
- return candidate === anchor || candidate.startsWith(anchor + path4.sep);
886
+ return candidate === anchor || candidate.startsWith(anchor + path3.sep);
1108
887
  }
1109
888
  function containmentAnchor(root) {
1110
889
  if (root.containment === void 0) return null;
@@ -1190,7 +969,7 @@ function loadSkillFile(filePath, root) {
1190
969
  }
1191
970
  for (const message of validateNameFormat(name)) diagnostics.push({ type: "warning", message, path: filePath });
1192
971
  if (!description) return { candidate: null, diagnostics };
1193
- const baseDir = path4.dirname(filePath);
972
+ const baseDir = path3.dirname(filePath);
1194
973
  const scope = root.scope;
1195
974
  const sourceInfo = {
1196
975
  path: filePath,
@@ -1246,7 +1025,7 @@ function collectSkills(root, dir, diagnostics, includeRootFiles, anchor = contai
1246
1025
  }
1247
1026
  const skillEntry = entries.find((entry) => entry.name === "SKILL.md" && entry.isFile());
1248
1027
  if (skillEntry) {
1249
- const skillPath = path4.join(dir, skillEntry.name);
1028
+ const skillPath = path3.join(dir, skillEntry.name);
1250
1029
  if (escapesContainment(skillPath, anchor, diagnostics)) return [];
1251
1030
  const loaded = loadSkillFile(skillPath, root);
1252
1031
  diagnostics.push(...loaded.diagnostics);
@@ -1255,8 +1034,8 @@ function collectSkills(root, dir, diagnostics, includeRootFiles, anchor = contai
1255
1034
  const candidates = [];
1256
1035
  for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
1257
1036
  if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
1258
- const fullPath = path4.join(dir, entry.name);
1259
- if (entry.isDirectory() || entry.isSymbolicLink() && existsSync3(path4.join(fullPath, "SKILL.md"))) {
1037
+ const fullPath = path3.join(dir, entry.name);
1038
+ if (entry.isDirectory() || entry.isSymbolicLink() && existsSync3(path3.join(fullPath, "SKILL.md"))) {
1260
1039
  candidates.push(...collectSkills(root, fullPath, diagnostics, false, anchor));
1261
1040
  continue;
1262
1041
  }
@@ -1284,15 +1063,15 @@ function explicitSkillRoot(filePath) {
1284
1063
  };
1285
1064
  }
1286
1065
  function loadExplicitSkillPath(inputPath, diagnostics, packageRoots, cwd) {
1287
- const resolved = path4.resolve(inputPath);
1066
+ const resolved = path3.resolve(inputPath);
1288
1067
  const identity = canonicalizePath(resolved);
1289
1068
  const owner = packageRoots.find((candidate) => {
1290
- const relative = path4.relative(canonicalizePath(candidate.path), identity);
1291
- return relative !== ".." && !relative.startsWith(`..${path4.sep}`) && !path4.isAbsolute(relative);
1069
+ const relative = path3.relative(canonicalizePath(candidate.path), identity);
1070
+ return relative !== ".." && !relative.startsWith(`..${path3.sep}`) && !path3.isAbsolute(relative);
1292
1071
  });
1293
1072
  if (!owner && ["user", "project"].some((scope) => {
1294
- const relative = path4.relative(canonicalizePath(pluginBaseDir(scope, cwd)), identity);
1295
- return relative !== ".." && !relative.startsWith(`..${path4.sep}`) && !path4.isAbsolute(relative);
1073
+ const relative = path3.relative(canonicalizePath(pluginBaseDir(scope, cwd)), identity);
1074
+ return relative !== ".." && !relative.startsWith(`..${path3.sep}`) && !path3.isAbsolute(relative);
1296
1075
  })) {
1297
1076
  diagnostics.push({
1298
1077
  type: "warning",
@@ -1313,7 +1092,7 @@ function loadExplicitSkillPath(inputPath, diagnostics, packageRoots, cwd) {
1313
1092
  diagnostics.push({ type: "warning", message: `explicit skill path does not exist: ${resolved}`, path: resolved });
1314
1093
  return [];
1315
1094
  }
1316
- const skillFile = path4.basename(resolved) === "SKILL.md" || resolved.endsWith(".md") ? resolved : path4.join(resolved, "SKILL.md");
1095
+ const skillFile = path3.basename(resolved) === "SKILL.md" || resolved.endsWith(".md") ? resolved : path3.join(resolved, "SKILL.md");
1317
1096
  if (!existsSync3(skillFile)) {
1318
1097
  const packages = collectSkills(root, resolved, diagnostics, false);
1319
1098
  if (packages.length > 0) return packages;
@@ -1532,21 +1311,21 @@ function parsePendingSkillRequests(input, skills, options = {}) {
1532
1311
  var MARKETPLACE_UNCONFIGURED = "no local skill marketplace catalog or index configured";
1533
1312
  function packageCatalogDir() {
1534
1313
  try {
1535
- return path5.join(resolvePackageRoot(), "library", "skills");
1314
+ return path4.join(resolvePackageRoot(), "library", "skills");
1536
1315
  } catch {
1537
1316
  return null;
1538
1317
  }
1539
1318
  }
1540
1319
  function packageIndexPath() {
1541
1320
  try {
1542
- return path5.join(resolvePackageRoot(), "library", "skills", "skill-marketplace.json");
1321
+ return path4.join(resolvePackageRoot(), "library", "skills", "skill-marketplace.json");
1543
1322
  } catch {
1544
1323
  return null;
1545
1324
  }
1546
1325
  }
1547
1326
  function defaultIndexPath() {
1548
1327
  try {
1549
- const configured = path5.join(clioConfigDir(), "skill-marketplace.json");
1328
+ const configured = path4.join(clioConfigDir(), "skill-marketplace.json");
1550
1329
  if (existsSync4(configured)) return configured;
1551
1330
  } catch {
1552
1331
  }
@@ -1590,7 +1369,7 @@ function parseMarketplaceIndex(indexPath, diagnostics = []) {
1590
1369
  const kind = record.kind === "agent" || record.kind === "prompt" || record.kind === "fleet" ? record.kind : "skill";
1591
1370
  const requires = Array.isArray(record.requires) ? record.requires.filter((entry) => typeof entry === "string") : void 0;
1592
1371
  const overlay = optionalString(record.overlay);
1593
- if (overlay && (path5.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
1372
+ if (overlay && (path4.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
1594
1373
  diagnostics.push(`skill marketplace index entry has an overlay outside the package: ${skill.name}`);
1595
1374
  return [];
1596
1375
  }
@@ -1622,11 +1401,11 @@ function looksLikeSkillCatalog(dir) {
1622
1401
  try {
1623
1402
  return readdirSync2(dir, { withFileTypes: true }).some((entry) => {
1624
1403
  if (!entry.isDirectory()) return false;
1625
- const child = path5.join(dir, entry.name);
1626
- if (existsSync4(path5.join(child, "SKILL.md"))) return true;
1404
+ const child = path4.join(dir, entry.name);
1405
+ if (existsSync4(path4.join(child, "SKILL.md"))) return true;
1627
1406
  try {
1628
1407
  return readdirSync2(child, { withFileTypes: true }).some(
1629
- (inner) => inner.isDirectory() && existsSync4(path5.join(child, inner.name, "SKILL.md"))
1408
+ (inner) => inner.isDirectory() && existsSync4(path4.join(child, inner.name, "SKILL.md"))
1630
1409
  );
1631
1410
  } catch {
1632
1411
  return false;
@@ -1638,19 +1417,19 @@ function looksLikeSkillCatalog(dir) {
1638
1417
  }
1639
1418
  function resolveCatalogDir(options) {
1640
1419
  if (options.catalogDir === null) return null;
1641
- if (options.catalogDir) return path5.resolve(options.catalogDir);
1420
+ if (options.catalogDir) return path4.resolve(options.catalogDir);
1642
1421
  const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
1643
- if (fromEnv && fromEnv.trim().length > 0) return path5.resolve(fromEnv.trim());
1644
- const repoLibraryCatalog = path5.join(options.cwd ?? process.cwd(), "library", "skills");
1422
+ if (fromEnv && fromEnv.trim().length > 0) return path4.resolve(fromEnv.trim());
1423
+ const repoLibraryCatalog = path4.join(options.cwd ?? process.cwd(), "library", "skills");
1645
1424
  if (looksLikeSkillCatalog(repoLibraryCatalog)) return repoLibraryCatalog;
1646
- const repoCatalog = path5.join(options.cwd ?? process.cwd(), "skills");
1425
+ const repoCatalog = path4.join(options.cwd ?? process.cwd(), "skills");
1647
1426
  if (looksLikeSkillCatalog(repoCatalog)) return repoCatalog;
1648
1427
  const bundled = packageCatalogDir();
1649
1428
  return bundled && looksLikeSkillCatalog(bundled) ? bundled : null;
1650
1429
  }
1651
1430
  function catalogCategory(catalogDir, baseDir) {
1652
- const rel = path5.relative(catalogDir, baseDir);
1653
- const category = path5.dirname(rel);
1431
+ const rel = path4.relative(catalogDir, baseDir);
1432
+ const category = path4.dirname(rel);
1654
1433
  if (rel.length === 0 || rel.startsWith("..") || category === "." || category.startsWith("..")) return void 0;
1655
1434
  return category;
1656
1435
  }
@@ -1713,7 +1492,7 @@ function getMarketplaceSkills(options = {}) {
1713
1492
  }
1714
1493
  function marketplaceInstallShaping(skill) {
1715
1494
  const shaping = {};
1716
- if (skill.overlay) shaping.overlay = path5.join(resolvePackageRoot(), skill.overlay);
1495
+ if (skill.overlay) shaping.overlay = path4.join(resolvePackageRoot(), skill.overlay);
1717
1496
  if (skill.exclude && skill.exclude.length > 0) shaping.exclude = [...skill.exclude];
1718
1497
  return shaping;
1719
1498
  }
@@ -1754,9 +1533,228 @@ function installSkill(input) {
1754
1533
  };
1755
1534
  }
1756
1535
 
1536
+ // src/domains/agents/recipe.ts
1537
+ init_esm_shims();
1538
+ import path5 from "node:path";
1539
+ var AGENT_BUDGET_KEYS = ["toolCalls", "readReserve", "synthesis", "maximum"];
1540
+ function parseAgentBudgetPhase(value, prefix, relationTarget) {
1541
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
1542
+ throw new Error(`${prefix} must be a non-null YAML object`);
1543
+ }
1544
+ const record = value;
1545
+ for (const key of Object.keys(record)) {
1546
+ if (key !== "toolCalls" && key !== "readReserve") throw new Error(`${prefix}.${key} is unknown`);
1547
+ }
1548
+ for (const key of ["toolCalls", "readReserve"]) {
1549
+ if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
1550
+ }
1551
+ const toolCalls = record.toolCalls;
1552
+ if (typeof toolCalls !== "number" || !Number.isSafeInteger(toolCalls)) {
1553
+ throw new Error(`${prefix}.toolCalls must be a finite safe integer`);
1554
+ }
1555
+ if (toolCalls <= 0) throw new Error(`${prefix}.toolCalls must be greater than 0`);
1556
+ const readReserve = record.readReserve;
1557
+ if (typeof readReserve !== "number" || !Number.isSafeInteger(readReserve)) {
1558
+ throw new Error(`${prefix}.readReserve must be a finite safe integer`);
1559
+ }
1560
+ if (readReserve < 0) throw new Error(`${prefix}.readReserve must be greater than or equal to 0`);
1561
+ if (readReserve >= toolCalls) throw new Error(`${prefix}.readReserve must be less than ${relationTarget}`);
1562
+ return { toolCalls, readReserve };
1563
+ }
1564
+ function parseAgentBudget(value, sourcePath) {
1565
+ if (value === void 0) return void 0;
1566
+ const prefix = `agent budget: ${sourcePath}: budget`;
1567
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
1568
+ throw new Error(`${prefix} must be a non-null YAML object`);
1569
+ }
1570
+ const record = value;
1571
+ for (const key of Object.keys(record)) {
1572
+ if (!AGENT_BUDGET_KEYS.includes(key)) {
1573
+ throw new Error(`${prefix}.${key} is unknown`);
1574
+ }
1575
+ }
1576
+ for (const key of ["toolCalls", "readReserve", "synthesis"]) {
1577
+ if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
1578
+ }
1579
+ const phase = parseAgentBudgetPhase(
1580
+ { toolCalls: record.toolCalls, readReserve: record.readReserve },
1581
+ prefix,
1582
+ "budget.toolCalls"
1583
+ );
1584
+ const synthesis = record.synthesis;
1585
+ if (typeof synthesis !== "boolean") throw new Error(`${prefix}.synthesis must be a boolean`);
1586
+ const maximum = record.maximum === void 0 ? void 0 : parseAgentBudgetPhase(record.maximum, `${prefix}.maximum`, "budget.maximum.toolCalls");
1587
+ if (maximum !== void 0) {
1588
+ if (maximum.toolCalls < phase.toolCalls) {
1589
+ throw new Error(`${prefix}.maximum.toolCalls must be greater than or equal to budget.toolCalls`);
1590
+ }
1591
+ if (maximum.readReserve < phase.readReserve) {
1592
+ throw new Error(`${prefix}.maximum.readReserve must be greater than or equal to budget.readReserve`);
1593
+ }
1594
+ }
1595
+ return { ...phase, synthesis, ...maximum === void 0 ? {} : { maximum } };
1596
+ }
1597
+ function recipeIdFromPath(absPath, rootDir) {
1598
+ const resolvedRoot = path5.resolve(rootDir);
1599
+ const resolvedPath = path5.resolve(absPath);
1600
+ const relPath = path5.relative(resolvedRoot, resolvedPath);
1601
+ if (relPath === "" || relPath.startsWith("..") || path5.isAbsolute(relPath)) {
1602
+ throw new Error(`recipe: path must live under rootDir (${resolvedPath} not under ${resolvedRoot})`);
1603
+ }
1604
+ if (path5.dirname(relPath) !== ".") {
1605
+ throw new Error(`recipe: recipes must live directly under rootDir (${resolvedPath})`);
1606
+ }
1607
+ if (path5.extname(relPath) !== ".md") {
1608
+ throw new Error(`recipe: recipe files must end in .md (${resolvedPath})`);
1609
+ }
1610
+ const id = path5.basename(relPath, ".md");
1611
+ if (id === "") {
1612
+ throw new Error(`recipe: recipe filename must not be empty (${resolvedPath})`);
1613
+ }
1614
+ return id;
1615
+ }
1616
+
1617
+ // src/domains/agents/recipe-schema.ts
1618
+ init_esm_shims();
1619
+ var RECIPE_KEYS = [
1620
+ "version",
1621
+ "name",
1622
+ "description",
1623
+ "tools",
1624
+ "skills",
1625
+ "audience",
1626
+ "category",
1627
+ "capabilityClass",
1628
+ "latencyClass",
1629
+ "projectContextTier",
1630
+ "budget",
1631
+ "resultContract",
1632
+ "tags"
1633
+ ];
1634
+ var OPTIONAL_RECIPE_KEYS = ["product"];
1635
+ var ALL_RECIPE_KEYS = [...RECIPE_KEYS, ...OPTIONAL_RECIPE_KEYS];
1636
+ function requiredString(value, path6) {
1637
+ if (typeof value !== "string" || value.trim().length === 0)
1638
+ throw new Error(`agent recipe: ${path6} must be a non-empty string`);
1639
+ return value;
1640
+ }
1641
+ function requiredStringArray(value, path6) {
1642
+ if (!Array.isArray(value)) throw new Error(`agent recipe: ${path6} must be an array of strings`);
1643
+ const entries = value.map((entry, index) => requiredString(entry, `${path6}[${index}]`));
1644
+ if (new Set(entries).size !== entries.length) throw new Error(`agent recipe: ${path6} must not contain duplicates`);
1645
+ return entries;
1646
+ }
1647
+ function enumValue(value, path6, predicate) {
1648
+ if (!predicate(value)) throw new Error(`agent recipe: ${path6} has an unsupported value`);
1649
+ return value;
1650
+ }
1651
+ function parseAudience(value, source, filepath) {
1652
+ const audience = enumValue(value, `${filepath}: audience`, isAgentAudience);
1653
+ if (source === "builtin") {
1654
+ if (audience === "custom") {
1655
+ throw new Error(`agent recipe: ${filepath}: a builtin recipe must not declare audience 'custom'`);
1656
+ }
1657
+ return audience;
1658
+ }
1659
+ if (audience !== "custom") {
1660
+ throw new Error(
1661
+ `agent recipe: ${filepath}: a ${source} recipe must declare audience 'custom', not '${audience}'; audience follows where the recipe was discovered and cannot be claimed in frontmatter`
1662
+ );
1663
+ }
1664
+ return audience;
1665
+ }
1666
+ function parseTools(value, filepath) {
1667
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
1668
+ throw new Error(`agent recipe: ${filepath}: tools must be a { required, optional } object`);
1669
+ }
1670
+ const record = value;
1671
+ if (Object.keys(record).some((key) => key !== "required" && key !== "optional")) {
1672
+ throw new Error(`agent recipe: ${filepath}: tools has an unknown key`);
1673
+ }
1674
+ if (!("required" in record) || !("optional" in record)) {
1675
+ throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional are required`);
1676
+ }
1677
+ if (!Array.isArray(record.required) || !Array.isArray(record.optional)) {
1678
+ throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional must be arrays`);
1679
+ }
1680
+ const required = record.required.map((entry, index) => {
1681
+ const entryPath = `${filepath}: tools.required[${index}]`;
1682
+ if (typeof entry === "string") return requiredString(entry, entryPath);
1683
+ if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
1684
+ throw new Error(`agent recipe: ${entryPath} must be a tool name or { anyOf: [...] }`);
1685
+ }
1686
+ const group = entry;
1687
+ if (Object.keys(group).length !== 1 || !("anyOf" in group)) {
1688
+ throw new Error(`agent recipe: ${entryPath} must contain only anyOf`);
1689
+ }
1690
+ const anyOf = requiredStringArray(group.anyOf, `${entryPath}.anyOf`);
1691
+ if (anyOf.length === 0) throw new Error(`agent recipe: ${entryPath}.anyOf must not be empty`);
1692
+ return { anyOf };
1693
+ });
1694
+ const optional = requiredStringArray(record.optional, `${filepath}: tools.optional`);
1695
+ const tools = [
1696
+ ...required.flatMap((requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf),
1697
+ ...optional
1698
+ ];
1699
+ if (new Set(tools).size !== tools.length)
1700
+ throw new Error(`agent recipe: ${filepath}: tools contains duplicate requirements`);
1701
+ return { tools, toolRequirements: { required, optional } };
1702
+ }
1703
+ function parseAgentRecipeSchema(input) {
1704
+ const { frontmatter, filepath } = input;
1705
+ for (const key of Object.keys(frontmatter)) {
1706
+ if (!ALL_RECIPE_KEYS.includes(key)) {
1707
+ throw new Error(`agent recipe: ${filepath}: unknown key '${key}'`);
1708
+ }
1709
+ }
1710
+ for (const key of RECIPE_KEYS) {
1711
+ if (!(key in frontmatter)) throw new Error(`agent recipe: ${filepath}: ${key} is required`);
1712
+ }
1713
+ if (frontmatter.version !== 1) throw new Error(`agent recipe: ${filepath}: version must be the supported integer 1`);
1714
+ if (input.body.trim().length === 0) throw new Error(`agent recipe: ${filepath}: persona body must not be empty`);
1715
+ const parsedTools = parseTools(frontmatter.tools, filepath);
1716
+ const budget = parseAgentBudget(frontmatter.budget, filepath);
1717
+ if (budget === void 0) throw new Error(`agent recipe: ${filepath}: budget is required`);
1718
+ return {
1719
+ version: 1,
1720
+ id: input.id,
1721
+ name: requiredString(frontmatter.name, `${filepath}: name`),
1722
+ description: requiredString(frontmatter.description, `${filepath}: description`),
1723
+ tools: parsedTools.tools,
1724
+ toolRequirements: parsedTools.toolRequirements,
1725
+ skills: requiredStringArray(frontmatter.skills, `${filepath}: skills`),
1726
+ boundSkillPaths: [],
1727
+ audience: parseAudience(frontmatter.audience, input.source, filepath),
1728
+ category: enumValue(frontmatter.category, `${filepath}: category`, isAgentCategory),
1729
+ capabilityClass: enumValue(
1730
+ frontmatter.capabilityClass,
1731
+ `${filepath}: capabilityClass`,
1732
+ isAgentCapabilityClass
1733
+ ),
1734
+ latencyClass: enumValue(
1735
+ frontmatter.latencyClass,
1736
+ `${filepath}: latencyClass`,
1737
+ isAgentLatencyClass
1738
+ ),
1739
+ projectContextTier: enumValue(
1740
+ frontmatter.projectContextTier,
1741
+ `${filepath}: projectContextTier`,
1742
+ isAgentProjectContextTier
1743
+ ),
1744
+ budget,
1745
+ resultContract: parseResultContract(frontmatter.resultContract, filepath),
1746
+ // Optional, but not lenient. A misspelled product silently costs the run
1747
+ // the delivery tools its reserve window was supposed to keep, and the
1748
+ // only symptom is a blocked tool call deep in a dispatch log.
1749
+ ...frontmatter.product === void 0 ? {} : { product: enumValue(frontmatter.product, `${filepath}: product`, isAgentProduct) },
1750
+ tags: requiredStringArray(frontmatter.tags, `${filepath}: tags`),
1751
+ source: input.source,
1752
+ filepath,
1753
+ body: input.body
1754
+ };
1755
+ }
1756
+
1757
1757
  export {
1758
- recipeIdFromPath,
1759
- parseAgentRecipeSchema,
1760
1758
  parsePluginGithubSource,
1761
1759
  pluginLocalPath,
1762
1760
  fetchPluginSource,
@@ -1796,6 +1794,8 @@ export {
1796
1794
  SKILL_SURFACE_CLEAR_ARG,
1797
1795
  parseSkillCommand,
1798
1796
  expandSkillInvocationInput,
1799
- parsePendingSkillRequests
1797
+ parsePendingSkillRequests,
1798
+ recipeIdFromPath,
1799
+ parseAgentRecipeSchema
1800
1800
  };
1801
- //# sourceMappingURL=chunk-EXKUF426.js.map
1801
+ //# sourceMappingURL=chunk-7FBCRWVT.js.map