@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
@@ -14,21 +14,26 @@ import {
14
14
  } from "node:fs";
15
15
  import { dirname, join } from "node:path";
16
16
  import type { ContextActivityPayload } from "../../../core/bus-events.js";
17
+ import type { DecisionLedgerEntry } from "../../session/entries.js";
17
18
  import { detectProjectType } from "../../session/workspace/project-type.js";
18
19
  import type { BootstrapProgressSink } from "../bootstrap.js";
19
20
  import { coordinateCodewikiWrite } from "../codewiki/coordinator.js";
20
21
  import type { Codewiki } from "../codewiki/schema.js";
21
22
  import type { Fingerprint } from "../fingerprint.js";
22
23
  import { readClioState, writeClioState } from "../state.js";
23
- import { assembleWikiTree, normalizeRepoPath, pageSourceIndex } from "./assemble.js";
24
+ import { assembleWikiTree, pageSourceIndex } from "./assemble.js";
25
+ import { inspectWikiPageEvidence } from "./evidence.js";
24
26
  import { isGeneratedWikiFile, listWikiPagesInDir, WIKI_PLAN_FILE, wikiDir, wikiMarkdownFilesInDir } from "./layout.js";
25
27
  import {
26
28
  computeWikiContentHash,
27
29
  computeWikiContentHashOfDir,
28
30
  currentWikiGitHead,
29
31
  readWikiMeta,
32
+ readWikiMetaInDir,
33
+ type WikiMeta,
30
34
  wikiMetaPath,
31
35
  writeWikiMeta,
36
+ writeWikiMetaInDir,
32
37
  } from "./meta.js";
33
38
  import {
34
39
  planWikiGeneration,
@@ -37,13 +42,16 @@ import {
37
42
  type WikiPlan,
38
43
  type WikiPlanPage,
39
44
  } from "./plan.js";
40
- import { readWikiPlanFile, scopePlanForUpdate, unclaimedCandidates, writeWikiPlanFile } from "./plan-store.js";
45
+ import { readWikiPlanFile, unclaimedCandidates, writeWikiPlanFile } from "./plan-store.js";
41
46
  import type { WikiGenerateMode } from "./prompts.js";
47
+ import { captureWikiSourceContent, type WikiSourceContent, wikiSourcesMatch } from "./source-content.js";
42
48
  import { changedPathsSince } from "./staleness.js";
43
49
 
44
50
  export type { WikiDepth, WikiGenerateMode };
45
51
 
46
52
  export interface WikiGenerateInput {
53
+ /** The current session board, already scoped to its active branch. */
54
+ decisions?: ReadonlyArray<DecisionLedgerEntry>;
47
55
  cwd: string;
48
56
  mode: WikiGenerateMode;
49
57
  /**
@@ -67,6 +75,8 @@ export interface WikiGenerateInput {
67
75
  * paths.
68
76
  */
69
77
  resumed: boolean;
78
+ /** Operator-requested retry of pending work, including exhausted writers, once this run. */
79
+ retryPending?: boolean;
70
80
  /** Indexed areas no existing page covers, offered to a planning pass. */
71
81
  unclaimedAreas: ReadonlyArray<WikiPlanPage>;
72
82
  gitHead?: string | null;
@@ -76,10 +86,14 @@ export interface WikiGenerateInput {
76
86
  export type WikiGenerate = (input: WikiGenerateInput) => void | Promise<void>;
77
87
 
78
88
  export interface RunWikiGenerateInput {
89
+ /** The current session board, already scoped to its active branch. */
90
+ decisions?: ReadonlyArray<DecisionLedgerEntry>;
79
91
  cwd?: string;
80
92
  mode?: WikiGenerateMode;
81
93
  /** Repository-detail policy. Auto scales decomposition from indexed files and lines. */
82
94
  depth?: WikiDepth;
95
+ /** Resume the existing plan, allowing exhausted pending writers one more attempt. */
96
+ retryPending?: boolean;
83
97
  model: string;
84
98
  generate?: WikiGenerate;
85
99
  onProgress?: BootstrapProgressSink;
@@ -294,13 +308,29 @@ function adoptOrCreateStaging(cwd: string): { dir: string; adopted: boolean } {
294
308
 
295
309
  type PromoteResult = { ok: true } | { ok: false; problems: string[] };
296
310
 
297
- /**
298
- * Atomically swap staging into place: move the current wiki aside to
299
- * .clio-coder/wiki-prev, rename staging to .clio-coder/wiki, then write meta.json. On any
300
- * failure after the old wiki is moved aside, restore it; if the restore fails,
301
- * the recovered content is left at wiki-prev and its path is surfaced.
302
- */
303
- function promoteStaging(cwd: string, stagingDir: string, writeMeta: () => void): PromoteResult {
311
+ /** Resolve a previous process crash before reading metadata or cleaning staging. */
312
+ function recoverPublication(cwd: string): void {
313
+ const wiki = wikiDir(cwd);
314
+ const prev = join(clioDir(cwd), WIKI_PREV_DIR);
315
+ if (!existsSync(prev)) return;
316
+ const valid = (dir: string): boolean => {
317
+ const meta = readWikiMetaInDir(dir);
318
+ return meta !== null && meta.contentHash === computeWikiContentHashOfDir(dir);
319
+ };
320
+ if (valid(wiki)) {
321
+ removeDir(prev);
322
+ return;
323
+ }
324
+ if (!valid(prev)) throw new Error(`wiki recovery requires a valid publication; preserved ${wiki} and ${prev}`);
325
+ if (existsSync(wiki)) {
326
+ const interrupted = mkdtempSync(join(clioDir(cwd), "wiki-interrupted-"));
327
+ renameSync(wiki, join(interrupted, "wiki"));
328
+ }
329
+ renameSync(prev, wiki);
330
+ }
331
+
332
+ /** Promote a prepared content/metadata pair; restore the old pair on rename failure. */
333
+ function promoteStaging(cwd: string, stagingDir: string): PromoteResult {
304
334
  const wiki = wikiDir(cwd);
305
335
  const prev = join(clioDir(cwd), WIKI_PREV_DIR);
306
336
  removeDir(prev);
@@ -308,7 +338,6 @@ function promoteStaging(cwd: string, stagingDir: string, writeMeta: () => void):
308
338
  if (hadWiki) renameSync(wiki, prev);
309
339
  try {
310
340
  renameSync(stagingDir, wiki);
311
- writeMeta();
312
341
  } catch (err) {
313
342
  const problems = [`wiki promotion failed: ${err instanceof Error ? err.message : String(err)}`];
314
343
  removeDir(stagingDir);
@@ -332,9 +361,9 @@ function promoteStaging(cwd: string, stagingDir: string, writeMeta: () => void):
332
361
  * interrupted run, then the plan the last promoted wiki recorded, then the
333
362
  * candidate skeleton the index just produced.
334
363
  *
335
- * A resumed plan is used exactly as it was left. It was settled when the wiki
336
- * was planned, and the pages already written link to its paths, so changing it
337
- * mid-flight would strand those links. Areas the index has since found that no
364
+ * A resumed plan retains its structure because finished pages link to its
365
+ * paths. Completed dispatches are reusable only when the checkpoint source
366
+ * content matches; missing or changed evidence requeues the pages. Areas the index has since found that no
338
367
  * page covers are carried separately and offered to a planning pass, which is
339
368
  * the only thing allowed to change a plan's shape.
340
369
  */
@@ -345,24 +374,60 @@ function resolvePlan(input: {
345
374
  mode: WikiGenerateMode;
346
375
  candidate: WikiPlan;
347
376
  previousPlan: WikiPlan | undefined;
377
+ sourceContent: WikiSourceContent;
348
378
  gitHead: string | null;
349
379
  }): { plan: WikiPlan; resumed: boolean; unclaimedAreas: WikiPlanPage[] } {
350
380
  const staged = input.adopted ? readWikiPlanFile(input.stagingDir) : null;
351
- if (staged !== null) return { plan: staged, resumed: true, unclaimedAreas: [] };
352
- if (input.mode === "update" && input.previousPlan !== undefined) {
381
+ const previous = staged ?? (input.mode === "update" ? input.previousPlan : undefined);
382
+ if (previous) {
353
383
  const pageSources = pageSourceIndex(input.stagingDir, input.cwd);
354
- const changed = new Set(
355
- changedPathsSince(input.cwd, input.gitHead).map((path) => normalizeRepoPath(input.cwd, path)),
356
- );
357
- return {
358
- plan: scopePlanForUpdate({
359
- plan: input.previousPlan,
360
- changedPaths: changed,
361
- existingPages: new Set(wikiMarkdownFilesInDir(input.stagingDir)),
362
- pageSources,
384
+ // A partial first publication has no whole-wiki Git certification yet.
385
+ // Its completed pages still have the harness-captured plan baseline.
386
+ const partialHead =
387
+ input.gitHead === null && previous.pages.some((page) => page.status !== "written")
388
+ ? previous.sourceGitHead
389
+ : undefined;
390
+ const gitAvailable = changedPathsSince(input.cwd, staged?.sourceGitHead ?? partialHead ?? input.gitHead) !== null;
391
+ const existing = new Set(wikiMarkdownFilesInDir(input.stagingDir));
392
+ const plan = {
393
+ ...previous,
394
+ pages: previous.pages.map((page) => {
395
+ if (page.status !== "written") return page;
396
+ const evidence = inspectWikiPageEvidence({
397
+ pagePath: page.path,
398
+ outputDir: input.stagingDir,
399
+ sourceRoot: input.cwd,
400
+ });
401
+ const sources = [
402
+ ...page.sources,
403
+ ...(page.dependencies ?? []),
404
+ ...(pageSources.get(page.path) ?? []),
405
+ ...(evidence.dependencies ?? []),
406
+ ];
407
+ return gitAvailable &&
408
+ existing.has(page.path) &&
409
+ evidence.ok &&
410
+ wikiSourcesMatch(previous.sourceContent, input.sourceContent, sources)
411
+ ? { ...page, dependencies: evidence.dependencies ?? [] }
412
+ : {
413
+ ...page,
414
+ status: "pending" as const,
415
+ attempts: 0,
416
+ ...(!evidence.ok
417
+ ? {
418
+ lastFailure: {
419
+ phase: "validation" as const,
420
+ detail: `saved page evidence check failed: ${evidence.reasons.join("; ")}`.slice(0, 500),
421
+ },
422
+ }
423
+ : {}),
424
+ };
363
425
  }),
364
- resumed: false,
365
- unclaimedAreas: unclaimedCandidates(input.previousPlan, input.candidate, pageSources),
426
+ };
427
+ return {
428
+ plan,
429
+ resumed: staged !== null,
430
+ unclaimedAreas: staged ? [] : unclaimedCandidates(previous, input.candidate, pageSources),
366
431
  };
367
432
  }
368
433
  return { plan: input.candidate, resumed: false, unclaimedAreas: [] };
@@ -371,9 +436,9 @@ function resolvePlan(input: {
371
436
  /**
372
437
  * Reconcile the plan against the tree that actually exists. A page whose file
373
438
  * the assembly pass dropped, or that was never written, is owed again; a page
374
- * on disk is recorded as written whatever the writer reported. A page that
375
- * exists without a plan entry is adopted, because a page on disk is a page: the
376
- * alternative is a plan that keeps re-dispatching a subject already covered.
439
+ * on disk retains its recorded dispatch outcome. A page
440
+ * created by a writer without a plan entry remains available and is adopted
441
+ * pending: its own completed dispatch has not yet been recorded.
377
442
  */
378
443
  function reconcilePlan(plan: WikiPlan, stagingDir: string): WikiPlan {
379
444
  const contentFiles = wikiMarkdownFilesInDir(stagingDir).filter((relPath) => !isGeneratedWikiFile(relPath));
@@ -386,15 +451,13 @@ function reconcilePlan(plan: WikiPlan, stagingDir: string): WikiPlan {
386
451
  title: relPath.replace(/\.md$/, ""),
387
452
  intent: "",
388
453
  sources: [],
389
- status: "written" as const,
390
- attempts: 1,
454
+ status: "pending" as const,
455
+ attempts: 0,
391
456
  }));
392
457
  return {
393
458
  ...plan,
394
459
  pages: [
395
- ...plan.pages.map((page) =>
396
- onDisk.has(page.path) ? { ...page, status: "written" as const } : { ...page, status: "pending" as const },
397
- ),
460
+ ...plan.pages.map((page) => (onDisk.has(page.path) ? page : { ...page, status: "pending" as const })),
398
461
  ...adopted,
399
462
  ],
400
463
  };
@@ -404,8 +467,6 @@ export async function runWikiGenerate(
404
467
  input: RunWikiGenerateInput = { model: "configured-clio-target" },
405
468
  ): Promise<RunWikiGenerateResult> {
406
469
  const cwd = input.cwd ?? process.cwd();
407
- const existingMeta = readWikiMeta(cwd);
408
- const mode = input.mode ?? (existingMeta ? "update" : "init");
409
470
 
410
471
  const lock = acquireWikiLock(cwd);
411
472
  if (!lock.ok) {
@@ -415,10 +476,12 @@ export async function runWikiGenerate(
415
476
  }
416
477
 
417
478
  try {
479
+ recoverPublication(cwd);
480
+ const existingMeta = readWikiMeta(cwd);
481
+ const mode = input.mode ?? (existingMeta ? "update" : "init");
418
482
  progress(input, { phase: "codewiki", status: "started", message: "loading codewiki for wiki generation" });
419
483
  const { codewiki, fingerprint } = await loadOrBuildCodewiki(cwd);
420
484
  const sourceTreeHash = fingerprint.treeHash;
421
- const generation = planWikiGeneration(codewiki, input.depth ?? "auto");
422
485
  progress(input, {
423
486
  phase: "codewiki",
424
487
  status: "completed",
@@ -428,6 +491,27 @@ export async function runWikiGenerate(
428
491
  });
429
492
 
430
493
  const staging = adoptOrCreateStaging(cwd);
494
+ const stagedPlan = staging.adopted ? readWikiPlanFile(staging.dir) : null;
495
+ const savedPlan = stagedPlan ?? (mode === "update" ? existingMeta?.plan : undefined);
496
+ const savedDepth = savedPlan?.depth ?? existingMeta?.generation?.depth;
497
+ const continuing = Boolean(
498
+ stagedPlan || input.retryPending || savedPlan?.pages.some((page) => page.status !== "written"),
499
+ );
500
+ const requestedDepth = input.depth ?? savedPlan?.requestedDepth ?? existingMeta?.generation?.requestedDepth ?? "auto";
501
+ const generation = planWikiGeneration(
502
+ codewiki,
503
+ continuing && (input.depth === undefined || input.depth === "auto") && savedDepth ? savedDepth : requestedDepth,
504
+ );
505
+ // Keep the policy separate from its resolved coverage so a completed auto wiki can grow.
506
+ generation.requestedDepth =
507
+ continuing && (input.depth === undefined || input.depth === "auto")
508
+ ? (savedPlan?.requestedDepth ?? existingMeta?.generation?.requestedDepth ?? savedDepth ?? requestedDepth)
509
+ : requestedDepth;
510
+ const depthChanged = Boolean(
511
+ savedPlan && (savedDepth ? savedDepth !== generation.depth : input.depth !== undefined && input.depth !== "auto"),
512
+ );
513
+ const sourceGitHead = currentWikiGitHead(cwd) ?? undefined;
514
+ const sourceContent = captureWikiSourceContent(cwd);
431
515
  const resolved = resolvePlan({
432
516
  cwd,
433
517
  stagingDir: staging.dir,
@@ -435,8 +519,25 @@ export async function runWikiGenerate(
435
519
  mode,
436
520
  candidate: generation.plan,
437
521
  previousPlan: existingMeta?.plan,
522
+ sourceContent,
438
523
  gitHead: existingMeta?.gitHead ?? null,
439
524
  });
525
+ if (input.retryPending && !resolved.resumed && !existingMeta?.plan) {
526
+ if (!staging.adopted) removeDir(staging.dir);
527
+ return failed(
528
+ ["no saved wiki plan to retry; run `clio-coder context wiki` first"],
529
+ listWikiPagesInDir(wikiDir(cwd)).length,
530
+ );
531
+ }
532
+ if (depthChanged) {
533
+ resolved.plan = {
534
+ ...resolved.plan,
535
+ pages: resolved.plan.pages.map((page) => ({ ...page, status: "pending", attempts: 0 })),
536
+ };
537
+ resolved.resumed = false;
538
+ }
539
+ resolved.plan.depth = generation.depth;
540
+ resolved.plan.requestedDepth = generation.requestedDepth;
440
541
  const owed = resolved.plan.pages.filter((page) => page.status !== "written").length;
441
542
  progress(input, {
442
543
  phase: "codewiki",
@@ -445,8 +546,14 @@ export async function runWikiGenerate(
445
546
  detail:
446
547
  `${generation.sourceFiles} source files; ${generation.sourceLines} lines; ` +
447
548
  `${resolved.plan.pages.length} pages planned; ${owed} to write` +
448
- (resolved.resumed ? "; resuming an interrupted run" : ""),
549
+ (resolved.resumed ? "; resuming an interrupted run" : "") +
550
+ (depthChanged
551
+ ? `; coverage changed from ${savedDepth ?? "legacy unspecified"} to ${generation.depth}; prior pages requeued with prose retained`
552
+ : ""),
449
553
  });
554
+ resolved.plan = { ...resolved.plan, sourceTreeHash, sourceContent };
555
+ if (sourceGitHead) resolved.plan.sourceGitHead = sourceGitHead;
556
+ else delete resolved.plan.sourceGitHead;
450
557
  writeWikiPlanFile(staging.dir, resolved.plan);
451
558
 
452
559
  const beforeHash = computeWikiContentHash(cwd);
@@ -471,8 +578,10 @@ export async function runWikiGenerate(
471
578
  codewiki,
472
579
  generation,
473
580
  plan: resolved.plan,
474
- resumed: resolved.resumed,
581
+ resumed: resolved.resumed || (input.retryPending === true && !depthChanged),
582
+ ...(input.retryPending ? { retryPending: true } : {}),
475
583
  unclaimedAreas: resolved.unclaimedAreas,
584
+ ...(input.decisions ? { decisions: input.decisions } : {}),
476
585
  gitHead: existingMeta?.gitHead ?? null,
477
586
  ...(input.onProgress ? { progress: input.onProgress } : {}),
478
587
  });
@@ -495,9 +604,33 @@ export async function runWikiGenerate(
495
604
  }
496
605
  progress(input, { phase: "generate", status: "completed", message: "wiki generator completed" });
497
606
 
498
- const workedPlan = readWikiPlanFile(staging.dir, resolved.plan) ?? resolved.plan;
607
+ const checkpoint = readWikiPlanFile(staging.dir) ?? resolved.plan;
608
+ // Replanning explicitly retires old planned publications. Other writer
609
+ // additions remain available, including pages linked by completed work.
610
+ for (const path of checkpoint.retiredPages ?? []) rmSync(join(staging.dir, path), { force: true });
611
+ // Capture citation evidence before assembly removes missing paths from
612
+ // routing metadata. Failed refreshes and no-op runs must retain it.
613
+ const citedSources = pageSourceIndex(staging.dir, cwd);
614
+ const currentContent = captureWikiSourceContent(cwd);
615
+ const workedPlan: WikiPlan = {
616
+ ...checkpoint,
617
+ sourceTreeHash,
618
+ sourceContent,
619
+ pages: checkpoint.pages.map((page) => {
620
+ const dependencies = [...new Set([...(page.dependencies ?? []), ...(citedSources.get(page.path) ?? [])])];
621
+ const stable = wikiSourcesMatch(sourceContent, currentContent, [...page.sources, ...dependencies]);
622
+ return {
623
+ ...page,
624
+ dependencies,
625
+ ...(page.status === "written" && !stable ? { status: "pending" as const, attempts: 0 } : {}),
626
+ };
627
+ }),
628
+ };
629
+ if (sourceGitHead) workedPlan.sourceGitHead = sourceGitHead;
630
+ else delete workedPlan.sourceGitHead;
499
631
  const report = assembleWikiTree({ dir: staging.dir, sourceRoot: cwd, plan: workedPlan });
500
632
  const finalPlan = reconcilePlan(workedPlan, staging.dir);
633
+ delete finalPlan.retiredPages;
501
634
  const pendingCount = finalPlan.pages.filter((page) => page.status !== "written").length;
502
635
  progress(input, {
503
636
  phase: "state",
@@ -509,9 +642,6 @@ export async function runWikiGenerate(
509
642
  (pendingCount > 0 ? `; ${pendingCount} page${pendingCount === 1 ? "" : "s"} still to write` : ""),
510
643
  });
511
644
 
512
- // The plan lives on in meta.json, so the staged working copy must not be
513
- // promoted into the wiki tree alongside the pages.
514
- rmSync(join(staging.dir, WIKI_PLAN_FILE), { force: true });
515
645
  const afterHash = computeWikiContentHashOfDir(staging.dir);
516
646
  const stagedPages = listWikiPagesInDir(staging.dir);
517
647
  // Unresolved references are reported, not fatal. They are repaired in the
@@ -519,25 +649,31 @@ export async function runWikiGenerate(
519
649
  // reach the operator and the next update run without costing this one.
520
650
  const problems = report.issues.map((issue) => `${issue.page} has an unresolved ${issue.kind}: ${issue.reference}`);
521
651
 
522
- const writeMeta = (): void => {
523
- writeWikiMeta(cwd, {
524
- version: 1,
525
- updatedAt: new Date().toISOString(),
526
- gitHead: currentWikiGitHead(cwd),
527
- sourceTreeHash,
528
- model: input.model,
529
- contentHash: afterHash,
530
- pages: stagedPages,
531
- generation: {
532
- requestedDepth: generation.requestedDepth,
533
- depth: generation.depth,
534
- sourceFiles: generation.sourceFiles,
535
- sourceLines: generation.sourceLines,
536
- pagesPlanned: finalPlan.pages.length,
537
- pagesWritten: finalPlan.pages.length - pendingCount,
538
- },
539
- plan: finalPlan,
540
- });
652
+ const unchanged = afterHash === beforeHash && existingMeta !== null;
653
+ const pendingPublishedPage = finalPlan.pages.some(
654
+ (page) => page.status !== "written" && stagedPages.some((available) => available.path === page.path),
655
+ );
656
+ const meta: WikiMeta = {
657
+ version: 1,
658
+ updatedAt: unchanged ? existingMeta.updatedAt : new Date().toISOString(),
659
+ gitHead: pendingPublishedPage ? (existingMeta?.gitHead ?? null) : currentWikiGitHead(cwd),
660
+ ...(pendingPublishedPage
661
+ ? existingMeta?.sourceTreeHash
662
+ ? { sourceTreeHash: existingMeta.sourceTreeHash }
663
+ : {}
664
+ : { sourceTreeHash }),
665
+ model: unchanged ? existingMeta.model : input.model,
666
+ contentHash: afterHash,
667
+ pages: stagedPages,
668
+ generation: {
669
+ requestedDepth: generation.requestedDepth,
670
+ depth: generation.depth,
671
+ sourceFiles: generation.sourceFiles,
672
+ sourceLines: generation.sourceLines,
673
+ pagesPlanned: finalPlan.pages.length,
674
+ pagesWritten: finalPlan.pages.length - pendingCount,
675
+ },
676
+ plan: finalPlan,
541
677
  };
542
678
 
543
679
  const done = (status: "generated" | "noop"): RunWikiGenerateResult => ({
@@ -552,22 +688,25 @@ export async function runWikiGenerate(
552
688
  // the assembled tree matches the live wiki byte for byte there is nothing
553
689
  // to swap, so metadata is refreshed in place.
554
690
  if (afterHash === beforeHash && computeWikiContentHash(cwd) === beforeHash && existingMeta) {
691
+ writeWikiMeta(cwd, meta);
692
+ rmSync(join(wikiDir(cwd), WIKI_PLAN_FILE), { force: true });
555
693
  removeDir(staging.dir);
556
- // Metadata is left exactly as it was. Rewriting it would churn
557
- // `updatedAt` and `model` on a run that changed nothing, which makes
558
- // every no-op look like a regeneration to anything reading the file.
559
694
  progress(input, {
560
695
  phase: "state",
561
696
  status: "completed",
562
- message: "wiki unchanged; metadata preserved",
697
+ message: "wiki unchanged; progress recorded",
563
698
  detail: wikiMetaPath(cwd),
564
699
  });
565
700
  progress(input, { phase: "done", status: "completed", message: "wiki unchanged" });
566
701
  return done("noop");
567
702
  }
568
703
 
704
+ // Keep the checkpoint until the complete publication is prepared. A crash
705
+ // during either rename can then recover the last good content/metadata pair.
706
+ writeWikiPlanFile(staging.dir, finalPlan);
707
+ writeWikiMetaInDir(staging.dir, meta);
569
708
  progress(input, { phase: "state", status: "running", message: "promoting wiki" });
570
- const promoted = promoteStaging(cwd, staging.dir, writeMeta);
709
+ const promoted = promoteStaging(cwd, staging.dir);
571
710
  if (!promoted.ok) {
572
711
  progress(input, {
573
712
  phase: "done",
@@ -577,6 +716,7 @@ export async function runWikiGenerate(
577
716
  });
578
717
  return failed(promoted.problems, listWikiPagesInDir(wikiDir(cwd)).length);
579
718
  }
719
+ rmSync(join(wikiDir(cwd), WIKI_PLAN_FILE), { force: true });
580
720
  progress(input, { phase: "state", status: "completed", message: "wiki metadata written" });
581
721
  progress(input, {
582
722
  phase: "done",
@@ -168,7 +168,11 @@ export function isWikiMeta(value: unknown): value is WikiMeta {
168
168
  }
169
169
 
170
170
  export function readWikiMeta(cwd: string): WikiMeta | null {
171
- const filePath = wikiMetaPath(cwd);
171
+ return readWikiMetaInDir(wikiDir(cwd));
172
+ }
173
+
174
+ export function readWikiMetaInDir(dir: string): WikiMeta | null {
175
+ const filePath = join(dir, "meta.json");
172
176
  if (!existsSync(filePath)) return null;
173
177
  let parsed: unknown;
174
178
  try {
@@ -181,6 +185,10 @@ export function readWikiMeta(cwd: string): WikiMeta | null {
181
185
  }
182
186
 
183
187
  export function writeWikiMeta(cwd: string, meta: WikiMeta): void {
188
+ writeWikiMetaInDir(wikiDir(cwd), meta);
189
+ }
190
+
191
+ export function writeWikiMetaInDir(dir: string, meta: WikiMeta): void {
184
192
  const normalized: WikiMeta = {
185
193
  version: 1,
186
194
  updatedAt: meta.updatedAt,
@@ -192,7 +200,7 @@ export function writeWikiMeta(cwd: string, meta: WikiMeta): void {
192
200
  ...(meta.generation !== undefined ? { generation: { ...meta.generation } } : {}),
193
201
  ...(meta.plan !== undefined ? { plan: meta.plan } : {}),
194
202
  };
195
- safeResourceWrite(wikiMetaPath(cwd), `${JSON.stringify(normalized)}\n`, { encoding: "utf8" });
203
+ safeResourceWrite(join(dir, "meta.json"), `${JSON.stringify(normalized)}\n`, { encoding: "utf8" });
196
204
  }
197
205
 
198
206
  /**
@@ -13,7 +13,8 @@ import { existsSync, readFileSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { safeResourceWrite } from "../../../core/safe-resource-write.js";
15
15
  import { isGeneratedWikiFile, WIKI_PLAN_FILE } from "./layout.js";
16
- import type { WikiPageStatus, WikiPlan, WikiPlanPage } from "./plan.js";
16
+ import type { WikiPageFailure, WikiPageStatus, WikiPlan, WikiPlanPage } from "./plan.js";
17
+ import { parseWikiSourceContent } from "./source-content.js";
17
18
 
18
19
  /** Dispatches one page may receive across all runs before it is left alone. */
19
20
  export const MAX_PAGE_ATTEMPTS = 3;
@@ -75,6 +76,16 @@ function parsedAttempts(value: unknown): number | null {
75
76
  return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
76
77
  }
77
78
 
79
+ function parsedFailure(value: unknown): WikiPageFailure | undefined {
80
+ if (!isRecord(value)) return undefined;
81
+ const phase = value.phase;
82
+ if (phase !== "admission" && phase !== "writer" && phase !== "validation") return undefined;
83
+ const detail = usableString(value.detail)?.replace(/\s+/gu, " ").slice(0, 500);
84
+ if (!detail) return undefined;
85
+ const runId = usableString(value.runId)?.slice(0, 120);
86
+ return { phase, detail, ...(runId ? { runId } : {}) };
87
+ }
88
+
78
89
  export interface SanitizeWikiPlanOptions {
79
90
  /**
80
91
  * Whether the recorded progress in this document may be believed.
@@ -90,7 +101,7 @@ export interface SanitizeWikiPlanOptions {
90
101
 
91
102
  /**
92
103
  * Parse a plan, preferring harness-owned progress from `previous` for any page
93
- * whose path survived. Returns null when nothing usable is left, so the caller
104
+ * whose path and specification survived. Returns null when nothing usable is left, so the caller
94
105
  * falls back to the candidate plan.
95
106
  */
96
107
  export function sanitizeWikiPlan(
@@ -107,22 +118,65 @@ export function sanitizeWikiPlan(
107
118
  if (!isRecord(entry)) continue;
108
119
  const path = sanitizePagePath(entry.path);
109
120
  if (path === null || seen.has(path)) continue;
110
- const intent = usableString(entry.intent);
121
+ const intent = (usableString(entry.intent) ?? "").slice(0, MAX_INTENT_CHARS);
122
+ const title = usableString(entry.title) ?? path.replace(/\.md$/, "");
123
+ const sources = stringList(entry.sources, 16);
111
124
  const prior = priorByPath.get(path);
125
+ const changedSpec =
126
+ prior !== undefined &&
127
+ (prior.title !== title ||
128
+ prior.intent !== intent ||
129
+ JSON.stringify([...prior.sources].sort()) !== JSON.stringify([...sources].sort()));
112
130
  const recorded = options.trustStatus ? parsedStatus(entry.status) : null;
113
131
  const recordedAttempts = options.trustStatus ? parsedAttempts(entry.attempts) : null;
132
+ const lastFailure = prior?.lastFailure ?? (options.trustStatus ? parsedFailure(entry.lastFailure) : undefined);
133
+ const dependencies =
134
+ prior?.dependencies ?? (options.trustStatus ? stringList(entry.dependencies, Number.POSITIVE_INFINITY) : []);
114
135
  seen.add(path);
115
136
  pages.push({
116
137
  path,
117
- title: usableString(entry.title) ?? path.replace(/\.md$/, ""),
118
- intent: intent === null ? "" : intent.slice(0, MAX_INTENT_CHARS),
119
- sources: stringList(entry.sources, 16),
120
- status: prior?.status ?? recorded ?? "pending",
121
- attempts: prior?.attempts ?? recordedAttempts ?? 0,
138
+ title,
139
+ intent,
140
+ sources,
141
+ ...(dependencies.length > 0 ? { dependencies } : {}),
142
+ status: changedSpec ? "pending" : (prior?.status ?? recorded ?? "pending"),
143
+ attempts: changedSpec ? 0 : (prior?.attempts ?? recordedAttempts ?? 0),
144
+ ...(!changedSpec && (prior?.status ?? recorded) !== "written" && lastFailure ? { lastFailure } : {}),
122
145
  });
123
146
  }
124
147
  if (pages.length === 0) return null;
125
- return { version: 1, overview: usableString(value.overview) ?? previous?.overview ?? "", pages };
148
+ const retiredPages = [
149
+ ...new Set([
150
+ ...(previous?.retiredPages ?? (options.trustStatus ? stringList(value.retiredPages, MAX_PLAN_PAGES) : [])),
151
+ ...(previous?.pages.filter((page) => !seen.has(page.path)).map((page) => page.path) ?? []),
152
+ ]),
153
+ ]
154
+ .map(sanitizePagePath)
155
+ .filter((path): path is string => path !== null && !seen.has(path));
156
+ const sourceContent =
157
+ previous?.sourceContent ?? (options.trustStatus ? parseWikiSourceContent(value.sourceContent) : undefined);
158
+ const sourceTreeHash = previous?.sourceTreeHash ?? (options.trustStatus ? value.sourceTreeHash : undefined);
159
+ const sourceGitHead = previous?.sourceGitHead ?? (options.trustStatus ? value.sourceGitHead : undefined);
160
+ const depth = previous?.depth ?? (options.trustStatus ? value.depth : undefined);
161
+ const requestedDepth = previous?.requestedDepth ?? (options.trustStatus ? value.requestedDepth : undefined);
162
+ return {
163
+ version: 1,
164
+ ...(depth === "simple" || depth === "medium" || depth === "detailed" ? { depth } : {}),
165
+ ...(requestedDepth === "auto" ||
166
+ requestedDepth === "simple" ||
167
+ requestedDepth === "medium" ||
168
+ requestedDepth === "detailed"
169
+ ? { requestedDepth }
170
+ : {}),
171
+ ...(sourceContent ? { sourceContent } : {}),
172
+ ...(retiredPages.length ? { retiredPages } : {}),
173
+ ...(typeof sourceTreeHash === "string" && /^[a-f0-9]{64}$/.test(sourceTreeHash) ? { sourceTreeHash } : {}),
174
+ ...(typeof sourceGitHead === "string" && /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(sourceGitHead)
175
+ ? { sourceGitHead }
176
+ : {}),
177
+ overview: usableString(value.overview) ?? previous?.overview ?? "",
178
+ pages,
179
+ };
126
180
  }
127
181
 
128
182
  function readPlanDocument(dir: string): unknown {
@@ -174,7 +228,8 @@ export function unclaimedCandidates(
174
228
  const knownPaths = new Set(plan.pages.map((page) => page.path));
175
229
  const claimed = new Set<string>();
176
230
  for (const page of plan.pages) {
177
- for (const source of [...page.sources, ...(pageSources.get(page.path) ?? [])]) claimed.add(source);
231
+ for (const source of [...page.sources, ...(page.dependencies ?? []), ...(pageSources.get(page.path) ?? [])])
232
+ claimed.add(source);
178
233
  }
179
234
  return candidate.pages.filter(
180
235
  (page) => !knownPaths.has(page.path) && !page.sources.some((source) => claimed.has(source)),
@@ -201,8 +256,9 @@ export interface ScopeUpdateInput {
201
256
  export function scopePlanForUpdate(input: ScopeUpdateInput): WikiPlan {
202
257
  const changedPrefixes = [...input.changedPaths];
203
258
  const pages = input.plan.pages.map((page): WikiPlanPage => {
259
+ if (page.status !== "written") return page;
204
260
  if (!input.existingPages.has(page.path)) return { ...page, status: "pending", attempts: 0 };
205
- const claimed = [...(input.pageSources.get(page.path) ?? []), ...page.sources];
261
+ const claimed = [...(input.pageSources.get(page.path) ?? []), ...page.sources, ...(page.dependencies ?? [])];
206
262
  const touched = claimed.some((source) =>
207
263
  changedPrefixes.some((changed) => changed === source || changed.startsWith(`${source}/`)),
208
264
  );
@@ -211,7 +267,7 @@ export function scopePlanForUpdate(input: ScopeUpdateInput): WikiPlan {
211
267
  return { ...input.plan, pages };
212
268
  }
213
269
 
214
- /** Pages this run still owes, in plan order, excluding ones already exhausted. */
215
- export function pendingPages(plan: WikiPlan): WikiPlanPage[] {
216
- return plan.pages.filter((page) => page.status !== "written" && page.attempts < MAX_PAGE_ATTEMPTS);
270
+ /** An explicit operator retry includes exhausted pages without erasing their attempt history. */
271
+ export function pendingPages(plan: WikiPlan, retryExhausted = false): WikiPlanPage[] {
272
+ return plan.pages.filter((page) => page.status !== "written" && (retryExhausted || page.attempts < MAX_PAGE_ATTEMPTS));
217
273
  }