@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
@@ -6,7 +6,7 @@ import { extractCommandCdTargets, extractCommandWriteTargets } from "./protected
6
6
 
7
7
  /**
8
8
  * Deterministic action classifier for tool calls. Pure function, no I/O, no
9
- * state. Slice 3 wires it into dispatch admission and audit. This module only
9
+ * state. Dispatch admission and tool audit consume it. This module only
10
10
  * owns the mapping from (tool, args) to an ActionClass.
11
11
  */
12
12
 
@@ -89,10 +89,22 @@ function baseClassify(tool: string): ActionClass | null {
89
89
  case ToolNames.Grep:
90
90
  case ToolNames.Find:
91
91
  case ToolNames.Ls:
92
+ // web_read is the GET-only half of the web split: no method, headers,
93
+ // or body can make it outward, so it is read class unconditionally.
94
+ case ToolNames.WebRead:
92
95
  case ToolNames.WebFetch:
93
96
  case ToolNames.Git:
94
97
  case ToolNames.CodeNav:
95
98
  case ToolNames.Context:
99
+ // clio_docs and clio_library read Clio's bundled documentation and the
100
+ // recipe catalog; data streams structured files. None writes.
101
+ case ToolNames.ClioDocs:
102
+ case ToolNames.ClioLibrary:
103
+ case ToolNames.Data:
104
+ // gateway lists and describes capabilities on its own; a call carries
105
+ // the capability's own class through a nested admission, so the outer
106
+ // call stays read class.
107
+ case ToolNames.Gateway:
96
108
  case ToolNames.Monitor:
97
109
  case ToolNames.AskUser:
98
110
  case ToolNames.CredentialPresent:
@@ -124,6 +136,10 @@ function baseClassify(tool: string): ActionClass | null {
124
136
  return "write";
125
137
  case ToolNames.Bash:
126
138
  case ToolNames.Verify:
139
+ // run_script runs an interpreter over a workspace script; its
140
+ // safetyCall projects the exact argv to a bash command so the policy
141
+ // engine applies the shell rules to it.
142
+ case ToolNames.RunScript:
127
143
  return "execute";
128
144
  case ToolNames.Dispatch:
129
145
  case ToolNames.Steer:
@@ -130,12 +130,20 @@ const CALL_ACTION_VOCABULARY: Readonly<Record<string, { verb: string; field: str
130
130
  bash: { verb: "running", field: "command" },
131
131
  grep: { verb: "searching", field: "pattern" },
132
132
  find: { verb: "finding", field: "pattern" },
133
+ web_read: { verb: "reading", field: "url" },
133
134
  web_fetch: { verb: "fetching", field: "url" },
134
135
  git: { verb: "git", field: "op" },
135
136
  verify: { verb: "verifying", field: "check" },
137
+ run_script: { verb: "running", field: "script" },
136
138
  code_nav: { verb: "navigating", field: "query" },
137
139
  context: { verb: "context", field: "scope" },
140
+ clio_docs: { verb: "searching", field: "query" },
141
+ clio_library: { verb: "searching", field: "query" },
142
+ data: { verb: "inspecting", field: "path" },
138
143
  artifact: { verb: "writing", field: "kind" },
144
+ // The gateway's descriptor names the capability it reaches, so worker
145
+ // telemetry and receipts read "gateway git" rather than an opaque call.
146
+ gateway: { verb: "gateway", field: "capability" },
139
147
  monitor: { verb: "monitoring", field: "run_id" },
140
148
  steer: { verb: "steering", field: "run_id" },
141
149
  tasks: { verb: "tasks", field: "action" },
@@ -193,9 +201,15 @@ const CALL_TARGET_FIELDS: Readonly<Record<string, ReadonlyArray<string>>> = {
193
201
  steer: ["run_id", "action"],
194
202
  tasks: ["action", "id"],
195
203
  ledger: ["action", "kind", "path", "line", "target", "passed", "since"],
204
+ web_read: ["url", "timeout_ms", "max_bytes", "format"],
196
205
  web_fetch: ["url", "method", "timeout_ms", "max_bytes", "format"],
206
+ run_script: ["interpreter", "script", "args", "interpreter_args", "cwd", "timeout_ms", "inputs", "outputs"],
207
+ clio_docs: ["query", "limit"],
208
+ clio_library: ["query", "kind", "ref", "limit", "offset"],
209
+ data: ["op", "path", "format", "offset", "limit", "columns", "pointer", "sample_rows", "max_rows"],
197
210
  ask_user: ["action", "mode", "max_rounds", "exposure"],
198
211
  artifact: ["kind", "path", "title"],
212
+ gateway: ["op", "capability", "query"],
199
213
  // ACP tool kinds use only fields whose meaning the protocol defines.
200
214
  execute: ["command", "cwd"],
201
215
  search: ["query", "path"],
@@ -45,7 +45,7 @@ export interface SafetyContract {
45
45
  readonly confirmed: ScopeSpec;
46
46
  };
47
47
 
48
- /** Subset check used by dispatch admission (Phase 6). */
48
+ /** Subset check used by dispatch admission. */
49
49
  isSubset(worker: ScopeSpec, orchestrator: ScopeSpec): boolean;
50
50
 
51
51
  /** Immutable safety policy metadata for receipts, audit, and replay. */
@@ -1,6 +1,7 @@
1
1
  import { resolve } from "node:path";
2
2
  import { ToolNames } from "../../core/tool-names.js";
3
3
  import { isProjectVerifierCheckId, isVerificationScriptName } from "../../core/verification-scripts.js";
4
+ import { effectiveToolCall } from "../../tools/surface.js";
4
5
  import { type DeclaredCheckSourceRef, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH } from "../../tools/verify/catalog.js";
5
6
  import type { UserTaskAcceptance } from "../user-tasks/acceptance.js";
6
7
  import {
@@ -295,9 +296,14 @@ function mutatingToolCall(entry: unknown): MutationCandidate | null {
295
296
  if (record?.kind !== "message" || record.role !== "tool_call") return null;
296
297
  const payload = asRecord(record.payload);
297
298
  if (payload === null) return null;
298
- const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
299
- if (toolName === null) return null;
300
- const args = asRecord(payload.args ?? payload.arguments ?? payload.input) ?? undefined;
299
+ const recordedTool = stringFromFirst(payload, ["name", "toolName", "tool"]);
300
+ if (recordedTool === null) return null;
301
+ // An artifact written through the gateway mutates the same path a direct
302
+ // artifact call would, so the call unwraps to the capability first.
303
+ const { toolName, args } = effectiveToolCall(
304
+ recordedTool,
305
+ asRecord(payload.args ?? payload.arguments ?? payload.input) ?? undefined,
306
+ );
301
307
  const paths = mutationPathsForTool(toolName, args);
302
308
  if (paths.length === 0) return null;
303
309
  const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Simple sliding-window loop detector. Pure logic; the caller owns state
3
- * storage. Slice 3 hands this an identity key composed of tool name + canonical
3
+ * storage. Callers provide an identity key composed of tool name + canonical
4
4
  * arg hash and a `Date.now()` reading so runaway workers can be caught before
5
5
  * their audit trail floods disk. `hashToolCall` builds that identity key and
6
6
  * lives here, beside the detector, so every observer (the registry's hook
@@ -162,6 +162,7 @@ const EXECUTION_TOOLS = new Set<string>([ToolNames.Bash, ToolNames.Verify]);
162
162
  export const WRITE_ROOT_REFUSED_TOOLS: ReadonlySet<string> = new Set<string>([
163
163
  ToolNames.Bash,
164
164
  ToolNames.Verify,
165
+ ToolNames.RunScript,
165
166
  ToolNames.Dispatch,
166
167
  ]);
167
168
 
@@ -634,6 +635,12 @@ function pathPolicyTargets(call: ClassifierCall): Array<{ operation: PathPolicyO
634
635
  const target = pathArg(args) ?? ".";
635
636
  return [{ operation: "read", path: target }];
636
637
  }
638
+ case ToolNames.Data: {
639
+ // data streams one named file; a zero-access path is refused here,
640
+ // before the reader opens it, exactly as a read of the same path.
641
+ const target = pathArg(args);
642
+ return target === null ? [] : [{ operation: "read", path: target }];
643
+ }
637
644
  case ToolNames.Write:
638
645
  case ToolNames.Edit: {
639
646
  const target = pathArg(args);
@@ -62,10 +62,9 @@ export type ValidationCommandDetection = { kind: "validation"; matched: string }
62
62
  * `npx vitest`, `tsc --noEmit`). Its consumer, dispatch validation grounding,
63
63
  * spends a match on nothing. An unmatched claim there is reported and never
64
64
  * downgrades a quality label, so the cost of a miss is noise in the receipt
65
- * rather than a gate opening. Observed live this session: S3 workers claimed
66
- * "git diff verification" and grounded 0/1, and a slice-2 coder verified its
67
- * own fix with `node -e "import(...)"`. Both are real work the strict set
68
- * cannot name.
65
+ * rather than a gate opening. Commands such as `git diff` and
66
+ * `node -e "import(...)"` can ground inspection claims even when they do not
67
+ * satisfy the strict validation vocabulary.
69
68
  */
70
69
  export type ValidationCommandScope = "finish-contract" | "grounding";
71
70
 
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Human-readable rejection messages for blocked tool calls. The registry
3
- * (slice 6) renders `short` in the UI footer, attaches `detail` to the audit
3
+ * renders `short` in the UI footer, attaches `detail` to the audit
4
4
  * record, and surfaces `hints` to the worker so the next turn can recover
5
5
  * without another round-trip.
6
6
  */
@@ -3,9 +3,8 @@ import { asDirectoryPathBoundary, pathBoundaryEntryCovers, resolvePathBoundary }
3
3
  import type { ActionClass } from "./action-classifier.js";
4
4
 
5
5
  /**
6
- * Scope rules for worker-vs-orchestrator privilege checks. Phase 2 ships the
7
- * shapes and the subset predicate. Phase 6 consumes isSubset at dispatch
8
- * admission so a worker scope never escalates past the orchestrator.
6
+ * Scope rules for worker-vs-orchestrator privilege checks. Dispatch admission
7
+ * consumes isSubset so a worker scope never escalates past the orchestrator.
9
8
  */
10
9
 
11
10
  export interface ScopeSpec {
@@ -3,6 +3,7 @@ import path from "node:path";
3
3
  import { parseDocument } from "yaml";
4
4
  import { resolveSafeCwd } from "../../core/safe-exec.js";
5
5
  import { byteLength } from "../../tools/truncate-utf8.js";
6
+ import { MAX_ULP_TOLERANCE } from "../../tools/verify/numeric.js";
6
7
  import { compareCodepoints } from "../evidence/ordering.js";
7
8
 
8
9
  /**
@@ -215,8 +216,8 @@ function validateTolerances(value: unknown, location: string): ValidationNumeric
215
216
  }
216
217
  if (Object.hasOwn(value, "ulp")) {
217
218
  const ulp = value.ulp;
218
- if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0) {
219
- return new Error(`${location}.ulp must be a non-negative integer`);
219
+ if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0 || ulp > MAX_ULP_TOLERANCE) {
220
+ return new Error(`${location}.ulp must be a non-negative integer no greater than ${MAX_ULP_TOLERANCE}`);
220
221
  }
221
222
  tolerances.ulp = ulp;
222
223
  }
@@ -1,7 +1,9 @@
1
1
  /**
2
- * Session budget state. checkCeiling reports whether the current spend is at
3
- * or above the ceiling; dispatch admission stays informational for v0.1 per
4
- * the Phase 10 scope, so the caller decides whether to enforce.
2
+ * Session budget state. checkCeiling reports whether current spend is under,
3
+ * at, or over the ceiling. Scheduling preflight exposes that spend and ceiling
4
+ * to dispatch reservations for accounting; the allocator does not enforce this
5
+ * session ceiling. Dispatch separately enforces an explicit per-request intent
6
+ * cost ceiling against the route estimate.
5
7
  */
6
8
 
7
9
  export type BudgetVerdict = "under" | "at" | "over";
@@ -15,7 +15,8 @@ export interface SchedulingContract {
15
15
  * Evaluate the running session cost against the ceiling. Scheduling owns the
16
16
  * observability lookup so callers (notably dispatch) don't need to import it.
17
17
  * Verdict is "under" when spend is below the ceiling, "at" when equal, "over"
18
- * when above. Dispatch treats "at" and "over" as admission failures.
18
+ * when above. Dispatch records this session budget without denying reservations
19
+ * from the verdict; explicit request cost ceilings have a separate route check.
19
20
  */
20
21
  preflight(): BudgetPreflight;
21
22
  /** Configured global worker capacity; durable leases own active usage. */
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Scheduling domain wire-up. Seeds budget + concurrency state from settings and
3
3
  * listens to dispatch.enqueued so it can fire budget.alert events when session
4
- * spend meets or crosses the ceiling. Dispatch admission preflights this state
5
- * and denies new dispatches at or over the ceiling; the alert is the TUI's
6
- * explanation of those denials.
4
+ * spend meets or crosses the ceiling. Dispatch preflight reads this state for
5
+ * accounting. Session-cost alerts are advisory; explicit per-request intent
6
+ * cost ceilings are enforced separately by dispatch route admission.
7
7
  */
8
8
 
9
9
  import { type BudgetAlertPayload, BusChannels } from "../../core/bus-events.js";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Branch summary builders (Phase 12 slice 12c).
2
+ * Branch summary builders.
3
3
  *
4
4
  * Deterministic text assembly for the compaction prompt. The summarization
5
5
  * model is asked to read a serialized conversation and emit a structured
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Compaction orchestration (Phase 12 slice 12c).
2
+ * Compaction orchestration.
3
3
  *
4
4
  * Given a list of session entries, finds the cut point, summarizes the
5
5
  * history portion via the supplied model, and returns the trimmed entry
@@ -252,6 +252,29 @@ function findTurnStartForProtection(
252
252
  return -1;
253
253
  }
254
254
 
255
+ /**
256
+ * The ledger chains entries linearly, so a result's parent is its own call only
257
+ * when that call was alone in its batch. In a parallel batch the parent chain
258
+ * runs back through sibling calls, results and activation receipts. The load is
259
+ * still verifiable when that chain reaches the call without crossing another
260
+ * assistant or user message, which would make it a different exchange.
261
+ */
262
+ function resultFollowsCallInBatch(
263
+ turn: ReadonlyArray<SessionEntry>,
264
+ resultEntry: SessionEntry,
265
+ call: SessionEntry,
266
+ ): boolean {
267
+ let parent = resultEntry.parentTurnId;
268
+ for (let hops = 0; hops < turn.length && parent; hops++) {
269
+ if (parent === call.turnId) return true;
270
+ const link = turn.find((candidate) => candidate.turnId === parent);
271
+ if (!link) return false;
272
+ if (link.kind === "message" && link.role !== "tool_call" && link.role !== "tool_result") return false;
273
+ parent = link.parentTurnId;
274
+ }
275
+ return false;
276
+ }
277
+
255
278
  /** Recover only complete, uniquely paired historical main-agent loads. Never consult current disk. */
256
279
  export function captureSkillContext(
257
280
  entries: ReadonlyArray<SessionEntry>,
@@ -337,7 +360,7 @@ export function captureSkillContext(
337
360
  results.length !== 1 ||
338
361
  resultEntry?.kind !== "message" ||
339
362
  !turn.includes(resultEntry) ||
340
- resultEntry.parentTurnId !== call.turnId ||
363
+ !resultFollowsCallInBatch(turn, resultEntry, call) ||
341
364
  entry.parentTurnId !== request.turnId
342
365
  )
343
366
  return undefined;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Cut-point detection for compaction (Phase 12 slice 12c).
2
+ * Cut-point detection for compaction.
3
3
  *
4
4
  * Walks an entry list newest-to-oldest, accumulating estimated tokens, and
5
5
  * reports where to slice so the suffix carries at least `keepRecentTokens`
@@ -1,16 +1,11 @@
1
1
  /**
2
- * Token estimation for session entries (Phase 12 slice 12c).
2
+ * Token estimation for session entries.
3
3
  *
4
- * Ports pi-coding-agent's chars/4 heuristic verbatim (reference:
5
- * pi-mono/packages/coding-agent/src/core/compaction/compaction.ts:232
6
- * `estimateTokens`). Pure functions, no I/O.
4
+ * Uses shared context-accounting estimates for messages and character-based
5
+ * estimates for other context-bearing entries. Provider usage anchors measured
6
+ * prefixes when available. These estimates are approximate, not token ceilings.
7
+ * Pure functions, no I/O.
7
8
  *
8
- * Rationale for the heuristic (plan §3):
9
- * - Conservative by design: over-estimating trips compaction earlier,
10
- * never later. Missing a trigger and hitting provider overflow is
11
- * expensive; running a compaction on 80k when actual was 95k is cheap.
12
- * - pi-coding-agent ships it at scale, so we adopt the
13
- * known ceiling rather than introduce a new numeric contract.
14
9
  * - Exact per-provider counts (Anthropic /count_tokens, tiktoken) are
15
10
  * parked. The `TokenEstimator` interface below keeps them a drop-in
16
11
  * swap for a later phase.
@@ -92,7 +92,7 @@ export interface SessionContract {
92
92
  append(turn: TurnInput): ClioTurnRecord;
93
93
  /**
94
94
  * Append a rich SessionEntry to the current session. Complements
95
- * `append(turn)` for Phase 12+ entry kinds (compactionSummary,
95
+ * `append(turn)` for structured entry kinds (compactionSummary,
96
96
  * branchSummary, modelChange, etc.). Old callers keep using `append`.
97
97
  */
98
98
  appendEntry(entry: SessionEntryInput): SessionEntry;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Session cwd fallback resolver (Phase 12 slice 12d).
2
+ * Session cwd fallback resolver.
3
3
  *
4
4
  * Pure guard used by the interactive layer when a session is resumed.
5
5
  * `meta.cwd` is captured at session creation time; by the time the user
@@ -37,7 +37,7 @@ export const defaultFsProbe: FsProbe = {
37
37
  /**
38
38
  * Discriminated result the overlay layer branches on.
39
39
  * - `no-cwd`: the meta record has no cwd field or it is blank after
40
- * trimming. Pre-Phase-12 sessions occasionally land here.
40
+ * trimming. Incomplete legacy metadata can produce this result.
41
41
  * - `missing`: cwd string is set but the directory does not exist on
42
42
  * disk (fsProbe.exists returned false).
43
43
  * - `not-a-directory`: the path exists but resolves to a file or a
@@ -22,6 +22,7 @@
22
22
  */
23
23
 
24
24
  import { isAbsolute, normalize, relative, resolve } from "node:path";
25
+ import { effectiveToolCall } from "../../tools/surface.js";
25
26
  import { decisionRationale } from "./decision-board.js";
26
27
  import type { DecisionLedgerEntry, SessionEntry } from "./entries.js";
27
28
  import { filterEntriesToActivePath } from "./tree/active-path.js";
@@ -369,7 +370,10 @@ function stringField(record: Record<string, unknown> | null, ...keys: string[]):
369
370
  return null;
370
371
  }
371
372
 
372
- function pathFromCall(toolName: string, args: unknown, cwd: string | null, into: Set<string>): void {
373
+ function pathFromCall(recordedTool: string, recordedArgs: unknown, cwd: string | null, into: Set<string>): void {
374
+ // A gateway call is the capability it reached: an artifact written through
375
+ // the gateway touched the same path a direct artifact call would have.
376
+ const { toolName, args } = effectiveToolCall(recordedTool, recordedArgs);
373
377
  if (!READ_LEDGER_TOOLS.has(toolName)) return;
374
378
  const record = isRecord(args) ? args : null;
375
379
  const named = stringField(record, "path", "file_path", "filePath");
@@ -95,6 +95,12 @@ function extractMessageText(payload: unknown): string | null {
95
95
  * operator-authored remains, so the caller moves on to the next turn.
96
96
  */
97
97
  function operatorTextOfUserPayload(payload: unknown): string | null {
98
+ // An expansion (prompt template, command) replaced the typed input. The
99
+ // typed input is the title; the expansion starts with generated scaffolding.
100
+ if (payload && typeof payload === "object" && typeof (payload as { displayText?: unknown }).displayText === "string") {
101
+ const typed = collapseWhitespace((payload as { displayText: string }).displayText);
102
+ if (typed.length > 0) return typed;
103
+ }
98
104
  if (
99
105
  payload &&
100
106
  typeof payload === "object" &&
@@ -6,10 +6,12 @@ import {
6
6
  type ClioTurnRecord,
7
7
  createSession as engineCreateSession,
8
8
  resumeSession as engineResumeSession,
9
+ openSession,
9
10
  readSessionMeta,
10
11
  type SessionTreeNode,
11
12
  sessionPaths,
12
13
  } from "../../engine/session.js";
14
+ import { collectSessionEntries } from "./compaction/session-entries.js";
13
15
  import type { SessionEntryInput, SessionMeta, TurnInput } from "./contract.js";
14
16
  import { isSessionEntry, type SessionEntry } from "./entries.js";
15
17
  import { runMigrations } from "./migrations/index.js";
@@ -71,14 +73,19 @@ export function resumeSessionState(sessionId: string): {
71
73
  const persistedMeta = readSessionMeta(sessionId) as SessionMeta;
72
74
  const paths = sessionPaths(persistedMeta);
73
75
  const migration = runMigrations(persistedMeta, paths.meta);
74
- const { meta, writer, tree } = engineResumeSession(sessionId);
76
+ const candidate = openSession(sessionId);
77
+ // Use the replay schema before engineResumeSession clears endedAt or
78
+ // the domain caller parks its current writer. The engine reader retains
79
+ // its established tolerance for interrupted JSONL fragments.
80
+ collectSessionEntries(candidate.turns(), paths.current);
81
+ // The ledger needed no transformation; only the stamp moves, so the next
82
+ // reader does not re-run the same no-op. It lands in the same metadata
83
+ // publication that reopens the session.
84
+ const { meta, writer, tree } = engineResumeSession(
85
+ sessionId,
86
+ migration.migrated ? { sessionFormatVersion: migration.to } : {},
87
+ );
75
88
  const state: SessionManagerState = { meta: meta as SessionMeta, writer };
76
- if (migration.migrated) {
77
- // The ledger needed no transformation; only the stamp moves, so the next
78
- // reader does not re-run the same no-op.
79
- state.meta.sessionFormatVersion = migration.to;
80
- persistSessionMeta(state);
81
- }
82
89
  return { state, nodes: tree };
83
90
  }
84
91
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Retry settings and countdown helper (Phase 12 / Phase 22 seam).
2
+ * Retry settings and countdown helper.
3
3
  *
4
4
  * pi-agent-core surfaces provider failures as a terminal assistant message
5
5
  * with `stopReason: "error"` + `errorMessage: <provider text>`. It does not
@@ -42,6 +42,7 @@ export const DEFAULT_RETRY_SETTINGS: RetrySettings = {
42
42
  baseDelayMs: 2000,
43
43
  maxDelayMs: 60000,
44
44
  streamStallMs: 180000,
45
+ firstTokenStallMs: 600000,
45
46
  };
46
47
 
47
48
  /**
@@ -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
@@ -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;
@@ -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,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
+ }