@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
@@ -1,4 +1,5 @@
1
1
  import { isAbsolute, relative, resolve } from "node:path";
2
+ import { effectiveToolCall } from "../../tools/surface.js";
2
3
 
3
4
  export type SessionArtifactTool = "artifact" | "write" | "edit";
4
5
  export type SessionArtifactKind = "plan" | "review" | "report";
@@ -61,7 +62,13 @@ export function foldSessionArtifacts(
61
62
  if (!isRecord(raw) || raw.kind !== "message" || raw.role !== "tool_result") continue;
62
63
  if (typeof raw.turnId !== "string" || typeof raw.timestamp !== "string") continue;
63
64
  const payload = raw.payload;
64
- if (!isRecord(payload) || !isSessionArtifactTool(payload.toolName)) continue;
65
+ if (!isRecord(payload) || typeof payload.toolName !== "string") continue;
66
+ const result = payload.result;
67
+ const details = isRecord(result) && isRecord(result.details) ? result.details : null;
68
+ // An artifact written through the gateway is recorded under `gateway`
69
+ // with the capability stamped on its details; it is the same write.
70
+ const toolName = effectiveToolCall(payload.toolName, undefined, details ?? undefined).toolName;
71
+ if (!isSessionArtifactTool(toolName)) continue;
65
72
  if (
66
73
  payload.isError === true ||
67
74
  payload.outcome === "error" ||
@@ -71,12 +78,10 @@ export function foldSessionArtifacts(
71
78
  ) {
72
79
  continue;
73
80
  }
74
- const result = payload.result;
75
- if (!isRecord(result) || !isRecord(result.details) || !Array.isArray(result.details.paths)) continue;
76
- const artifactKind =
77
- payload.toolName === "artifact" && isSessionArtifactKind(result.details.kind) ? result.details.kind : undefined;
81
+ if (!isRecord(result) || details === null || !Array.isArray(details.paths)) continue;
82
+ const artifactKind = toolName === "artifact" && isSessionArtifactKind(details.kind) ? details.kind : undefined;
78
83
  const pathsSeenInResult = new Set<string>();
79
- for (const recordedPath of result.details.paths) {
84
+ for (const recordedPath of details.paths) {
80
85
  if (typeof recordedPath !== "string" || recordedPath.trim().length === 0) continue;
81
86
  const normalized = normalizedWorkspacePath(recordedPath, workspace);
82
87
  if (normalized === null || pathsSeenInResult.has(normalized)) continue;
@@ -86,7 +91,7 @@ export function foldSessionArtifacts(
86
91
  writeIndex += 1;
87
92
  lastByPath.set(normalized, {
88
93
  path: recordedPath,
89
- tool: payload.toolName,
94
+ tool: toolName,
90
95
  ...(artifactKind ? { artifactKind } : {}),
91
96
  turnId: raw.turnId,
92
97
  timestamp: raw.timestamp,
@@ -9,9 +9,8 @@ import {
9
9
  /**
10
10
  * The session task board: the live state behind the `tasks` tool, the footer
11
11
  * tasks row, and the /tasks overlay. Every mutation persists a full-snapshot
12
- * `taskLedger` entry (the dormant Phase 12 entry kind gains its producer
13
- * here), so the board is replayable from the JSONL alone and survives
14
- * resume/fork without any side-car state.
12
+ * `taskLedger` entry, so the board is replayable from the JSONL alone and
13
+ * survives resume/fork without any side-car state.
15
14
  *
16
15
  * Shape mapping onto TaskLedgerEntry:
17
16
  * - the board title is the single top-level goal
@@ -13,10 +13,8 @@
13
13
  * every surface's accounting, which is the same thing the tools/interactive
14
14
  * boundary rule exists to prevent.
15
15
  *
16
- * Assistant turns marked aborted or error are skipped for the same reason the
17
- * context estimator skips them: their usage is not a completed call. A
18
- * cancelled partial persists a fully populated all-zero usage object, so
19
- * counting it would add an API call worth nothing.
16
+ * Failed/aborted calls with reported usage still consumed resources. Skip
17
+ * only all-zero SDK placeholders, whose accounting was never observed.
20
18
  */
21
19
 
22
20
  import {
@@ -39,6 +37,7 @@ export interface LedgerUsageCall {
39
37
  output: number;
40
38
  cacheRead: number;
41
39
  cacheWrite: number;
40
+ cacheWrite1h?: number;
42
41
  reasoningTokens: number;
43
42
  totalTokens: number;
44
43
  costUsd: number;
@@ -58,7 +57,7 @@ function numberAt(source: Record<string, unknown>, key: string): number {
58
57
  }
59
58
 
60
59
  function reasoningTokensOf(usage: Record<string, unknown>): number {
61
- const direct = numberAt(usage, "reasoningTokens");
60
+ const direct = numberAt(usage, "reasoning") || numberAt(usage, "reasoningTokens");
62
61
  if (direct > 0) return direct;
63
62
  const details = usage.outputTokensDetails ?? usage.completionTokensDetails;
64
63
  if (details && typeof details === "object") return numberAt(details as Record<string, unknown>, "reasoningTokens");
@@ -109,6 +108,7 @@ export function ledgerUsageCalls(
109
108
  output: usage.output,
110
109
  cacheRead: usage.cacheRead,
111
110
  cacheWrite: usage.cacheWrite,
111
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
112
112
  reasoningTokens: usage.reasoning,
113
113
  totalTokens: usage.totalTokens,
114
114
  costUsd: usage.cost.total,
@@ -129,8 +129,6 @@ export function ledgerUsageCalls(
129
129
  const payload = entry.payload;
130
130
  if (!payload || typeof payload !== "object" || Array.isArray(payload)) continue;
131
131
  const record = payload as Record<string, unknown>;
132
- const stopReason = record.stopReason;
133
- if (stopReason === "aborted" || stopReason === "error") continue;
134
132
  const rawUsage = record.usage;
135
133
  if (!rawUsage || typeof rawUsage !== "object" || Array.isArray(rawUsage)) continue;
136
134
  const usage = rawUsage as Record<string, unknown>;
@@ -156,6 +154,7 @@ export function ledgerUsageCalls(
156
154
  output,
157
155
  cacheRead,
158
156
  cacheWrite,
157
+ ...(typeof usage.cacheWrite1h === "number" ? { cacheWrite1h: numberAt(usage, "cacheWrite1h") } : {}),
159
158
  reasoningTokens: reasoningTokensOf(usage),
160
159
  totalTokens,
161
160
  costUsd,
@@ -2559,6 +2559,17 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2559
2559
  }
2560
2560
  const text = promptText(params);
2561
2561
  if (text.length === 0) throw new AcpRequestError(-32602, "prompt text is required", { code: "invalid_params" });
2562
+ // Check the same credential authority as the runtime, without resolving or
2563
+ // echoing a secret. Desktop services do not inherit a terminal's API keys.
2564
+ const targetId = routingSnapshot().target;
2565
+ const target = targetId ? options.providers?.getTarget(targetId) : undefined;
2566
+ const runtime = target ? options.providers?.getRuntime(target.runtime) : undefined;
2567
+ if (target && runtime && options.providers && !options.providers.auth.statusForTarget(target, runtime).available) {
2568
+ throw new AcpRequestError(-32000, "credentials for the selected target are unavailable", {
2569
+ code: "prompt_not_admitted",
2570
+ reason: "authentication-required",
2571
+ });
2572
+ }
2562
2573
  if (options.session?.current()?.id !== session.id && options.session) options.session.resume(session.id);
2563
2574
  const active = createActivePromptState();
2564
2575
  session.activePrompt = active;
package/src/engine/ai.ts CHANGED
@@ -76,6 +76,7 @@ export interface EngineTextCompletionResult {
76
76
  output: number;
77
77
  cacheRead: number;
78
78
  cacheWrite: number;
79
+ cacheWrite1h?: number;
79
80
  reasoning: number;
80
81
  totalTokens: number;
81
82
  costUsd: number;
@@ -110,6 +111,7 @@ export async function completeEngineText(input: EngineTextCompletionInput): Prom
110
111
  output: response.usage.output,
111
112
  cacheRead: response.usage.cacheRead,
112
113
  cacheWrite: response.usage.cacheWrite,
114
+ ...(response.usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: response.usage.cacheWrite1h }),
113
115
  reasoning: response.usage.reasoning ?? 0,
114
116
  totalTokens: response.usage.totalTokens,
115
117
  costUsd: response.usage.cost.total,
@@ -35,6 +35,7 @@ import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/
35
35
  import type { LiteLLMTargetSettings, LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
36
36
  import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
37
37
  import { HarmonyResponseParser } from "../harmony-response.js";
38
+ import { captureErrorBody, restoreTruncatedErrorBody } from "../provider-error-body.js";
38
39
  import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
39
40
  import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
40
41
  import { ensureLmStudioResidency } from "./lmstudio.js";
@@ -110,6 +111,8 @@ interface ResponseModelIdCapture {
110
111
  backendTimings: BackendCompletionTimings | null;
111
112
  backendTimingsSource: BackendTimingsSource | null;
112
113
  gatewayRouting: GatewayRoutingObservation | null;
114
+ /** Latest non-2xx body, read from a clone before the SDK truncates its copy. */
115
+ errorBody: Promise<string | null> | null;
113
116
  buffer: string;
114
117
  decoder: TextDecoder | null;
115
118
  }
@@ -212,6 +215,7 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
212
215
  if (runtimeMetadata(model)?.runtimeId === "litellm") {
213
216
  capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
214
217
  }
218
+ if (!response.ok) capture.errorBody = captureErrorBody(response);
215
219
  if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
216
220
  return response;
217
221
  }
@@ -247,6 +251,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
247
251
  backendTimings: null,
248
252
  backendTimingsSource: backendTimingsSourceForModel(model),
249
253
  gatewayRouting: null,
254
+ errorBody: null,
250
255
  buffer: "",
251
256
  decoder: new TextDecoder(),
252
257
  };
@@ -271,6 +276,9 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
271
276
  if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
272
277
  if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
273
278
  } else if (event.type === "error") {
279
+ if (event.error.errorMessage !== undefined && capture.errorBody !== null) {
280
+ event.error.errorMessage = restoreTruncatedErrorBody(event.error.errorMessage, await capture.errorBody);
281
+ }
274
282
  event.error.responseModelIdObservation = observation;
275
283
  if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
276
284
  if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
@@ -546,11 +554,15 @@ function applyLmStudioPayload(
546
554
  return next;
547
555
  }
548
556
 
549
- function applyLlamaCppPromptCachePayload(payload: Record<string, unknown>, model: Model<Api>): Record<string, unknown> {
557
+ function applyLlamaCppPromptCachePayload(
558
+ payload: Record<string, unknown>,
559
+ model: Model<Api>,
560
+ retention: StreamOptions["cacheRetention"],
561
+ ): Record<string, unknown> {
550
562
  const metadata = runtimeMetadata(model);
551
563
  if (model.provider !== "llamacpp" || metadata?.runtimeId !== "llamacpp") return payload;
552
564
  if (payload.cache_prompt !== undefined) return payload;
553
- return { ...payload, cache_prompt: true };
565
+ return { ...payload, cache_prompt: retention !== "none" };
554
566
  }
555
567
 
556
568
  function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boolean {
@@ -562,13 +574,14 @@ function shouldApplyLlamaCppPromptCache(model: Model<"openai-completions">): boo
562
574
  function composeThinkingOnPayload(
563
575
  resolved: ResolvedModelRuntimeCapabilities,
564
576
  base: AnyOnPayload | undefined,
577
+ retention: StreamOptions["cacheRetention"],
565
578
  ): AnyOnPayload {
566
579
  return async (payload, model) => {
567
580
  if (!isPlainRecord(payload)) {
568
581
  return base ? await base(payload, model) : undefined;
569
582
  }
570
583
  const next = applyLmStudioPayload(
571
- applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model), resolved.thinking, resolved, model),
584
+ applyThinkingPayload(applyLlamaCppPromptCachePayload(payload, model, retention), resolved.thinking, resolved, model),
572
585
  model,
573
586
  resolved,
574
587
  );
@@ -625,7 +638,7 @@ function withSamplingOverrides<TOptions extends StreamOptions>(
625
638
  applied.mechanism === "on-off" ||
626
639
  applied.mechanism === "none"
627
640
  ) {
628
- merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload);
641
+ merged.onPayload = composeThinkingOnPayload(resolved, options?.onPayload, options?.cacheRetention);
629
642
  }
630
643
  return merged as TOptions;
631
644
  }
@@ -949,6 +949,13 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
949
949
  return true;
950
950
  },
951
951
  evaluate(input): ReadonlyArray<MiddlewareEffect> {
952
+ // A nested invocation (the gateway calling the capability the model
953
+ // asked for) is the same model call the outer gateway occurrence
954
+ // already counted and fingerprinted. Counting it again would spend
955
+ // the worker cap and the turn budget twice per gateway call, and its
956
+ // inner fingerprint would never repeat across a model's retries the
957
+ // outer one does not already show.
958
+ if (input.metadata?.nested === true) return [];
952
959
  if (input.hook === "after_tool") {
953
960
  recordSuccessfulResult(input);
954
961
  recordResultForStagnation(input);
@@ -0,0 +1,232 @@
1
+ /**
2
+ * One bounded-output warm through the eventual caller's engine request path.
3
+ * Copies portable context, applies public Pi transforms and payload hooks,
4
+ * and consumes the response without running tools or appending conversation.
5
+ * Admission and lifecycle remain with the caller. A matching serialized
6
+ * prefix is only a reuse candidate; the backend decides actual cache reuse.
7
+ */
8
+
9
+ import type { Agent } from "@earendil-works/pi-agent-core";
10
+ import type { BackendCompletionTimings } from "../core/cache-telemetry.js";
11
+ import { streamSimple } from "./ai.js";
12
+ import { estimateInputTokensFromContext } from "./apis/output-budget.js";
13
+ import type { AgentMessage, AgentTool, EngineModel, Usage } from "./types.js";
14
+
15
+ /**
16
+ * The one user message appended so the chat template renders the prefix up to
17
+ * the user turn. One character: it has to exist for the template to close the
18
+ * prefix, and everything after the last shared byte is re-evaluated by the real
19
+ * turn anyway.
20
+ */
21
+ export const PREWARM_USER_TEXT = ".";
22
+
23
+ /** Output budget for the round. The tokens the model produces are not the point. */
24
+ export const PREWARM_MAX_TOKENS = 1;
25
+
26
+ /** Which trigger asked for the pre-warm. Recorded on the ledger entry. */
27
+ export type PrewarmTrigger = "session-start" | "resume" | "compaction";
28
+
29
+ export interface PrewarmContext {
30
+ systemPrompt: string;
31
+ messages: ReadonlyArray<AgentMessage>;
32
+ tools: ReadonlyArray<AgentTool>;
33
+ }
34
+
35
+ /**
36
+ * The roles pi-agent-core's default `convertToLlm` keeps when it turns the
37
+ * agent's message list into provider messages. The pre-warm applies the same
38
+ * filter so its message array is the one a turn would send, not the agent's
39
+ * internal list.
40
+ */
41
+ const LLM_MESSAGE_ROLES: ReadonlySet<string> = new Set(["user", "assistant", "toolResult"]);
42
+
43
+ export interface PrewarmRoundInput {
44
+ model: EngineModel;
45
+ /** Live agent state the next turn would send. Read-only; the round copies it. */
46
+ state: {
47
+ systemPrompt: string;
48
+ messages: ReadonlyArray<AgentMessage>;
49
+ tools: ReadonlyArray<AgentTool>;
50
+ thinkingLevel: string;
51
+ };
52
+ apiKey?: string;
53
+ signal?: AbortSignal;
54
+ /** Admission bound on the engine's input estimate, after context selection. */
55
+ maxInputTokens?: number;
56
+ /** Public Pi preparation hooks of the eventual caller. No tools or agent loop are executed. */
57
+ agent?: Pick<
58
+ Agent,
59
+ | "transformContext"
60
+ | "convertToLlm"
61
+ | "streamFunction"
62
+ | "onPayload"
63
+ | "onResponse"
64
+ | "sessionId"
65
+ | "thinkingBudgets"
66
+ | "transport"
67
+ | "maxRetryDelayMs"
68
+ >;
69
+ /** Test seam. Production uses the engine dispatcher a turn runs on. */
70
+ streamFn?: typeof streamSimple;
71
+ }
72
+
73
+ export interface PrewarmRoundResult {
74
+ /** True when the operator submitted (or the session moved) before the round settled. */
75
+ aborted: boolean;
76
+ /** Provider usage for the round; null when the backend reported none. */
77
+ usage: Usage | null;
78
+ /** Backend prefill and prediction timings when the server reported them. */
79
+ backend: BackendCompletionTimings | null;
80
+ /** Wall clock the round spent, in the shape a turn's assistant entry uses. */
81
+ timing: { ttftMs: number | null; apiMs: number };
82
+ /** Provider error text when the round failed outright. */
83
+ errorMessage: string | null;
84
+ }
85
+
86
+ function usageOf(message: unknown): Usage | null {
87
+ if (message === null || typeof message !== "object") return null;
88
+ const usage = (message as { usage?: unknown }).usage;
89
+ if (usage === null || typeof usage !== "object") return null;
90
+ const record = usage as Usage;
91
+ // Pi initializes missing usage to zero, including on aborted/error calls.
92
+ // A warm with no observed tokens cannot be called a measured free request.
93
+ return [record.input, record.output, record.cacheRead, record.cacheWrite, record.cost?.total].some(
94
+ (value) => typeof value === "number" && Number.isFinite(value) && value > 0,
95
+ )
96
+ ? record
97
+ : null;
98
+ }
99
+
100
+ function backendOf(message: unknown): BackendCompletionTimings | null {
101
+ if (message === null || typeof message !== "object") return null;
102
+ const backend = (message as { backendTimings?: unknown }).backendTimings;
103
+ return backend !== null && typeof backend === "object" ? (backend as BackendCompletionTimings) : null;
104
+ }
105
+
106
+ /**
107
+ * Prompt tokens the backend actually processed for one pre-warm. The server's
108
+ * own prompt count is authoritative when it reported one; otherwise the
109
+ * provider usage prompt side, cached tokens folded in, is the honest figure.
110
+ * Null when neither exists, which is different from a measured zero.
111
+ */
112
+ export function prewarmPromptTokens(result: Pick<PrewarmRoundResult, "usage" | "backend">): number | null {
113
+ if (result.backend) return result.backend.promptTokens;
114
+ const usage = result.usage;
115
+ if (!usage) return null;
116
+ const total = (usage.input || 0) + (usage.cacheRead || 0) + (usage.cacheWrite || 0);
117
+ return total > 0 ? total : null;
118
+ }
119
+
120
+ /**
121
+ * Send the prefix and wait for the backend to acknowledge it. Resolves rather
122
+ * than rejects on a provider failure: a pre-warm is an optimization, and a
123
+ * backend that refuses it must not be able to break the session it was warming.
124
+ */
125
+ export async function runPrewarmRound(input: PrewarmRoundInput): Promise<PrewarmRoundResult> {
126
+ // pi-agent-core maps `thinkingLevel: "off"` onto an absent `reasoning`; the
127
+ // pre-warm has to make the same mapping or the thinking composition resolves
128
+ // against a different level and the rendered template moves.
129
+ const options: Record<string, unknown> = { maxTokens: PREWARM_MAX_TOKENS };
130
+ // Narrow residency authority without changing prompt rendering. A warm may
131
+ // not inherit the foreground turn's implicit load/unload authorization.
132
+ const metadata = (input.model as EngineModel & { clioCoder?: Record<string, unknown> }).clioCoder;
133
+ const model = metadata ? { ...input.model, clioCoder: { ...metadata, lifecycle: "user-managed" } } : input.model;
134
+ if (metadata?.runtimeId === "llamacpp") {
135
+ // A worker that disappeared after admission must not be JIT-loaded by
136
+ // the pinned llama router. This query is independent of prompt bytes.
137
+ options.fetch = (request: string | URL | Request, init?: RequestInit) => {
138
+ const url = new URL(request instanceof Request ? request.url : request);
139
+ url.searchParams.set("autoload", "false");
140
+ return fetch(request instanceof Request ? new Request(url, request) : url, init);
141
+ };
142
+ }
143
+ if (input.state.thinkingLevel !== "off") options.reasoning = input.state.thinkingLevel;
144
+ if (input.apiKey !== undefined) options.apiKey = input.apiKey;
145
+ if (input.signal !== undefined) options.signal = input.signal;
146
+ if (input.agent) {
147
+ for (const key of [
148
+ "onPayload",
149
+ "onResponse",
150
+ "sessionId",
151
+ "thinkingBudgets",
152
+ "transport",
153
+ "maxRetryDelayMs",
154
+ ] as const) {
155
+ if (input.agent[key] !== undefined) options[key] = input.agent[key];
156
+ }
157
+ }
158
+
159
+ const send = input.streamFn ?? input.agent?.streamFunction ?? streamSimple;
160
+ const startedAt = performance.now();
161
+ let firstDeltaAt: number | null = null;
162
+ const elapsed = (): number => Math.round(Math.max(0, performance.now() - startedAt));
163
+ const ttft = (): number | null => (firstDeltaAt === null ? null : Math.round(Math.max(0, firstDeltaAt - startedAt)));
164
+
165
+ try {
166
+ input.signal?.throwIfAborted();
167
+ let messages: AgentMessage[] = [
168
+ ...structuredClone([...input.state.messages]),
169
+ { role: "user", content: [{ type: "text", text: PREWARM_USER_TEXT }], timestamp: Date.now() },
170
+ ];
171
+ if (input.agent?.transformContext) messages = await input.agent.transformContext(messages, input.signal);
172
+ const converted = input.agent
173
+ ? await input.agent.convertToLlm(messages)
174
+ : messages.filter((message) => LLM_MESSAGE_ROLES.has(message.role));
175
+ input.signal?.throwIfAborted();
176
+ const context = {
177
+ systemPrompt: input.state.systemPrompt,
178
+ messages: converted,
179
+ tools: [...input.state.tools],
180
+ } as Parameters<typeof streamSimple>[1];
181
+ if (input.maxInputTokens !== undefined && estimateInputTokensFromContext(context) > input.maxInputTokens) {
182
+ throw new Error("pre-warm input estimate exceeds its token budget");
183
+ }
184
+ const events = await send(
185
+ model,
186
+ context as unknown as Parameters<typeof streamSimple>[1],
187
+ options as unknown as Parameters<typeof streamSimple>[2],
188
+ );
189
+ for await (const event of events) {
190
+ const hasDelta =
191
+ event.type === "toolcall_start" ||
192
+ ((event.type === "text_delta" || event.type === "thinking_delta" || event.type === "toolcall_delta") &&
193
+ event.delta.length > 0);
194
+ if (firstDeltaAt === null && hasDelta) firstDeltaAt = performance.now();
195
+ if (event.type === "done") {
196
+ return {
197
+ aborted: false,
198
+ usage: usageOf(event.message),
199
+ backend: backendOf(event.message),
200
+ timing: { ttftMs: ttft(), apiMs: elapsed() },
201
+ errorMessage: null,
202
+ };
203
+ }
204
+ if (event.type === "error") {
205
+ const failed = event.error as { stopReason?: unknown; errorMessage?: unknown };
206
+ const aborted = event.reason === "aborted" || failed.stopReason === "aborted" || input.signal?.aborted === true;
207
+ return {
208
+ aborted,
209
+ usage: usageOf(event.error),
210
+ backend: backendOf(event.error),
211
+ timing: { ttftMs: ttft(), apiMs: elapsed() },
212
+ errorMessage: aborted ? null : typeof failed.errorMessage === "string" ? failed.errorMessage : "pre-warm failed",
213
+ };
214
+ }
215
+ }
216
+ } catch (error) {
217
+ return {
218
+ aborted: input.signal?.aborted === true,
219
+ usage: null,
220
+ backend: null,
221
+ timing: { ttftMs: ttft(), apiMs: elapsed() },
222
+ errorMessage: input.signal?.aborted === true ? null : error instanceof Error ? error.message : String(error),
223
+ };
224
+ }
225
+ return {
226
+ aborted: input.signal?.aborted === true,
227
+ usage: null,
228
+ backend: null,
229
+ timing: { ttftMs: ttft(), apiMs: elapsed() },
230
+ errorMessage: null,
231
+ };
232
+ }
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { closeSync, constants, fstatSync, openSync, writeFileSync } from "node:fs";
3
3
  import { isAbsolute } from "node:path";
4
4
  import type { Api, AssistantMessageEventStream, Model, StreamOptions } from "@earendil-works/pi-ai";
5
+ import type { TargetCacheSettings } from "../domains/providers/types/target-descriptor.js";
5
6
  import { findEngineEnvKeys } from "./env-api-keys.js";
6
7
 
7
8
  /** Process-owned opt-in reaches every native engine call, including prewarm and workers. */
@@ -11,7 +12,11 @@ export function instrumentProviderCall<T extends StreamOptions>(
11
12
  invoke: (options: T | undefined) => AssistantMessageEventStream,
12
13
  ): AssistantMessageEventStream {
13
14
  let effective = options;
14
- if (model.api === "anthropic-messages" && options?.cacheRetention === undefined) {
15
+ const configured = (model as Model<Api> & { clioCoder?: { cache?: TargetCacheSettings } }).clioCoder?.cache?.retention;
16
+ if (options?.cacheRetention === undefined && configured !== undefined) {
17
+ effective = { ...options, cacheRetention: configured } as T;
18
+ }
19
+ if (model.api === "anthropic-messages" && effective?.cacheRetention === undefined) {
15
20
  const retention = process.env.CLIO_CODER_ANTHROPIC_CACHE_RETENTION;
16
21
  if (retention !== undefined && retention !== "") {
17
22
  if (retention !== "none" && retention !== "short" && retention !== "long") {
@@ -0,0 +1,65 @@
1
+ /**
2
+ * pi-ai formats an HTTP error from the parsed JSON body and keeps only its first
3
+ * 4000 characters. Clio's fetch wrapper sees the same response first, so the
4
+ * discarded tail can be restored when the captured body provably is the one the
5
+ * SDK truncated. Anything else leaves the SDK diagnostic unchanged.
6
+ */
7
+ const SDK_BODY_CHARS = 4000;
8
+ const SDK_MARKER = /\.\.\. \[truncated (\d+) chars\]/u;
9
+ /** Bounds both the capture read and the restored diagnostic kept in the ledger. */
10
+ export const MAX_RESTORED_ERROR_BODY_CHARS = 65_536;
11
+ const MAX_CAPTURE_BYTES = 4 * 1024 * 1024;
12
+
13
+ /** Read a clone so the SDK still owns the original body. Never throws. */
14
+ export async function captureErrorBody(response: Response): Promise<string | null> {
15
+ if (response.ok || response.body === null) return null;
16
+ try {
17
+ const reader = response.clone().body?.getReader();
18
+ if (reader === undefined) return null;
19
+ const decoder = new TextDecoder();
20
+ let text = "";
21
+ let bytes = 0;
22
+ for (;;) {
23
+ const { done, value } = await reader.read();
24
+ if (done) break;
25
+ bytes += value.byteLength;
26
+ // A body too large to hold cannot be compared exactly; keep the SDK text.
27
+ if (bytes > MAX_CAPTURE_BYTES) {
28
+ await reader.cancel().catch(() => {});
29
+ return null;
30
+ }
31
+ text += decoder.decode(value, { stream: true });
32
+ }
33
+ return text + decoder.decode();
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+
39
+ export function restoreTruncatedErrorBody(message: string, capturedBody: string | null): string {
40
+ if (capturedBody === null) return message;
41
+ const marker = SDK_MARKER.exec(message);
42
+ if (marker === null || marker.index < SDK_BODY_CHARS) return message;
43
+ let parsed: unknown;
44
+ try {
45
+ parsed = JSON.parse(capturedBody);
46
+ } catch {
47
+ return message;
48
+ }
49
+ const start = marker.index - SDK_BODY_CHARS;
50
+ const kept = message.slice(start, marker.index);
51
+ const dropped = Number(marker[1]);
52
+ // The openai SDK exposes the body's `error` member when present, else the body.
53
+ const nested = typeof parsed === "object" && parsed !== null ? (parsed as { error?: unknown }).error : undefined;
54
+ for (const candidate of [nested, parsed]) {
55
+ if (typeof candidate !== "object" || candidate === null) continue;
56
+ const full = JSON.stringify(candidate).trim();
57
+ if (full.length - SDK_BODY_CHARS !== dropped || !full.startsWith(kept)) continue;
58
+ const restored =
59
+ full.length > MAX_RESTORED_ERROR_BODY_CHARS
60
+ ? `${full.slice(0, MAX_RESTORED_ERROR_BODY_CHARS)}... [truncated ${full.length - MAX_RESTORED_ERROR_BODY_CHARS} chars]`
61
+ : full;
62
+ return `${message.slice(0, start)}${restored}${message.slice(marker.index + marker[0].length)}`;
63
+ }
64
+ return message;
65
+ }