@iowarp/clio-coder 0.4.3 → 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 (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.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-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.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-5DDOTTG4.js +402 -0
  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-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -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-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.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-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  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-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.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-42FMPA75.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-WCXUNS7U.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-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  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-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  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-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  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-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.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-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  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-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  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-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  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-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.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-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  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-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  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-64I3JVYM.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-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  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-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  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-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  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-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  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-VLPTKCKT.js +396 -0
  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-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.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-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.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-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  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 +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.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-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.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-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  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-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.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-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
2
3
  import path from "node:path";
3
4
  import { artifactDefaultPath } from "../../core/artifact-paths.js";
4
5
  import { pathBoundaryCovers, resolvePathBoundary } from "../../core/path-boundary.js";
@@ -8,7 +9,11 @@ import { clioConfigDir } from "../../core/xdg.js";
8
9
  import { type DeclaredCheck, loadProjectVerifierCatalog } from "../../tools/verify/catalog.js";
9
10
  import { type ActionClass, type Classification, type ClassifierCall, classify } from "./action-classifier.js";
10
11
  import type { DamageControlMatch, DamageControlRule } from "./damage-control.js";
11
- import { DEFAULT_DAMAGE_CONTROL_PATH_POLICY, mergePathPolicyInputs } from "./default-path-policy.js";
12
+ import {
13
+ DEFAULT_DAMAGE_CONTROL_PATH_POLICY,
14
+ mergePathPolicyInputs,
15
+ OPERATOR_PATH_POLICY,
16
+ } from "./default-path-policy.js";
12
17
  import {
13
18
  type CompiledPathPolicy,
14
19
  compilePathPolicy,
@@ -32,6 +37,8 @@ import { formatRejection, type RejectionMessage } from "./rejection-feedback.js"
32
37
  import { getCachedDefaultRulePacks, type PackId, type RulePacks } from "./rule-pack-loader.js";
33
38
  import { activeClioSkillRoots, skillMutationReason } from "./skill-authority.js";
34
39
 
40
+ import { gateProjectSafetyPolicy, workspaceTrustDirectory } from "./workspace-trust.js";
41
+
35
42
  export type SafetyPolicySource =
36
43
  | "damage-control:base"
37
44
  | "project-policy"
@@ -79,6 +86,8 @@ export interface SafetyPolicyMetadata {
79
86
  projectPolicyHash: string | null;
80
87
  projectPolicyValid: boolean;
81
88
  projectPolicyErrors: ReadonlyArray<string>;
89
+ disableDefaultPathPolicy?: boolean;
90
+ workspaceTrustVerdict?: "trusted" | "untrusted" | "changed";
82
91
  cwd: string;
83
92
  }
84
93
 
@@ -113,6 +122,9 @@ const BUILTIN_ALLOWLIST: ReadonlyArray<{ id: string; re: RegExp }> = [
113
122
  { id: "builtin:git-status", re: /^git\s+status(?:\s+--short|\s+--branch|\s+-sb)*$/ },
114
123
  { id: "builtin:git-diff", re: /^git\s+diff(?:\s+--cached|\s+--stat|\s+--name-only|\s+--\s+[\w./-]+)*$/ },
115
124
  { id: "builtin:git-log", re: /^git\s+log\s+--oneline(?:\s+-n\s+[1-9]\d{0,2})?(?:\s+--\s+[\w./-]+)?$/ },
125
+ ];
126
+
127
+ const PROJECT_SCRIPT_COMMANDS: ReadonlyArray<{ id: string; re: RegExp }> = [
116
128
  { id: "builtin:npm-test", re: /^npm\s+(?:test|run\s+test)(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
117
129
  { id: "builtin:npm-lint", re: /^npm\s+run\s+lint(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
118
130
  { id: "builtin:npm-build", re: /^npm\s+run\s+build(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
@@ -198,18 +210,19 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
198
210
  const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
199
211
  const skillRoots = activeClioSkillRoots(cwd);
200
212
  const packs = options.rulePacks ?? getCachedDefaultRulePacks();
201
- const projectPolicy = options.projectPolicy ?? loadProjectSafetyPolicy(cwd);
213
+ const projectPolicy = options.projectPolicy ?? gateProjectSafetyPolicy(cwd, loadProjectSafetyPolicy(cwd));
202
214
  const projectPolicyRoot =
203
- projectPolicy.path === null ? cwd : path.dirname(path.dirname(canonicalizeExistingPath(projectPolicy.path)));
215
+ projectPolicy.path === null ? cwd : path.dirname(path.dirname(path.resolve(projectPolicy.path)));
204
216
  const pathPolicyInput = projectPolicy.disableDefaultPathPolicy
205
217
  ? projectPolicy.pathPolicy
206
218
  : mergePathPolicyInputs(DEFAULT_DAMAGE_CONTROL_PATH_POLICY, projectPolicy.pathPolicy);
207
- // Clio's own secret store, by absolute path. The static default list carries
208
- // the `credentials.yaml` literal; the expansion has to happen here because
219
+ // Clio's own secret store and user skills, by absolute path.
220
+ // Config directory expansion has to happen here because
209
221
  // the list cannot call config helpers at module scope.
210
- const expandedDefaults = projectPolicy.disableDefaultPathPolicy
211
- ? pathPolicyInput
212
- : mergePathPolicyInputs(pathPolicyInput, { zeroAccessPaths: clioCredentialStorePaths() });
222
+ const expandedDefaults = mergePathPolicyInputs(mergePathPolicyInputs(pathPolicyInput, OPERATOR_PATH_POLICY), {
223
+ zeroAccessPaths: clioCredentialStorePaths(),
224
+ readOnlyPaths: [...clioSkillsRootPaths(), path.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()],
225
+ });
213
226
  const pathPolicy = compilePathPolicy(expandedDefaults, projectPolicyRoot);
214
227
  // Bash-read scanning tests argument tokens against zero-access entries only:
215
228
  // read-only paths stay readable from bash by design, secrets do not.
@@ -314,6 +327,31 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
314
327
  // Editing active instructions is an operator privilege at every autonomy
315
328
  // level, in both the coordinator and the shared worker safety contract.
316
329
  const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
330
+ if (mutationCommand !== null && invokesTrustMutation(mutationCommand)) {
331
+ return blockDecision(base, {
332
+ reasonCode: "trust-authority",
333
+ ruleId: "trust-authority",
334
+ reasons: ["workspace trust grants require the operator CLI"],
335
+ policySource: "builtin-classifier",
336
+ });
337
+ }
338
+ // Reuse the canonical authority boundary scan for parent deletions,
339
+ // shell cwd changes and aliases that a literal path-policy lookup misses.
340
+ if (
341
+ skillMutationReason(
342
+ [path.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()],
343
+ pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
344
+ callCwd,
345
+ mutationCommand,
346
+ ) !== null
347
+ ) {
348
+ return blockDecision(base, {
349
+ reasonCode: "path-policy:readOnlyPaths",
350
+ ruleId: "path-policy:readOnlyPaths",
351
+ reasons: ["Clio settings and workspace trust records are operator-owned and cannot be mutated by tools"],
352
+ policySource: "builtin-classifier",
353
+ });
354
+ }
317
355
  const skillReason =
318
356
  mutationCommand !== null && invokesClioSkillMutation(mutationCommand)
319
357
  ? "skill installation and updates require the operator CLI or an explicit operator install choice; draft outside active skill roots"
@@ -418,8 +456,39 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
418
456
  return posture === "confirmed" ? allowDecision(base, input) : askDecision(base, input);
419
457
  }
420
458
 
421
- if (call.tool === ToolNames.Bash && classification.actionClass === "execute") {
422
- const bash = evaluateBashPolicy(command ?? "", callCwd, cwd, posture, projectPolicy);
459
+ const packageCommand =
460
+ call.tool === ToolNames.Verify &&
461
+ catalogCheck === null &&
462
+ typeof call.args?.check === "string" &&
463
+ call.args.check !== "frontend"
464
+ ? `npm run ${call.args.check}`
465
+ : null;
466
+ if (
467
+ (call.tool === ToolNames.Bash || catalogCheck !== null || packageCommand !== null) &&
468
+ classification.actionClass === "execute"
469
+ ) {
470
+ const bash = evaluateBashPolicy(
471
+ catalogCheck?.command ?? packageCommand ?? command ?? "",
472
+ catalogCheck === null ? callCwd : path.resolve(cwd, catalogCheck.cwd),
473
+ cwd,
474
+ posture,
475
+ projectPolicy,
476
+ );
477
+ if (
478
+ (catalogCheck !== null || packageCommand !== null) &&
479
+ bash.kind === "allow" &&
480
+ bash.execRecognition !== "recognized" &&
481
+ posture !== "confirmed"
482
+ ) {
483
+ return askDecision(base, {
484
+ ...bash,
485
+ reasonCode: "project-verifier-confirm",
486
+ reasons: [
487
+ ...bash.reasons,
488
+ `Repository verifier requires confirmation or an approved safety declaration: ${catalogCommand ?? packageCommand}`,
489
+ ],
490
+ });
491
+ }
423
492
  if (bash.kind === "block") return blockDecision(base, bash);
424
493
  if (bash.kind === "ask") return askDecision(base, bash);
425
494
  return allowDecision(base, bash);
@@ -435,22 +504,9 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
435
504
  };
436
505
  if (hit?.match.ruleId !== undefined) allowInput.ruleId = hit.match.ruleId;
437
506
  if (hit?.match !== undefined) allowInput.match = hit.match;
438
- // The typed execution tool (verify) sits in the no-prompt set when the
439
- // check is a package script or the frontend validator: both are bounded
440
- // by the verification-script family and run a fixed argv shape. A
441
- // project-catalog check runs whatever argv the workspace file declares,
442
- // so it is unrecognized: auto-edit parks it for one confirmation that
443
- // shows the argv, full-auto runs it, and the damage-control match and
444
- // zero-access scan above have already seen the declared vector.
445
- if (classification.actionClass === "execute") {
446
- allowInput.execRecognition = catalogCheck === null ? "recognized" : "unrecognized";
447
- if (catalogCheck !== null) {
448
- allowInput.reasons = [
449
- ...allowInput.reasons,
450
- `project verifier '${catalogCheck.id}' runs declared argv: ${catalogCommand ?? ""}`,
451
- ];
452
- }
453
- }
507
+ // Catalog argv already went through canonical command recognition above.
508
+ // Package scripts and the frontend validator retain their fixed typed surface.
509
+ if (classification.actionClass === "execute") allowInput.execRecognition = "recognized";
454
510
  return allowDecision(base, allowInput);
455
511
  },
456
512
  metadata() {
@@ -463,6 +519,8 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
463
519
  projectPolicyHash: projectPolicy.hash,
464
520
  projectPolicyValid: projectPolicy.valid,
465
521
  projectPolicyErrors: [...projectPolicy.errors, ...pathPolicy.diagnostics],
522
+ disableDefaultPathPolicy: projectPolicy.disableDefaultPathPolicy,
523
+ workspaceTrustVerdict: projectPolicy.trustVerdict ?? "trusted",
466
524
  cwd,
467
525
  };
468
526
  },
@@ -478,6 +536,15 @@ function clioCredentialStorePaths(): string[] {
478
536
  }
479
537
  }
480
538
 
539
+ /** Absolute path of Clio's user skills, when resolvable. */
540
+ function clioSkillsRootPaths(): string[] {
541
+ try {
542
+ return [path.join(clioConfigDir(), "skills")];
543
+ } catch {
544
+ return [];
545
+ }
546
+ }
547
+
481
548
  /**
482
549
  * The exact safe presence form: `grep -q` or `grep -sq` (either flag order)
483
550
  * with a `^NAME=`-shaped pattern and a single file argument. Exit code only;
@@ -601,12 +668,27 @@ function pathPolicyTargets(call: ClassifierCall): Array<{ operation: PathPolicyO
601
668
  * admission seam decides whether it runs, asks, or is denied.
602
669
  */
603
670
  function evaluateBashPolicy(
604
- command: string,
671
+ input: string | ReadonlyArray<string>,
605
672
  callCwd: string,
606
673
  workspaceRoot: string,
607
674
  posture: string | undefined,
608
675
  policy: LoadedProjectSafetyPolicy,
609
676
  ): Omit<SafetyPolicyDecision, "classification" | "tool" | "actionClass" | "cwd" | "posture" | "command"> {
677
+ // Catalog commands execute as argv, never as shell source. Only bare words
678
+ // have an unambiguous representation in the canonical command matcher.
679
+ // Keep whitespace, empty arguments, and shell syntax out of recognition;
680
+ // joining them would erase argument boundaries or invent a shell chain.
681
+ if (typeof input !== "string" && !input.every((arg) => /^[\w=./:-]+$/u.test(arg))) {
682
+ return {
683
+ kind: posture === "confirmed" ? "allow" : "ask",
684
+ ruleId: "verify-unrecognized-argv",
685
+ reasonCode: "verify-unrecognized-argv",
686
+ reasons: ["project verifier argv is outside the bare-word no-prompt command set"],
687
+ policySource: "builtin-command-allowlist",
688
+ execRecognition: "unrecognized",
689
+ };
690
+ }
691
+ const command = typeof input === "string" ? input : input.join(" ");
610
692
  if (command.trim().length === 0) {
611
693
  return {
612
694
  kind: "block",
@@ -616,6 +698,21 @@ function evaluateBashPolicy(
616
698
  policySource: "builtin-command-allowlist",
617
699
  };
618
700
  }
701
+ if (
702
+ typeof input === "string" &&
703
+ (/\$(?:[A-Za-z_{0-9@*#?!-])/.test(command) ||
704
+ /(?:^|[\s;&|])(?:python[\d.]*|node|ruby|perl|php|lua)\s+(?:[^\n]*?\s)?-[ce]\b/.test(command)) &&
705
+ posture !== "confirmed"
706
+ ) {
707
+ return {
708
+ kind: "ask",
709
+ reasonCode: "bash-hidden-content",
710
+ ruleId: "bash-hidden-content",
711
+ reasons: ["shell variables or interpreter source hide paths from the safety scan and require one-shot confirmation"],
712
+ policySource: "builtin-command-allowlist",
713
+ execRecognition: "unrecognized",
714
+ };
715
+ }
619
716
  const projectMatch = matchingProjectCommand(policy, command, callCwd);
620
717
  if (projectMatch) {
621
718
  const base: Omit<
@@ -668,15 +765,34 @@ function evaluateBashPolicy(
668
765
  execRecognition: "unrecognized",
669
766
  };
670
767
  }
768
+ if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(recognitionCommand))) {
769
+ return {
770
+ kind: posture === "confirmed" ? "allow" : "ask",
771
+ reasonCode: "project-script-confirm",
772
+ ruleId: "project-script-confirm",
773
+ reasons: [
774
+ "Repository-authored code requires one-shot confirmation or an operator-approved safety command declaration.",
775
+ projectScriptPreview(recognitionCommand, callCwd),
776
+ ],
777
+ policySource: "builtin-command-allowlist",
778
+ execRecognition: "unrecognized",
779
+ };
780
+ }
671
781
  const chain = recognizeCommandChain(recognitionCommand, callCwd, workspaceRoot, policy);
672
782
  if (chain !== null) {
673
783
  const chainReasons = [`every step of the && chain is recognized: ${chain.ruleIds.join(", ")}`];
784
+ if (chain.requiresConfirmation) {
785
+ for (const segment of recognitionCommand.split("&&").map((part) => part.trim())) {
786
+ if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(segment)))
787
+ chainReasons.push(projectScriptPreview(segment, callCwd));
788
+ }
789
+ }
674
790
  if (chain.requiresConfirmation && posture !== "confirmed") {
675
791
  return {
676
792
  kind: "ask",
677
793
  ruleId: "bash-recognized-chain",
678
794
  reasonCode: "bash-recognized-chain",
679
- reasons: [...chainReasons, "project policy requires confirmation for one step"],
795
+ reasons: [...chainReasons, "repository code or project policy requires confirmation for one step"],
680
796
  policySource: "builtin-command-allowlist",
681
797
  execRecognition: "recognized",
682
798
  };
@@ -697,6 +813,23 @@ function evaluateBashPolicy(
697
813
  // the full string, so a destructive verb behind an operator was caught before
698
814
  // this point.
699
815
  if (hasSequencingOperators(command)) {
816
+ const scriptSegments = recognitionCommand
817
+ .split(/&&|\|\||[;|\n]/)
818
+ .map((part) => part.trim())
819
+ .filter((part) => PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(part)));
820
+ if (scriptSegments.length > 0 && posture !== "confirmed") {
821
+ return {
822
+ kind: "ask",
823
+ ruleId: "project-script-confirm",
824
+ reasonCode: "project-script-confirm",
825
+ reasons: [
826
+ "Repository scripts in compound commands require one-shot confirmation",
827
+ ...scriptSegments.map((part) => projectScriptPreview(part, callCwd)),
828
+ ],
829
+ policySource: "builtin-command-allowlist",
830
+ execRecognition: "unrecognized",
831
+ };
832
+ }
700
833
  return {
701
834
  kind: "allow",
702
835
  ruleId: "bash-shell-operators",
@@ -913,6 +1046,11 @@ function recognizeCommandChain(
913
1046
  if (projectMatch.requireConfirmation) requiresConfirmation = true;
914
1047
  continue;
915
1048
  }
1049
+ if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(rendered))) {
1050
+ ruleIds.push("project-script-confirm");
1051
+ requiresConfirmation = true;
1052
+ continue;
1053
+ }
916
1054
  const builtin = BUILTIN_ALLOWLIST.find((entry) => entry.re.test(rendered));
917
1055
  if (builtin === undefined) return null;
918
1056
  ruleIds.push(builtin.id);
@@ -966,10 +1104,16 @@ function cwdArg(args: Record<string, unknown> | undefined, fallback: string): st
966
1104
  }
967
1105
 
968
1106
  /**
969
- * Tools whose arguments are a file's contents rather than a command line.
970
- * Their damage-control scan is the destination path alone.
1107
+ * Tools whose arguments carry file contents or task prose, not command lines.
1108
+ * Their damage-control scan is the destination path alone, when present.
971
1109
  */
972
- const CONTENT_BEARING_TOOLS: ReadonlySet<string> = new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
1110
+ const CONTENT_BEARING_TOOLS: ReadonlySet<string> = new Set([
1111
+ ToolNames.Write,
1112
+ ToolNames.Edit,
1113
+ ToolNames.Artifact,
1114
+ ToolNames.Dispatch,
1115
+ ToolNames.Tasks,
1116
+ ]);
973
1117
 
974
1118
  /**
975
1119
  * The text damage-control rules are matched against.
@@ -991,6 +1135,8 @@ const CONTENT_BEARING_TOOLS: ReadonlySet<string> = new Set([ToolNames.Write, Too
991
1135
  * full. Only the destination path is scanned for a mutation tool, which keeps
992
1136
  * any path-shaped rule working; where the file may land is the write tool's own
993
1137
  * gate in `writePathClass`.
1138
+ * Dispatch and task-board prose likewise does not execute; worker commands
1139
+ * are scanned when the worker calls an execute-class tool.
994
1140
  */
995
1141
  function damageControlScan(call: ClassifierCall): string {
996
1142
  if (!CONTENT_BEARING_TOOLS.has(call.tool)) return serializeArgs(call.args);
@@ -1004,9 +1150,9 @@ function damageControlScan(call: ClassifierCall): string {
1004
1150
  * declare. The catalog is an argv vector the operator authored, but the file
1005
1151
  * sits in the workspace, so the engine reads it fresh on every verify call and
1006
1152
  * treats the declared argv exactly like a bash command string: it is what the
1007
- * damage-control rules and the zero-access read guard scan, and it is not in
1008
- * the no-prompt set. An unreadable or invalid catalog resolves to null here and
1009
- * fails closed in the tool itself.
1153
+ * damage-control rules and the zero-access read guard scan. Recognition uses
1154
+ * canonical command policy with argv boundaries preserved. An unreadable or
1155
+ * invalid catalog resolves to null here and fails closed in the tool itself.
1010
1156
  */
1011
1157
  function resolveVerifyCatalogCheck(call: ClassifierCall, workspaceRoot: string): DeclaredCheck | null {
1012
1158
  if (call.tool !== ToolNames.Verify) return null;
@@ -1057,3 +1203,34 @@ function packPayload(rules: ReadonlyArray<DamageControlRule>): Array<Record<stri
1057
1203
  ...(rule.ask !== undefined ? { ask: rule.ask } : {}),
1058
1204
  }));
1059
1205
  }
1206
+
1207
+ function invokesTrustMutation(command: string): boolean {
1208
+ // Wrappers, package launchers, quoted argv and source-tree CLI invocations
1209
+ // must not turn an operator-only grant into model authority.
1210
+ const words = scanShellLike(command)
1211
+ .filter((token) => !token.operator)
1212
+ .map((token) => token.value);
1213
+ return (
1214
+ words.some((word, index) => word === "config" && words[index + 1] === "trust") ||
1215
+ /\bconfig\s+trust\b/.test(inlineShellScript(command) ?? "")
1216
+ );
1217
+ }
1218
+
1219
+ function projectScriptPreview(command: string, cwd: string): string {
1220
+ const match = /^npm\s+(?:run\s+)?([\w:-]+)/.exec(command);
1221
+ if (match) {
1222
+ try {
1223
+ const manifest = JSON.parse(readFileSync(path.join(cwd, "package.json"), "utf8")) as {
1224
+ scripts?: Record<string, unknown>;
1225
+ };
1226
+ const name = match[1] ?? "test";
1227
+ const scripts = [`pre${name}`, name, `post${name}`].flatMap((key) =>
1228
+ typeof manifest.scripts?.[key] === "string" ? [`${key}: ${manifest.scripts[key]}`] : [],
1229
+ );
1230
+ return `package.json scripts (repository data): ${scripts.join("; ") || "no script resolved"}`;
1231
+ } catch {
1232
+ return "package.json script body could not be resolved; repository code will execute.";
1233
+ }
1234
+ }
1235
+ return `Repository command: ${command}. Its test/build files and dependencies execute with the child process permissions.`;
1236
+ }
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { existsSync, readFileSync } from "node:fs";
2
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { parse as parseYaml } from "yaml";
5
5
  import type { ActionClass } from "./action-classifier.js";
@@ -29,6 +29,7 @@ export interface ProjectCommandPolicy {
29
29
  }
30
30
 
31
31
  export interface LoadedProjectSafetyPolicy {
32
+ trustVerdict?: "trusted" | "untrusted" | "changed";
32
33
  path: string | null;
33
34
  hash: string | null;
34
35
  valid: boolean;
@@ -80,7 +81,7 @@ function projectSafetyPolicyPath(cwd: string = process.cwd()): string | null {
80
81
  }
81
82
 
82
83
  export function loadProjectSafetyPolicy(cwd: string = process.cwd()): LoadedProjectSafetyPolicy {
83
- const policyPath = projectSafetyPolicyPath(cwd);
84
+ let policyPath = projectSafetyPolicyPath(cwd);
84
85
  if (policyPath === null) {
85
86
  return {
86
87
  path: null,
@@ -94,6 +95,10 @@ export function loadProjectSafetyPolicy(cwd: string = process.cwd()): LoadedProj
94
95
  }
95
96
  let raw: string;
96
97
  try {
98
+ // Relative entries are interpreted against this source directory. Pin its
99
+ // canonical identity before reading; downstream trust and compilation use
100
+ // the captured path, not a symlink that may move after admission.
101
+ policyPath = realpathSync(policyPath);
97
102
  raw = readFileSync(policyPath, "utf8");
98
103
  } catch (err) {
99
104
  return {
@@ -5,44 +5,71 @@
5
5
  *
6
6
  * - `normal`: the finish-contract advisory stays a soft `warn` reminder.
7
7
  * - `high`: an unvalidated completion claim re-prompts the model to run
8
- * validation or state a limitation before the turn settles.
8
+ * validation or record a limitation before the turn settles.
9
9
  *
10
10
  * Rigor resolves from a per-session / per-dispatch override (the `CLIO_CODER_RIGOR`
11
11
  * env var today) layered over a repo-derived default. The repo-derived default
12
- * is `high` when the workspace declares a scientific-validation contract by the
13
- * documented path convention below, and `normal` otherwise. This keeps the
14
- * evidence bar derived from what the repo actually is rather than from a global
15
- * toggle.
12
+ * is `high` only when the workspace's scientific-validation contract parses
13
+ * under the version-1 schema in `validation-contract.ts`. A contract that
14
+ * fails to parse is diagnosed and leaves rigor at `normal`, and a Markdown
15
+ * `VALIDATION.md` is advisory prose that never raises rigor on its own. This
16
+ * keeps the evidence bar derived from what the repo actually declares rather
17
+ * than from a filename or a global toggle.
16
18
  */
17
19
 
18
- import { existsSync } from "node:fs";
19
- import path from "node:path";
20
+ import { describeValidationContract, loadValidationContract } from "./validation-contract.js";
20
21
 
21
22
  export type Rigor = "normal" | "high";
22
23
 
23
- /**
24
- * Workspace-root files that declare a scientific-validation contract. Presence
25
- * of any one of these raises the repo-derived rigor default to `high`. The
26
- * convention is intentionally small and explicit: a project opts into a higher
27
- * evidence bar by committing a validation contract at its root.
28
- */
29
- const VALIDATION_CONTRACT_FILES: ReadonlyArray<string> = [
30
- path.join(".clio-coder", "validation.yaml"),
31
- path.join(".clio-coder", "validation.yml"),
32
- "validation.yaml",
33
- "validation.yml",
34
- "VALIDATION.md",
35
- ];
24
+ /** Why rigor settled where it did, so a caller can print the reason. */
25
+ export type RigorSource = "override" | "validation-contract" | "invalid-contract" | "markdown-advisory" | "none";
26
+
27
+ export interface RigorResolution {
28
+ rigor: Rigor;
29
+ source: RigorSource;
30
+ /** Present when a contract was found but could not raise rigor: the parse fault or the Markdown advisory note. */
31
+ diagnostic?: string;
32
+ /** The repository-relative contract path, when one was found. */
33
+ contractPath?: string;
34
+ }
35
+
36
+ export interface RigorOptions {
37
+ cwd?: string;
38
+ override?: Rigor | null;
39
+ }
36
40
 
37
41
  /**
38
- * Resolve the effective rigor. An explicit override (`"high"` | `"normal"`)
39
- * always wins; otherwise the repo-derived default keys off the presence of a
40
- * validation contract at the workspace root.
42
+ * Resolve the effective rigor and the reason for it. An explicit override
43
+ * (`"high"` | `"normal"`) always wins; otherwise the repo-derived default keys
44
+ * off the parsed validation contract at the workspace root.
41
45
  */
42
- export function resolveRigor(options: { cwd?: string; override?: Rigor | null }): Rigor {
43
- if (options.override === "high" || options.override === "normal") return options.override;
46
+ export function rigorResolution(options: RigorOptions): RigorResolution {
47
+ if (options.override === "high" || options.override === "normal") {
48
+ return { rigor: options.override, source: "override" };
49
+ }
44
50
  const cwd = options.cwd ?? process.cwd();
45
- return hasValidationContract(cwd) ? "high" : "normal";
51
+ const loaded = loadValidationContract(cwd);
52
+ if (!loaded.ok) {
53
+ const resolution: RigorResolution = { rigor: "normal", source: "invalid-contract", contractPath: loaded.path };
54
+ const diagnostic = describeValidationContract(loaded);
55
+ if (diagnostic !== null) resolution.diagnostic = diagnostic;
56
+ return resolution;
57
+ }
58
+ if (loaded.contract !== null) {
59
+ return { rigor: "high", source: "validation-contract", contractPath: loaded.path };
60
+ }
61
+ if ("advisory" in loaded) {
62
+ const resolution: RigorResolution = { rigor: "normal", source: "markdown-advisory", contractPath: loaded.path };
63
+ const diagnostic = describeValidationContract(loaded);
64
+ if (diagnostic !== null) resolution.diagnostic = diagnostic;
65
+ return resolution;
66
+ }
67
+ return { rigor: "normal", source: "none" };
68
+ }
69
+
70
+ /** The effective rigor alone; see {@link rigorResolution} for the reason. */
71
+ export function resolveRigor(options: RigorOptions): Rigor {
72
+ return rigorResolution(options).rigor;
46
73
  }
47
74
 
48
75
  /**
@@ -57,16 +84,3 @@ export function parseRigorOverride(value: string | null | undefined): Rigor | nu
57
84
  if (normalized === "normal") return "normal";
58
85
  return null;
59
86
  }
60
-
61
- /**
62
- * True when the workspace declares a scientific-validation contract by the
63
- * documented path convention. Pure and resilient: any filesystem error is
64
- * swallowed and treated as "no contract".
65
- */
66
- function hasValidationContract(cwd: string): boolean {
67
- try {
68
- return VALIDATION_CONTRACT_FILES.some((relative) => existsSync(path.join(cwd, relative)));
69
- } catch {
70
- return false;
71
- }
72
- }