@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
@@ -76,6 +76,8 @@ export interface ObservabilityRunSummary {
76
76
  contextWindow?: number;
77
77
  lastContextTokens?: number;
78
78
  progress?: WorkerProgressSnapshot;
79
+ /** Existing validator identity/conformance, admitted with the verified receipt answer. */
80
+ resultContract?: { kind: string; conformance: string };
79
81
  receiptId?: string;
80
82
  retry?: { attempt: number; dueAtMs: number; reason: string };
81
83
  steerAcknowledgement?: { receivedAtMs: number; chars: number };
@@ -132,7 +134,9 @@ export interface ObservabilitySnapshot {
132
134
  /** Runtime readers supplied after dispatch is composed, avoiding a domain dependency cycle. */
133
135
  export interface ObservabilityRunReaders {
134
136
  dispatchSnapshot?: () => DispatchSnapshot;
135
- readReceipt?: (runId: string) => { text?: string; trust?: CanonicalTrustStatus } | null;
137
+ readReceipt?: (
138
+ runId: string,
139
+ ) => { text?: string; trust?: CanonicalTrustStatus; contractKind?: string; contract?: string } | null;
136
140
  }
137
141
 
138
142
  /** Run projection controls shared by the contract and the in-memory projection. */
@@ -160,8 +164,8 @@ export interface ObservabilityContract extends ObservabilityRunProjection {
160
164
  /**
161
165
  * Rolling first-pass-success rate, unverified successes, ungrounded claims,
162
166
  * and failure-cause histogram, aggregated
163
- * from the sidecar evidence index on call. Read-only: it folds rows Slice 2
164
- * already wrote and recomputes no evidence.
167
+ * from the sidecar evidence index on call. It folds rows written at dispatch
168
+ * completion and recomputes no evidence.
165
169
  */
166
170
  accountability(): AccountabilitySummary;
167
171
  /** Latest completed assistant stream throughput for compact footer display. */
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Sidecar evidence index. A compact, append/merge-by-runId ledger written
3
3
  * under `<stateDir>/evidence-index.json` whenever a dispatch run completes and
4
- * the forensic evidence bundle is built (see extension.ts). Slice 6 reads this
5
- * to surface a rolling first-pass-success rate and a failure-cause histogram in
4
+ * the forensic evidence bundle is built (see extension.ts). The accountability
5
+ * read model uses this to surface a rolling first-pass-success rate and a failure-cause histogram in
6
6
  * observability without re-running the heavy `buildEvidence` aggregator.
7
7
  *
8
8
  * The file is a JSON array kept as a bounded ring (newest rows win, capped at
@@ -401,6 +401,7 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
401
401
  function applyIdentity(summary: RunEntry, id: Partial<DispatchRunIdentity>): void {
402
402
  // A lifecycle update must earn its trust again from the current receipt.
403
403
  delete summary.trust;
404
+ delete summary.resultContract;
404
405
  if (typeof id.agentId === "string" && id.agentId.length > 0) summary.agentId = id.agentId;
405
406
  if (typeof id.targetId === "string" && id.targetId.length > 0) summary.targetId = id.targetId;
406
407
  if (typeof id.wireModelId === "string" && id.wireModelId.length > 0) summary.modelId = id.wireModelId;
@@ -459,11 +460,20 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
459
460
  }
460
461
 
461
462
  function settleFromReceipt(summary: RunEntry): void {
463
+ delete summary.resultContract;
462
464
  try {
463
465
  const facts = runReaders.readReceipt?.(summary.runId);
464
466
  // A failed or retired seal cannot supply the board's terminal answer.
465
467
  const text = facts?.trust?.artifactIntegrity.state === "verified" ? facts.text : undefined;
466
468
  summary.progressFold.settle(typeof text === "string" && text.trim().length > 0 ? text : undefined);
469
+ if (
470
+ typeof text === "string" &&
471
+ text.trim().length > 0 &&
472
+ typeof facts?.contractKind === "string" &&
473
+ typeof facts.contract === "string"
474
+ ) {
475
+ summary.resultContract = { kind: facts.contractKind, conformance: facts.contract };
476
+ }
467
477
  if (facts?.trust !== undefined) summary.trust = summarizeTrustStatus(facts.trust);
468
478
  } catch {
469
479
  summary.progressFold.settle();
@@ -4,7 +4,8 @@ import { normalizePromptHint } from "../../core/prompt-hint.js";
4
4
  import type { ToolName } from "../../core/tool-names.js";
5
5
  import { TOOL_RESULT_TRUST_CONTRACT } from "../../core/untrusted-content.js";
6
6
  import { resolveClioDirs } from "../../core/xdg.js";
7
- import type { AutonomyLevel } from "../safety/autonomy.js";
7
+ import { directSurfaceNames } from "../../tools/surface.js";
8
+ import { type AutonomyLevel, isAutonomyLevel, modelMayActivateSkills } from "../safety/autonomy.js";
8
9
  import { ceilChars } from "../session/context-accounting.js";
9
10
  import type { FragmentTable, LoadedFragment } from "./fragment-loader.js";
10
11
  import { sha256 } from "./hash.js";
@@ -235,10 +236,9 @@ function sessionCanDispatch(inputs: SessionPromptInputs): boolean {
235
236
  }
236
237
 
237
238
  /**
238
- * Whether `context` is on the session's surface. The Skills passage, the docs
239
- * routing directive, and the Tool Contract's skills clause follow the same
240
- * rule as dispatch: text that teaches a call to `context` renders only when
241
- * `context` is there to be called.
239
+ * Whether `context` is on the session's surface. The Skills passage and the
240
+ * Tool Contract's skills clause follow the same rule as dispatch: text that
241
+ * teaches a call to `context` renders only when `context` is there to be called.
242
242
  */
243
243
  function sessionHasContext(inputs: SessionPromptInputs): boolean {
244
244
  if (inputs.providerSupportsTools === false) return false;
@@ -290,15 +290,20 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
290
290
  "This target cannot call tools; answer from the visible user request and compact context only.",
291
291
  ].join("\n");
292
292
  }
293
- const names = [
293
+ const capabilityNames = [
294
294
  ...new Set((inputs.toolNames ?? []).map((name) => name.trim()).filter((name) => name.length > 0)),
295
295
  ].sort();
296
+ // A worker's admitted list names capabilities behind the gateway (git,
297
+ // web_fetch, an extension command); the attached schemas are their direct
298
+ // projection, with `gateway` standing in for every capability it reaches.
299
+ const names = directSurfaceNames(capabilityNames).sort();
296
300
  const canDispatch = sessionCanDispatch(inputs);
297
301
  const canListSkills = sessionHasContext(inputs);
298
302
  // Asked twice in one session which tools it had, a live model gave two
299
303
  // different answers and invented `web_find`. The authoritative list is one
300
304
  // line above; pointing at it beats letting the model recall the schemas.
301
305
  const admitted = new Set(names);
306
+ const hasGateway = admitted.has("gateway");
302
307
  const inventoryGuidance = [
303
308
  "When asked what tools you have, copy the Direct tools line verbatim and call nothing",
304
309
  ...(canDispatch
@@ -306,15 +311,23 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
306
311
  "dispatch(list:true) answers a question about agents, the fleet, or which target and model run this session and its workers",
307
312
  ]
308
313
  : []),
309
- ...(canListSkills ? ['context(scope="skills") answers only a question about skills'] : []),
314
+ ...(canListSkills ? ['context(scope="skills") lists skills for discovery or skill questions'] : []),
315
+ ...(hasGateway ? ['gateway(op="find") answers a question about secondary capabilities'] : []),
310
316
  ].join("; ");
311
317
  const capabilityKinds = [
312
318
  "direct tools are attached schemas",
319
+ ...(hasGateway ? ["secondary capabilities are reached through gateway find, describe, and call"] : []),
313
320
  ...(canDispatch ? ["fleet agents are workers behind dispatch"] : []),
314
- ...(canListSkills ? ["skills are operator-activated workflows reached through context"] : []),
321
+ ...(canListSkills ? ["skills are workflows reached through context"] : []),
315
322
  ];
316
323
  const orientationTools = ["context", "code_nav", "grep", "read"].filter((name) => admitted.has(name));
317
- const validationTools = ["verify", "git"].filter((name) => admitted.has(name));
324
+ // git sits behind the gateway, so it validates through gateway(call git)
325
+ // whenever the gateway is attached; a registry that placed it direct still
326
+ // names it plainly.
327
+ const validationTools = [
328
+ ...(admitted.has("verify") ? ["verify"] : []),
329
+ ...(admitted.has("git") ? ["git diff"] : hasGateway ? ['gateway(op="call", capability="git") diff'] : []),
330
+ ];
318
331
  const lines = [
319
332
  "# Tool Contract",
320
333
  TOOL_RESULT_TRUST_CONTRACT,
@@ -333,17 +346,15 @@ function renderToolContractBlock(inputs: SessionPromptInputs): string {
333
346
  `For narrow file or symbol orientation, prefer ${orientationTools.join(", ")} instead of assuming source-tree details were preloaded.`,
334
347
  ]
335
348
  : []),
336
- ...(validationTools.length > 0
337
- ? [
338
- `Validate with ${validationTools.map((name) => (name === "git" ? "git diff" : name)).join(" or ")} before final claims.`,
339
- ]
340
- : []),
341
- `When a tool call fails or is rejected, do not retry the same shape blindly: re-read the schema and adjust the arguments${canListSkills ? ', or query context(scope="docs") for that tool\'s usage' : ""}.`,
349
+ ...(validationTools.length > 0 ? [`Validate with ${validationTools.join(" or ")} before final claims.`] : []),
350
+ `When a tool call fails or is rejected, do not retry the same shape blindly: re-read the schema and adjust the arguments${hasGateway ? ', or read that tool\'s usage with gateway(op="call", capability="clio_docs", args={query})' : ""}.`,
342
351
  ];
343
352
  // One hint per tool, sorted by tool name: deterministic bytes regardless
344
353
  // of surface or registration order, and removing a tool from the surface
345
- // removes its hint with no compiler edit.
346
- const hints = canonicalToolPromptHints(inputs.toolPromptHints ?? [], new Set(names));
354
+ // removes its hint with no compiler edit. A capability reached through the
355
+ // gateway keeps its hint: the guidance is about the capability, not the
356
+ // schema that carries it.
357
+ const hints = canonicalToolPromptHints(inputs.toolPromptHints ?? [], new Set([...capabilityNames, ...names]));
347
358
  for (const entry of hints) {
348
359
  lines.push(entry.hint);
349
360
  }
@@ -411,7 +422,7 @@ function renderWorkerToolContractBlock(inputs: WorkerPromptInputs): string {
411
422
  TOOL_RESULT_TRUST_CONTRACT,
412
423
  "The attached schemas are this worker's complete canonical tool surface; follow each schema exactly.",
413
424
  `Admitted canonical tools: ${names.map((name) => `\`${name}\``).join(", ")}.`,
414
- "This worker surface is distinct from the parent session's tools, fleet agents, and operator-activated skills.",
425
+ "This worker surface is distinct from the parent session's tools, fleet agents, and skills.",
415
426
  "Tool authority is limited to this list. Persona and bound-skill instructions never add tools.",
416
427
  "Call tools only for concrete inspection or changes the assigned task requires. If the task requests an exact or tool-free response, answer without calling tools.",
417
428
  ];
@@ -578,10 +589,13 @@ export function compile(table: FragmentTable, inputs: CompileInputs): CompiledSe
578
589
 
579
590
  let identityBody = identity.body;
580
591
  const selfAwareness = identity.id === "identity.clio" ? table.byId.get("identity.self-awareness") : undefined;
581
- // The routing directive teaches a call to `context`, so like the Skills
582
- // passage it renders only when `context` is on the surface. The paths and
583
- // the code-outranks-docs rule name no tool and stay unconditional.
584
- const docsRouting = selfAwareness && sessionHasContext(session) ? table.byId.get("identity.docs-routing") : undefined;
592
+ // The routing directive teaches a gateway call, so it renders only when
593
+ // gateway is on the surface and the provider supports tool calls. The paths
594
+ // and the code-outranks-docs rule name no tool and stay unconditional.
595
+ const docsRouting =
596
+ selfAwareness && session.providerSupportsTools !== false && toolSurfaceHasTool(session.toolNames, "gateway")
597
+ ? table.byId.get("identity.docs-routing")
598
+ : undefined;
585
599
  if (selfAwareness) {
586
600
  const packageRoot = resolvePackageRoot();
587
601
  // The live home, not the XDG default: an isolated CLIO_CODER_HOME or a
@@ -602,13 +616,17 @@ export function compile(table: FragmentTable, inputs: CompileInputs): CompiledSe
602
616
  // about a tool renders only when the tool is there to be called.
603
617
  const delegation = sessionCanDispatch(session) ? table.byId.get("operating.delegation") : undefined;
604
618
  const skills = sessionHasContext(session) ? table.byId.get("operating.skills") : undefined;
619
+ const skillActivation =
620
+ isAutonomyLevel(autonomyLevel) && modelMayActivateSkills(autonomyLevel)
621
+ ? 'Load matching installed skills with context(scope="skills", name="<name>") and continue the task; skill restrictions still apply.'
622
+ : "Suggest matching skills as /skill <name> (in order when several compose), then continue without them; only the operator activates skills.";
605
623
 
606
624
  const legacy = inputs.sectionOrder === "legacy-0.3.8";
607
625
  const rendered = new Map<string, string>([
608
626
  ["identity", identityBody],
609
627
  ["operating-contract", operatingContract.body],
610
628
  ["delegation", delegation?.body ?? ""],
611
- ["skills", skills?.body ?? ""],
629
+ ["skills", skills?.body.replace("{SKILL_ACTIVATION_POLICY}", skillActivation) ?? ""],
612
630
  ["safety", renderSafetySection(safety, autonomyLevel)],
613
631
  ["runtime", renderRuntimeBlock(session)],
614
632
  ["tool-contract", renderToolContractBlock(session)],
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  id: identity.docs-routing
3
3
  version: 1
4
- description: Directive to route questions about Clio herself through context(scope="docs"); rendered only when context is on the surface
4
+ description: Questions about Clio herself go through gateway(op="call", capability="clio_docs"); this directive renders only when gateway is on the surface and provider tool calls are available.
5
5
  ---
6
6
 
7
7
  # Clio documentation routing
8
8
 
9
- For a question about Clio herself, call context (scope="docs", query=<the question>) before answering and before any workspace search, then read the document it names from the installed documentation path above.
9
+ For a question about Clio herself, call gateway(op="call", capability="clio_docs", args={query: <the question>}) before answering and before any workspace search, then read the document it names from the installed documentation path above.
@@ -6,14 +6,16 @@ description: Coordinator skill suggestion discipline; rendered only when context
6
6
 
7
7
  # Skills
8
8
 
9
- Skills are operator-activated workflows: git delivery, planning, coding
10
- practice, context priming/handoff, research, plan stress-testing.
9
+ Skills are workflows for git delivery, planning, coding practice,
10
+ context priming/handoff, research, and plan stress-testing.
11
11
  context (scope="skills") lists installed and marketplace skills; never
12
- guess it or search the repository for one. When a task has one of those
13
- shapes, list them, suggest the best match as /skill <name> (in order
14
- when several compose), and continue without it: only the operator
15
- activates or installs a skill; a [Marketplace] reminder states its
16
- own offer options. When the operator names a skill or asks how it
17
- works, answer from it. If nothing fits, suggest none. context
18
- (scope="library") is the read-only catalog of recipes and installable
19
- packages; it activates nothing.
12
+ guess a skill or search the repository for one.
13
+ {SKILL_ACTIVATION_POLICY}
14
+ Only the operator installs marketplace skills; a [Marketplace] reminder
15
+ states its own offer options. When the operator names a skill or asks
16
+ how it works, answer from it. If nothing fits, suggest none.
17
+
18
+ If gateway is on the attached direct-tool surface, use
19
+ gateway(op="call", capability="clio_library", args={}) to read the catalog
20
+ of recipes and installable packages; it activates and installs nothing.
21
+ Without gateway, this catalog route is unavailable.
@@ -55,7 +55,11 @@ export {
55
55
  } from "./endpoint-slots-store.js";
56
56
  export { ProvidersManifest } from "./manifest.js";
57
57
  export type { ModelCapabilityPatchTarget } from "./model-capabilities.js";
58
- export { applyModelCapabilityPatch, resolveModelCapabilities } from "./model-capabilities.js";
58
+ export {
59
+ applyModelCapabilityPatch,
60
+ probeCapabilitiesForModel,
61
+ resolveModelCapabilities,
62
+ } from "./model-capabilities.js";
59
63
  export {
60
64
  canonicalizeWireModelId,
61
65
  contextSlotsForModel,
@@ -636,6 +636,37 @@
636
636
  turns when the workflow is iterative; the budget caps runaway chains.
637
637
  serving: "Official Qwen card recommends max output 32768 tokens for standard queries (81920 only for math/code competitions). Coding sampler is the precise variant; preserve thinking blocks across turns for iterative workflows."
638
638
 
639
+ - family: qwopus3.8-27b-dense
640
+ matchPatterns:
641
+ - mini/qwopus3.8-27b-dense
642
+ capabilities:
643
+ reasoning: true
644
+ quirks:
645
+ measuredUnder:
646
+ runtime: "LiteLLM route mini/qwopus3.8-27b-dense-q6; model_info.runtime llama.cpp"
647
+ date: "2026-09-16"
648
+ source: "Operator report and current-source request to blade-gateway, reproduced during v0.4.9 closeout"
649
+ note: |
650
+ The exact route rejected an omitted effort with Jinja's diagnostic
651
+ Unexpected reasoning effort high. Supported types are xhigh
652
+ (default), medium, and low. Clio's captured request carried only
653
+ enable_thinking true. The upstream behavior is consistent with an
654
+ incompatible deployment default; its precise cause was not inspected.
655
+ These effort levels come from that server diagnostic, not from
656
+ Qwen or Qwopus name similarity. Other capabilities remain supplied
657
+ by the route probe; no sampler, hardware, or context size is inherited.
658
+ thinking:
659
+ mechanism: effort-levels
660
+ effortByLevel:
661
+ low: low
662
+ medium: medium
663
+ xhigh: xhigh
664
+ guidance: |
665
+ The measured mini/qwopus3.8-27b-dense-q6 route accepts low, medium,
666
+ and xhigh, and rejects high. Clio maps high and max to xhigh and
667
+ explicitly forwards that supported effort through LiteLLM. Omitting
668
+ active effort can expose an incompatible deployment default.
669
+
639
670
  - family: qwen3.8-27b
640
671
  matchPatterns:
641
672
  - qwen3.8-27b
@@ -829,23 +860,23 @@
829
860
  leakageNote: |
830
861
  LM Studio's gemma4 chat template emits chain-of-thought as plain text
831
862
  bracketed by literal '<|channel>thought\n' and '<channel|>' markers
832
- rather than structured reasoning fragments. The OpenAI-compatible path
833
- currently exposes those markers as the server streams them; filtering
834
- this family remains a follow-up.
863
+ rather than structured reasoning fragments. Clio splits those regions into
864
+ thinking content on the OpenAI-compatible stream, including LM Studio,
865
+ and removes the channel markers from the visible answer.
835
866
  gpuTiers:
836
867
  "48gb": "Fits at f16 KV when parallel=1 and ctx=122880; drop to q8_0 KV at parallel=4."
837
868
  "80gb": "Comfortable at f16 KV with parallel=1 and ctx=122880."
838
869
  runtimePreference:
839
870
  lmstudio: "Pin parallel=1 in the LM Studio per-model preset to give a single agent the full 122880 context."
840
- openaiCompat: "LM Studio chat uses this surface; visible text may contain the raw channel markers."
871
+ openaiCompat: "LM Studio chat uses this surface; Clio separates inline thought regions and removes their channel markers."
841
872
  thinking:
842
873
  mechanism: on-off
843
874
  guidance: |
844
875
  Gemma 4 chat template exposes thinking only as on or off; intermediate
845
876
  levels coerce to on. NVFP4 quantization can corrupt JSON tool-call
846
877
  output under aggressive sampling, so the instruct profile pins
847
- temperature at 0.7. LM Studio's OpenAI-compatible stream currently
848
- exposes channel markers when the server does not classify them.
878
+ temperature at 0.7. Clio classifies inline channel markers on LM Studio's
879
+ OpenAI-compatible stream when the server leaves them in content.
849
880
  serving: "LilaRest publishes no per-model sampler; values inherit the gemma family default per the official Google Gemma 4 31B card. KV cache budget at f16, ctx=122880 is roughly 57 GB on top of ~21 GB of NVFP4 weights."
850
881
 
851
882
  # The qat/UD-Q4_K_XL/MTP build is the long-context llama.cpp gemma profile and is a
@@ -928,7 +959,7 @@
928
959
  "32gb": "32 GB Vulkan llama.cpp profile with UD-Q4_K_XL weights, ctx=262144, q8 KV, flash attention, parallel=1, F16 gemma4v mmproj (vision), and MTP draft (spec-type draft-mtp, n_max 4) both active."
929
960
  runtimePreference:
930
961
  llamaCpp: "OpenAI-compatible chat completions with --jinja and --reasoning off. Recommended local profile serves at ctx=262144, q8 KV, flash attention, parallel=1, batch=1024, ubatch=256, with F16 mmproj vision and draft-mtp speculative decoding; sampler temperature 0.8, top_p 0.95, top_k 64, repeat_penalty 1.05."
931
- openaiCompat: "Fallback when a gateway fronts the same llama.cpp chat-completions surface; the openai-compat surface does not expose the channel-marker classifier, so visible text may show raw thought markers."
962
+ openaiCompat: "Fallback when a gateway fronts the same llama.cpp chat-completions surface; Clio separates inline thought regions with the shared channel-marker filter."
932
963
  llamaCpp:
933
964
  ctxSize: 262144
934
965
  cacheTypeK: q8_0
@@ -1008,15 +1039,16 @@
1008
1039
  "48gb": "Fits at f16 KV with parallel=1; q8_0 KV recommended at parallel=4."
1009
1040
  "80gb": "Comfortable at f16 KV with parallel=1 and ctx=122880."
1010
1041
  runtimePreference:
1011
- lmstudio: "LM Studio's OpenAI-compatible stream may expose this family's channel markers as visible text."
1042
+ lmstudio: "LM Studio may stream inline channel markers; Clio separates the thought region and removes the markers from the answer."
1012
1043
  openaiCompat: "Fallback; reasoning_content is absent from the openai-compat reasoning probe for this family."
1013
1044
  thinking:
1014
1045
  mechanism: always-on
1015
1046
  guidance: |
1016
1047
  Distilled traces emit unconditionally. The thinking level setting is
1017
1048
  ignored at the API surface; chain-of-thought arrives whether or not
1018
- Clio asks for it. Channel-marker filtering remains a follow-up for the
1019
- OpenAI-compatible LM Studio path.
1049
+ Clio asks for it. The shared channel-marker filter splits inline thought
1050
+ regions into thinking content on the OpenAI-compatible LM Studio path
1051
+ and removes the markers from the visible answer.
1020
1052
  serving: "Distilled from Claude 4.6 Opus reasoning traces onto Google Gemma 4 31B; sampler matches the gemopus card values."
1021
1053
 
1022
1054
  - family: qwopus3.6-27b-v1-preview
@@ -13,84 +13,69 @@ export interface HttpProbeOptions {
13
13
 
14
14
  export type JsonProbeOptions = HttpProbeOptions;
15
15
 
16
- export interface JsonProbeResult<T = unknown> extends ProbeResult {
17
- data?: T;
16
+ export interface HttpProbeResult extends ProbeResult {
17
+ /** Status of a completed HTTP response; absent when body/transport work fails. */
18
+ status?: number;
18
19
  }
19
20
 
20
- export async function probeHttp(opts: HttpProbeOptions): Promise<ProbeResult> {
21
- const { response, latencyMs, error } = await runFetch(opts);
22
- if (response === null) return { ok: false, error: error ?? "unknown transport error", latencyMs };
23
- const method = opts.method ?? "GET";
24
- if (response.ok) return { ok: true, latencyMs };
25
- // Some servers reject HEAD with 405 even though the endpoint is reachable.
26
- if (method === "HEAD" && response.status === 405) return { ok: true, latencyMs };
27
- return {
28
- ok: false,
29
- latencyMs,
30
- error: `HTTP ${response.status}: ${response.statusText}`,
31
- };
21
+ export interface JsonProbeResult<T = unknown> extends HttpProbeResult {
22
+ data?: T;
32
23
  }
33
24
 
34
- export async function probeJson<T = unknown>(opts: JsonProbeOptions): Promise<JsonProbeResult<T>> {
35
- const { response, latencyMs, error } = await runFetch(opts);
36
- if (response === null) return { ok: false, error: error ?? "unknown transport error", latencyMs };
37
- const method = opts.method ?? "GET";
38
- if (!response.ok && !(method === "HEAD" && response.status === 405)) {
39
- return {
40
- ok: false,
41
- latencyMs,
42
- error: `HTTP ${response.status}: ${response.statusText}`,
43
- };
44
- }
45
- let data: T;
46
- try {
47
- data = (await response.json()) as T;
48
- } catch (err) {
49
- return { ok: false, latencyMs, error: `JSON parse: ${describeError(err)}` };
50
- }
51
- return { ok: true, latencyMs, data };
25
+ export async function probeHttp(opts: HttpProbeOptions): Promise<HttpProbeResult> {
26
+ return runProbe(opts, false);
52
27
  }
53
28
 
54
- interface FetchOutcome {
55
- response: Response | null;
56
- latencyMs: number;
57
- error?: string;
29
+ export async function probeJson<T = unknown>(opts: JsonProbeOptions): Promise<JsonProbeResult<T>> {
30
+ return runProbe<T>(opts, true);
58
31
  }
59
32
 
60
- async function runFetch(opts: HttpProbeOptions): Promise<FetchOutcome> {
33
+ /** Own the request until its body has been consumed or cancelled. */
34
+ async function runProbe<T>(opts: HttpProbeOptions, readJson: boolean): Promise<JsonProbeResult<T>> {
61
35
  const controller = new AbortController();
62
- let timedOut = false;
63
- const timer = setTimeout(() => {
64
- timedOut = true;
36
+ let abortError: string | undefined;
37
+ const abort = (error: string): void => {
38
+ if (controller.signal.aborted) return;
39
+ abortError = error;
65
40
  controller.abort();
66
- }, opts.timeoutMs);
67
- const onExternalAbort = () => controller.abort();
68
- if (opts.signal) {
69
- if (opts.signal.aborted) controller.abort();
70
- else opts.signal.addEventListener("abort", onExternalAbort, { once: true });
71
- }
72
- const init: RequestInit = {
73
- method: opts.method ?? "GET",
74
- signal: controller.signal,
75
41
  };
42
+ const timer = setTimeout(() => abort(`timeout after ${opts.timeoutMs}ms`), opts.timeoutMs);
43
+ const onExternalAbort = () => abort("aborted by caller");
44
+ if (opts.signal?.aborted) onExternalAbort();
45
+ else opts.signal?.addEventListener("abort", onExternalAbort, { once: true });
46
+ const method = opts.method ?? "GET";
47
+ const init: RequestInit = { method, signal: controller.signal };
76
48
  if (opts.headers) init.headers = opts.headers;
77
49
  if (opts.body !== undefined) init.body = opts.body;
78
50
  const started = performance.now();
51
+ let latencyMs: number | undefined;
52
+ let parsingJson = false;
79
53
  try {
80
54
  const response = await fetch(opts.url, init);
81
- return { response, latencyMs: Math.round(performance.now() - started) };
82
- } catch (err) {
83
- const latencyMs = Math.round(performance.now() - started);
84
- if (timedOut) {
85
- return { response: null, latencyMs, error: `timeout after ${opts.timeoutMs}ms` };
55
+ // Preserve the existing network latency measurement at response headers.
56
+ latencyMs = Math.round(performance.now() - started);
57
+ // HEAD 405 demonstrates reachability, but does not supply JSON data.
58
+ const ok = response.ok || (method === "HEAD" && response.status === 405);
59
+ if (!ok || !readJson) {
60
+ await response.body?.cancel();
61
+ controller.signal.throwIfAborted();
62
+ return ok
63
+ ? { ok: true, latencyMs, status: response.status }
64
+ : { ok: false, latencyMs, status: response.status, error: `HTTP ${response.status}: ${response.statusText}` };
86
65
  }
87
- if (opts.signal?.aborted) {
88
- return { response: null, latencyMs, error: "aborted by caller" };
89
- }
90
- return { response: null, latencyMs, error: describeError(err) };
66
+ parsingJson = true;
67
+ const data = (await response.json()) as T;
68
+ controller.signal.throwIfAborted();
69
+ return { ok: true, latencyMs, status: response.status, data };
70
+ } catch (err) {
71
+ return {
72
+ ok: false,
73
+ latencyMs: latencyMs ?? Math.round(performance.now() - started),
74
+ error: abortError ?? `${parsingJson ? "JSON parse: " : ""}${describeError(err)}`,
75
+ };
91
76
  } finally {
92
77
  clearTimeout(timer);
93
- if (opts.signal) opts.signal.removeEventListener("abort", onExternalAbort);
78
+ opts.signal?.removeEventListener("abort", onExternalAbort);
94
79
  }
95
80
  }
96
81
 
@@ -95,6 +95,8 @@ export async function probeOpenAICompatReasoning(opts: ProbeReasoningOptions): P
95
95
  });
96
96
  const latencyMs = Math.round(performance.now() - started);
97
97
  if (!response.ok) {
98
+ await response.body?.cancel();
99
+ controller.signal.throwIfAborted();
98
100
  return { reasoning: false, latencyMs, error: `HTTP ${response.status}: ${response.statusText}` };
99
101
  }
100
102
  const data = (await response.json()) as ChatCompletionResponse;
@@ -54,27 +54,6 @@ function flattenNativeEmbedding(entry: NativeEmbeddingItem): number[] {
54
54
  return value as number[];
55
55
  }
56
56
 
57
- async function postJson<T>(
58
- url: string,
59
- body: unknown,
60
- signal: AbortSignal | undefined,
61
- ): Promise<{ status: number; data: T | null }> {
62
- const init: RequestInit = {
63
- method: "POST",
64
- headers: { "content-type": "application/json" },
65
- body: JSON.stringify(body),
66
- };
67
- if (signal) init.signal = signal;
68
- const response = await fetch(url, init);
69
- if (!response.ok) return { status: response.status, data: null };
70
- try {
71
- const data = (await response.json()) as T;
72
- return { status: response.status, data };
73
- } catch {
74
- return { status: response.status, data: null };
75
- }
76
- }
77
-
78
57
  const llamacppEmbedRuntime: RuntimeDescriptor = {
79
58
  id: "llamacpp-embed",
80
59
  displayName: "llama.cpp (embeddings)",
@@ -90,16 +69,16 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
90
69
  const healthOpts = { url: `${base}/health`, timeoutMs: ctx.httpTimeoutMs } as const;
91
70
  const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
92
71
  if (!health.ok) return health;
93
- const probeResponse = await fetch(`${base}/embedding`, {
72
+ const probeResponse = await probeHttp({
73
+ url: `${base}/embedding`,
94
74
  method: "POST",
75
+ timeoutMs: ctx.httpTimeoutMs,
95
76
  headers: { "content-type": "application/json" },
96
77
  body: JSON.stringify({ content: "probe" }),
97
78
  ...(ctx.signal ? { signal: ctx.signal } : {}),
98
- }).catch((err) => {
99
- return new Response(null, { status: 599, statusText: String(err) });
100
79
  });
101
80
  if (!probeResponse.ok) {
102
- return { ok: false, error: `/embedding not available: HTTP ${probeResponse.status}` };
81
+ return { ok: false, error: `/embedding not available: ${probeResponse.error}` };
103
82
  }
104
83
  const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
105
84
  const result: ProbeResult = { ok: true };
@@ -129,12 +108,15 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
129
108
  if (!base) throw new Error("target has no url");
130
109
  const modelId = target.defaultModel ?? "default";
131
110
  const inputs = Array.isArray(input) ? input : [input];
132
- const oai = await postJson<OaiEmbeddingResponse>(
133
- `${base}/v1/embeddings`,
134
- { input: inputs, model: modelId, encoding_format: "float" },
135
- ctx.signal,
136
- );
137
- if (oai.data && Array.isArray(oai.data.data)) {
111
+ const oai = await probeJson<OaiEmbeddingResponse>({
112
+ url: `${base}/v1/embeddings`,
113
+ method: "POST",
114
+ timeoutMs: ctx.httpTimeoutMs,
115
+ headers: { "content-type": "application/json" },
116
+ body: JSON.stringify({ input: inputs, model: modelId, encoding_format: "float" }),
117
+ ...(ctx.signal ? { signal: ctx.signal } : {}),
118
+ });
119
+ if (oai.ok && oai.data && Array.isArray(oai.data.data)) {
138
120
  const rows = oai.data.data;
139
121
  const sorted = [...rows].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
140
122
  const vectors = sorted.map((row) => row.embedding ?? []);
@@ -148,6 +130,13 @@ const llamacppEmbedRuntime: RuntimeDescriptor = {
148
130
  if (tokens !== undefined) result.tokensUsed = tokens;
149
131
  return result;
150
132
  }
133
+ // Only endpoint-unavailable responses permit trying the native route.
134
+ // Cancellation, transport failures and malformed successes must not
135
+ // submit a second inference request.
136
+ if (oai.status === undefined || ![404, 405, 501].includes(oai.status)) {
137
+ throw new Error(`llama.cpp embedding failed: ${oai.error ?? "invalid OAI embedding response"}`);
138
+ }
139
+ if (ctx.signal?.aborted) throw new Error("llama.cpp embedding failed: aborted by caller");
151
140
  const probeOpts = { url: `${base}/embedding`, timeoutMs: ctx.httpTimeoutMs } as const;
152
141
  const native = await (ctx.signal
153
142
  ? probeJson<NativeEmbeddingItem[]>({
@@ -51,14 +51,19 @@ const llamacppRerankRuntime: RuntimeDescriptor = {
51
51
  const health = await (ctx.signal ? probeHttp({ ...healthOpts, signal: ctx.signal }) : probeHttp(healthOpts));
52
52
  if (!health.ok) return health;
53
53
  const modelId = target.defaultModel ?? "default";
54
- const probeResponse = await fetch(`${base}/reranking`, {
54
+ const probeResponse = await probeHttp({
55
+ url: `${base}/reranking`,
55
56
  method: "POST",
57
+ timeoutMs: ctx.httpTimeoutMs,
56
58
  headers: { "content-type": "application/json" },
57
59
  body: JSON.stringify({ query: "probe", documents: ["a"], model: modelId }),
58
60
  ...(ctx.signal ? { signal: ctx.signal } : {}),
59
- }).catch((err) => new Response(null, { status: 599, statusText: String(err) }));
60
- if (!(probeResponse.status === 200 || probeResponse.status === 202)) {
61
- return { ok: false, error: `/reranking not available: HTTP ${probeResponse.status}` };
61
+ });
62
+ if (!probeResponse.ok || !(probeResponse.status === 200 || probeResponse.status === 202)) {
63
+ return {
64
+ ok: false,
65
+ error: `/reranking not available: ${probeResponse.error ?? `HTTP ${probeResponse.status}`}`,
66
+ };
62
67
  }
63
68
  const props = await probeLlamaCppProps(base, ctx, target.defaultModel);
64
69
  const result: ProbeResult = { ok: true };