@iowarp/clio-coder 0.4.7 → 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 (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
@@ -0,0 +1,138 @@
1
+ import { Type } from "typebox";
2
+ import { ToolNames } from "../../core/tool-names.js";
3
+ import { StringEnum } from "../../engine/ai.js";
4
+ import { DATA_FORMATS } from "../data/shared.js";
5
+ import type { ToolSurface } from "../lazy-tool.js";
6
+ import { resolveToCwd } from "../path-utils.js";
7
+
8
+ /**
9
+ * The `data` capability's immutable surface, kept apart from its streaming
10
+ * implementation so the registry can attach the schema and defer the readers
11
+ * until the first call.
12
+ */
13
+
14
+ export const DATA_TOOL_NAME = ToolNames.Data;
15
+
16
+ export const DATA_OPS = ["inspect", "select", "validate"] as const;
17
+ export type DataOp = (typeof DATA_OPS)[number];
18
+
19
+ const DESCRIPTION =
20
+ "Inspect, select, or validate a structured data file without loading it whole: CSV/TSV (delimiter and header detection, per-column types, sentinels such as NA counted, never converted), JSON (document shape, RFC 6901 pointer selection), and JSON Lines (record windows). op=inspect reports schema, dimensions, and a sample; op=select returns a bounded window of rows, records, or the value at a pointer; op=validate checks the whole file against its format. Every result carries view {exact, sampled, converted} and honest counts (rowCount null means the scan stopped early), and large integers or long floats are reported, never rounded. Refuses invalid UTF-8, binary, and unsupported formats (HDF5, NetCDF, Parquet: use run_script with a library) with an actionable reason.";
21
+
22
+ function numberArg(value: unknown): number | undefined {
23
+ if (typeof value === "number" && Number.isFinite(value)) return value;
24
+ if (typeof value === "string" && value.trim().length > 0) {
25
+ const parsed = Number(value);
26
+ return Number.isFinite(parsed) ? parsed : undefined;
27
+ }
28
+ return undefined;
29
+ }
30
+
31
+ export function headerArg(value: unknown): "auto" | boolean | undefined {
32
+ if (value === undefined || value === null) return undefined;
33
+ if (typeof value === "boolean") return value;
34
+ if (value === "auto") return "auto";
35
+ if (value === "true") return true;
36
+ if (value === "false") return false;
37
+ return undefined;
38
+ }
39
+
40
+ function columnsArg(value: unknown): Array<string | number> | undefined {
41
+ if (typeof value === "string") {
42
+ const parts = value
43
+ .split(",")
44
+ .map((part) => part.trim())
45
+ .filter((part) => part.length > 0);
46
+ return parts.length > 0 ? parts : undefined;
47
+ }
48
+ if (!Array.isArray(value)) return undefined;
49
+ const out: Array<string | number> = [];
50
+ for (const entry of value) {
51
+ if (typeof entry === "string" || (typeof entry === "number" && Number.isFinite(entry))) out.push(entry);
52
+ }
53
+ return out.length > 0 ? out : undefined;
54
+ }
55
+
56
+ /**
57
+ * Accept the weak-model argument shapes without teaching every reader about
58
+ * them: numbers as strings, `columns` as a comma-separated string, `header`
59
+ * as "true"/"false", and `file`/`file_path` for `path`.
60
+ */
61
+ export function prepareDataArguments(args: Record<string, unknown>): Record<string, unknown> {
62
+ const out: Record<string, unknown> = { ...args };
63
+ if (typeof out.path !== "string") {
64
+ const alias = out.file ?? out.file_path ?? out.filePath;
65
+ if (typeof alias === "string") out.path = alias;
66
+ }
67
+ if (typeof out.path === "string") out.path = out.path.trim();
68
+ for (const key of ["sample_rows", "offset", "limit"] as const) {
69
+ const parsed = numberArg(out[key]);
70
+ if (parsed !== undefined) out[key] = parsed;
71
+ else if (out[key] !== undefined) delete out[key];
72
+ }
73
+ if (out.max_rows !== undefined && out.max_rows !== null) {
74
+ const parsed = numberArg(out.max_rows);
75
+ if (parsed !== undefined) out.max_rows = parsed;
76
+ else delete out.max_rows;
77
+ }
78
+ const header = headerArg(out.header);
79
+ if (header !== undefined) out.header = header;
80
+ else if (out.header !== undefined) delete out.header;
81
+ const columns = columnsArg(out.columns);
82
+ if (columns !== undefined) out.columns = columns;
83
+ else if (out.columns !== undefined) delete out.columns;
84
+ return out;
85
+ }
86
+
87
+ /** Freeze the reader's normalized target before path policy admission. */
88
+ export function prepareDataAdmissionArguments(
89
+ args: Record<string, unknown>,
90
+ cwd = process.cwd(),
91
+ ): Record<string, unknown> {
92
+ const prepared = prepareDataArguments(args);
93
+ if (typeof prepared.path === "string" && prepared.path.length > 0) prepared.path = resolveToCwd(prepared.path, cwd);
94
+ return prepared;
95
+ }
96
+
97
+ export const dataToolSurface = {
98
+ name: DATA_TOOL_NAME,
99
+ description: DESCRIPTION,
100
+ parameters: Type.Object({
101
+ op: StringEnum(DATA_OPS, { description: "inspect, select, or validate." }),
102
+ path: Type.String({ description: "Data file, relative to the workspace root or absolute." }),
103
+ format: Type.Optional(
104
+ StringEnum(DATA_FORMATS, {
105
+ description: "Format when the extension or content does not say: csv, tsv, json, jsonl.",
106
+ }),
107
+ ),
108
+ delimiter: Type.Optional(Type.String({ description: "CSV/TSV: one delimiter character (or \\t)." })),
109
+ header: Type.Optional(
110
+ Type.Union([Type.Boolean(), Type.Literal("auto")], {
111
+ description: 'CSV/TSV: "auto" (default) detects a header row; true or false forces it.',
112
+ }),
113
+ ),
114
+ sample_rows: Type.Optional(
115
+ Type.Number({ description: "inspect: rows or top-level members kept as the sample (default 10, max 1000)." }),
116
+ ),
117
+ max_rows: Type.Optional(
118
+ Type.Union([Type.Number(), Type.Null()], {
119
+ description:
120
+ "inspect and validate: rows scanned before the view becomes sampled or the verdict partial (default 100000; null scans the whole file).",
121
+ }),
122
+ ),
123
+ offset: Type.Optional(Type.Number({ description: "select: 0-based first row, record, or array element." })),
124
+ limit: Type.Optional(Type.Number({ description: "select: rows returned (default 50, max 1000)." })),
125
+ columns: Type.Optional(
126
+ Type.Array(Type.Union([Type.String(), Type.Number()]), {
127
+ description: "select, CSV/TSV: header names or 0-based indices to project.",
128
+ }),
129
+ ),
130
+ pointer: Type.Optional(
131
+ Type.String({ description: 'select, JSON: RFC 6901 pointer to the value to return; "" is the whole document.' }),
132
+ ),
133
+ }),
134
+ baseActionClass: "read",
135
+ executionMode: "parallel",
136
+ prepareArguments: prepareDataArguments,
137
+ prepareAdmissionArguments: prepareDataAdmissionArguments,
138
+ } satisfies ToolSurface;
@@ -0,0 +1,201 @@
1
+ import path from "node:path";
2
+ import {
3
+ type DataRefusal,
4
+ type InspectDataOptions,
5
+ type InspectDataResult,
6
+ inspectData,
7
+ isDataRefusal,
8
+ type SelectDataOptions,
9
+ type SelectDataResult,
10
+ selectData,
11
+ type ValidateDataOptions,
12
+ type ValidateDataResult,
13
+ validateData,
14
+ } from "../data/index.js";
15
+ import {
16
+ commitObservationReservation,
17
+ finalizeObservation,
18
+ type ObservationUnit,
19
+ observationBudgetExhausted,
20
+ releaseObservation,
21
+ reserveObservation,
22
+ } from "../observation.js";
23
+ import { resolveToCwd } from "../path-utils.js";
24
+ import type { ToolInvokeOptions, ToolResult, ToolSpec } from "../registry.js";
25
+ import { DATA_OBSERVATION_SELF_CAP_BYTES } from "./caps.js";
26
+ import {
27
+ DATA_OPS,
28
+ DATA_TOOL_NAME,
29
+ type DataOp,
30
+ dataToolSurface,
31
+ headerArg,
32
+ prepareDataAdmissionArguments,
33
+ prepareDataArguments,
34
+ } from "./data-surface.js";
35
+
36
+ export { DATA_OBSERVATION_SELF_CAP_BYTES } from "./caps.js";
37
+ export { DATA_TOOL_NAME, dataToolSurface, prepareDataArguments } from "./data-surface.js";
38
+
39
+ /**
40
+ * The `data` capability: structured-data inspection, selection, and
41
+ * validation over CSV/TSV, JSON, and JSON Lines through the streaming readers
42
+ * in src/tools/data. This module owns only the tool contract: argument
43
+ * normalization, path resolution against the workspace, the observation
44
+ * envelope for large results, and the mapping of a typed refusal to a tool
45
+ * error. Every scientific-integrity rule (exact versus sampled views, large
46
+ * integers reported rather than rounded, sentinels counted rather than
47
+ * converted) lives in the readers and is reported verbatim.
48
+ */
49
+
50
+ export interface DataToolDeps {
51
+ getCwd?: () => string;
52
+ }
53
+
54
+ interface CountedResult {
55
+ unit: ObservationUnit;
56
+ shownCount: number;
57
+ totalCount: number | null;
58
+ truncated: boolean;
59
+ next?: string;
60
+ }
61
+
62
+ type DataResult = InspectDataResult | SelectDataResult | ValidateDataResult;
63
+
64
+ function isDataOp(value: string): value is DataOp {
65
+ return (DATA_OPS as ReadonlyArray<string>).includes(value);
66
+ }
67
+
68
+ /** Honest envelope counts read off the reader's own result; the readers never guess. */
69
+ function countResult(op: DataOp, payload: DataResult): CountedResult {
70
+ if (op === "select") {
71
+ const result = payload as unknown as Record<string, unknown>;
72
+ const rows = result.rows ?? result.records ?? result.elements;
73
+ const returned = typeof result.returned === "number" ? result.returned : Array.isArray(rows) ? rows.length : 1;
74
+ const offset = typeof result.offset === "number" ? result.offset : 0;
75
+ const limit = typeof result.limit === "number" ? result.limit : returned;
76
+ const hasMore = result.hasMore === true;
77
+ const total = typeof result.total === "number" ? result.total : hasMore ? null : offset + returned;
78
+ return {
79
+ unit: "entries",
80
+ shownCount: returned,
81
+ totalCount: total,
82
+ truncated: hasMore,
83
+ ...(hasMore ? { next: `offset=${offset + limit}` } : {}),
84
+ };
85
+ }
86
+ return { unit: "results", shownCount: 1, totalCount: 1, truncated: false };
87
+ }
88
+
89
+ /**
90
+ * One word for the reader's view flags, so a transcript row never calls a
91
+ * budget cut a sample: all three flags false means a value was cut to the
92
+ * capture budget, which is neither a sampled scan nor a converted one.
93
+ */
94
+ function describeDataView(view: unknown): string {
95
+ const flags = typeof view === "object" && view !== null ? (view as Record<string, unknown>) : {};
96
+ if (flags.exact === true) return "exact";
97
+ const parts = [...(flags.sampled === true ? ["sampled"] : []), ...(flags.converted === true ? ["converted"] : [])];
98
+ return parts.length > 0 ? parts.join(", ") : "value cut to budget";
99
+ }
100
+
101
+ function refusalResult(op: DataOp, refusal: DataRefusal): ToolResult {
102
+ return {
103
+ kind: "error",
104
+ message: `data: ${op} refused (${refusal.reason}): ${refusal.message}`,
105
+ details: { refusal },
106
+ };
107
+ }
108
+
109
+ export function createDataTool(deps: DataToolDeps = {}): ToolSpec {
110
+ const getCwd = deps.getCwd ?? (() => process.cwd());
111
+ return {
112
+ ...dataToolSurface,
113
+ prepareAdmissionArguments: (args) => prepareDataAdmissionArguments(args, getCwd()),
114
+ async run(rawArgs, options?: ToolInvokeOptions): Promise<ToolResult> {
115
+ const args = prepareDataArguments(rawArgs);
116
+ const op = typeof args.op === "string" ? args.op : "";
117
+ if (!isDataOp(op)) {
118
+ return { kind: "error", message: `data: op must be inspect, select, or validate; got '${op}'` };
119
+ }
120
+ if (typeof args.path !== "string" || args.path.trim().length === 0) {
121
+ return { kind: "error", message: "data: path is required" };
122
+ }
123
+ const target = resolveToCwd(args.path.trim(), getCwd());
124
+ const reservation = reserveObservation(DATA_OBSERVATION_SELF_CAP_BYTES, options);
125
+ if (reservation.exhausted) {
126
+ return observationBudgetExhausted({
127
+ tool: DATA_TOOL_NAME,
128
+ unit: op === "select" ? "entries" : "results",
129
+ reservation,
130
+ subject: `${op} ${path.relative(getCwd(), target) || target}`,
131
+ hint: "Continue in a follow-up turn.",
132
+ });
133
+ }
134
+ // The readers stream and await between reserve and finalize, so the
135
+ // cap is charged up front and reconciled when the result settles.
136
+ commitObservationReservation(reservation);
137
+ try {
138
+ const format = typeof args.format === "string" ? args.format : undefined;
139
+ const delimiter = typeof args.delimiter === "string" ? args.delimiter : undefined;
140
+ const header = headerArg(args.header);
141
+ const signal = options?.signal;
142
+ let result: DataResult | DataRefusal;
143
+ if (op === "inspect") {
144
+ const inspectOptions: InspectDataOptions = {
145
+ ...(format !== undefined ? { format } : {}),
146
+ ...(delimiter !== undefined ? { delimiter } : {}),
147
+ ...(header !== undefined ? { header } : {}),
148
+ ...(typeof args.sample_rows === "number" ? { sampleRows: args.sample_rows } : {}),
149
+ ...(args.max_rows === null || typeof args.max_rows === "number" ? { maxRows: args.max_rows } : {}),
150
+ signal,
151
+ };
152
+ result = await inspectData(target, inspectOptions);
153
+ } else if (op === "select") {
154
+ const selectOptions: SelectDataOptions = {
155
+ ...(format !== undefined ? { format } : {}),
156
+ ...(delimiter !== undefined ? { delimiter } : {}),
157
+ ...(header !== undefined ? { header } : {}),
158
+ ...(typeof args.offset === "number" ? { offset: args.offset } : {}),
159
+ ...(typeof args.limit === "number" ? { limit: args.limit } : {}),
160
+ ...(Array.isArray(args.columns) ? { columns: args.columns as Array<string | number> } : {}),
161
+ ...(typeof args.pointer === "string" ? { pointer: args.pointer } : {}),
162
+ signal,
163
+ };
164
+ result = await selectData(target, selectOptions);
165
+ } else {
166
+ const validateOptions: ValidateDataOptions = {
167
+ ...(format !== undefined ? { format } : {}),
168
+ ...(delimiter !== undefined ? { delimiter } : {}),
169
+ ...(header !== undefined ? { header } : {}),
170
+ ...(args.max_rows === null || typeof args.max_rows === "number" ? { maxRows: args.max_rows } : {}),
171
+ signal,
172
+ };
173
+ result = await validateData(target, validateOptions);
174
+ }
175
+ if (isDataRefusal(result)) {
176
+ releaseObservation(reservation);
177
+ return refusalResult(op, result);
178
+ }
179
+ const counted = countResult(op, result);
180
+ return finalizeObservation({
181
+ tool: DATA_TOOL_NAME,
182
+ unit: counted.unit,
183
+ format: "json",
184
+ output: JSON.stringify(result),
185
+ shownCount: counted.shownCount,
186
+ totalCount: counted.totalCount,
187
+ truncated: counted.truncated,
188
+ ...(counted.next !== undefined ? { next: counted.next } : {}),
189
+ details: { op, path: target, format: result.format, view: result.view, viewLabel: describeDataView(result.view) },
190
+ reservation,
191
+ ...(options ? { options } : {}),
192
+ });
193
+ } catch (error) {
194
+ releaseObservation(reservation);
195
+ return { kind: "error", message: `data: ${error instanceof Error ? error.message : String(error)}` };
196
+ }
197
+ },
198
+ };
199
+ }
200
+
201
+ export const dataTool: ToolSpec = createDataTool();
@@ -0,0 +1,342 @@
1
+ import { Type } from "typebox";
2
+ import { isMcpToolName, type ToolName, ToolNames } from "../../core/tool-names.js";
3
+ import type { ActionClass } from "../../domains/safety/action-classifier.js";
4
+ import { StringEnum, validateEngineToolArguments } from "../../engine/ai.js";
5
+ import { wireParameterSchema } from "../agent-tools.js";
6
+ import type { ToolSurface } from "../lazy-tool.js";
7
+ import {
8
+ commitObservationReservation,
9
+ finalizeObservation,
10
+ observationBudgetExhausted,
11
+ releaseObservation,
12
+ reserveObservation,
13
+ } from "../observation.js";
14
+ import {
15
+ nestedBlockedResult,
16
+ nestedExecutedResult,
17
+ type ToolInvokeOptions,
18
+ type ToolRegistry,
19
+ type ToolResult,
20
+ type ToolSpec,
21
+ } from "../registry.js";
22
+ import { type GatewayCapabilityKind, gatewayCapabilityKind, toolSpecPlacement } from "../surface.js";
23
+ import { GATEWAY_FIND_SELF_CAP_BYTES } from "./caps.js";
24
+ import type { McpCapabilitySource, McpServerListing } from "./mcp-capabilities.js";
25
+
26
+ export { GATEWAY_FIND_SELF_CAP_BYTES } from "./caps.js";
27
+ export {
28
+ createMcpCapabilitySource,
29
+ type McpCapabilitySource,
30
+ type McpCapabilitySourceOptions,
31
+ type McpCloseReport,
32
+ type McpListing,
33
+ type McpServerListing,
34
+ type McpTeardownReport,
35
+ mcpTrustRemedy,
36
+ } from "./mcp-capabilities.js";
37
+
38
+ /**
39
+ * The gateway: one stable find/describe/call schema through which the model
40
+ * reaches every secondary capability. A call is not a new authority path: the
41
+ * gateway resolves the capability and invokes it through the registry under
42
+ * the capability's own name, so the safety net, the skill surface, the
43
+ * autonomy mapping, parking for approval, before/after hooks, result shaping,
44
+ * and the audit row all happen exactly as for a direct call. The result is
45
+ * the capability's result with `details.capability` stamped on it, and a
46
+ * refused capability refuses the gateway call with the same verdict.
47
+ */
48
+
49
+ export const GATEWAY_OPS = ["find", "describe", "call"] as const;
50
+ export type GatewayOp = (typeof GATEWAY_OPS)[number];
51
+
52
+ /** Entries a find listing returns before it says `truncated` and asks for a narrower query. */
53
+ export const GATEWAY_FIND_MAX_ENTRIES = 300;
54
+
55
+ export interface GatewayCapabilityEntry {
56
+ name: string;
57
+ kind: GatewayCapabilityKind;
58
+ /** The first sentence of the capability's description. */
59
+ description: string;
60
+ actionClass: ActionClass;
61
+ }
62
+
63
+ export interface GatewayToolDeps {
64
+ registry: ToolRegistry;
65
+ /** Local MCP servers, present on the session registry only. */
66
+ mcp?: McpCapabilitySource;
67
+ }
68
+
69
+ const DESCRIPTION =
70
+ 'Reach secondary capabilities on demand. op="find" lists them as JSON {name, kind: builtin|extension|mcp, description, actionClass} (query filters by name or description); op="describe" returns one capability\'s full description, JSON parameter schema, and authority notes; op="call" runs one with args under the same admission as a direct tool: its own action class, approval, and evidence apply and the result is the capability\'s result. Capabilities: artifact (terminal plan/review/report documents), web_read (GET-only web reading), web_fetch (full HTTP requests), git (read-only status/diff/log), evidence, credential_present, clio_docs, clio_library, data (CSV/TSV, JSON, JSONL inspection), installed extension commands, and trusted local MCP servers.';
71
+
72
+ export const gatewayToolSurface = {
73
+ name: ToolNames.Gateway,
74
+ description: DESCRIPTION,
75
+ parameters: Type.Object({
76
+ op: StringEnum(GATEWAY_OPS, { description: "find, describe, or call." }),
77
+ capability: Type.Optional(Type.String({ description: "describe and call: the capability name from find." })),
78
+ query: Type.Optional(Type.String({ description: "find: case-insensitive filter over names and descriptions." })),
79
+ args: Type.Optional(
80
+ Type.Record(Type.String(), Type.Unknown(), {
81
+ description: "call: the capability's arguments, matching its describe schema.",
82
+ }),
83
+ ),
84
+ }),
85
+ baseActionClass: "read",
86
+ executionMode: "sequential",
87
+ } satisfies ToolSurface;
88
+
89
+ function isRecord(value: unknown): value is Record<string, unknown> {
90
+ return typeof value === "object" && value !== null && !Array.isArray(value);
91
+ }
92
+
93
+ /**
94
+ * Accept the weak-model shapes: `args` as a JSON string, `name`/`tool` for
95
+ * `capability`, and a missing `op` inferred from what else was given.
96
+ */
97
+ function prepareGatewayArguments(args: Record<string, unknown>): Record<string, unknown> {
98
+ const out: Record<string, unknown> = { ...args };
99
+ if (typeof out.capability !== "string") {
100
+ const alias = out.name ?? out.tool;
101
+ if (typeof alias === "string") out.capability = alias;
102
+ }
103
+ if (typeof out.args === "string") {
104
+ try {
105
+ const parsed: unknown = JSON.parse(out.args);
106
+ if (isRecord(parsed)) out.args = parsed;
107
+ } catch {
108
+ // The body reports the unparseable string.
109
+ }
110
+ }
111
+ if (typeof out.op !== "string") {
112
+ if (typeof out.capability === "string" && out.args !== undefined) out.op = "call";
113
+ else if (typeof out.capability === "string") out.op = "describe";
114
+ else out.op = "find";
115
+ }
116
+ return out;
117
+ }
118
+
119
+ function firstSentence(text: string): string {
120
+ const line = text.split("\n")[0]?.trim() ?? "";
121
+ const match = /^(.*?[.!?])(?:\s|$)/u.exec(line);
122
+ return (match?.[1] ?? line).slice(0, 240);
123
+ }
124
+
125
+ function autonomyNote(actionClass: ActionClass): string {
126
+ switch (actionClass) {
127
+ case "read":
128
+ return "Read class: runs at every autonomy level.";
129
+ case "write":
130
+ return "Write class: parks for operator approval at suggest, runs at auto-edit and full-auto, and is denied at read-only.";
131
+ case "execute":
132
+ return "Execute class: an unrecognized command asks at auto-edit, runs at full-auto, and is denied at read-only.";
133
+ case "dispatch":
134
+ return "Dispatch class: plan-scale calls ask below full-auto; denied at read-only.";
135
+ case "unknown":
136
+ return "No action class was declared: every call asks for approval and read-only denies it.";
137
+ default:
138
+ return `Action class ${actionClass}.`;
139
+ }
140
+ }
141
+
142
+ export function createGatewayTool(deps: GatewayToolDeps): ToolSpec {
143
+ const { registry } = deps;
144
+
145
+ const allowedSet = (options: ToolInvokeOptions | undefined): ReadonlySet<string> | null =>
146
+ options?.allowedTools ? new Set<string>(options.allowedTools) : null;
147
+
148
+ const resolveCapability = async (
149
+ name: string,
150
+ options: ToolInvokeOptions | undefined,
151
+ ): Promise<{ spec: ToolSpec } | { spec: null; message: string }> => {
152
+ let spec = registry.get(name as ToolName);
153
+ if (spec === undefined && isMcpToolName(name) && deps.mcp) {
154
+ const ensured = await deps.mcp.ensure(name, options?.signal ? { signal: options.signal } : {});
155
+ if (ensured.spec === null)
156
+ return { spec: null, message: `gateway: ${ensured.reason ?? `unknown capability ${name}`}` };
157
+ spec = ensured.spec;
158
+ }
159
+ if (spec === undefined) {
160
+ return {
161
+ spec: null,
162
+ message: `gateway: unknown capability "${name}"; run gateway(op="find") to list the capabilities this session offers`,
163
+ };
164
+ }
165
+ if (toolSpecPlacement(spec) === "direct") {
166
+ return {
167
+ spec: null,
168
+ message: `gateway: "${name}" is a direct tool with an attached schema; call it directly, not through the gateway`,
169
+ };
170
+ }
171
+ return { spec };
172
+ };
173
+
174
+ const outsideSurface = (name: string, allowed: ReadonlySet<string>): ToolResult => ({
175
+ kind: "error",
176
+ message: `gateway: capability "${name}" is not on this run's admitted tool surface (${[...allowed].sort().join(", ")}); the recipe did not declare it, so the gateway refuses to call it`,
177
+ });
178
+
179
+ const runFind = async (args: Record<string, unknown>, options: ToolInvokeOptions | undefined): Promise<ToolResult> => {
180
+ const query = typeof args.query === "string" ? args.query.trim().toLowerCase() : "";
181
+ const allowed = allowedSet(options);
182
+ const reservation = reserveObservation(GATEWAY_FIND_SELF_CAP_BYTES, options);
183
+ if (reservation.exhausted) {
184
+ return observationBudgetExhausted({
185
+ tool: ToolNames.Gateway,
186
+ unit: "entries",
187
+ reservation,
188
+ subject: query.length > 0 ? `find query=${query}` : "find",
189
+ hint: "Continue in a follow-up turn.",
190
+ });
191
+ }
192
+ commitObservationReservation(reservation);
193
+ try {
194
+ // Trusted MCP servers connect here, lazily, and register their tools
195
+ // before the registry listing below is taken. Untrusted and stale
196
+ // servers are described with their remedy and never launched.
197
+ let servers: McpServerListing[] = [];
198
+ let diagnostics: string[] = [];
199
+ if (deps.mcp && allowed === null) {
200
+ const listing = await deps.mcp.list(options?.signal ? { signal: options.signal } : {});
201
+ servers = listing.servers;
202
+ diagnostics = listing.diagnostics;
203
+ }
204
+ const entries: GatewayCapabilityEntry[] = registry
205
+ .listGateway()
206
+ .filter((spec) => allowed === null || allowed.has(spec.name))
207
+ .map((spec) => ({
208
+ name: spec.name,
209
+ kind: gatewayCapabilityKind(spec.name),
210
+ description: firstSentence(spec.description),
211
+ actionClass: spec.baseActionClass,
212
+ }))
213
+ .filter(
214
+ (entry) =>
215
+ query.length === 0 || entry.name.toLowerCase().includes(query) || entry.description.toLowerCase().includes(query),
216
+ )
217
+ .sort((left, right) => left.name.localeCompare(right.name));
218
+ const total = entries.length;
219
+ const shown = entries.slice(0, GATEWAY_FIND_MAX_ENTRIES);
220
+ const truncated = shown.length < total;
221
+ const payload = {
222
+ capabilities: shown,
223
+ count: shown.length,
224
+ total,
225
+ ...(servers.length > 0 ? { servers } : {}),
226
+ ...(diagnostics.length > 0 ? { diagnostics } : {}),
227
+ ...(truncated ? { note: "listing truncated; narrow it with query" } : {}),
228
+ };
229
+ return finalizeObservation({
230
+ tool: ToolNames.Gateway,
231
+ unit: "entries",
232
+ format: "json",
233
+ output: JSON.stringify(payload),
234
+ shownCount: shown.length,
235
+ totalCount: total,
236
+ truncated,
237
+ ...(truncated ? { next: "query=<narrower terms>" } : {}),
238
+ details: { op: "find", count: shown.length, total, servers: servers.length },
239
+ reservation,
240
+ ...(options ? { options } : {}),
241
+ });
242
+ } catch (error) {
243
+ releaseObservation(reservation);
244
+ return { kind: "error", message: `gateway: find failed: ${error instanceof Error ? error.message : String(error)}` };
245
+ }
246
+ };
247
+
248
+ const runDescribe = async (
249
+ args: Record<string, unknown>,
250
+ options: ToolInvokeOptions | undefined,
251
+ ): Promise<ToolResult> => {
252
+ const name = typeof args.capability === "string" ? args.capability.trim() : "";
253
+ if (name.length === 0) return { kind: "error", message: 'gateway: op="describe" requires capability' };
254
+ const allowed = allowedSet(options);
255
+ if (allowed !== null && !allowed.has(name)) return outsideSurface(name, allowed);
256
+ const resolved = await resolveCapability(name, options);
257
+ if (resolved.spec === null) return { kind: "error", message: resolved.message };
258
+ const spec = resolved.spec;
259
+ const kind = gatewayCapabilityKind(spec.name);
260
+ const authority = [
261
+ `Runs through the same admission as a direct call, under its own name and action class (${spec.baseActionClass}); the approval overlay, audit row, and ledger record name ${spec.name}, not the gateway.`,
262
+ autonomyNote(spec.baseActionClass),
263
+ ];
264
+ if (spec.name === ToolNames.WebFetch) {
265
+ authority.push(
266
+ "A non-GET method or a body is an outward action and asks at suggest and auto-edit; use web_read when a plain GET is enough.",
267
+ );
268
+ }
269
+ if (spec.name === ToolNames.Artifact) {
270
+ authority.push("Terminal: writing the artifact completes the turn, so close the task board before calling it.");
271
+ }
272
+ if (kind === "extension") {
273
+ authority.push(
274
+ `Harness extension${spec.sourceInfo?.extension ? ` ${spec.sourceInfo.extension.contentDigest.slice(0, 12)}` : ""}: an installed command run with JSON input on the workspace; its argv is classified like a bash command, and running it does not sandbox it.`,
275
+ );
276
+ }
277
+ const mcpNote = kind === "mcp" ? deps.mcp?.authorityNote(spec.name) : null;
278
+ if (mcpNote) authority.push(mcpNote);
279
+ const payload = {
280
+ name: spec.name,
281
+ kind,
282
+ description: spec.description,
283
+ parameters: wireParameterSchema(spec.parameters),
284
+ actionClass: spec.baseActionClass,
285
+ executionMode: spec.executionMode ?? "sequential",
286
+ authority,
287
+ };
288
+ return { kind: "ok", output: JSON.stringify(payload), details: { op: "describe", described: spec.name } };
289
+ };
290
+
291
+ const runCall = async (args: Record<string, unknown>, options: ToolInvokeOptions | undefined): Promise<ToolResult> => {
292
+ const name = typeof args.capability === "string" ? args.capability.trim() : "";
293
+ if (name.length === 0) return { kind: "error", message: 'gateway: op="call" requires capability' };
294
+ const allowed = allowedSet(options);
295
+ if (allowed !== null && !allowed.has(name)) return outsideSurface(name, allowed);
296
+ const resolved = await resolveCapability(name, options);
297
+ if (resolved.spec === null) return { kind: "error", message: resolved.message };
298
+ const spec = resolved.spec;
299
+ if (args.args !== undefined && !isRecord(args.args)) {
300
+ return { kind: "error", message: `gateway: args for ${spec.name} must be a JSON object` };
301
+ }
302
+ const rawArgs: Record<string, unknown> = isRecord(args.args) ? args.args : {};
303
+ // The same coercion pi-ai applies to a direct call's arguments before
304
+ // execute, so "5" reaches a number field as 5 either way.
305
+ let validated: Record<string, unknown>;
306
+ try {
307
+ validated = validateEngineToolArguments(
308
+ { name: spec.name, description: spec.description, parameters: spec.parameters },
309
+ { type: "toolCall", id: options?.toolCallId ?? "", name: spec.name, arguments: rawArgs },
310
+ ) as Record<string, unknown>;
311
+ } catch (error) {
312
+ return {
313
+ kind: "error",
314
+ message: `gateway: ${spec.name} arguments rejected: ${error instanceof Error ? error.message : String(error)}. Use gateway(op="describe", capability="${spec.name}") for the schema.`,
315
+ };
316
+ }
317
+ // The nested call keeps the outer options (signal, ids, skill policy,
318
+ // progress, park accounting) minus any one-shot approval, which was
319
+ // granted to the gateway call and must not travel to the capability.
320
+ const { approval: _approval, ...outer } = options ?? {};
321
+ const verdict = await registry.invoke({ tool: spec.name, args: validated }, { ...outer, nested: true });
322
+ if (verdict.kind === "not_visible") return { kind: "error", message: `gateway: ${verdict.reason}` };
323
+ if (verdict.kind === "blocked") return nestedBlockedResult(verdict);
324
+ return nestedExecutedResult(
325
+ { ...verdict.result, details: { ...verdict.result.details, capability: spec.name } },
326
+ verdict.decision,
327
+ );
328
+ };
329
+
330
+ return {
331
+ ...gatewayToolSurface,
332
+ prepareArguments: prepareGatewayArguments,
333
+ async run(rawArgs, options): Promise<ToolResult> {
334
+ const args = prepareGatewayArguments(rawArgs);
335
+ const op = typeof args.op === "string" ? args.op : "";
336
+ if (op === "find") return runFind(args, options);
337
+ if (op === "describe") return runDescribe(args, options);
338
+ if (op === "call") return runCall(args, options);
339
+ return { kind: "error", message: `gateway: op must be find, describe, or call; got '${op}'` };
340
+ },
341
+ };
342
+ }