@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
@@ -1,14 +1,25 @@
1
- import { realpathSync } from "node:fs";
2
- import { resolve } from "node:path";
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstatSync, readlinkSync, realpathSync } from "node:fs";
3
+ import { lstat, mkdir, open, readlink, realpath, rename, stat, unlink } from "node:fs/promises";
4
+ import { basename, dirname, join, resolve } from "node:path";
3
5
 
4
6
  const fileMutationQueues = new Map<string, Promise<void>>();
5
7
 
6
- function mutationQueueKey(filePath: string): string {
8
+ function mutationQueueKey(filePath: string, depth = 0): string {
7
9
  const resolved = resolve(filePath);
10
+ if (depth > 40) throw new Error("Too many symbolic links");
8
11
  try {
9
12
  return realpathSync.native(resolved);
10
13
  } catch {
11
- return resolved;
14
+ try {
15
+ if (lstatSync(resolved).isSymbolicLink()) {
16
+ return mutationQueueKey(resolve(dirname(resolved), readlinkSync(resolved)), depth + 1);
17
+ }
18
+ } catch {
19
+ // Missing paths still share a key through the nearest real ancestor.
20
+ }
21
+ const parent = dirname(resolved);
22
+ return parent === resolved ? resolved : join(mutationQueueKey(parent, depth), basename(resolved));
12
23
  }
13
24
  }
14
25
 
@@ -33,3 +44,102 @@ export async function withFileMutationQueue<T>(filePath: string, fn: () => Promi
33
44
  }
34
45
  }
35
46
  }
47
+
48
+ export interface FileIdentity {
49
+ bytes: number;
50
+ mtimeMs: number;
51
+ }
52
+
53
+ export interface AtomicPublishResult {
54
+ before: FileIdentity | null;
55
+ after: FileIdentity;
56
+ /** Publication succeeded, but directory durability could not be confirmed. */
57
+ durabilityWarning?: string;
58
+ }
59
+
60
+ export interface AtomicPublishOptions {
61
+ /** Test seam. Must either perform the rename or throw before publishing. */
62
+ rename?: (tempPath: string, targetPath: string) => Promise<void>;
63
+ }
64
+
65
+ async function resolvePublishTarget(filePath: string, depth = 0): Promise<string> {
66
+ if (depth > 40) throw new Error("Too many symbolic links");
67
+ const absolute = resolve(filePath);
68
+ try {
69
+ const info = await lstat(absolute);
70
+ if (info.isSymbolicLink()) {
71
+ return resolvePublishTarget(resolve(dirname(absolute), await readlink(absolute)), depth + 1);
72
+ }
73
+ if (!info.isFile()) throw new Error(`Refusing non-file target (including directories): ${filePath}`);
74
+ } catch (error) {
75
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
76
+ }
77
+ await mkdir(dirname(absolute), { recursive: true });
78
+ return join(await realpath(dirname(absolute)), basename(absolute));
79
+ }
80
+
81
+ /**
82
+ * Atomically replaces the resolved target, preserving symlinks and existing mode bits.
83
+ * Call inside withFileMutationQueue when a read/modify/write transaction is needed.
84
+ * External writers are not locked; the last rename wins. Atomicity and durability
85
+ * depend on the filesystem's rename/fsync guarantees, including on shared storage.
86
+ * Ownership, timestamps, ACLs, and extended attributes are not copied.
87
+ */
88
+ export async function publishFileAtomically(
89
+ filePath: string,
90
+ content: string | Uint8Array,
91
+ options: AtomicPublishOptions = {},
92
+ ): Promise<AtomicPublishResult> {
93
+ let tempPath: string | undefined;
94
+ try {
95
+ const target = await resolvePublishTarget(filePath);
96
+ const previous = await stat(target).catch((error: NodeJS.ErrnoException) => {
97
+ if (error.code === "ENOENT") return null;
98
+ throw error;
99
+ });
100
+ if (previous && !previous.isFile()) throw new Error(`Refusing directory or non-file target: ${filePath}`);
101
+ tempPath = join(dirname(target), `.clio-coder-publish-${randomUUID()}.tmp`);
102
+ const handle = await open(tempPath, "wx", previous ? previous.mode & 0o7777 : 0o666);
103
+ let after: FileIdentity;
104
+ try {
105
+ await handle.writeFile(content);
106
+ if (previous) await handle.chmod(previous.mode & 0o7777);
107
+ await handle.sync();
108
+ const info = await handle.stat();
109
+ after = { bytes: info.size, mtimeMs: info.mtimeMs };
110
+ } finally {
111
+ await handle.close();
112
+ }
113
+ await (options.rename ?? rename)(tempPath, target);
114
+ tempPath = undefined;
115
+ const result: AtomicPublishResult = {
116
+ before: previous ? { bytes: previous.size, mtimeMs: previous.mtimeMs } : null,
117
+ after,
118
+ };
119
+ // Rename is the commit point. A later durability failure cannot honestly
120
+ // be described as an unpublished write or safely rolled back over other writers.
121
+ try {
122
+ const directory = await open(dirname(target), "r");
123
+ try {
124
+ await directory.sync();
125
+ } finally {
126
+ await directory.close();
127
+ }
128
+ } catch (error) {
129
+ result.durabilityWarning = `Published, but directory fsync was unavailable or failed: ${String(error)}`;
130
+ }
131
+ return result;
132
+ } catch (error) {
133
+ let cleanup = "";
134
+ if (tempPath) {
135
+ try {
136
+ await unlink(tempPath);
137
+ } catch (cleanupError) {
138
+ if ((cleanupError as NodeJS.ErrnoException).code !== "ENOENT") {
139
+ cleanup = ` Temporary file cleanup failed at ${tempPath}: ${String(cleanupError)}`;
140
+ }
141
+ }
142
+ }
143
+ throw new Error(`Nothing was published: ${String(error)}.${cleanup}`, { cause: error });
144
+ }
145
+ }
package/src/tools/find.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { existsSync, statSync } from "node:fs";
2
2
  import { readdir } from "node:fs/promises";
3
- import { join, relative } from "node:path";
3
+ import { join, relative, resolve } from "node:path";
4
4
  import { Type } from "typebox";
5
5
  import { ToolNames } from "../core/tool-names.js";
6
6
  import { StringEnum } from "../engine/ai.js";
@@ -18,7 +18,16 @@ import {
18
18
  } from "./observation.js";
19
19
  import { resolveReadPath, toPosixPath } from "./path-utils.js";
20
20
  import type { ToolInvokeOptions, ToolResult, ToolSpec } from "./registry.js";
21
- import { SEARCH_SPAWN_TIMEOUT_MS, spawnLineStream, validateSearchPatternSize } from "./spawn-hygiene.js";
21
+ import {
22
+ createSearchDiagnostics,
23
+ finishSearch,
24
+ newSearchCompleteness,
25
+ type SearchCompleteness,
26
+ searchNotice,
27
+ skipSearchPath,
28
+ spawnLineStream,
29
+ validateSearchPatternSize,
30
+ } from "./spawn-hygiene.js";
22
31
  import { truncateHead } from "./truncate.js";
23
32
 
24
33
  const DEFAULT_LIMIT = 500;
@@ -32,9 +41,9 @@ type FindOrder = "path" | "mtime";
32
41
  // Build fd's argv. Ignore semantics (hidden files, .gitignore honoring,
33
42
  // generated-dir excludes, include_ignored) come entirely from the shared
34
43
  // ignore policy so grep and find never disagree about tree visibility.
35
- function buildFdArgs(pattern: string, searchPath: string, maxResults: number, includeIgnored: boolean): string[] {
44
+ function buildFdArgs(pattern: string, searchPath: string, collectLimit: number, includeIgnored: boolean): string[] {
36
45
  const args = ["--glob", "--color=never", ...fdIgnoreArgs(searchPath, includeIgnored)];
37
- args.push("--max-results", String(maxResults));
46
+ args.push("--show-errors", "--max-results", String(collectLimit));
38
47
  let effectivePattern = pattern;
39
48
  if (pattern.includes("/")) {
40
49
  args.push("--full-path");
@@ -52,33 +61,45 @@ async function fdFind(
52
61
  searchPath: string,
53
62
  collectLimit: number,
54
63
  includeIgnored: boolean,
64
+ search: SearchCompleteness,
65
+ allows: (path: string) => boolean,
55
66
  signal?: AbortSignal,
56
67
  ): Promise<{ ok: true; paths: string[] } | { ok: false; message: string }> {
57
68
  const lines: string[] = [];
69
+ const diagnostics = createSearchDiagnostics(search, (path) => allows(resolve(process.cwd(), path)));
58
70
  const result = await spawnLineStream(fdPath, buildFdArgs(pattern, searchPath, collectLimit, includeIgnored), {
59
71
  ...(signal ? { signal } : {}),
72
+ onStderrLine: diagnostics.onLine,
60
73
  onLine(line, stop) {
61
74
  lines.push(line);
62
75
  if (lines.length >= collectLimit) stop();
63
76
  },
64
77
  });
65
- if (result.aborted) return { ok: false, message: "find: operation aborted" };
66
- if (result.timedOut) {
78
+ finishSearch(search, result);
79
+ if (!result.aborted && !result.timedOut && !result.stoppedEarly && result.exitCode !== 0) {
80
+ search.complete = false;
81
+ search.reason = "errors";
82
+ }
83
+ if (result.spawnError !== null) return { ok: false, message: `find: failed to run fd: ${result.spawnError}` };
84
+ if (
85
+ !result.aborted &&
86
+ !result.timedOut &&
87
+ !result.stoppedEarly &&
88
+ result.exitCode !== 0 &&
89
+ lines.length === 0 &&
90
+ (diagnostics.realError || (search.skipped.count === 0 && !search.skipped.unknown))
91
+ ) {
67
92
  return {
68
93
  ok: false,
69
- message: `find: fd timed out after ${SEARCH_SPAWN_TIMEOUT_MS / 1000}s. Narrow the pattern or path, or lower limit.`,
94
+ message: `find: fd rejected the search or failed (exit code ${result.exitCode}). Check the glob and search path.`,
70
95
  };
71
96
  }
72
- if (result.spawnError !== null) return { ok: false, message: `find: failed to run fd: ${result.spawnError}` };
73
- if (!result.stoppedEarly && result.exitCode !== 0 && lines.length === 0) {
74
- return { ok: false, message: `find: ${result.stderr.trim() || `fd exited with code ${result.exitCode}`}` };
75
- }
76
97
  const paths = lines
77
- .map((rawLine) => rawLine.replace(/\r$/, "").trim())
98
+ .map((rawLine) => rawLine.replace(/\r$/, ""))
78
99
  .filter((line) => line.length > 0)
79
100
  .map((line) => {
80
101
  const hadTrailingSlash = line.endsWith("/") || line.endsWith("\\");
81
- let relPath = line.startsWith(searchPath) ? line.slice(searchPath.length + 1) : relative(searchPath, line);
102
+ let relPath = relative(searchPath, line);
82
103
  if (hadTrailingSlash && !relPath.endsWith("/")) relPath += "/";
83
104
  return toPosixPath(relPath);
84
105
  });
@@ -94,6 +115,8 @@ async function fallbackFind(
94
115
  searchPath: string,
95
116
  collectLimit: number,
96
117
  includeIgnored: boolean,
118
+ search: SearchCompleteness,
119
+ allows: (path: string) => boolean,
97
120
  signal?: AbortSignal,
98
121
  ): Promise<string[]> {
99
122
  const matcher = compileGlobRegex(pattern.includes("/") ? pattern : `**/${pattern}`);
@@ -105,11 +128,13 @@ async function fallbackFind(
105
128
  try {
106
129
  entries = (await readdir(dir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
107
130
  } catch {
131
+ skipSearchPath(search, dir, allows);
108
132
  return;
109
133
  }
110
134
  for (const entry of entries) {
111
135
  if (out.length >= collectLimit || signal?.aborted) return;
112
136
  const absPath = join(dir, entry.name);
137
+ if (!allows(absPath)) continue;
113
138
  if (entry.isDirectory() && !entry.isSymbolicLink()) {
114
139
  if (ignored.has(entry.name)) continue;
115
140
  const relDir = `${toPosixPath(relative(searchPath, absPath))}/`;
@@ -117,7 +142,13 @@ async function fallbackFind(
117
142
  await walk(absPath);
118
143
  continue;
119
144
  }
120
- if (!entry.isFile()) continue;
145
+ if (entry.isSymbolicLink()) {
146
+ try {
147
+ if (statSync(absPath).isDirectory()) skipSearchPath(search, absPath, allows);
148
+ } catch {
149
+ skipSearchPath(search, absPath, allows);
150
+ }
151
+ } else if (!entry.isFile()) continue;
121
152
  const relPath = toPosixPath(relative(searchPath, absPath));
122
153
  if (matcher.test(normalizeGlobInput(relPath))) out.push(relPath);
123
154
  }
@@ -133,14 +164,21 @@ interface OrderedPaths {
133
164
  candidateCap: number | null;
134
165
  }
135
166
 
136
- function orderByMtime(paths: string[], searchPath: string, limit: number, candidateCap: number): OrderedPaths {
167
+ function orderByMtime(
168
+ paths: string[],
169
+ searchPath: string,
170
+ limit: number,
171
+ candidateCap: number,
172
+ search: SearchCompleteness,
173
+ ): OrderedPaths {
137
174
  const candidateCapHit = paths.length >= candidateCap;
138
175
  const stamped = paths.map((relPath) => {
139
176
  let mtimeMs = 0;
140
177
  try {
141
178
  mtimeMs = statSync(join(searchPath, relPath)).mtimeMs;
142
179
  } catch {
143
- // Entries that vanish mid-scan sort last instead of failing the call.
180
+ // Entries that vanish mid-scan sort last and remain explicitly incomplete.
181
+ skipSearchPath(search, join(searchPath, relPath));
144
182
  }
145
183
  return { relPath, mtimeMs };
146
184
  });
@@ -149,6 +187,8 @@ function orderByMtime(paths: string[], searchPath: string, limit: number, candid
149
187
  }
150
188
 
151
189
  function renderFindResult(input: {
190
+ search: SearchCompleteness;
191
+ fallback: boolean;
152
192
  withheldPaths: number;
153
193
  ordered: OrderedPaths;
154
194
  collected: number;
@@ -158,16 +198,27 @@ function renderFindResult(input: {
158
198
  reservation: ObservationReservation;
159
199
  options: ToolInvokeOptions | undefined;
160
200
  }): ToolResult {
161
- const { ordered, collected, collectLimit, limit, order, reservation, options } = input;
201
+ const { ordered, collected, collectLimit, limit, order, reservation, options, search } = input;
202
+ if ((collected > limit || collected >= collectLimit || ordered.candidateCapHit) && search.complete) {
203
+ search.complete = false;
204
+ search.reason = "limit";
205
+ }
206
+ const coverageNotice = input.fallback
207
+ ? "\n[Fallback search uses GENERATED_DIRS only; .gitignore is not applied.]"
208
+ : "\n[Native fd search: skipped symlinked directories are not counted.]";
162
209
  if (ordered.paths.length === 0) {
163
210
  return finalizeObservation({
164
211
  tool: ToolNames.Find,
165
212
  withheldPaths: input.withheldPaths,
166
213
  unit: "paths",
167
- output: "No visible files found matching pattern",
214
+ output:
215
+ (search.complete ? "No visible files found matching pattern" : "Search incomplete") +
216
+ searchNotice(search, 0, "paths") +
217
+ coverageNotice,
218
+ details: { search, symlinkDirectories: { counted: input.fallback } },
168
219
  shownCount: 0,
169
- totalCount: collected >= collectLimit ? null : 0,
170
- truncated: collected >= collectLimit,
220
+ totalCount: search.complete ? 0 : null,
221
+ truncated: !search.complete,
171
222
  ...(collected >= collectLimit ? { next: `limit=${limit * 2}` } : {}),
172
223
  reservation,
173
224
  ...(options ? { options } : {}),
@@ -181,10 +232,14 @@ function renderFindResult(input: {
181
232
  const limitHit = collected > limit || collected >= collectLimit;
182
233
  // Unknown totals: the collector stopped at its cap, so matches beyond it
183
234
  // exist but were never counted.
184
- const totalKnown = !limitHit && !ordered.candidateCapHit;
185
- const truncated = limitHit || ordered.candidateCapHit || truncation.truncated;
235
+ if (truncation.truncated && search.complete) {
236
+ search.complete = false;
237
+ search.reason = "limit";
238
+ }
239
+ const totalKnown = search.complete;
240
+ const truncated = !search.complete || limitHit || ordered.candidateCapHit || truncation.truncated;
186
241
  const next = limitHit ? `limit=${limit * 2}` : ordered.candidateCapHit ? "order=path" : undefined;
187
- const details: Record<string, unknown> = {};
242
+ const details: Record<string, unknown> = { search, symlinkDirectories: { counted: input.fallback } };
188
243
  if (order === "mtime" && ordered.candidateCap !== null) {
189
244
  details.candidates = {
190
245
  cap: ordered.candidateCap,
@@ -197,7 +252,7 @@ function renderFindResult(input: {
197
252
  tool: ToolNames.Find,
198
253
  withheldPaths: input.withheldPaths,
199
254
  unit: "paths",
200
- output: truncation.content,
255
+ output: truncation.content + searchNotice(search, truncation.outputLines, "paths") + coverageNotice,
201
256
  // Offload only when the byte cap cut collected paths; a bare result
202
257
  // limit continues via `next`, and the offload would duplicate the body.
203
258
  ...(truncation.truncated ? { fullOutput } : {}),
@@ -214,7 +269,7 @@ function renderFindResult(input: {
214
269
  export const findTool: ToolSpec = {
215
270
  name: ToolNames.Find,
216
271
  description:
217
- "Find files and directories by glob pattern (supports *, **, ?, [abc]); returns paths relative to the search directory. Respects .gitignore and skips generated dirs (node_modules, dist, build, ...) unless include_ignored=true. order=path (default) returns fd's native order; order=mtime returns newest first from a bounded candidate set. Truncated results say how to continue and where the full list was saved.",
272
+ "Find files and directories by glob pattern (supports *, **, ?, [abc]); returns paths relative to the search directory. Respects .gitignore and skips generated dirs (node_modules, dist, build, ...) unless include_ignored=true. Symlinked directories are never followed. Only the fallback counts skipped symlinked directories; native fd leaves that count unmeasured, as indicated by details.symlinkDirectories.counted=false. Without fd the fallback uses GENERATED_DIRS only, with no .gitignore support. order=path (default) returns fd's native order; order=mtime returns newest first from a bounded candidate set. Truncated results say how to continue and where the full list was saved.",
218
273
  parameters: Type.Object({
219
274
  pattern: Type.String({ description: "Glob pattern, e.g. 'src/**/*.ts'." }),
220
275
  path: Type.Optional(Type.String({ description: "Directory to search in." })),
@@ -260,28 +315,52 @@ export const findTool: ToolSpec = {
260
315
  commitObservationReservation(reservation);
261
316
  try {
262
317
  let collectedPaths: string[];
318
+ const search = newSearchCompleteness();
319
+ const pathFilter = createObservationPathFilter(process.cwd(), options?.allowsObservationPath);
263
320
  const fdPath = resolveFdBinary();
264
321
  if (fdPath) {
265
- const result = await fdFind(fdPath, pattern, searchPath, collectLimit, includeIgnored, options?.signal);
322
+ const result = await fdFind(
323
+ fdPath,
324
+ pattern,
325
+ searchPath,
326
+ collectLimit,
327
+ includeIgnored,
328
+ search,
329
+ pathFilter.allows,
330
+ options?.signal,
331
+ );
266
332
  if (!result.ok) return { kind: "error", message: result.message };
267
333
  collectedPaths = result.paths;
268
334
  } else {
269
335
  try {
270
- collectedPaths = await fallbackFind(pattern, searchPath, collectLimit, includeIgnored, options?.signal);
336
+ collectedPaths = await fallbackFind(
337
+ pattern,
338
+ searchPath,
339
+ collectLimit,
340
+ includeIgnored,
341
+ search,
342
+ pathFilter.allows,
343
+ options?.signal,
344
+ );
271
345
  } catch (err) {
272
346
  const message = err instanceof Error ? err.message : String(err);
273
347
  return { kind: "error", message: `find: ${message}` };
274
348
  }
275
349
  }
276
350
 
351
+ if (options?.signal?.aborted) {
352
+ search.complete = false;
353
+ search.reason = "cancelled";
354
+ }
277
355
  const collectedCount = collectedPaths.length;
278
- const pathFilter = createObservationPathFilter(process.cwd(), options?.allowsObservationPath);
279
356
  collectedPaths = collectedPaths.filter((entry) => pathFilter.allows(join(searchPath, entry)));
280
357
  const ordered: OrderedPaths =
281
358
  order === "mtime"
282
- ? orderByMtime(collectedPaths, searchPath, limit, collectLimit)
359
+ ? orderByMtime(collectedPaths, searchPath, limit, collectLimit, search)
283
360
  : { paths: collectedPaths.slice(0, limit), candidateCapHit: false, candidateCap: null };
284
361
  return renderFindResult({
362
+ search,
363
+ fallback: !fdPath,
285
364
  withheldPaths: pathFilter.withheldPaths,
286
365
  ordered,
287
366
  collected: collectedCount,
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Self-caps of the gateway-plane observation envelopes. Kept in a module with
3
+ * no imports so the bootstrap policy assertion and the catalog can read them
4
+ * without loading the tools themselves.
5
+ */
6
+
7
+ /** Bytes of one `data` result body before the JSON stub rule offloads it. */
8
+ export const DATA_OBSERVATION_SELF_CAP_BYTES = 32 * 1024;
9
+
10
+ /** Bytes of one `gateway` find listing before the JSON stub rule offloads it. */
11
+ export const GATEWAY_FIND_SELF_CAP_BYTES = 32 * 1024;
@@ -0,0 +1,41 @@
1
+ import { Type } from "typebox";
2
+ import { ToolNames } from "../../core/tool-names.js";
3
+ import { StringEnum } from "../../engine/ai.js";
4
+ import type { ToolSurface } from "../lazy-tool.js";
5
+
6
+ /**
7
+ * Immutable surfaces of the two Clio-internal reads that left the permanent
8
+ * `context` schema: `clio_docs` (bundled documentation) and `clio_library`
9
+ * (the recipe catalog). The implementations load on first call.
10
+ */
11
+
12
+ export const clioDocsToolSurface = {
13
+ name: ToolNames.ClioDocs,
14
+ description:
15
+ "Search Clio's bundled documentation for a question or terms and return cited sections as JSON; omit query to list the corpus (files and counts). Read-only; charges the per-turn observation pool.",
16
+ parameters: Type.Object({
17
+ query: Type.Optional(Type.String({ description: "Question or terms; omit to list the corpus." })),
18
+ limit: Type.Optional(Type.Number({ description: "Max sections (default 5, max 12)." })),
19
+ }),
20
+ baseActionClass: "read",
21
+ executionMode: "parallel",
22
+ } satisfies ToolSurface;
23
+
24
+ export const clioLibraryToolSurface = {
25
+ name: ToolNames.ClioLibrary,
26
+ description:
27
+ "Read the recipe catalog: installed skills, agents, prompts, and fleets with their owner and invocation, plus installable packages. Body-free rows, bounded pages; activates and installs nothing. Unavailable inside a worker.",
28
+ parameters: Type.Object({
29
+ query: Type.Optional(Type.String({ description: "Name, owner, or description terms." })),
30
+ kind: Type.Optional(
31
+ StringEnum(["skill", "agent", "prompt", "fleet", "plugin"], {
32
+ description: "One recipe kind, or plugin for installable package rows.",
33
+ }),
34
+ ),
35
+ ref: Type.Optional(Type.String({ description: "Exact kind:name or resource key for one record." })),
36
+ limit: Type.Optional(Type.Number({ description: "Max rows (default 20, max 50)." })),
37
+ offset: Type.Optional(Type.Number({ description: "Zero-based offset; follow nextOffset (default 0)." })),
38
+ }),
39
+ baseActionClass: "read",
40
+ executionMode: "parallel",
41
+ } satisfies ToolSurface;
@@ -0,0 +1,77 @@
1
+ import { ToolNames } from "../../core/tool-names.js";
2
+ import type { LoadSkillsInput } from "../../domains/resources/index.js";
3
+ import { runDocsScope } from "../context/index.js";
4
+ import { OBSERVE_SELF_CAPS, observationBudgetExhausted, reserveObservation } from "../observation.js";
5
+ import type { ToolResult, ToolSpec } from "../registry.js";
6
+ import { clioDocsToolSurface, clioLibraryToolSurface } from "./clio-context-surface.js";
7
+
8
+ export { clioDocsToolSurface, clioLibraryToolSurface } from "./clio-context-surface.js";
9
+
10
+ /**
11
+ * The two Clio-internal reads that left the permanent `context` schema:
12
+ * `clio_docs` (bundled documentation) and `clio_library` (the recipe catalog).
13
+ * Each is the former context scope under its own name, reusing the scope
14
+ * function unchanged, so what the gateway returns is exactly what
15
+ * context(scope="docs"|"library") returned.
16
+ */
17
+
18
+ export function createClioDocsTool(): ToolSpec {
19
+ return {
20
+ ...clioDocsToolSurface,
21
+ async run(args, options): Promise<ToolResult> {
22
+ const reservation = reserveObservation(OBSERVE_SELF_CAPS.contextDocs, options);
23
+ if (reservation.exhausted) {
24
+ return observationBudgetExhausted({
25
+ tool: ToolNames.ClioDocs,
26
+ unit: "sections",
27
+ reservation,
28
+ subject: typeof args.query === "string" && args.query.length > 0 ? `query=${args.query}` : "corpus",
29
+ hint: "Continue in a follow-up turn.",
30
+ });
31
+ }
32
+ return runDocsScope(args, reservation, options, ToolNames.ClioDocs);
33
+ },
34
+ };
35
+ }
36
+
37
+ export interface ClioLibraryToolDeps {
38
+ getCwd?: () => string;
39
+ /** False on every worker registry: the read refuses there, as the context scope did. */
40
+ skillMarketplace?: boolean;
41
+ getSkillLoaderOptions?: () => Pick<
42
+ LoadSkillsInput,
43
+ "trustProjectCompatRoots" | "disableDiscovery" | "explicitSkillPaths"
44
+ >;
45
+ }
46
+
47
+ export function createClioLibraryTool(deps: ClioLibraryToolDeps = {}): ToolSpec {
48
+ return {
49
+ ...clioLibraryToolSurface,
50
+ async run(args, options): Promise<ToolResult> {
51
+ // Reserved before the inventory is walked, so an exhausted pool answers
52
+ // with the notice and no catalog read happens for nothing.
53
+ const reservation = reserveObservation(OBSERVE_SELF_CAPS.contextLibrary, options);
54
+ if (reservation.exhausted) {
55
+ return observationBudgetExhausted({
56
+ tool: ToolNames.ClioLibrary,
57
+ unit: "entries",
58
+ reservation,
59
+ subject: "catalog",
60
+ hint: "Continue in a follow-up turn.",
61
+ });
62
+ }
63
+ const { runLibraryScope } = await import("../context/library.js");
64
+ return runLibraryScope(
65
+ {
66
+ getCwd: () => deps.getCwd?.() ?? process.cwd(),
67
+ ...(deps.skillMarketplace !== undefined ? { skillMarketplace: deps.skillMarketplace } : {}),
68
+ ...(deps.getSkillLoaderOptions ? { skillLoaderOptions: deps.getSkillLoaderOptions() } : {}),
69
+ },
70
+ args,
71
+ reservation,
72
+ options,
73
+ ToolNames.ClioLibrary,
74
+ );
75
+ },
76
+ };
77
+ }