@iowarp/clio-coder 0.4.4 → 0.4.5

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 (555) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
  5. package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
  17. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/{chunk-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  24. package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
  27. package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
  34. package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  43. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  66. package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
  79. package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
  80. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
  93. package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
  101. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
  135. package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
  137. package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
  139. package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/chunk-SD7SHNDW.js +15 -0
  141. package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
  154. package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  177. package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +44 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  195. package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
  198. package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
  206. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  207. package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
  208. package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
  212. package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
  213. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  214. package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
  215. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
  216. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  221. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
  229. package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
  230. package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
  231. package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
  232. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
  233. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  235. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
  239. package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
  241. package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
  242. package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
  243. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
  244. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  256. package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
  257. package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
  258. package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -88
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +7 -6
  267. package/docs/architecture/acp.md +10 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/context-engine.md +44 -59
  270. package/docs/architecture/context-working-set.md +7 -9
  271. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  272. package/docs/architecture/evidence-and-memory.md +10 -0
  273. package/docs/architecture/pi-boundary.md +37 -7
  274. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  275. package/docs/architecture/session-lifecycle.md +4 -4
  276. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  277. package/docs/guide/commands-and-modes.md +49 -36
  278. package/docs/guide/configuration-and-targets.md +7 -2
  279. package/docs/guide/configuration-reference.md +13 -3
  280. package/docs/guide/environment-variables.md +6 -2
  281. package/docs/guide/fleet-dispatch.md +12 -0
  282. package/docs/guide/installation-and-lifecycle.md +35 -9
  283. package/docs/guide/proactive-memory.md +1 -1
  284. package/docs/guide/skills-marketplace.md +11 -3
  285. package/docs/guide/tool-usage.md +9 -2
  286. package/docs/process/development-pipeline.md +10 -10
  287. package/docs/process/documentation-guide.md +2 -2
  288. package/docs/process/eval-runner.md +15 -0
  289. package/docs/process/evals-internal.md +1 -1
  290. package/docs/process/release-cut-checklist.md +6 -6
  291. package/evals/README.md +4 -0
  292. package/evals/behavioral-corpus-grader.mjs +147 -14
  293. package/evals/behavioral-model-negative-control.yaml +1 -0
  294. package/evals/behavioral-model.yaml +266 -1
  295. package/evals/fixtures/docs-retrieval.json +102 -0
  296. package/evals/fixtures/scalar-decision.json +17 -0
  297. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  298. package/evals/fixtures/source-explanation.json +74 -0
  299. package/evals/fixtures/tool-arguments.json +18 -0
  300. package/evals/fixtures/tool-surface/read.txt +4 -0
  301. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  302. package/evals/no-edit-memory-grader.mjs +149 -0
  303. package/evals/scalar-decision-grader.py +41 -0
  304. package/evals/scalar-decision-machinery.ts +145 -0
  305. package/evals/source-explanation-grader.mjs +118 -0
  306. package/evals/tool-surface-grader.mjs +53 -0
  307. package/evals/tool-surface-model.yaml +274 -0
  308. package/package.json +14 -14
  309. package/skills/README.md +6 -6
  310. package/skills/registry.yaml +1 -1
  311. package/skills/skill-marketplace.json +1 -1
  312. package/src/cli/bootstrap-generate.ts +6 -0
  313. package/src/cli/config-inspect.ts +24 -7
  314. package/src/cli/config-trust.ts +62 -0
  315. package/src/cli/config.ts +8 -0
  316. package/src/cli/context-map.ts +75 -14
  317. package/src/cli/context.ts +46 -17
  318. package/src/cli/eval.ts +17 -3
  319. package/src/cli/modes/print.ts +32 -4
  320. package/src/cli/run.ts +16 -14
  321. package/src/cli/skills-eval.ts +10 -8
  322. package/src/cli/steer-channel.ts +31 -18
  323. package/src/cli/targets.ts +83 -31
  324. package/src/cli/tasks.ts +10 -1
  325. package/src/cli/upgrade.ts +9 -6
  326. package/src/cli/usage.ts +24 -0
  327. package/src/cli/wiki-generate.ts +239 -96
  328. package/src/core/bash-exec.ts +43 -15
  329. package/src/core/bus-events.ts +15 -0
  330. package/src/core/config.ts +33 -14
  331. package/src/core/defaults.ts +5 -4
  332. package/src/core/file-references.ts +11 -1
  333. package/src/core/incomplete-installation.ts +3 -1
  334. package/src/core/settings-layers.ts +21 -5
  335. package/src/core/termination.ts +26 -9
  336. package/src/core/untrusted-content.ts +16 -0
  337. package/src/core/workspace-trust.ts +179 -0
  338. package/src/domains/agents/builtins/coder.md +4 -2
  339. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  340. package/src/domains/agents/builtins/documenter.md +7 -4
  341. package/src/domains/agents/builtins/researcher.md +1 -0
  342. package/src/domains/agents/builtins/scout.md +7 -1
  343. package/src/domains/agents/result-contract.ts +199 -26
  344. package/src/domains/context/bootstrap-prompt.ts +11 -9
  345. package/src/domains/context/bootstrap.ts +74 -39
  346. package/src/domains/context/clio-md.ts +88 -26
  347. package/src/domains/context/codewiki/build-operation.ts +121 -0
  348. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  349. package/src/domains/context/codewiki/build-worker.ts +3 -35
  350. package/src/domains/context/codewiki/coordinator.ts +36 -6
  351. package/src/domains/context/codewiki/indexer.ts +59 -19
  352. package/src/domains/context/contract.ts +6 -2
  353. package/src/domains/context/extension.ts +72 -10
  354. package/src/domains/context/fingerprint.ts +39 -34
  355. package/src/domains/context/index.ts +7 -1
  356. package/src/domains/context/prompt-context.ts +55 -14
  357. package/src/domains/context/refresh.ts +9 -57
  358. package/src/domains/context/wiki/assemble.ts +14 -10
  359. package/src/domains/context/wiki/evidence.ts +209 -0
  360. package/src/domains/context/wiki/generate.ts +201 -67
  361. package/src/domains/context/wiki/meta.ts +10 -2
  362. package/src/domains/context/wiki/plan-store.ts +70 -14
  363. package/src/domains/context/wiki/plan.ts +71 -14
  364. package/src/domains/context/wiki/prompts.ts +42 -1
  365. package/src/domains/context/wiki/source-content.ts +106 -0
  366. package/src/domains/context/wiki/staleness.ts +33 -22
  367. package/src/domains/context/working-set/contract.ts +8 -2
  368. package/src/domains/context/working-set/engine.ts +17 -4
  369. package/src/domains/context/working-set/fold.ts +15 -2
  370. package/src/domains/context/working-set/marker.ts +2 -1
  371. package/src/domains/context/working-set/project.ts +18 -7
  372. package/src/domains/context/working-set/recall.ts +82 -56
  373. package/src/domains/dispatch/active-route-planner.ts +6 -3
  374. package/src/domains/dispatch/admission-queue.ts +19 -7
  375. package/src/domains/dispatch/admission.ts +3 -3
  376. package/src/domains/dispatch/budget-envelope.ts +47 -82
  377. package/src/domains/dispatch/capacity-lease.ts +57 -19
  378. package/src/domains/dispatch/contract.ts +10 -2
  379. package/src/domains/dispatch/event-pump.ts +28 -7
  380. package/src/domains/dispatch/execution-role.ts +49 -2
  381. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  382. package/src/domains/dispatch/extension.ts +190 -105
  383. package/src/domains/dispatch/fleet-run.ts +20 -0
  384. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  385. package/src/domains/dispatch/parallel-writers.ts +34 -0
  386. package/src/domains/dispatch/reservation-store.ts +8 -34
  387. package/src/domains/dispatch/route-approval.ts +3 -3
  388. package/src/domains/dispatch/route-observer.ts +4 -2
  389. package/src/domains/dispatch/route-quality.ts +6 -1
  390. package/src/domains/dispatch/types.ts +4 -3
  391. package/src/domains/dispatch/worker-spawn.ts +58 -21
  392. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  393. package/src/domains/eval/compare/behavioral.ts +81 -14
  394. package/src/domains/eval/compare/compare.ts +15 -5
  395. package/src/domains/eval/compare/envelope.ts +12 -5
  396. package/src/domains/eval/metrics/context.ts +24 -1
  397. package/src/domains/eval/metrics/tracked.ts +4 -28
  398. package/src/domains/eval/reports/comparison.ts +9 -9
  399. package/src/domains/eval/runners/clio-run.ts +5 -1
  400. package/src/domains/eval/schema/suite.ts +2 -0
  401. package/src/domains/eval/schema/validate.ts +1 -0
  402. package/src/domains/eval/suites/run.ts +189 -13
  403. package/src/domains/eval/verifiers/integrity.ts +39 -0
  404. package/src/domains/eval/verifiers/patch.ts +58 -2
  405. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  406. package/src/domains/evidence/build.ts +4 -2
  407. package/src/domains/interop/registry.ts +2 -2
  408. package/src/domains/middleware/hooks-io.ts +45 -26
  409. package/src/domains/middleware/hooks.ts +6 -0
  410. package/src/domains/middleware/injection-screen.ts +23 -0
  411. package/src/domains/middleware/rules.ts +5 -1
  412. package/src/domains/middleware/stalled-turn.ts +18 -3
  413. package/src/domains/middleware/task-board-reminder.ts +4 -2
  414. package/src/domains/middleware/task-nudge.ts +4 -1
  415. package/src/domains/mux/contract.ts +34 -1
  416. package/src/domains/mux/dock-controller.ts +8 -1
  417. package/src/domains/mux/index.ts +1 -0
  418. package/src/domains/mux/socket-client.ts +13 -3
  419. package/src/domains/observability/contract.ts +2 -2
  420. package/src/domains/observability/projection.ts +30 -9
  421. package/src/domains/prompts/compiler.ts +10 -2
  422. package/src/domains/prompts/contract.ts +7 -4
  423. package/src/domains/prompts/extension.ts +28 -64
  424. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  425. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  426. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  427. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  428. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  429. package/src/domains/prompts/preload-prefix.ts +31 -0
  430. package/src/domains/prompts/preload.ts +135 -61
  431. package/src/domains/providers/auth/backend-file.ts +15 -11
  432. package/src/domains/providers/auth/storage.ts +3 -5
  433. package/src/domains/providers/catalog.ts +18 -3
  434. package/src/domains/providers/runtime-resolution.ts +11 -9
  435. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  436. package/src/domains/resources/skills/promotion.ts +8 -1
  437. package/src/domains/safety/action-classifier.ts +9 -0
  438. package/src/domains/safety/autonomy.ts +10 -1
  439. package/src/domains/safety/contract.ts +5 -1
  440. package/src/domains/safety/default-path-policy.ts +11 -0
  441. package/src/domains/safety/extension.ts +11 -2
  442. package/src/domains/safety/policy-engine.ts +189 -32
  443. package/src/domains/safety/project-policy.ts +7 -2
  444. package/src/domains/safety/workspace-trust.ts +43 -0
  445. package/src/domains/session/compaction/compact.ts +384 -21
  446. package/src/domains/session/compaction/cut-point.ts +42 -5
  447. package/src/domains/session/compaction/tokens.ts +9 -1
  448. package/src/domains/session/decision-board.ts +43 -33
  449. package/src/domains/session/entries.ts +169 -4
  450. package/src/domains/session/prompt-manifest.ts +47 -8
  451. package/src/domains/session/task-board.ts +21 -3
  452. package/src/domains/user-tasks/handoff.ts +16 -0
  453. package/src/engine/acp/adapter.ts +44 -12
  454. package/src/engine/acp/server.ts +1 -0
  455. package/src/engine/acp/transport.ts +2 -1
  456. package/src/engine/acp/types.ts +6 -1
  457. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  458. package/src/engine/api-registry.ts +19 -2
  459. package/src/engine/apis/openai-completions.ts +13 -6
  460. package/src/engine/apis/output-budget.ts +26 -10
  461. package/src/engine/claude/sdk-runtime.ts +4 -3
  462. package/src/engine/env-api-keys.ts +2 -1
  463. package/src/engine/external-subprocess.ts +14 -3
  464. package/src/engine/loop-guard.ts +19 -2
  465. package/src/engine/provider-diagnostics.ts +129 -0
  466. package/src/engine/provider-payload.ts +3 -1
  467. package/src/engine/worker-runtime.ts +13 -2
  468. package/src/engine/worker-tools.ts +5 -1
  469. package/src/entry/extension-reload.ts +1 -0
  470. package/src/entry/orchestrator.ts +53 -15
  471. package/src/interactive/chat-loop-messages.ts +12 -4
  472. package/src/interactive/chat-loop.ts +115 -45
  473. package/src/interactive/chat-renderer.ts +60 -0
  474. package/src/interactive/context-recall-command.ts +2 -1
  475. package/src/interactive/dispatch-board.ts +17 -2
  476. package/src/interactive/editor-submit.ts +13 -0
  477. package/src/interactive/interactive-application.ts +8 -2
  478. package/src/interactive/interactive-event-projection.ts +7 -1
  479. package/src/interactive/interactive-presentation.ts +15 -7
  480. package/src/interactive/interactive-slash-runtime.ts +2 -0
  481. package/src/interactive/layout.ts +2 -1
  482. package/src/interactive/model-session-replay.ts +2 -2
  483. package/src/interactive/overlay-frame.ts +1 -0
  484. package/src/interactive/overlay-general-openers.ts +3 -1
  485. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  486. package/src/interactive/overlays/ask-user.ts +1 -0
  487. package/src/interactive/overlays/message-picker.ts +1 -1
  488. package/src/interactive/renderers/tool-execution.ts +17 -1
  489. package/src/interactive/renderers/worker-entry.ts +25 -10
  490. package/src/interactive/slash-commands.ts +9 -7
  491. package/src/interactive/turn-context.ts +221 -53
  492. package/src/interactive/turn-middleware.ts +3 -1
  493. package/src/interactive/turn-persistence.ts +3 -0
  494. package/src/interactive/turn-runtime.ts +11 -2
  495. package/src/interactive/turn-state.ts +10 -9
  496. package/src/interactive/watch-pane.ts +18 -4
  497. package/src/interactive/worker-stream.ts +7 -7
  498. package/src/tools/agent-tools.ts +6 -3
  499. package/src/tools/bash.ts +1 -1
  500. package/src/tools/builtin-tool-catalog.ts +9 -2
  501. package/src/tools/codewiki/code-nav.ts +4 -10
  502. package/src/tools/compete-judge-task.ts +71 -0
  503. package/src/tools/compete-worktrees.ts +34 -0
  504. package/src/tools/context/index.ts +32 -7
  505. package/src/tools/context/surface.ts +15 -4
  506. package/src/tools/decide.ts +1 -1
  507. package/src/tools/dispatch-admission.ts +12 -1
  508. package/src/tools/dispatch-arguments.ts +38 -1
  509. package/src/tools/dispatch-plan.ts +7 -7
  510. package/src/tools/dispatch-runner.ts +48 -32
  511. package/src/tools/dispatch-schema.ts +30 -23
  512. package/src/tools/dispatch-scout-admission.ts +10 -44
  513. package/src/tools/dispatch-scout.ts +2 -3
  514. package/src/tools/find.ts +13 -4
  515. package/src/tools/grep.ts +13 -1
  516. package/src/tools/ls.ts +7 -1
  517. package/src/tools/monitor.ts +26 -11
  518. package/src/tools/network-policy.ts +11 -24
  519. package/src/tools/observation.ts +39 -2
  520. package/src/tools/read.ts +112 -15
  521. package/src/tools/registry.ts +54 -17
  522. package/src/tools/result-shaping.ts +110 -2
  523. package/src/tools/tasks.ts +33 -7
  524. package/src/tools/verify/frontend.ts +67 -30
  525. package/src/tools/verify/numeric.ts +6 -1
  526. package/src/tools/web-fetch-network.ts +179 -0
  527. package/src/tools/web-fetch-surface.ts +2 -1
  528. package/src/tools/web-fetch.ts +15 -13
  529. package/src/tools/worker-evidence.ts +27 -0
  530. package/src/worker/spec-contract.ts +12 -8
  531. package/dist/builtins-WGALA46I.js +0 -22
  532. package/dist/chunk-2WZ546HR.js +0 -792
  533. package/dist/chunk-5PSMVOLM.js +0 -56
  534. package/dist/chunk-EL24TAU4.js +0 -1560
  535. package/dist/chunk-IZXGRF7P.js +0 -4048
  536. package/dist/chunk-JVCV3ICN.js +0 -47
  537. package/dist/chunk-MNJGS2IN.js +0 -33
  538. package/dist/chunk-O5CVSAG5.js +0 -122
  539. package/dist/chunk-ODGTEFFI.js +0 -50
  540. package/dist/chunk-OQE5J4C6.js +0 -73
  541. package/dist/chunk-UUVG37B4.js +0 -244
  542. package/dist/chunk-V6HJFQZE.js +0 -228
  543. package/dist/clio-QLICPCF5.js +0 -25
  544. package/dist/configure-VEPX4NMX.js +0 -55
  545. package/dist/context-clear-S4ZJCQUX.js +0 -182
  546. package/dist/detail-A7JAVSIG.js +0 -98
  547. package/dist/evidence-4F5USFKH.js +0 -208
  548. package/dist/fleet-view-MN2VG4MR.js +0 -101
  549. package/dist/inventory-C26CFDRR.js +0 -101
  550. package/dist/preload-P6DGH2PZ.js +0 -13
  551. package/dist/slash-commands-ZXPJD64J.js +0 -92
  552. package/dist/tasks-IPAGMEIX.js +0 -36
  553. package/dist/tools-EFFEAIDP.js +0 -28
  554. package/dist/verify-FWYGPKMR.js +0 -29
  555. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -0,0 +1,39 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile } from "node:fs/promises";
3
+ import { isAbsolute, relative, resolve, sep } from "node:path";
4
+
5
+ export class EvalGraderIntegrityError extends Error {}
6
+
7
+ /** Explicit dependencies avoid guessing executable paths from arbitrary shell commands. */
8
+ export async function protectGraderFiles(cwd: string, files: readonly string[]): Promise<() => Promise<void>> {
9
+ const paths = files.map((file) => {
10
+ const path = resolve(cwd, file);
11
+ const rel = relative(cwd, path);
12
+ if (isAbsolute(file) || rel === ".." || rel.startsWith(`..${sep}`))
13
+ throw new EvalGraderIntegrityError(`grader dependency escapes workspace: ${file}`);
14
+ return path;
15
+ });
16
+ const fingerprint = async (path: string) => {
17
+ // Do not follow a replacement symlink to content chosen outside the fixture.
18
+ let current = path;
19
+ while (current !== resolve(cwd)) {
20
+ if ((await lstat(current)).isSymbolicLink())
21
+ throw new EvalGraderIntegrityError(`grader dependency is a symlink: ${path}`);
22
+ current = resolve(current, "..");
23
+ }
24
+ return createHash("sha256")
25
+ .update(await readFile(path))
26
+ .digest("hex");
27
+ };
28
+ const hashes = await Promise.all(paths.map(fingerprint));
29
+ return async () => {
30
+ for (const [index, path] of paths.entries()) {
31
+ try {
32
+ if ((await fingerprint(path)) === hashes[index]) continue;
33
+ } catch {
34
+ /* Missing, unreadable, and replaced dependencies all invalidate grading. */
35
+ }
36
+ throw new EvalGraderIntegrityError(`grader dependency changed during trial: ${relative(cwd, path)}`);
37
+ }
38
+ };
39
+ }
@@ -1,4 +1,43 @@
1
1
  import { spawnSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { readdirSync, readFileSync, readlinkSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
5
+
6
+ type FileBaseline = Map<string, { hash: string; bytes: number }>;
7
+ const baselines = new Map<string, FileBaseline>();
8
+
9
+ /** Held by the harness process so a runner cannot rewrite its own baseline. */
10
+ export function recordPatchBaseline(cwd: string): void {
11
+ baselines.set(resolve(cwd), snapshotFiles(cwd));
12
+ }
13
+
14
+ export function forgetPatchBaseline(cwd: string): void {
15
+ baselines.delete(resolve(cwd));
16
+ }
17
+
18
+ function snapshotFiles(cwd: string): FileBaseline {
19
+ const files: FileBaseline = new Map();
20
+ function walk(dir: string, prefix: string): void {
21
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
22
+ if (entry.name === ".git") continue;
23
+ const path = join(dir, entry.name);
24
+ const relative = prefix + entry.name;
25
+ if (entry.isDirectory()) walk(path, `${relative}/`);
26
+ else if (entry.isFile() || entry.isSymbolicLink()) {
27
+ const bytes = entry.isSymbolicLink() ? Buffer.from(readlinkSync(path)) : readFileSync(path);
28
+ files.set(relative, {
29
+ hash: createHash("sha256")
30
+ .update(entry.isSymbolicLink() ? "link:" : "file:")
31
+ .update(bytes)
32
+ .digest("hex"),
33
+ bytes: bytes.length,
34
+ });
35
+ }
36
+ }
37
+ }
38
+ walk(cwd, "");
39
+ return files;
40
+ }
2
41
 
3
42
  export interface PatchMetrics {
4
43
  bytes: number;
@@ -6,9 +45,26 @@ export interface PatchMetrics {
6
45
  testFilesModified: number;
7
46
  }
8
47
 
9
- export function collectPatchMetrics(cwd: string): PatchMetrics {
48
+ export function collectPatchMetrics(cwd: string): PatchMetrics | null {
49
+ const baseline = baselines.get(resolve(cwd));
50
+ if (baseline !== undefined) {
51
+ const current = snapshotFiles(cwd);
52
+ const changed = [...new Set([...baseline.keys(), ...current.keys()])].filter(
53
+ (path) => baseline.get(path)?.hash !== current.get(path)?.hash,
54
+ );
55
+ return {
56
+ // For hash baselines this is changed file content bytes, including deleted
57
+ // content, rather than a textual Git diff (which cannot represent all files).
58
+ bytes: changed.reduce((sum, path) => sum + (current.get(path)?.bytes ?? baseline.get(path)?.bytes ?? 0), 0),
59
+ filesChanged: changed.length,
60
+ testFilesModified: changed.filter((file) => /(^|\/)(test|tests|spec|__tests__)(\/|$)|\.(test|spec)\./.test(file))
61
+ .length,
62
+ };
63
+ }
64
+
10
65
  const diff = spawnSync("git", ["diff", "--", "."], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
11
- const text = diff.status === 0 && typeof diff.stdout === "string" ? diff.stdout : "";
66
+ if (diff.status !== 0 || typeof diff.stdout !== "string") return null;
67
+ const text = diff.stdout;
12
68
  const files = text
13
69
  .split(/\r?\n/)
14
70
  .filter((line) => line.startsWith("diff --git "))
@@ -4,6 +4,7 @@ import { tmpdir } from "node:os";
4
4
  import { relative, resolve } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  import type { EvalWorkspaceV2 } from "../schema/suite.js";
7
+ import { forgetPatchBaseline, recordPatchBaseline } from "../verifiers/patch.js";
7
8
  import type { PreparedEvalWorkspace } from "./local.js";
8
9
 
9
10
  const execFileAsync = promisify(execFile);
@@ -42,9 +43,11 @@ export async function prepareTempCopyWorkspace(
42
43
  recursive: true,
43
44
  filter: (path) => shouldCopy(relative(source, path), excludes, selection),
44
45
  });
46
+ recordPatchBaseline(dest);
45
47
  return {
46
48
  dir: dest,
47
49
  cleanup: async () => {
50
+ forgetPatchBaseline(dest);
48
51
  await rm(dest, { recursive: true, force: true });
49
52
  },
50
53
  };
@@ -1473,11 +1473,13 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
1473
1473
  const label = decision.label === undefined ? "" : ` label=${previewUnknown(decision.label)}`;
1474
1474
  const sourceQuestion =
1475
1475
  decision.source_question === undefined ? "" : ` sourceQuestion=${previewUnknown(decision.source_question)}`;
1476
- const revision = decision.revisedAt === undefined ? "" : ` revisedAt=${decision.revisedAt} revisionSource=operator`;
1476
+ const revisionSource = decision.revisionSource ?? "unknown";
1477
+ const revision =
1478
+ decision.revisedAt === undefined ? "" : ` revisedAt=${decision.revisedAt} revisionSource=${revisionSource}`;
1477
1479
  const correction =
1478
1480
  decision.correction === undefined
1479
1481
  ? ""
1480
- : ` correctionSource=operator correction=${previewUnknown(decision.correction)}`;
1482
+ : ` correctionSource=${revisionSource} correction=${previewUnknown(decision.correction)}`;
1481
1483
  return ` decision key=${decision.key} status=${decision.status} decidedAt=${decision.decidedAt}${revision}${label}${sourceQuestion} value=${previewUnknown(decision.value)}${correction}`;
1482
1484
  }),
1483
1485
  ];
@@ -19,7 +19,7 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
19
19
  instructionFiles: ["CLAUDE.md", ".claude/CLAUDE.md"],
20
20
  acp: {
21
21
  command: "npx",
22
- args: ["-y", "@zed-industries/claude-code-acp"],
22
+ args: ["-y", "@zed-industries/claude-code-acp@0.16.2"],
23
23
  npmPackage: "@zed-industries/claude-code-acp",
24
24
  npmPackageBin: "claude-code-acp",
25
25
  },
@@ -39,7 +39,7 @@ export const INTEROP_AGENT_KINDS: ReadonlyArray<InteropAgentKind> = [
39
39
  instructionFiles: ["AGENTS.md", "CODEX.md", ".codex/AGENTS.md"],
40
40
  acp: {
41
41
  command: "npx",
42
- args: ["-y", "@agentclientprotocol/codex-acp"],
42
+ args: ["-y", "@agentclientprotocol/codex-acp@1.10.0"],
43
43
  npmPackage: "@agentclientprotocol/codex-acp",
44
44
  npmPackageBin: "codex-acp",
45
45
  },
@@ -19,13 +19,18 @@
19
19
  */
20
20
 
21
21
  import { spawnSync } from "node:child_process";
22
- import { readFileSync } from "node:fs";
23
- import { join } from "node:path";
24
22
  import { parse as parseYaml } from "yaml";
25
23
  import {
24
+ gitCommitAttributionEnabled,
26
25
  reportCommitAttributionDiagnostic,
27
26
  withManagedGitCommitAttributionEnvironment,
28
27
  } from "../../core/git-commit-attribution.js";
28
+ import { buildSafeToolEnv } from "../../core/safe-exec.js";
29
+ import {
30
+ captureProjectSurface,
31
+ type ProjectSurfaceSnapshot,
32
+ projectSurfaceTrustNotice,
33
+ } from "../../core/workspace-trust.js";
29
34
  import {
30
35
  type HookReceiptSink,
31
36
  loadUserHooks,
@@ -49,6 +54,7 @@ export interface HookFileIssue {
49
54
  export interface ReadHookSourcesResult {
50
55
  batches: UserHookDeclarationBatch[];
51
56
  fileIssues: HookFileIssue[];
57
+ projectSurface: ProjectSurfaceSnapshot;
52
58
  }
53
59
 
54
60
  /** One package's hook declarations, captured by the supplier from verified bytes. */
@@ -77,15 +83,9 @@ export interface ReadHookSourcesOptions {
77
83
  function readBatch(
78
84
  source: UserHookSource,
79
85
  filePath: string,
86
+ text: string,
80
87
  fileIssues: HookFileIssue[],
81
88
  ): UserHookDeclarationBatch | null {
82
- let text: string;
83
- try {
84
- text = readFileSync(filePath, "utf8");
85
- } catch {
86
- // Missing file: not an error, the source is simply absent.
87
- return null;
88
- }
89
89
  try {
90
90
  const parsed = parseYaml(text) as unknown;
91
91
  return { source, declarations: parsed ?? [] };
@@ -125,21 +125,22 @@ export function readHookSources(options: ReadHookSourcesOptions): ReadHookSource
125
125
  batches.push({ source, declarations: entry.declarations });
126
126
  }
127
127
 
128
- const projectBatch = readBatch(
129
- { origin: "project", sourcePath: ".clio-coder/hooks.yaml" },
130
- join(options.cwd, ".clio-coder", "hooks.yaml"),
131
- fileIssues,
132
- );
133
- if (projectBatch) batches.push(projectBatch);
134
-
135
- const localBatch = readBatch(
136
- { origin: "project.local", sourcePath: ".clio-coder/hooks.local.yaml" },
137
- join(options.cwd, ".clio-coder", "hooks.local.yaml"),
138
- fileIssues,
139
- );
140
- if (localBatch) batches.push(localBatch);
141
-
142
- return { batches, fileIssues };
128
+ const projectSurface = captureProjectSurface(options.cwd, "hooks");
129
+ for (const [index, file] of projectSurface.files.entries()) {
130
+ const source: UserHookSource = {
131
+ origin: index === 0 ? "project" : "project.local",
132
+ sourcePath: index === 0 ? ".clio-coder/hooks.yaml" : ".clio-coder/hooks.local.yaml",
133
+ };
134
+ if (file.error !== undefined) fileIssues.push({ source, message: file.error });
135
+ if (file.text === null) continue;
136
+ if (projectSurface.verdict !== "trusted") {
137
+ fileIssues.push({ source, message: projectSurfaceTrustNotice(projectSurface, file.path) });
138
+ continue;
139
+ }
140
+ const batch = readBatch(source, file.path, file.text, fileIssues);
141
+ if (batch) batches.push(batch);
142
+ }
143
+ return { batches, fileIssues, projectSurface };
143
144
  }
144
145
 
145
146
  export interface BuildUserHookRegistrationsOptions {
@@ -151,6 +152,8 @@ export interface BuildUserHookRegistrationsOptions {
151
152
  /** Injected for tests; defaults to the spawnSync runner. */
152
153
  runCommand?: UserHookCommandRunner;
153
154
  now?: () => number;
155
+ /** Operator notice when an already published project's trust changes. */
156
+ report?: (line: string) => void;
154
157
  }
155
158
 
156
159
  export interface BuildUserHookRegistrationsResult extends UserHookLoadResult {
@@ -173,13 +176,28 @@ export function buildUserHookRegistrations(
173
176
  const workspaceRoot = options.workspaceRoot ?? options.cwd;
174
177
  const readOptions: ReadHookSourcesOptions = { cwd: options.cwd };
175
178
  if (options.capturedSources !== undefined) readOptions.capturedSources = options.capturedSources;
176
- const { batches, fileIssues } = readHookSources(readOptions);
179
+ const { batches, fileIssues, projectSurface } = readHookSources(readOptions);
177
180
  const loaded = loadUserHooks(batches, { workspaceRoot });
178
181
  const runCommand = options.runCommand ?? spawnSyncCommandRunner();
182
+ let reportedUntrusted = false;
183
+ const projectStillTrusted = (): boolean => {
184
+ const current = captureProjectSurface(options.cwd, "hooks");
185
+ if (current.verdict === "trusted" && current.contentHash === projectSurface.contentHash) return true;
186
+ if (!reportedUntrusted) {
187
+ reportedUntrusted = true;
188
+ options.report?.(
189
+ `[clio-coder:hooks] project hooks changed or trust was revoked; hooks skipped. Review with clio-coder config trust hooks, then reload extensions.`,
190
+ );
191
+ }
192
+ return false;
193
+ };
179
194
  const registrations = loaded.hooks.map((hook) =>
180
195
  userHookToRegistration(hook, {
181
196
  recordReceipt: options.recordReceipt,
182
197
  runCommand,
198
+ ...(hook.source.origin === "project" || hook.source.origin === "project.local"
199
+ ? { isTrusted: projectStillTrusted }
200
+ : {}),
183
201
  ...(options.now !== undefined ? { now: options.now } : {}),
184
202
  }),
185
203
  );
@@ -195,8 +213,9 @@ export function spawnSyncCommandRunner(): UserHookCommandRunner {
195
213
  const [command, ...args] = argv;
196
214
  // A user hook is operator automation, not Clio work: the environment is
197
215
  // normalized so a nested seam sees consistent state, but no role is claimed.
198
- const attribution = withManagedGitCommitAttributionEnvironment(process.env, {
216
+ const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(), {
199
217
  cwd: options.cwd ?? process.cwd(),
218
+ enabled: gitCommitAttributionEnabled(process.env),
200
219
  evidence: {},
201
220
  });
202
221
  reportCommitAttributionDiagnostic(attribution.diagnostic);
@@ -397,6 +397,8 @@ export interface UserHookRegistrationDeps {
397
397
  /** Synchronous command runner. Injected so tests need no real subprocess. */
398
398
  runCommand: UserHookCommandRunner;
399
399
  now?: () => number;
400
+ /** Published project hooks stop executing after their approved surface changes or is revoked. */
401
+ isTrusted?: () => boolean;
400
402
  }
401
403
 
402
404
  function reminderEffect(message: string, severity: MiddlewareReminderSeverity): MiddlewareEffect {
@@ -441,6 +443,10 @@ export function userHookToRegistration(
441
443
  evaluate: (input) => {
442
444
  if (!hook.enabled) return [];
443
445
  try {
446
+ if (deps.isTrusted?.() === false) {
447
+ deps.recordReceipt({ ...baseReceipt(input), outcome: "skipped" });
448
+ return [];
449
+ }
444
450
  return evaluateHook(hook, deps, baseReceipt(input));
445
451
  } catch {
446
452
  // A hook must never throw into a turn; report a skipped receipt.
@@ -0,0 +1,23 @@
1
+ import { INSTRUCTION_SHAPED_WARNING } from "../../core/untrusted-content.js";
2
+ import type { MiddlewareRuleDefinition } from "./runtime.js";
3
+
4
+ /** Raw-body marker detection is supplied by the registry before result shaping. */
5
+ export const INJECTION_SCREEN_RULE: MiddlewareRuleDefinition = {
6
+ rule: {
7
+ id: "safety.untrusted-instructions",
8
+ source: "builtin",
9
+ description: "Warn when external tool data contains instruction-shaped markers",
10
+ enabled: true,
11
+ hooks: ["after_tool"],
12
+ effectKinds: ["annotate_tool_result"],
13
+ },
14
+ toolNames: ["web_fetch", "read", "bash", "dispatch", "monitor"],
15
+ predicate: (input) => input.metadata?.untrustedInstructionMarkers === true,
16
+ effects: [
17
+ {
18
+ kind: "annotate_tool_result",
19
+ severity: "warn",
20
+ message: INSTRUCTION_SHAPED_WARNING,
21
+ },
22
+ ],
23
+ };
@@ -1,3 +1,4 @@
1
+ import { INJECTION_SCREEN_RULE } from "./injection-screen.js";
1
2
  import type { MiddlewareRuleDefinition } from "./runtime.js";
2
3
  import { STALLED_TURN_RULE_DEFINITION } from "./stalled-turn.js";
3
4
  import type { MiddlewareRule } from "./types.js";
@@ -8,7 +9,10 @@ import type { MiddlewareRule } from "./types.js";
8
9
  * channel delivers the declarative half to workers, which resolve payloads
9
10
  * from this table by rule id.
10
11
  */
11
- const BUILTIN_MIDDLEWARE_RULE_DEFINITIONS: ReadonlyArray<MiddlewareRuleDefinition> = [STALLED_TURN_RULE_DEFINITION];
12
+ const BUILTIN_MIDDLEWARE_RULE_DEFINITIONS: ReadonlyArray<MiddlewareRuleDefinition> = [
13
+ STALLED_TURN_RULE_DEFINITION,
14
+ INJECTION_SCREEN_RULE,
15
+ ];
12
16
 
13
17
  export const BUILTIN_MIDDLEWARE_RULE_IDS = BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => definition.rule.id);
14
18
 
@@ -9,7 +9,7 @@ export const STALLED_TURN_REQUEST_CONTINUATION_MESSAGE =
9
9
  "You ended your turn after announcing an action without executing it: no tools were called. Continue now and perform the announced action, or state plainly that you are finished and waiting for the user.";
10
10
 
11
11
  export const SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE =
12
- "You ended your turn on a skill suggestion without doing the task. The suggestion line has already made the offer and only the operator loads a skill, so nothing is needed from them before you proceed. Continue the task now without the skill.";
12
+ "You ended your turn on a skill suggestion without doing the task. The suggestion line has already made the offer and only the operator loads a skill, so the skill choice needs nothing from them before you proceed. Continue the already-authorized task now without the skill. This continuation is not an operator answer to any other question: if the remaining work is a proposal awaiting an explicit operator go-ahead, park it on the task board and say so instead of implementing.";
13
13
 
14
14
  const INTENT_PATTERN = /\b(let me|i['’]ll|i will|i am going to|i['’]m going to|now i|next i|let's|let us)\b/i;
15
15
 
@@ -110,12 +110,25 @@ const ACTION_OBJECT_CONNECTOR_PATTERN = /^(?:at|for|in|into|on|through|to)\s+/i;
110
110
  const ACTION_OBJECT_DETERMINER_PATTERN = /^(?:a|an|my|our|that|the|their|these|this|those|your)\s+/i;
111
111
  const ACTION_OBJECT_PATTERN = /^(?!(?:again|everyone|later|next|now|soon|then|you)\b)[`"'./~]*[\p{L}\p{N}_-]/iu;
112
112
  const CONDITIONAL_LEAD_IN_PATTERN = /\b(?:if|once|unless|until|when|whenever)\b/i;
113
- const CONDITIONAL_INVITATION_PATTERN = /\b(?:ask|give|point|say|send|share|tell)\b[\s\S]*\b(?:and|then)\s*$/i;
113
+ // "say go and", "confirm and", "reply yes and": the sentence hands the operator
114
+ // the decision and promises work only after it.
115
+ const CONDITIONAL_INVITATION_PATTERN =
116
+ /\b(?:answer|approve|ask|confirm|give|point|reply|respond|say|send|share|tell|type)\b[\s\S]*\b(?:and|then)\s*$/i;
114
117
  // "if needed", and any conditional whose condition is about the user: "if you
115
118
  // want", "if that is what you need". Conditions about the work ("if the config
116
119
  // is valid") stay announcements.
120
+ // Any condition that waits on the operator ("after you approve", "once you
121
+ // confirm", "until you say", "upon your go-ahead") is a proposal awaiting a
122
+ // decision, not an announcement: the operator's answer is the missing input,
123
+ // and an automatic continuation would stand in for it (issue #365).
117
124
  const CONDITIONAL_OFFER_SUFFIX_PATTERN =
118
- /\b(?:if\s+(?:needed|necessary|requested)\b|if\b[^.!?]*\byou\b|when(?:ever)?\s+you\b)/i;
125
+ /\b(?:if\s+(?:needed|necessary|requested|approved|confirmed)\b|(?:if|after|once|until|unless|when(?:ever)?|as\s+soon\s+as|provided|assuming)\b[^.!?]*\byou\b|(?:upon|on|after|with|pending|awaiting|following)\s+(?:your\s+|the\s+operator(?:'s)?\s+)?(?:approval|go-?ahead|confirmation|sign-?off|decision|word|green\s+light|okay|ok)\b)/i;
126
+ // A lead-in that is itself a wait ("Awaiting your go-ahead; I'll then write
127
+ // the test") defers whatever the intent clause goes on to name.
128
+ const OPERATOR_WAIT_LEAD_PATTERN = /\b(?:await(?:ing)?|pending|waiting\s+(?:for|on))\b/i;
129
+ // "I will not edit files" announces a refusal, and "next I would create
130
+ // clamp.py" describes a hypothetical; neither promises an action now.
131
+ const NEGATED_OR_HYPOTHETICAL_CLAUSE_PATTERN = /^\s*(?:not|never|would|could|might|may)\b/i;
119
132
  const LET_ME_KNOW_PATTERN = /\blet me know\b/i;
120
133
  // "I'll wait for your go-ahead before I touch src/cli/index.ts" names a path
121
134
  // and promises nothing now. A clause that opens by deferring is a wait
@@ -199,12 +212,14 @@ function announcesConcreteAction(sentence: string): boolean {
199
212
  if (
200
213
  CONDITIONAL_LEAD_IN_PATTERN.test(leadIn) ||
201
214
  CONDITIONAL_INVITATION_PATTERN.test(leadIn) ||
215
+ OPERATOR_WAIT_LEAD_PATTERN.test(leadIn) ||
202
216
  CONDITIONAL_OFFER_SUFFIX_PATTERN.test(sentence)
203
217
  ) {
204
218
  return false;
205
219
  }
206
220
  const clause = sentence.slice(intent.index + intent[0].length);
207
221
  if (DEFERRAL_LEAD_PATTERN.test(clause)) return false;
222
+ if (NEGATED_OR_HYPOTHETICAL_CLAUSE_PATTERN.test(clause)) return false;
208
223
  if (hasActionWithObject(clause)) return true;
209
224
  // A path or command is evidence of an immediate action only when the
210
225
  // announcement itself is unconditional; "once package.json is updated"
@@ -17,8 +17,10 @@ export const TASK_BOARD_REMINDER_REGISTRATION_ID = "observer.task-board-reminder
17
17
  export function taskBoardReminderMessage(steps: number): string {
18
18
  return (
19
19
  `[Tasks] This request enumerates ${steps} steps. Before the first edit, declare the task board: ` +
20
- 'tasks action="plan" with a title and one task per step, then work them one at a time ' +
21
- '("start", then "done" with an evidence note).'
20
+ 'tasks action="plan" with a title and one task per authorized step, then work them one at a time ' +
21
+ '("start", then "done" with an evidence note). A plan does not authorize implementation: ' +
22
+ 'for proposed work awaiting an operator go-ahead, use action="block" with a note naming the pending operator decision, ' +
23
+ 'or action="drop", and wait.'
22
24
  );
23
25
  }
24
26
 
@@ -36,7 +36,10 @@ export function buildOpenTasksMessage(board: TaskBoardSnapshot): string {
36
36
  return (
37
37
  `[Clio Coder] task board "${board.title}" still has ${open.length} of ${counts.total} task(s) open:\n` +
38
38
  `${rows.join("\n")}\n` +
39
- `Continue working them, or record the honest state on the board: ` +
39
+ `Continue only work already authorized by the operator. This reminder and a self-created plan are not authorization ` +
40
+ `to implement a proposal. If implementation awaits an operator decision, use tasks action="block" with a note ` +
41
+ `naming that pending operator decision, or action="drop"; then wait for an explicit operator go-ahead. ` +
42
+ `A skill-install choice does not authorize implementation. Otherwise record the honest state on the board: ` +
40
43
  `tasks action="done" with an evidence note, action="block" with a reason, or action="drop". ` +
41
44
  `Do not end the turn with a stale board.`
42
45
  );
@@ -61,7 +61,13 @@ const TOKEN_VALUE_MAX = 80;
61
61
  /** How long `available()` stays false after a transport failure before probing again. */
62
62
  const DEGRADE_COOLDOWN_MS = 5_000;
63
63
 
64
+ export type MuxPaneOpenFailure =
65
+ | { source: "mux"; kind: MuxError["kind"]; wireCode: string | null; method: string | null; message: string }
66
+ | { source: "local"; message: string };
67
+
64
68
  export interface MuxOpenUtilityPaneRequest {
69
+ /** Request-scoped diagnostics; the pane-or-null best-effort result is unchanged. */
70
+ onFailure?: (failure: MuxPaneOpenFailure) => void;
65
71
  argv: ReadonlyArray<string>;
66
72
  cwd: string;
67
73
  label: string;
@@ -230,7 +236,12 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
230
236
  * is what the caller sees when the pane layer is not there, which is the same
231
237
  * value it sees in `none` mode.
232
238
  */
233
- const attempt = async <T>(what: string, run: (live: MuxClient) => Promise<T>, fallback: T): Promise<T> => {
239
+ const attempt = async <T>(
240
+ what: string,
241
+ run: (live: MuxClient) => Promise<T>,
242
+ fallback: T,
243
+ onError?: (error: unknown) => void,
244
+ ): Promise<T> => {
234
245
  if (!usable() || client === null) return fallback;
235
246
  try {
236
247
  const value = await run(client);
@@ -238,6 +249,7 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
238
249
  return value;
239
250
  } catch (error) {
240
251
  degrade(what, error);
252
+ onError?.(error);
241
253
  return fallback;
242
254
  }
243
255
  };
@@ -301,6 +313,13 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
301
313
  },
302
314
 
303
315
  async openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null> {
316
+ const report = (failure: MuxPaneOpenFailure): void => {
317
+ try {
318
+ request.onFailure?.(failure);
319
+ } catch {
320
+ // Diagnostics must not break the best-effort contract.
321
+ }
322
+ };
304
323
  // Idempotence for docks: a slot that already has a pane answers with it.
305
324
  const dockSlot = request.dock?.slot;
306
325
  if (dockSlot && docks) {
@@ -314,6 +333,7 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
314
333
  let ref: MuxPaneRef;
315
334
  if (request.dock && docks) {
316
335
  const placed = await docks.open(request.dock.slot, {
336
+ onRefused: (message) => report({ source: "local", message }),
317
337
  ...(request.dock.share === undefined ? {} : { share: request.dock.share }),
318
338
  cwd: request.cwd,
319
339
  ...(request.env ? { env: request.env } : {}),
@@ -356,6 +376,19 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
356
376
  return ref;
357
377
  },
358
378
  null,
379
+ (error) => {
380
+ if (error instanceof MuxError) {
381
+ report({
382
+ source: "mux",
383
+ kind: error.kind,
384
+ wireCode: error.wireCode,
385
+ method: error.method,
386
+ message: error.message,
387
+ });
388
+ } else {
389
+ report({ source: "local", message: error instanceof Error ? error.message : String(error) });
390
+ }
391
+ },
359
392
  );
360
393
  },
361
394
 
@@ -198,7 +198,12 @@ export interface DockController {
198
198
  */
199
199
  open(
200
200
  slot: DockSlot,
201
- options?: { share?: number; cwd?: string; env?: Readonly<Record<string, string>> },
201
+ options?: {
202
+ share?: number;
203
+ cwd?: string;
204
+ env?: Readonly<Record<string, string>>;
205
+ onRefused?: (reason: string) => void;
206
+ },
202
207
  ): Promise<MuxPaneRef | null>;
203
208
  /** Record an adopted pane (crash recovery) as this slot's dock. */
204
209
  adopt(slot: DockSlot, ref: MuxPaneRef): void;
@@ -265,11 +270,13 @@ export function createDockController(options: DockControllerOptions): DockContro
265
270
  const geometry = await client.paneLayout(anchorPaneId);
266
271
  const anchorRect = geometry.panes.find((pane) => pane.paneId === anchorPaneId)?.rect;
267
272
  if (!anchorRect) {
273
+ openOptions.onRefused?.(`no anchor geometry for ${anchorPaneId}; check the pane host layout before trying again`);
268
274
  log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
269
275
  return null;
270
276
  }
271
277
  const plan = planDockOpen(anchorRect, spec, openOptions.share);
272
278
  if ("refused" in plan) {
279
+ openOptions.onRefused?.(`${plan.refused}; enlarge the anchor pane before trying again`);
273
280
  log("info", `mux ${slot} dock refused: ${plan.refused}`);
274
281
  return null;
275
282
  }
@@ -21,6 +21,7 @@ export type {
21
21
  MuxContract,
22
22
  MuxNotifyRequest,
23
23
  MuxOpenUtilityPaneRequest,
24
+ MuxPaneOpenFailure,
24
25
  MuxRuntime,
25
26
  MuxRuntimeOptions,
26
27
  } from "./contract.js";
@@ -645,9 +645,19 @@ export function createMuxClient(options: MuxClientOptions): MuxClient {
645
645
  // so an empty-id error line on this connection is still ours.
646
646
  if (responseId !== id && !(responseId === "" && error)) return;
647
647
  if (error) {
648
- const code = typeof error.code === "string" ? error.code : "unknown";
649
- const message = typeof error.message === "string" ? error.message : code;
650
- finish(() => reject(new MuxError(muxErrorKind(code), message, { wireCode: code, method })));
648
+ const code = typeof error.code === "string" ? error.code : undefined;
649
+ // Absence is different from a host literally saying "unknown".
650
+ // Keep supplied text verbatim and make missing text explicit here.
651
+ const message =
652
+ typeof error.message === "string" ? error.message : "no failure message was supplied by the pane host";
653
+ finish(() =>
654
+ reject(
655
+ new MuxError(muxErrorKind(code ?? "unknown"), message, {
656
+ ...(code === undefined ? {} : { wireCode: code }),
657
+ method,
658
+ }),
659
+ ),
660
+ );
651
661
  return;
652
662
  }
653
663
  finish(() => resolve(line.result));
@@ -47,7 +47,7 @@ export interface ObservabilityNotice {
47
47
  }
48
48
 
49
49
  /**
50
- * Compact lifecycle summary for a recent dispatch run. Projected from the
50
+ * Compact lifecycle summary for an active or recently settled dispatch run. Projected from the
51
51
  * dispatch bus channels; raw tool arguments and reasoning are absent. Worker
52
52
  * progress is a bounded, redacted presentation of the live stream. `evidence`
53
53
  * is populated asynchronously once the forensic bundle for the run finalizes.
@@ -205,7 +205,7 @@ export interface ObservabilityContract extends ObservabilityRunProjection {
205
205
  recordSessionTurn(trace: SessionTurnTrace): void;
206
206
  /**
207
207
  * Current product-facing projection. Cheap to call: it folds in-memory state
208
- * (bounded run/notice rings, session cost/tokens, aggregated metrics, and the
208
+ * (active runs, bounded terminal history/notices, session cost/tokens, aggregated metrics, and the
209
209
  * cached accountability summary) into a fresh immutable snapshot.
210
210
  */
211
211
  snapshot(): ObservabilitySnapshot;