@maycombhq/atticus 2.0.0-beta.27.1 → 2.0.0-beta.28

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 (278) hide show
  1. package/dist/bin.js +3 -3
  2. package/dist/{chunk-N5DLB74D.js → chunk-22MCNFEB.js} +4 -4
  3. package/dist/{chunk-C5DY4R7R.js → chunk-25GG2NAU.js} +2 -2
  4. package/dist/{chunk-YAPVAYZN.js → chunk-2C3KACPH.js} +3 -3
  5. package/dist/{chunk-NNURP7VO.js → chunk-2D5YPHEF.js} +11 -11
  6. package/dist/{chunk-3CMGSQIA.js → chunk-2E3TK22H.js} +2 -2
  7. package/dist/{chunk-GZSOZYEP.js → chunk-2E725C6E.js} +2 -2
  8. package/dist/{chunk-AOQG37K4.js → chunk-2FJ2GBMY.js} +8 -2
  9. package/dist/{chunk-JF2HM2IF.js → chunk-2GP3OTVG.js} +3 -3
  10. package/dist/{chunk-QLT3WYTD.js → chunk-2Q5TFDLI.js} +3 -3
  11. package/dist/{chunk-JGR4X2UA.js → chunk-2YB35HY6.js} +19 -19
  12. package/dist/{chunk-7LOXUBRB.js → chunk-2Z2CIBGD.js} +11 -11
  13. package/dist/{chunk-ZNZYMUBK.js → chunk-32KKFIIP.js} +23 -23
  14. package/dist/{chunk-TPKDYSHO.js → chunk-3AZEQIXD.js} +9 -9
  15. package/dist/{chunk-MNOZDE6W.js → chunk-3BOKR3RU.js} +10 -10
  16. package/dist/chunk-3MKQXZWB.js +67 -0
  17. package/dist/{chunk-JRXFZB6J.js → chunk-3MXX45EF.js} +3 -3
  18. package/dist/{chunk-MA44TMTL.js → chunk-3STTGZFW.js} +1 -1
  19. package/dist/{chunk-P7H5WZH6.js → chunk-3URSPNDW.js} +6 -6
  20. package/dist/{chunk-6ESJWPR3.js → chunk-3YR2EYJP.js} +4 -4
  21. package/dist/{chunk-WNPGLGCJ.js → chunk-42CRNKOT.js} +1 -1
  22. package/dist/{chunk-2WPUSHB6.js → chunk-43DFUZ5J.js} +9 -9
  23. package/dist/{chunk-DDRTAEFZ.js → chunk-4BIG3Y3L.js} +7 -7
  24. package/dist/{chunk-PPKH6ULR.js → chunk-4EBXR37M.js} +1 -1
  25. package/dist/{chunk-SRIU7L4Z.js → chunk-4GR77BYQ.js} +11 -11
  26. package/dist/{chunk-66CMRGI2.js → chunk-4OITEXVX.js} +18 -18
  27. package/dist/{chunk-UGJSKAZ2.js → chunk-4PYY4TMT.js} +3 -3
  28. package/dist/{chunk-LH52QGNY.js → chunk-4QCR6HE3.js} +7 -7
  29. package/dist/{chunk-DNKYWTVZ.js → chunk-5DTLTADG.js} +14 -14
  30. package/dist/{chunk-INCFIDCB.js → chunk-5KRMFM3P.js} +1 -1
  31. package/dist/{chunk-O5BUMSB3.js → chunk-5PWXWUW3.js} +6 -6
  32. package/dist/{chunk-AQLDQK2M.js → chunk-5RCX7YFH.js} +3 -3
  33. package/dist/{chunk-7BOGXFZ3.js → chunk-5U4KA353.js} +7 -7
  34. package/dist/{chunk-MP7W6OKP.js → chunk-65VII57C.js} +12 -12
  35. package/dist/{chunk-EFDUC35B.js → chunk-665VDAU4.js} +2 -2
  36. package/dist/{chunk-3NGHSBVS.js → chunk-6D7HF6V4.js} +21 -21
  37. package/dist/{chunk-R7VX5BSP.js → chunk-6J4PQWNI.js} +12 -12
  38. package/dist/{chunk-MUXYUIBV.js → chunk-6LGI3LIF.js} +3 -3
  39. package/dist/{chunk-ZQZRNVNS.js → chunk-6LIHNYLJ.js} +20 -20
  40. package/dist/{chunk-UMIZYX3U.js → chunk-6RKZYQTL.js} +12 -12
  41. package/dist/chunk-6WIYOGDU.js +23 -0
  42. package/dist/{chunk-ZIAMPN7N.js → chunk-72FLXGSN.js} +3 -3
  43. package/dist/{chunk-USYDJY63.js → chunk-7CBLSYKC.js} +12 -12
  44. package/dist/{chunk-6DHGNY3O.js → chunk-7DMQXEKN.js} +12 -12
  45. package/dist/chunk-7GBVL7JC.js +51 -0
  46. package/dist/{chunk-FVT6LUOC.js → chunk-7IEQFI4L.js} +4 -4
  47. package/dist/{chunk-LAPVW2F6.js → chunk-7NU54VAT.js} +3 -3
  48. package/dist/{chunk-PVJZR4JB.js → chunk-7O22X554.js} +372 -37
  49. package/dist/{chunk-5CIW5RMP.js → chunk-7RBQP7PY.js} +3 -3
  50. package/dist/{chunk-VSED7FYC.js → chunk-7SJ7D6Q7.js} +4 -4
  51. package/dist/{chunk-XKWPEY4B.js → chunk-7SVS7PBB.js} +10 -10
  52. package/dist/{chunk-6MSACVCY.js → chunk-7T73PJED.js} +17 -17
  53. package/dist/{chunk-LCQIRCOT.js → chunk-A2PNCDY2.js} +5 -5
  54. package/dist/{chunk-ELZGWEK4.js → chunk-A5IJVTLL.js} +4 -4
  55. package/dist/{chunk-QXXEOH3A.js → chunk-ABY7IKHT.js} +3 -3
  56. package/dist/{chunk-MSNEGKI3.js → chunk-AGTB5CRY.js} +13 -11
  57. package/dist/{chunk-X5B7KYPD.js → chunk-AIM4ER32.js} +1 -1
  58. package/dist/{chunk-CLM5Z3R5.js → chunk-AKC5NKH6.js} +4 -4
  59. package/dist/{chunk-HNU4AQXB.js → chunk-AKMOH4JL.js} +17 -17
  60. package/dist/{chunk-OBQL7GX4.js → chunk-APVNK4WC.js} +23 -23
  61. package/dist/{chunk-5YX7MJWW.js → chunk-AQOFIHBO.js} +20 -20
  62. package/dist/{chunk-6OTGCKYH.js → chunk-AT7JJQGK.js} +6 -6
  63. package/dist/{chunk-2J2GMERV.js → chunk-ATMILKLM.js} +12 -12
  64. package/dist/{chunk-VVLWEM2Y.js → chunk-AWICXXAC.js} +4 -4
  65. package/dist/{chunk-QU3ENIJV.js → chunk-AY7Z2MFH.js} +22 -22
  66. package/dist/{chunk-PGAXZLNF.js → chunk-B23Z4Y25.js} +9 -9
  67. package/dist/{chunk-AHAEHBH5.js → chunk-B6N2QL5F.js} +7 -7
  68. package/dist/{chunk-YRHKEXTP.js → chunk-BCMXPM2J.js} +7 -7
  69. package/dist/{chunk-L4WFMAHI.js → chunk-BEDHU324.js} +11 -11
  70. package/dist/{chunk-QNXMVJMA.js → chunk-BJZ5BPJU.js} +4 -4
  71. package/dist/{chunk-FT55WYNB.js → chunk-BKHDWJYK.js} +18 -18
  72. package/dist/{chunk-3M3MDBOG.js → chunk-BPWOKVPJ.js} +1 -1
  73. package/dist/{chunk-3YL2GZZH.js → chunk-BULKZIYH.js} +20 -20
  74. package/dist/{chunk-4NPWOUI2.js → chunk-CBYJQD7C.js} +2 -2
  75. package/dist/{chunk-OUALZ5RA.js → chunk-CLH4QLIH.js} +1 -1
  76. package/dist/{chunk-W6OY2PMB.js → chunk-CP4KZA33.js} +6 -6
  77. package/dist/{chunk-V6BP4XHZ.js → chunk-CSP2VZQ2.js} +20 -20
  78. package/dist/{chunk-ORGB6645.js → chunk-CX7WKIUV.js} +12 -12
  79. package/dist/{chunk-4FLIW5PJ.js → chunk-CXGGT3LX.js} +1 -1
  80. package/dist/{chunk-Y6S7VCYN.js → chunk-CYPQ3PBB.js} +3 -3
  81. package/dist/{chunk-XZY4GTCX.js → chunk-D6GPG32H.js} +2 -2
  82. package/dist/{chunk-DTW37FJ6.js → chunk-D6WUJFQH.js} +12 -12
  83. package/dist/{chunk-UXETN43F.js → chunk-DEQGTRMM.js} +5 -5
  84. package/dist/{chunk-VWCNMDMZ.js → chunk-DJLVEPNP.js} +2 -2
  85. package/dist/{chunk-JD3QDLM2.js → chunk-DR2NZ2O6.js} +24 -24
  86. package/dist/{chunk-KOITA526.js → chunk-DSLVJKCF.js} +19 -19
  87. package/dist/{chunk-OOZKLLW7.js → chunk-DXSZXPFF.js} +23 -23
  88. package/dist/{chunk-GEHB2LMA.js → chunk-E2V7Z5PS.js} +26 -26
  89. package/dist/{chunk-YTPND655.js → chunk-E4AUZ5AC.js} +14 -14
  90. package/dist/{chunk-CPB4XMFI.js → chunk-E7O2WMDW.js} +5 -5
  91. package/dist/{chunk-DNDIT3LD.js → chunk-EC6YA766.js} +5 -5
  92. package/dist/{chunk-2AIOOA3U.js → chunk-EGHG6K65.js} +4 -4
  93. package/dist/{chunk-W5UMEIYG.js → chunk-ESOOGVOM.js} +17 -17
  94. package/dist/{chunk-ZT6GPGZ4.js → chunk-EVWTVCFN.js} +34 -34
  95. package/dist/{chunk-XRTECHVH.js → chunk-EXGL7CWI.js} +6 -6
  96. package/dist/{chunk-IPSZDVLI.js → chunk-FEJPEDDX.js} +4 -4
  97. package/dist/{chunk-BUBKKEUV.js → chunk-FHTOS6DU.js} +2 -2
  98. package/dist/{chunk-LP6BFBE5.js → chunk-FIYGZJF6.js} +4 -4
  99. package/dist/{chunk-NNRQZUVW.js → chunk-FJ6YX4K2.js} +22 -22
  100. package/dist/{chunk-I57IH5X6.js → chunk-FRSDREKQ.js} +1 -1
  101. package/dist/{chunk-LKLB5IJ7.js → chunk-FUKL7PUS.js} +4 -4
  102. package/dist/{chunk-U36V664P.js → chunk-G4USCLYQ.js} +87 -42
  103. package/dist/{chunk-5KR2DHDW.js → chunk-G5CXRFI5.js} +14 -14
  104. package/dist/{chunk-MBIJNU3D.js → chunk-G5ZQLW5K.js} +500 -369
  105. package/dist/{chunk-OILAH2C7.js → chunk-GAACSJWG.js} +17 -17
  106. package/dist/{chunk-44XGOSUU.js → chunk-GCT6HBIU.js} +4 -4
  107. package/dist/{chunk-CHS5BJ34.js → chunk-GGCRLU4L.js} +3 -3
  108. package/dist/{chunk-S6TLXRBR.js → chunk-GNY4LOHN.js} +3 -3
  109. package/dist/{chunk-VTQ55N4O.js → chunk-GOB2TYE5.js} +14 -14
  110. package/dist/{chunk-UDM7LXNJ.js → chunk-H4JC4U44.js} +3 -3
  111. package/dist/{chunk-I4P72R2F.js → chunk-H7BHL2KV.js} +21 -21
  112. package/dist/{chunk-J4L64TUA.js → chunk-HBBMRFSQ.js} +25 -25
  113. package/dist/{chunk-RDFRB26Z.js → chunk-HBRMXFMC.js} +3 -3
  114. package/dist/chunk-HBWRKIJI.js +68 -0
  115. package/dist/{chunk-OUGTAOGA.js → chunk-HE4O7PLD.js} +1 -1
  116. package/dist/{chunk-HOEZQRZU.js → chunk-HPKQIRQR.js} +5 -5
  117. package/dist/{chunk-XIIT4PVT.js → chunk-HQG5AGT2.js} +2 -2
  118. package/dist/{chunk-O6UC7ASJ.js → chunk-HWXEPWHW.js} +5 -5
  119. package/dist/{chunk-L3KSU4QU.js → chunk-HZ65CLTT.js} +8 -8
  120. package/dist/{chunk-FZ2K3IXP.js → chunk-HZPHNRHV.js} +23 -23
  121. package/dist/{chunk-SFCFL7Y5.js → chunk-I3ZJTM2T.js} +3 -1
  122. package/dist/{chunk-FADIWOA5.js → chunk-IEGOFWZC.js} +2 -2
  123. package/dist/{chunk-4BK5EJ2C.js → chunk-IQYR73ED.js} +6 -6
  124. package/dist/{chunk-DS2OZXBN.js → chunk-J3G3YZSE.js} +17 -17
  125. package/dist/{chunk-W4SWXJZQ.js → chunk-J5AJRTID.js} +14 -14
  126. package/dist/{chunk-QK3UFHFC.js → chunk-JCZSY5ZC.js} +1 -1
  127. package/dist/{chunk-2ANBMA74.js → chunk-JMU2NZ4W.js} +2 -2
  128. package/dist/{chunk-HDWVR5KD.js → chunk-JNAJH2KI.js} +1 -1
  129. package/dist/{chunk-DVQCYF3V.js → chunk-JQARUMXI.js} +2 -2
  130. package/dist/{chunk-Z245SJ64.js → chunk-JS2QR752.js} +20 -20
  131. package/dist/{chunk-D566V3T3.js → chunk-JTTTC5AI.js} +11 -11
  132. package/dist/{chunk-3PN7KJBA.js → chunk-JUY5VPJL.js} +19 -19
  133. package/dist/{chunk-JA7AUBHU.js → chunk-JZ5UJ5AM.js} +19 -19
  134. package/dist/{chunk-5GCCG3GJ.js → chunk-KIRQVVEQ.js} +2 -2
  135. package/dist/{chunk-SF3HXNXR.js → chunk-KLTHX4MU.js} +3 -3
  136. package/dist/{chunk-7GZ46N4V.js → chunk-KNHV3DEJ.js} +14 -14
  137. package/dist/{chunk-6GX3OFEZ.js → chunk-KOTDH7M2.js} +5 -5
  138. package/dist/{chunk-FBNJZ3VH.js → chunk-KS3XFDGF.js} +2 -2
  139. package/dist/{chunk-XRNMQZFC.js → chunk-L72673XW.js} +8 -8
  140. package/dist/{chunk-SKVLJL2E.js → chunk-LBLYKXFO.js} +23 -23
  141. package/dist/{chunk-LCWC6NDE.js → chunk-LD35W2PC.js} +3 -3
  142. package/dist/{chunk-TM2WY65Q.js → chunk-LD5YRRZW.js} +20 -20
  143. package/dist/{chunk-MA73J3E6.js → chunk-LDHTS4DI.js} +10 -10
  144. package/dist/{chunk-EHXEJFHD.js → chunk-LHSKJEIP.js} +2 -2
  145. package/dist/{chunk-SSYD4XIW.js → chunk-LQM2YZUX.js} +15 -15
  146. package/dist/{chunk-QPAANKUR.js → chunk-LSRKXZI4.js} +4 -4
  147. package/dist/{chunk-TRSNIJNM.js → chunk-LWCWGLLZ.js} +3 -3
  148. package/dist/{chunk-2FORECYK.js → chunk-LWUWPGQV.js} +6 -6
  149. package/dist/{chunk-VGXE7XFO.js → chunk-M4XMRGH3.js} +14 -14
  150. package/dist/{chunk-6VFR3DYS.js → chunk-M5RJE72K.js} +8 -8
  151. package/dist/{chunk-NK6JCNJX.js → chunk-M76MYSFZ.js} +16 -16
  152. package/dist/{chunk-6TXB2WR6.js → chunk-M7H7U62C.js} +4 -4
  153. package/dist/{chunk-BSGOUHL6.js → chunk-MBBWY2MA.js} +12 -12
  154. package/dist/{chunk-5YEUAZZE.js → chunk-MM2SZYPS.js} +4 -4
  155. package/dist/{chunk-3BQDBTQJ.js → chunk-MO6D2ZO6.js} +8 -8
  156. package/dist/{chunk-JOG5O2ZH.js → chunk-MUTSQOQ7.js} +11 -11
  157. package/dist/{chunk-GBJRFFDW.js → chunk-MVZYCDIX.js} +1 -1
  158. package/dist/{chunk-TMMGQBLO.js → chunk-MWEJAEX5.js} +15 -15
  159. package/dist/{chunk-3PBIZBWN.js → chunk-MZ2ITC2C.js} +1 -1
  160. package/dist/{chunk-HBHPOKL2.js → chunk-MZ7LTRE4.js} +4 -4
  161. package/dist/{chunk-AXJCABA5.js → chunk-N2IVTVXW.js} +5 -5
  162. package/dist/{chunk-YIGSUTW2.js → chunk-N5IGQQM4.js} +3 -3
  163. package/dist/{chunk-LTVOQJKT.js → chunk-NC6ET2OI.js} +3 -3
  164. package/dist/{chunk-S5O57P5P.js → chunk-NNRU2B3U.js} +13 -13
  165. package/dist/{chunk-NJ5IEZIG.js → chunk-NQFBTZWW.js} +7 -7
  166. package/dist/{chunk-TFN2N227.js → chunk-NT4SCIRT.js} +3 -3
  167. package/dist/{chunk-LQEMCF43.js → chunk-NTWOEULN.js} +12 -12
  168. package/dist/{chunk-NWAMUD7B.js → chunk-NWZPMZUR.js} +22 -22
  169. package/dist/{chunk-7HUCEHUK.js → chunk-O77FAGKZ.js} +12 -12
  170. package/dist/chunk-ODCC5CRP.js +62 -0
  171. package/dist/{chunk-YBAJ5SAR.js → chunk-OFHPXH3N.js} +4 -4
  172. package/dist/{chunk-OY2VC2IU.js → chunk-OHAMT5OA.js} +21 -21
  173. package/dist/{chunk-D3L5SO27.js → chunk-OJ7KHS4P.js} +2 -2
  174. package/dist/{chunk-I2NGDERG.js → chunk-OJE4JK45.js} +12 -12
  175. package/dist/{chunk-AZBP5DTU.js → chunk-OMGEHUXV.js} +9 -9
  176. package/dist/chunk-ON2W7SWK.js +60 -0
  177. package/dist/{chunk-VX5CORDG.js → chunk-OU35MAMV.js} +19 -19
  178. package/dist/{chunk-GF6GBHFN.js → chunk-OUVEXAM2.js} +7 -7
  179. package/dist/{chunk-G33UIUG3.js → chunk-OXDMFJHR.js} +2 -2
  180. package/dist/{chunk-W7NNZFIL.js → chunk-OZN3KT74.js} +15 -15
  181. package/dist/{chunk-RX2SMQV3.js → chunk-P37XFTBW.js} +14 -14
  182. package/dist/{chunk-JWIAVNEC.js → chunk-P6WPQQ5K.js} +15 -15
  183. package/dist/{chunk-KMBI6IQD.js → chunk-PEIGHDVC.js} +4 -4
  184. package/dist/{chunk-523NRKHF.js → chunk-PHXTGKLG.js} +2 -2
  185. package/dist/{chunk-Z5CIRZNO.js → chunk-PI5G43TD.js} +42 -42
  186. package/dist/{chunk-APYIIVBH.js → chunk-PKQJANRL.js} +31 -31
  187. package/dist/{chunk-Q7YDUGVZ.js → chunk-PL4EFATK.js} +1 -1
  188. package/dist/{chunk-CWKQRP6Y.js → chunk-PNU5SNYP.js} +23 -23
  189. package/dist/{chunk-QUFZDWPC.js → chunk-PTFOD2OZ.js} +4 -4
  190. package/dist/{chunk-R6KZWNZM.js → chunk-PUORKWTG.js} +27 -27
  191. package/dist/{chunk-UDM6HGF4.js → chunk-PXUNPXAB.js} +4 -4
  192. package/dist/{chunk-U4K34CXK.js → chunk-PZY4M3AZ.js} +16 -16
  193. package/dist/{chunk-5ZFLP2IK.js → chunk-Q2KK7SXF.js} +3 -3
  194. package/dist/{chunk-HUMM4S5I.js → chunk-QAKAUMAK.js} +3 -3
  195. package/dist/{chunk-WPZCSFND.js → chunk-QEODQXAV.js} +16 -16
  196. package/dist/{chunk-QQUAEM3U.js → chunk-QIUQHNEC.js} +22 -22
  197. package/dist/{chunk-TMETWJFO.js → chunk-QKDVSKSI.js} +7 -7
  198. package/dist/{chunk-PCIENCB7.js → chunk-QYK2G2YA.js} +12 -12
  199. package/dist/{chunk-6H62UHY5.js → chunk-QZIXAFV2.js} +109 -15
  200. package/dist/{chunk-QXSYFB5L.js → chunk-R3BSM6HV.js} +3 -3
  201. package/dist/{chunk-GZILYRGC.js → chunk-R5X4CNVG.js} +2 -2
  202. package/dist/{chunk-RZEYZOLW.js → chunk-RA5Y7WI7.js} +12 -12
  203. package/dist/{chunk-WTLFRINF.js → chunk-RGL7ZSJ7.js} +32 -32
  204. package/dist/{chunk-5PAIR73N.js → chunk-RIXLWV3X.js} +22 -22
  205. package/dist/{chunk-YHS7TSQS.js → chunk-RKDZ2LAO.js} +4 -4
  206. package/dist/{chunk-R7NPDUBL.js → chunk-RLGDSUJM.js} +12 -12
  207. package/dist/{chunk-RTHQIGGY.js → chunk-RUCNERM2.js} +23 -23
  208. package/dist/{chunk-RZYRUXSU.js → chunk-RV32IY7X.js} +1 -1
  209. package/dist/{chunk-BV7WB32T.js → chunk-RXCYV2QS.js} +22 -22
  210. package/dist/{chunk-HPCGQAYH.js → chunk-SFWTGHHU.js} +14 -14
  211. package/dist/{chunk-IDFUGYTS.js → chunk-SG4PMGZS.js} +12 -12
  212. package/dist/{chunk-AKZTCZ6F.js → chunk-SGFFO45X.js} +1 -1
  213. package/dist/{chunk-KZ5G3KEN.js → chunk-STJYW2X2.js} +3 -3
  214. package/dist/{chunk-YPXBGNUV.js → chunk-SU2JHMIS.js} +17 -17
  215. package/dist/{chunk-3PG6QOQF.js → chunk-T62FEOSG.js} +8 -8
  216. package/dist/{chunk-TQISA4VW.js → chunk-T7FFW2NN.js} +19 -19
  217. package/dist/{chunk-WJWSB65O.js → chunk-T7QW62TW.js} +204 -10
  218. package/dist/{chunk-WNRIL6JQ.js → chunk-TCHA7MWY.js} +12 -12
  219. package/dist/{chunk-IPMPLTEG.js → chunk-TCYVFE6T.js} +2 -2
  220. package/dist/{chunk-7SO6CGJH.js → chunk-TEESLG4C.js} +8 -8
  221. package/dist/{chunk-OY6H7JX6.js → chunk-TIQMGQPM.js} +3 -3
  222. package/dist/chunk-TQP6HR52.js +43 -0
  223. package/dist/{chunk-FYRBBFIF.js → chunk-TUYZSEKB.js} +4 -4
  224. package/dist/{chunk-4UVTNHA6.js → chunk-TYC6ILJ5.js} +1 -1
  225. package/dist/chunk-U25OIWWE.js +55 -0
  226. package/dist/{chunk-4HMOOBIR.js → chunk-U3SLTDOW.js} +10 -10
  227. package/dist/{chunk-ZW3OEHLT.js → chunk-UMP3TCNX.js} +25 -25
  228. package/dist/{chunk-OUDGBJC2.js → chunk-UZ45RC2L.js} +3 -3
  229. package/dist/{chunk-NWQ76YQ5.js → chunk-V44VIUP2.js} +16 -16
  230. package/dist/{chunk-SJ2Z3AWF.js → chunk-VEI22AS7.js} +2 -2
  231. package/dist/{chunk-M25UUEKC.js → chunk-VKBJ4JDV.js} +21 -21
  232. package/dist/{chunk-I5X4WU7U.js → chunk-VMNBSQIV.js} +2 -2
  233. package/dist/{chunk-TOSHT6NJ.js → chunk-VQKBO73Y.js} +6 -6
  234. package/dist/{chunk-DX7WEXYG.js → chunk-VQX2XXTI.js} +13 -13
  235. package/dist/{chunk-DGNTEKF6.js → chunk-VTE3MIWY.js} +119 -119
  236. package/dist/{chunk-YZUOOTC3.js → chunk-VX5WA6M2.js} +22 -22
  237. package/dist/{chunk-5A4FHGTI.js → chunk-W66GLVBI.js} +15 -15
  238. package/dist/{chunk-2MRYL45Z.js → chunk-W7U3NIUF.js} +102 -10
  239. package/dist/{chunk-CWJDZ5VP.js → chunk-WAEYJ6XE.js} +5 -5
  240. package/dist/{chunk-ELJ5Q4J2.js → chunk-WX2EYZTA.js} +2 -2
  241. package/dist/{chunk-FBG3QHOL.js → chunk-WZPPCEAK.js} +8 -8
  242. package/dist/{chunk-TUMHMISE.js → chunk-X3JAILX6.js} +18 -18
  243. package/dist/{chunk-V7DGFWDB.js → chunk-X4HPOZCJ.js} +22 -22
  244. package/dist/{chunk-J3ZUKQLV.js → chunk-XGOLAZSH.js} +4 -4
  245. package/dist/{chunk-3XNE6XXF.js → chunk-XLONNKSI.js} +4 -4
  246. package/dist/{chunk-ZOAX7W5S.js → chunk-XNZCTQ5C.js} +8 -8
  247. package/dist/{chunk-TLSL7OII.js → chunk-XPE3V7ZN.js} +7 -7
  248. package/dist/{chunk-B4WPO6FX.js → chunk-XSLFANKH.js} +12 -12
  249. package/dist/{chunk-LJEEVZIH.js → chunk-Y3AA4RZA.js} +12 -12
  250. package/dist/{chunk-SP5BWA5H.js → chunk-Y55ADAF3.js} +27 -27
  251. package/dist/chunk-YM2X57FO.js +157 -0
  252. package/dist/{chunk-GLNSLQSV.js → chunk-YRK6FTYB.js} +21 -21
  253. package/dist/{chunk-UEUPEUZX.js → chunk-YV75FKIY.js} +3 -3
  254. package/dist/{chunk-PT77IUYQ.js → chunk-Z56NN3AX.js} +19 -19
  255. package/dist/{chunk-EM6DKBTJ.js → chunk-ZBW2UO5M.js} +3 -3
  256. package/dist/{chunk-ZCARJ77R.js → chunk-ZGOQY4UB.js} +27 -27
  257. package/dist/{chunk-A3QZZEJA.js → chunk-ZHNZZ642.js} +63 -37
  258. package/dist/{chunk-NV5S63YK.js → chunk-ZLPTFC2O.js} +4 -4
  259. package/dist/{chunk-E7Q52EOO.js → chunk-ZLQQJBPF.js} +5 -5
  260. package/dist/{chunk-23OQZY5Z.js → chunk-ZUSKC4YT.js} +6 -6
  261. package/dist/{chunk-3TWERSTY.js → chunk-ZVCF5PBG.js} +11 -11
  262. package/dist/files.json +588 -580
  263. package/dist/fixtures/forge/slots/build.json +1 -1
  264. package/dist/packages/sdk/npm/index.js +144 -1
  265. package/dist/packages/ui/dist/assets/{elk-api-CPE6PVL8.js → elk-api-dCIOhvlC.js} +2 -2
  266. package/dist/packages/ui/dist/assets/index-B1Jr0xH8.js +63 -0
  267. package/dist/packages/ui/dist/assets/index-BqafgeqY.css +1 -0
  268. package/dist/packages/ui/dist/index.html +2 -2
  269. package/package.json +5 -5
  270. package/dist/chunk-CBFQO2F2.js +0 -62
  271. package/dist/chunk-EHT2KP5A.js +0 -43
  272. package/dist/chunk-FFIHRQ3O.js +0 -67
  273. package/dist/chunk-G4TFQ4EG.js +0 -60
  274. package/dist/chunk-MIKRDA2P.js +0 -68
  275. package/dist/chunk-RCPWEZD7.js +0 -47
  276. package/dist/chunk-WTGQJXRJ.js +0 -55
  277. package/dist/packages/ui/dist/assets/index-BYcVqj0l.js +0 -65
  278. package/dist/packages/ui/dist/assets/index-DF52Ejvz.css +0 -1
@@ -3,19 +3,27 @@ import { fileURLToPath as __atticusFileURLToPath } from "node:url";
3
3
  var require = __atticusCreateRequire(import.meta.url);
4
4
  var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
5
  var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
+ import {
7
+ uiCiteRoutes
8
+ } from "./chunk-R3BSM6HV.js";
9
+ import "./chunk-3YR2EYJP.js";
6
10
  import {
7
11
  uiComponentTypeRoutes
8
- } from "./chunk-523NRKHF.js";
12
+ } from "./chunk-PHXTGKLG.js";
13
+ import {
14
+ historyEntry,
15
+ listHistory
16
+ } from "./chunk-HQG5AGT2.js";
9
17
  import {
10
18
  changeProblems,
11
19
  missingChangeWords
12
- } from "./chunk-SJ2Z3AWF.js";
20
+ } from "./chunk-VEI22AS7.js";
13
21
  import {
14
22
  FORCE_STEPS,
15
23
  appLines,
16
24
  hasKeptResume,
17
25
  mapRepoOf
18
- } from "./chunk-JRXFZB6J.js";
26
+ } from "./chunk-3MXX45EF.js";
19
27
  import {
20
28
  allRuns,
21
29
  answerOf,
@@ -23,14 +31,18 @@ import {
23
31
  listRuns,
24
32
  partStates,
25
33
  runTranscript
26
- } from "./chunk-EFDUC35B.js";
34
+ } from "./chunk-665VDAU4.js";
27
35
  import {
28
- uiCiteRoutes
29
- } from "./chunk-QXSYFB5L.js";
30
- import "./chunk-6ESJWPR3.js";
36
+ defencesScan,
37
+ evalRun
38
+ } from "./chunk-EGHG6K65.js";
39
+ import {
40
+ listReports,
41
+ readQuality
42
+ } from "./chunk-LDHTS4DI.js";
31
43
  import {
32
44
  conformanceCommand
33
- } from "./chunk-UDM6HGF4.js";
45
+ } from "./chunk-PXUNPXAB.js";
34
46
  import {
35
47
  outcomeList,
36
48
  outcomeRecord,
@@ -39,11 +51,10 @@ import {
39
51
  releaseNotesCommand,
40
52
  releasePlanCommand,
41
53
  releaseSecurityCommand
42
- } from "./chunk-5CIW5RMP.js";
54
+ } from "./chunk-7RBQP7PY.js";
43
55
  import {
44
- historyEntry,
45
- listHistory
46
- } from "./chunk-XIIT4PVT.js";
56
+ estimateOf
57
+ } from "./chunk-N2IVTVXW.js";
47
58
  import {
48
59
  changeArchive,
49
60
  changeHandoff,
@@ -51,17 +62,17 @@ import {
51
62
  changeReleasePrs,
52
63
  changeSync,
53
64
  syncAfterManualStep
54
- } from "./chunk-TQISA4VW.js";
65
+ } from "./chunk-T7FFW2NN.js";
55
66
  import {
56
67
  executorsCheck,
57
68
  todoDone,
58
69
  todoRun,
59
70
  todoShow
60
- } from "./chunk-J3ZUKQLV.js";
71
+ } from "./chunk-XGOLAZSH.js";
61
72
  import {
62
73
  inputsSha256,
63
74
  loadExecutors
64
- } from "./chunk-IPMPLTEG.js";
75
+ } from "./chunk-TCYVFE6T.js";
65
76
  import {
66
77
  isSandbox,
67
78
  learnCheck,
@@ -69,59 +80,103 @@ import {
69
80
  lessonsFor,
70
81
  readProgress,
71
82
  sandboxCreate
72
- } from "./chunk-6VFR3DYS.js";
73
- import {
74
- defencesScan,
75
- evalRun
76
- } from "./chunk-2AIOOA3U.js";
77
- import {
78
- listReports,
79
- readQuality
80
- } from "./chunk-MA73J3E6.js";
81
- import {
82
- estimateOf
83
- } from "./chunk-AXJCABA5.js";
83
+ } from "./chunk-M5RJE72K.js";
84
84
  import {
85
85
  changeMapBody,
86
86
  changeMapOf,
87
87
  targetFlowsOf
88
- } from "./chunk-O6UC7ASJ.js";
89
- import "./chunk-6TXB2WR6.js";
90
- import {
91
- readServiceRequests
92
- } from "./chunk-MNOZDE6W.js";
88
+ } from "./chunk-HWXEPWHW.js";
89
+ import "./chunk-M7H7U62C.js";
93
90
  import {
94
91
  runDone,
95
92
  taskRun,
96
93
  taskRunNotWaiting
97
- } from "./chunk-3PG6QOQF.js";
94
+ } from "./chunk-T62FEOSG.js";
95
+ import {
96
+ readServiceRequests
97
+ } from "./chunk-3BOKR3RU.js";
98
98
  import {
99
99
  changeNextStep
100
- } from "./chunk-2FORECYK.js";
100
+ } from "./chunk-LWUWPGQV.js";
101
101
  import {
102
102
  digestCommand
103
- } from "./chunk-XRTECHVH.js";
103
+ } from "./chunk-EXGL7CWI.js";
104
104
  import {
105
105
  reconcileCommand
106
- } from "./chunk-JF2HM2IF.js";
106
+ } from "./chunk-2GP3OTVG.js";
107
107
  import {
108
108
  sourcesAdd,
109
109
  sourcesSync
110
- } from "./chunk-TOSHT6NJ.js";
110
+ } from "./chunk-VQKBO73Y.js";
111
111
  import {
112
112
  INPUTS_SOURCE_ID
113
- } from "./chunk-EM6DKBTJ.js";
113
+ } from "./chunk-ZBW2UO5M.js";
114
+ import {
115
+ MACHINE_CHECKING,
116
+ baselineCommand,
117
+ setupSteps
118
+ } from "./chunk-EC6YA766.js";
119
+ import {
120
+ catalogRecords,
121
+ openChanges,
122
+ systemGuide
123
+ } from "./chunk-HBRMXFMC.js";
124
+ import {
125
+ doctorChecks
126
+ } from "./chunk-RA5Y7WI7.js";
127
+ import {
128
+ readMe,
129
+ writeMe
130
+ } from "./chunk-MZDHFWTN.js";
131
+ import {
132
+ readNextState,
133
+ uiOnboardingRoutes
134
+ } from "./chunk-RUCNERM2.js";
135
+ import "./chunk-JQARUMXI.js";
136
+ import {
137
+ buildTask,
138
+ cancelTaskRunWait,
139
+ findTaskRunOfRun,
140
+ previewTaskRun,
141
+ raiseTaskPr,
142
+ readTaskRun,
143
+ readyTasksOf,
144
+ runReadyTasks,
145
+ saveTaskRun,
146
+ settleTaskPr,
147
+ stopAllBuilds,
148
+ taskRunOfRun
149
+ } from "./chunk-2Z2CIBGD.js";
114
150
  import {
115
151
  boxesOf,
116
152
  candidatesOf,
117
153
  uiLinkRoutes
118
- } from "./chunk-A3QZZEJA.js";
154
+ } from "./chunk-ZHNZZ642.js";
155
+ import "./chunk-Y3AA4RZA.js";
156
+ import {
157
+ idFromUrl
158
+ } from "./chunk-PEIGHDVC.js";
159
+ import "./chunk-X7XVMYIL.js";
160
+ import {
161
+ matchDone,
162
+ quotesOf,
163
+ readMatch,
164
+ runMatch
165
+ } from "./chunk-TEESLG4C.js";
166
+ import "./chunk-ZVCF5PBG.js";
167
+ import "./chunk-NQFBTZWW.js";
168
+ import {
169
+ copilotAcpAllowed
170
+ } from "./chunk-B23Z4Y25.js";
171
+ import "./chunk-H7BHL2KV.js";
172
+ import "./chunk-AKC5NKH6.js";
173
+ import "./chunk-R5X4CNVG.js";
119
174
  import {
120
175
  DecideError,
121
176
  correctDecision,
122
177
  decisionsView,
123
178
  undoBatch
124
- } from "./chunk-D566V3T3.js";
179
+ } from "./chunk-JTTTC5AI.js";
125
180
  import {
126
181
  answerAudit,
127
182
  auditLines,
@@ -129,147 +184,92 @@ import {
129
184
  precisionOf,
130
185
  prepareAudit,
131
186
  writeAudit
132
- } from "./chunk-P7H5WZH6.js";
133
- import {
134
- readNextState,
135
- uiOnboardingRoutes
136
- } from "./chunk-RTHQIGGY.js";
137
- import "./chunk-DVQCYF3V.js";
138
- import {
139
- idFromUrl
140
- } from "./chunk-KMBI6IQD.js";
141
- import "./chunk-X7XVMYIL.js";
142
- import {
143
- matchDone,
144
- quotesOf,
145
- readMatch,
146
- runMatch
147
- } from "./chunk-7SO6CGJH.js";
148
- import "./chunk-3TWERSTY.js";
149
- import "./chunk-NJ5IEZIG.js";
187
+ } from "./chunk-3URSPNDW.js";
150
188
  import {
151
- copilotAcpAllowed
152
- } from "./chunk-PGAXZLNF.js";
153
- import "./chunk-I4P72R2F.js";
154
- import "./chunk-CLM5Z3R5.js";
155
- import "./chunk-GZILYRGC.js";
189
+ scanCommand,
190
+ scanSummaryLines
191
+ } from "./chunk-7SVS7PBB.js";
192
+ import "./chunk-7IEQFI4L.js";
193
+ import "./chunk-XLONNKSI.js";
156
194
  import {
157
195
  answersMayHaveChanged,
158
196
  checkoutsStamp,
159
197
  keepAnswersWhileWatched,
160
198
  keptAnswer,
161
199
  uiTrustRoutes
162
- } from "./chunk-4HMOOBIR.js";
200
+ } from "./chunk-U3SLTDOW.js";
163
201
  import {
164
202
  contractCheckOf,
165
203
  estateJoinOnFile,
166
204
  stampOf
167
- } from "./chunk-2WPUSHB6.js";
168
- import "./chunk-YHS7TSQS.js";
169
- import {
170
- readRepos
171
- } from "./chunk-FBNJZ3VH.js";
205
+ } from "./chunk-43DFUZ5J.js";
172
206
  import {
173
207
  filesUnder,
174
208
  memoByFiles,
175
209
  recheckNow,
176
210
  uiFactsRoutes
177
- } from "./chunk-LH52QGNY.js";
178
- import {
179
- safeMessage,
180
- withFileLock
181
- } from "./chunk-SFCFL7Y5.js";
182
- import "./chunk-I2NGDERG.js";
211
+ } from "./chunk-4QCR6HE3.js";
212
+ import "./chunk-OJE4JK45.js";
183
213
  import {
184
214
  syncNextOf
185
215
  } from "./chunk-EHXDB3SA.js";
186
- import "./chunk-OUGTAOGA.js";
187
- import "./chunk-IDFUGYTS.js";
188
- import "./chunk-YAPVAYZN.js";
189
- import {
190
- MACHINE_CHECKING,
191
- baselineCommand,
192
- setupSteps
193
- } from "./chunk-DNDIT3LD.js";
216
+ import "./chunk-HE4O7PLD.js";
217
+ import "./chunk-RKDZ2LAO.js";
194
218
  import {
195
- readMe,
196
- writeMe
197
- } from "./chunk-MZDHFWTN.js";
219
+ safeMessage,
220
+ withFileLock
221
+ } from "./chunk-I3ZJTM2T.js";
198
222
  import {
199
- buildTask,
200
- cancelTaskRunWait,
201
- findTaskRunOfRun,
202
- previewTaskRun,
203
- raiseTaskPr,
204
- readTaskRun,
205
- readyTasksOf,
206
- runReadyTasks,
207
- saveTaskRun,
208
- settleTaskPr,
209
- stopAllBuilds,
210
- taskRunOfRun
211
- } from "./chunk-7LOXUBRB.js";
212
- import "./chunk-UXETN43F.js";
213
- import "./chunk-VVLWEM2Y.js";
223
+ readRepos
224
+ } from "./chunk-KS3XFDGF.js";
225
+ import "./chunk-SG4PMGZS.js";
226
+ import "./chunk-2C3KACPH.js";
227
+ import "./chunk-AWICXXAC.js";
214
228
  import {
215
229
  checkoutOf
216
- } from "./chunk-QPAANKUR.js";
217
- import "./chunk-FADIWOA5.js";
218
- import {
219
- intakeContext
220
- } from "./chunk-44XGOSUU.js";
221
- import "./chunk-ELZGWEK4.js";
222
- import {
223
- scanCommand,
224
- scanSummaryLines
225
- } from "./chunk-XKWPEY4B.js";
226
- import "./chunk-FVT6LUOC.js";
227
- import {
228
- catalogRecords,
229
- openChanges,
230
- systemGuide
231
- } from "./chunk-RDFRB26Z.js";
232
- import {
233
- doctorChecks
234
- } from "./chunk-RZEYZOLW.js";
230
+ } from "./chunk-LSRKXZI4.js";
231
+ import "./chunk-IEGOFWZC.js";
232
+ import "./chunk-DEQGTRMM.js";
235
233
  import {
236
234
  isMetarepo
237
235
  } from "./chunk-3G4YI4ZU.js";
238
236
  import {
239
237
  workspaceOpen,
240
238
  workspaceSync
241
- } from "./chunk-HPCGQAYH.js";
242
- import "./chunk-Q7YDUGVZ.js";
243
- import "./chunk-CPB4XMFI.js";
239
+ } from "./chunk-SFWTGHHU.js";
240
+ import "./chunk-PL4EFATK.js";
241
+ import "./chunk-E7O2WMDW.js";
244
242
  import {
245
243
  readChangeTasks,
246
244
  readStory,
247
245
  setTaskDone
248
- } from "./chunk-L3KSU4QU.js";
246
+ } from "./chunk-HZ65CLTT.js";
249
247
  import {
250
248
  planStories,
251
249
  snowDraft,
252
250
  snowSubmit
253
- } from "./chunk-VSED7FYC.js";
254
- import "./chunk-4UVTNHA6.js";
251
+ } from "./chunk-7SJ7D6Q7.js";
252
+ import "./chunk-TYC6ILJ5.js";
255
253
  import {
256
254
  ciArchiveGate
257
- } from "./chunk-DDRTAEFZ.js";
255
+ } from "./chunk-4BIG3Y3L.js";
258
256
  import {
259
257
  traceMatrix
260
- } from "./chunk-4BK5EJ2C.js";
258
+ } from "./chunk-IQYR73ED.js";
261
259
  import "./chunk-MUWDB4R4.js";
262
260
  import {
263
261
  archiveGate
264
- } from "./chunk-TLSL7OII.js";
265
- import "./chunk-3XNE6XXF.js";
266
- import "./chunk-LJEEVZIH.js";
267
- import "./chunk-3BQDBTQJ.js";
268
- import "./chunk-HOEZQRZU.js";
262
+ } from "./chunk-XPE3V7ZN.js";
263
+ import "./chunk-MO6D2ZO6.js";
264
+ import "./chunk-HPKQIRQR.js";
269
265
  import {
270
266
  initiativeStatus,
271
267
  readView
272
- } from "./chunk-23OQZY5Z.js";
268
+ } from "./chunk-ZUSKC4YT.js";
269
+ import {
270
+ intakeContext
271
+ } from "./chunk-GCT6HBIU.js";
272
+ import "./chunk-A5IJVTLL.js";
273
273
  import {
274
274
  CORRECTIONS_FILE,
275
275
  FEATURE_FILE,
@@ -319,14 +319,14 @@ import {
319
319
  syncWorkItems,
320
320
  threadReplies,
321
321
  writeSketch
322
- } from "./chunk-DTW37FJ6.js";
322
+ } from "./chunk-D6WUJFQH.js";
323
323
  import {
324
324
  FeaturePlacement,
325
325
  STAGES,
326
326
  STAGE_PHASE,
327
327
  fieldNames,
328
328
  rerunOf
329
- } from "./chunk-INCFIDCB.js";
329
+ } from "./chunk-5KRMFM3P.js";
330
330
  import {
331
331
  HttpError,
332
332
  badRequest,
@@ -337,7 +337,7 @@ import {
337
337
  requireConfirmation,
338
338
  startServer,
339
339
  strParam
340
- } from "./chunk-6GX3OFEZ.js";
340
+ } from "./chunk-KOTDH7M2.js";
341
341
  import {
342
342
  addressRefusal,
343
343
  asTheApp,
@@ -345,19 +345,19 @@ import {
345
345
  requireConfirmedModel,
346
346
  servingTheApp,
347
347
  whereKeyGoes
348
- } from "./chunk-OY6H7JX6.js";
348
+ } from "./chunk-TIQMGQPM.js";
349
349
  import "./chunk-4XK3HLOH.js";
350
350
  import {
351
351
  ASSISTANT_FORMATS,
352
352
  readProbes,
353
353
  whatRunsWhere
354
- } from "./chunk-G33UIUG3.js";
354
+ } from "./chunk-OXDMFJHR.js";
355
355
  import {
356
356
  critic,
357
357
  criticStats,
358
358
  findingAction
359
- } from "./chunk-CWJDZ5VP.js";
360
- import "./chunk-O5BUMSB3.js";
359
+ } from "./chunk-WAEYJ6XE.js";
360
+ import "./chunk-5PWXWUW3.js";
361
361
  import "./chunk-VOGCSYOI.js";
362
362
  import {
363
363
  layerRules,
@@ -371,7 +371,7 @@ import {
371
371
  readStoryIndex,
372
372
  reviewedGates,
373
373
  roundsOf
374
- } from "./chunk-LP6BFBE5.js";
374
+ } from "./chunk-FIYGZJF6.js";
375
375
  import {
376
376
  ChangeOwnersError,
377
377
  artifactFiles,
@@ -393,7 +393,7 @@ import {
393
393
  setChangeOwners,
394
394
  unmergedTaskBranches,
395
395
  unmergedTaskWords
396
- } from "./chunk-YBAJ5SAR.js";
396
+ } from "./chunk-OFHPXH3N.js";
397
397
  import "./chunk-23TTURB2.js";
398
398
  import {
399
399
  componentRenames,
@@ -408,14 +408,14 @@ import {
408
408
  readCatalog,
409
409
  readCrossCheck,
410
410
  targetPicker
411
- } from "./chunk-6H62UHY5.js";
411
+ } from "./chunk-QZIXAFV2.js";
412
412
  import {
413
413
  NoSuchNode,
414
414
  buildEstate,
415
415
  focusView,
416
416
  nodeView,
417
417
  viewKey
418
- } from "./chunk-YIGSUTW2.js";
418
+ } from "./chunk-N5IGQQM4.js";
419
419
  import {
420
420
  OrgPackProposal,
421
421
  SNAPSHOT_FILE,
@@ -439,42 +439,42 @@ import {
439
439
  snapshotDates,
440
440
  snapshotSources,
441
441
  writeReview
442
- } from "./chunk-N5DLB74D.js";
443
- import "./chunk-4NPWOUI2.js";
442
+ } from "./chunk-22MCNFEB.js";
443
+ import "./chunk-CBYJQD7C.js";
444
444
  import {
445
445
  fileStepStore,
446
446
  manualAdapter,
447
447
  stepOfProvisional
448
- } from "./chunk-I57IH5X6.js";
449
- import "./chunk-LCQIRCOT.js";
448
+ } from "./chunk-FRSDREKQ.js";
449
+ import "./chunk-A2PNCDY2.js";
450
450
  import {
451
451
  baseClonePath,
452
452
  changeWorktreesDir,
453
453
  cloneUrlKey,
454
454
  loadRepos,
455
455
  readChangeRepos
456
- } from "./chunk-X5B7KYPD.js";
456
+ } from "./chunk-AIM4ER32.js";
457
457
  import {
458
458
  COMMON_SETTINGS,
459
459
  PROVIDER_SETTINGS,
460
460
  defaultKeyStore,
461
461
  keyEnvFromEnvironment,
462
462
  looksLikeKey
463
- } from "./chunk-GZSOZYEP.js";
463
+ } from "./chunk-2E725C6E.js";
464
464
  import {
465
465
  readServiceRequestExports,
466
466
  readVendorSpec,
467
467
  readWorkItemExports
468
- } from "./chunk-IPSZDVLI.js";
468
+ } from "./chunk-FEJPEDDX.js";
469
469
  import {
470
470
  batchSections,
471
471
  providerFactoryFor
472
- } from "./chunk-2MRYL45Z.js";
473
- import "./chunk-ELJ5Q4J2.js";
474
- import "./chunk-XZY4GTCX.js";
475
- import "./chunk-3M3MDBOG.js";
476
- import "./chunk-QK3UFHFC.js";
477
- import "./chunk-3PBIZBWN.js";
472
+ } from "./chunk-W7U3NIUF.js";
473
+ import "./chunk-WX2EYZTA.js";
474
+ import "./chunk-D6GPG32H.js";
475
+ import "./chunk-BPWOKVPJ.js";
476
+ import "./chunk-JCZSY5ZC.js";
477
+ import "./chunk-MZ2ITC2C.js";
478
478
  import {
479
479
  ADAPTER_FIELDS,
480
480
  ADAPTER_KINDS,
@@ -547,7 +547,7 @@ import {
547
547
  specRepos,
548
548
  undeclareLink,
549
549
  writeOrgPackFile
550
- } from "./chunk-WJWSB65O.js";
550
+ } from "./chunk-T7QW62TW.js";
551
551
  import {
552
552
  FileChangedError,
553
553
  RUN_LOG_READ_MAX,
@@ -606,7 +606,7 @@ import {
606
606
 
607
607
  // packages/cli/dist/ui-commands.js
608
608
  import { spawn } from "node:child_process";
609
- import { join as join18 } from "node:path";
609
+ import { join as join19 } from "node:path";
610
610
 
611
611
  // packages/ui/dist-lib/index.js
612
612
  import { dirname, join } from "node:path";
@@ -1046,6 +1046,9 @@ function uiActivityRoutes(r, ctx, deps = {}) {
1046
1046
  });
1047
1047
  }
1048
1048
 
1049
+ // packages/cli/dist/ui-api-catalog.js
1050
+ import { join as join3 } from "node:path";
1051
+
1049
1052
  // packages/cli/dist/ui-api-steps.js
1050
1053
  import { readdir } from "node:fs/promises";
1051
1054
  import { dirname as dirname2 } from "node:path";
@@ -1072,19 +1075,19 @@ async function changesWithWorktrees(root) {
1072
1075
  function uiStepRoutes(r, ctx, asJob) {
1073
1076
  const root = ctx.root;
1074
1077
  return r.add("POST", "/api/facts/apply-all", async () => {
1075
- const { verifyAllCommand } = await import("./chunk-3NGHSBVS.js");
1078
+ const { verifyAllCommand } = await import("./chunk-6D7HF6V4.js");
1076
1079
  return asJob("Applying to every repo", () => captured((io) => verifyAllCommand(root, { write: true, verbose: false, json: false }, io)));
1077
1080
  }).add("POST", "/api/estate/join", async () => {
1078
- const { estateJoin } = await import("./chunk-5YX7MJWW.js");
1081
+ const { estateJoin } = await import("./chunk-AQOFIHBO.js");
1079
1082
  return asJob("Joining the estate's flows", () => captured((io) => estateJoin(root, { json: false }, io)));
1080
1083
  }).add("POST", "/api/knowledge/sources/sync", async () => {
1081
- const { sourcesSync: sourcesSync2 } = await import("./chunk-YTPND655.js");
1084
+ const { sourcesSync: sourcesSync2 } = await import("./chunk-E4AUZ5AC.js");
1082
1085
  return asJob("Syncing every wiki", () => captured((io) => sourcesSync2(root, io, { json: false })));
1083
1086
  }).add("POST", "/api/workspace/prune", async ({ body }) => {
1084
1087
  const change = body?.change;
1085
1088
  if (change !== void 0 && (typeof change !== "string" || !ID2.test(change)))
1086
1089
  throw badRequest("change is a change id, or left out for every change with worktrees.");
1087
- const { workspacePrune } = await import("./chunk-G4TFQ4EG.js");
1090
+ const { workspacePrune } = await import("./chunk-ON2W7SWK.js");
1088
1091
  return asJob(change ? `Cleaning up ${change}'s worktrees` : "Cleaning up worktrees", () => captured(async (io) => {
1089
1092
  const list = change ? [change] : await changesWithWorktrees(root);
1090
1093
  if (!list.length) {
@@ -1099,7 +1102,7 @@ function uiStepRoutes(r, ctx, asJob) {
1099
1102
  return code;
1100
1103
  }));
1101
1104
  }).add("GET", "/api/changes/{changeId}/tasks/{taskId}/context", async ({ params }) => {
1102
- const { taskContextCli } = await import("./chunk-OY2VC2IU.js");
1105
+ const { taskContextCli } = await import("./chunk-OHAMT5OA.js");
1103
1106
  const lines = [];
1104
1107
  const errs = [];
1105
1108
  const code = await taskContextCli(root, params.changeId, params.taskId, { markdown: true }, { out: (l) => lines.push(l), err: (l) => errs.push(l) });
@@ -1110,7 +1113,7 @@ function uiStepRoutes(r, ctx, asJob) {
1110
1113
  const on = body?.on;
1111
1114
  if (typeof on !== "boolean")
1112
1115
  throw badRequest("on is true or false.");
1113
- const { setLocalRecording } = await import("./chunk-Y6S7VCYN.js");
1116
+ const { setLocalRecording } = await import("./chunk-CYPQ3PBB.js");
1114
1117
  await setLocalRecording(root, on);
1115
1118
  ctx.events.publish({ type: "file.changed", path: ".atticus/me.yaml" });
1116
1119
  return { status: 200, body: { on } };
@@ -1164,7 +1167,7 @@ function coalesced(work) {
1164
1167
  }
1165
1168
  function uiCatalogRoutes(r, ctx, asJob) {
1166
1169
  const root = ctx.root;
1167
- const buildViewNow = coalesced(async () => (await import("./chunk-B4WPO6FX.js")).catalogBuildView(root));
1170
+ const buildViewNow = coalesced(async () => (await import("./chunk-XSLFANKH.js")).catalogBuildView(root));
1168
1171
  const repoOf2 = (params) => {
1169
1172
  const repo = params.repo ?? "";
1170
1173
  if (!REPO.test(repo))
@@ -1186,7 +1189,7 @@ function uiCatalogRoutes(r, ctx, asJob) {
1186
1189
  throw notFound(`${repo} isn't a repo the manifests list.`);
1187
1190
  const head = await headOf(root, repo);
1188
1191
  const promoted = await promotedStates(root, repo, one.items.filter((i) => i.state === "readers-only").map((i) => i.key));
1189
- const { readersValueSha } = await import("./chunk-JOG5O2ZH.js");
1192
+ const { readersValueSha } = await import("./chunk-MUTSQOQ7.js");
1190
1193
  const items = one.items.map((i) => {
1191
1194
  const p = i.state === "readers-only" ? promoted.get(i.key) : void 0;
1192
1195
  const sha5 = i.state === "readers-only" || i.state === "disagree" ? { readersSha256: readersValueSha(i.readers?.value) } : {};
@@ -1204,8 +1207,8 @@ function uiCatalogRoutes(r, ctx, asJob) {
1204
1207
  const v = await readCrossCheck(root, { repo });
1205
1208
  if (!v.repos[0])
1206
1209
  throw notFound(`${repo} isn't a repo the manifests list.`);
1207
- const { planPromote } = await import("./chunk-MSNEGKI3.js");
1208
- const { checkoutLineOf } = await import("./chunk-JOG5O2ZH.js");
1210
+ const { planPromote } = await import("./chunk-AGTB5CRY.js");
1211
+ const { checkoutLineOf } = await import("./chunk-MUTSQOQ7.js");
1209
1212
  const { next: _next, ...plan } = await planPromote(root, repo, key, {
1210
1213
  lineOf: checkoutLineOf(root, repo)
1211
1214
  });
@@ -1217,14 +1220,14 @@ function uiCatalogRoutes(r, ctx, asJob) {
1217
1220
  const v = await readCrossCheck(root, { repo });
1218
1221
  if (!v.repos[0])
1219
1222
  throw notFound(`${repo} isn't a repo the manifests list.`);
1220
- const { planPromote } = await import("./chunk-MSNEGKI3.js");
1221
- const { catalogCrossCheck, checkoutLineOf } = await import("./chunk-JOG5O2ZH.js");
1223
+ const { planPromote } = await import("./chunk-AGTB5CRY.js");
1224
+ const { catalogCrossCheck, checkoutLineOf } = await import("./chunk-MUTSQOQ7.js");
1222
1225
  const plan = await planPromote(root, repo, b.key, { lineOf: checkoutLineOf(root, repo) });
1223
1226
  if (!plan.can)
1224
1227
  throw conflict(`${b.key} can't be promoted now: ${plan.why}. Nothing written.`);
1225
1228
  if (plan.sha256 !== b.sha256)
1226
1229
  throw conflict(`The fact promoting ${b.key} writes isn't the one the page showed any more. Nothing written: look at it again.`);
1227
- const { verifyCommand } = await import("./chunk-3NGHSBVS.js");
1230
+ const { verifyCommand } = await import("./chunk-6D7HF6V4.js");
1228
1231
  return asJob(`Promote on ${repo}`, () => captured(async (io) => {
1229
1232
  const code = await catalogCrossCheck(root, { repo, promote: b.key, expect: b.sha256 }, io);
1230
1233
  if (code !== 0)
@@ -1238,7 +1241,7 @@ function uiCatalogRoutes(r, ctx, asJob) {
1238
1241
  const one = v.repos[0];
1239
1242
  if (!one)
1240
1243
  throw notFound(`${repo} isn't a repo the manifests list.`);
1241
- const { catalogCrossCheck, readersValueSha } = await import("./chunk-JOG5O2ZH.js");
1244
+ const { catalogCrossCheck, readersValueSha } = await import("./chunk-MUTSQOQ7.js");
1242
1245
  const item2 = one.items.find((i) => i.key === b.key);
1243
1246
  if (b.undo) {
1244
1247
  if (!item2?.dismissed)
@@ -1263,11 +1266,11 @@ function uiCatalogRoutes(r, ctx, asJob) {
1263
1266
  if (counted && b.plan === void 0)
1264
1267
  throw badRequest("plan is GET /api/build's pending.plan for the list being confirmed.");
1265
1268
  if (b.plan !== void 0) {
1266
- const { catalogBuildView } = await import("./chunk-B4WPO6FX.js");
1269
+ const { catalogBuildView } = await import("./chunk-XSLFANKH.js");
1267
1270
  if ((await catalogBuildView(root)).pending.plan !== b.plan)
1268
1271
  throw conflict("What the build would remove or discard isn't what the page listed any more. Nothing written: look at the list again.");
1269
1272
  }
1270
- const { catalogBuild } = await import("./chunk-PVJZR4JB.js");
1273
+ const { catalogBuild } = await import("./chunk-7O22X554.js");
1271
1274
  const flags = [
1272
1275
  ...b.allowRemovals !== void 0 ? [`--allow-removals ${b.allowRemovals}`] : [],
1273
1276
  ...b.discardEdits !== void 0 ? [`--discard-edits ${b.discardEdits}`] : []
@@ -1279,27 +1282,27 @@ function uiCatalogRoutes(r, ctx, asJob) {
1279
1282
  }, io)));
1280
1283
  }).add("POST", "/api/build/edits/curate", async ({ body }) => {
1281
1284
  const b = parse(api_exports.CatalogEditsRequest, body);
1282
- const { catalogBuildView } = await import("./chunk-B4WPO6FX.js");
1285
+ const { catalogBuildView } = await import("./chunk-XSLFANKH.js");
1283
1286
  const view3 = await catalogBuildView(root);
1284
1287
  const now = view3.pending.refused;
1285
1288
  const edits = now?.reasons.includes("hand-edits") ? now.edits ?? [] : [];
1286
1289
  if (edits.length !== b.count || view3.pending.plan !== b.plan)
1287
1290
  throw conflict(edits.length !== b.count ? `The page listed ${b.count} hand ${b.count === 1 ? "edit" : "edits"}; there ${edits.length === 1 ? "is" : "are"} ${edits.length} now. Nothing was made curated: look at the list again.` : "The hand edits aren't the ones the page listed any more. Nothing was made curated: look at the list again.");
1288
- const { catalogBuild, catalogEdits } = await import("./chunk-PVJZR4JB.js");
1291
+ const { catalogBuild, catalogEdits } = await import("./chunk-7O22X554.js");
1289
1292
  return asJob("Make the hand edits curated, then build", () => captured(async (io) => {
1290
1293
  const code = await catalogEdits(root, { curate: true, by: ctx.user, plan: b.plan }, io);
1291
1294
  return code === 0 ? catalogBuild(root, {}, io) : code;
1292
1295
  }));
1293
1296
  }).add("GET", "/api/build/undo", async ({ query }) => {
1294
1297
  const n = intParam(query, "n", 1, 1e6);
1295
- const { catalogUndoView } = await import("./chunk-B4WPO6FX.js");
1298
+ const { catalogUndoView } = await import("./chunk-XSLFANKH.js");
1296
1299
  return {
1297
1300
  status: 200,
1298
1301
  body: api_exports.CatalogUndoView.parse(await catalogUndoView(root, n))
1299
1302
  };
1300
1303
  }).add("POST", "/api/build/undo", async ({ body }) => {
1301
1304
  const b = parse(api_exports.CatalogUndoRequest, body);
1302
- const { catalogUndoView } = await import("./chunk-B4WPO6FX.js");
1305
+ const { catalogUndoView } = await import("./chunk-XSLFANKH.js");
1303
1306
  const v = await catalogUndoView(root, b.n);
1304
1307
  if (!v.plan)
1305
1308
  throw conflict(v.problem ?? `There are fewer than ${b.n} builds to undo here.`);
@@ -1307,30 +1310,30 @@ function uiCatalogRoutes(r, ctx, asJob) {
1307
1310
  throw conflict(`The page listed ${b.files} ${b.files === 1 ? "file" : "files"} to put back; taking back the ${b.n === 1 ? "latest build" : `${b.n} latest builds`} puts back ${v.plan.files.length} now. Nothing was undone: look at the list again.`);
1308
1311
  if (v.plan.hash !== b.plan)
1309
1312
  throw conflict("The builds to take back or their files aren't the ones the page listed any more. Nothing was undone: look at the list again.");
1310
- const { catalogUndo } = await import("./chunk-PVJZR4JB.js");
1313
+ const { catalogUndo } = await import("./chunk-7O22X554.js");
1311
1314
  return asJob(`atticus catalog undo ${b.n} --yes`, () => captured((io) => catalogUndo(root, { n: b.n, yes: true, plan: b.plan }, io)));
1312
1315
  }).add("GET", "/api/build/prune", async () => {
1313
- const { catalogPruneView } = await import("./chunk-B4WPO6FX.js");
1316
+ const { catalogPruneView } = await import("./chunk-XSLFANKH.js");
1314
1317
  return {
1315
1318
  status: 200,
1316
1319
  body: api_exports.CatalogPruneView.parse(await catalogPruneView(root))
1317
1320
  };
1318
1321
  }).add("POST", "/api/build/prune", async ({ body }) => {
1319
1322
  const b = parse(api_exports.CatalogPruneRequest, body);
1320
- const { catalogPruneView } = await import("./chunk-B4WPO6FX.js");
1323
+ const { catalogPruneView } = await import("./chunk-XSLFANKH.js");
1321
1324
  const v = await catalogPruneView(root);
1322
1325
  if (v.files.length !== b.count)
1323
1326
  throw conflict(`The page listed ${b.count} ${b.count === 1 ? "file" : "files"} to remove; there ${v.files.length === 1 ? "is" : "are"} ${v.files.length} now. Nothing was removed: look at the list again.`);
1324
1327
  if (v.plan !== b.plan)
1325
1328
  throw conflict("The files to remove aren't the ones the page listed any more. Nothing was removed: look at the list again.");
1326
- const { catalogPrune } = await import("./chunk-PVJZR4JB.js");
1329
+ const { catalogPrune } = await import("./chunk-7O22X554.js");
1327
1330
  return asJob("atticus catalog prune --yes", () => captured((io) => catalogPrune(root, { yes: true, plan: b.plan }, io)));
1328
1331
  }).add("GET", "/api/build/upgrade", async () => {
1329
- const { catalogUpgradeView } = await import("./chunk-B4WPO6FX.js");
1332
+ const { catalogUpgradeView } = await import("./chunk-XSLFANKH.js");
1330
1333
  return { status: 200, body: api_exports.CatalogUpgradeView.parse(await catalogUpgradeView(root)) };
1331
1334
  }).add("POST", "/api/build/upgrade", async ({ body }) => {
1332
1335
  const b = parse(api_exports.CatalogUpgradeRequest, body);
1333
- const { catalogUpgradeView } = await import("./chunk-B4WPO6FX.js");
1336
+ const { catalogUpgradeView } = await import("./chunk-XSLFANKH.js");
1334
1337
  const v = await catalogUpgradeView(root);
1335
1338
  if (!v.pending)
1336
1339
  throw conflict("Nothing to upgrade: catalog/sources is here already.");
@@ -1343,8 +1346,67 @@ function uiCatalogRoutes(r, ctx, asJob) {
1343
1346
  throw conflict("The first build changes nothing now, so there is nothing to accept. Nothing written: look at the list again.");
1344
1347
  if (v.writes.length !== b.count || v.plan !== b.plan)
1345
1348
  throw conflict(`The page listed ${b.count} ${b.count === 1 ? "file" : "files"} to write; the upgrade writes ${v.writes.length === b.count ? "other files" : `${v.writes.length}`} now. Nothing written: look at the list again.`);
1346
- const { upgradeCommand } = await import("./chunk-CWKQRP6Y.js");
1349
+ const { upgradeCommand } = await import("./chunk-PNU5SNYP.js");
1347
1350
  return asJob(accept ? `atticus upgrade --yes --accept-changes ${accept}` : "atticus upgrade --yes", () => captured((io) => upgradeCommand(root, { by: ctx.user, yes: true, ...accept ? { acceptChanges: accept } : {} }, io)));
1351
+ }).add("POST", "/api/links/delete", async ({ body }) => {
1352
+ const b = parse(api_exports.LinkDeleteRequest, body);
1353
+ const now = new Set((await readCatalog(join3(catalogDirOf(root), "generated"), { fresh: true })).records.filter((x) => x.kind === "Interface").map((x) => x.id));
1354
+ const missing = b.interfaces.filter((id) => !now.has(id));
1355
+ if (missing.length)
1356
+ throw notFound(`${missing.slice(0, 5).join(", ")}${missing.length > 5 ? ` and ${missing.length - 5} more` : ""} ${missing.length === 1 ? "isn't an Interface" : "aren't Interfaces"} of the catalog now: the link may be gone already. Nothing written.`);
1357
+ const { deleteLink } = await import("./chunk-7O22X554.js");
1358
+ return asJob(`Delete the link ${b.from} \u2192 ${b.to}`, () => captured((io) => deleteLink(root, { interfaces: b.interfaces, from: b.from, to: b.to, by: ctx.user }, io)));
1359
+ }).add("GET", "/api/links/deleted", async () => {
1360
+ const { deletedLinks, suppressedNow } = await import("./chunk-7O22X554.js");
1361
+ const suppressed = await suppressedNow(root).catch(() => void 0);
1362
+ return {
1363
+ status: 200,
1364
+ body: api_exports.DeletedLinksView.parse(await deletedLinks(root, suppressed ? { suppressed } : {}))
1365
+ };
1366
+ }).add("POST", "/api/links/deleted/undo", async ({ body }) => {
1367
+ const b = parse(api_exports.LinkUndeleteRequest, body);
1368
+ const { deletedLinks, undeleteLink } = await import("./chunk-7O22X554.js");
1369
+ const v = await deletedLinks(root);
1370
+ const held = new Map(v.links.flatMap((l2) => l2.decisions.map((d) => [d.id, l2])));
1371
+ const missing = b.decisions.filter((id) => !held.has(id));
1372
+ if (missing.length)
1373
+ throw notFound(`${missing.slice(0, 5).join(", ")} ${missing.length === 1 ? "isn't a link" : "aren't links"} deleted on the canvas. Nothing removed.`);
1374
+ const l = held.get(b.decisions[0]);
1375
+ return asJob(`Bring back the link ${l.from} \u2192 ${l.to}`, () => captured((io) => undeleteLink(root, { decisions: b.decisions }, io)));
1376
+ }).add("POST", "/api/map/edits", async ({ body }) => {
1377
+ const b = parse(api_exports.MapEditsRequest, body);
1378
+ const { checkMapEdits } = await import("./chunk-YM2X57FO.js");
1379
+ const { problems, callers, waitsOn } = await checkMapEdits(root, b.edits);
1380
+ if (problems.length)
1381
+ throw new HttpError(422, "Some changes can't be made", `${problems.length} of the ${b.edits.length} changes can't be made: ${problems.map((p) => `change ${p.edit + 1}: ${p.message}`).join(" ")} Nothing was written.`, { problems });
1382
+ const { applyMapEdits } = await import("./chunk-7O22X554.js");
1383
+ const n = b.edits.length;
1384
+ return asJob(`Apply ${n} change${n === 1 ? "" : "s"} to the map`, async () => {
1385
+ const { lastBuildOf } = await import("./chunk-XSLFANKH.js");
1386
+ const before = JSON.stringify(await lastBuildOf(root) ?? null);
1387
+ let ran;
1388
+ const res = await captured(async (io) => {
1389
+ ran = await applyMapEdits(root, { edits: b.edits, by: ctx.user }, io);
1390
+ return ran.code;
1391
+ });
1392
+ let refused4;
1393
+ if (ran && !ran.built && ran.edits.every((x) => x.state === "saved")) {
1394
+ const { lastBuildOf: lastBuildOf2 } = await import("./chunk-XSLFANKH.js");
1395
+ const last = await lastBuildOf2(root);
1396
+ if (last?.outcome === "refused" && last.refused && JSON.stringify(last) !== before)
1397
+ refused4 = last.refused;
1398
+ }
1399
+ return {
1400
+ ...res,
1401
+ extra: {
1402
+ edits: ran?.edits ?? [],
1403
+ built: ran?.built ?? false,
1404
+ callers,
1405
+ waitsOn,
1406
+ ...refused4 ? { refused: refused4 } : {}
1407
+ }
1408
+ };
1409
+ });
1348
1410
  });
1349
1411
  }
1350
1412
 
@@ -1352,14 +1414,14 @@ function uiCatalogRoutes(r, ctx, asJob) {
1352
1414
  import { createHash as createHash3 } from "node:crypto";
1353
1415
  import { existsSync } from "node:fs";
1354
1416
  import { mkdir, readdir as readdir2, readFile as readFile2, stat as stat2 } from "node:fs/promises";
1355
- import { dirname as dirname3, join as join4 } from "node:path";
1417
+ import { dirname as dirname3, join as join5 } from "node:path";
1356
1418
  var import_yaml2 = __toESM(require_dist(), 1);
1357
1419
 
1358
1420
  // packages/cli/dist/handoff-autodone.js
1359
1421
  var import_yaml = __toESM(require_dist(), 1);
1360
1422
  import { createHash as createHash2 } from "node:crypto";
1361
1423
  import { readFile, rm, stat, writeFile } from "node:fs/promises";
1362
- import { join as join3 } from "node:path";
1424
+ import { join as join4 } from "node:path";
1363
1425
  var AUTO_AGENTS = /* @__PURE__ */ new Set([
1364
1426
  "change-drafter",
1365
1427
  "feature-placer",
@@ -1379,13 +1441,13 @@ var agentOf = (s) => {
1379
1441
  var sha = (t) => createHash2("sha256").update(t).digest("hex");
1380
1442
  var AUTO_CHECKED = "checked-by-app.json";
1381
1443
  async function markCheckedByApp(root, change, runId) {
1382
- await writeFile(join3(runsDirOf(root), change, runId, AUTO_CHECKED), JSON.stringify({ at: (/* @__PURE__ */ new Date()).toISOString() }) + "\n", "utf8");
1444
+ await writeFile(join4(runsDirOf(root), change, runId, AUTO_CHECKED), JSON.stringify({ at: (/* @__PURE__ */ new Date()).toISOString() }) + "\n", "utf8");
1383
1445
  }
1384
1446
  async function unmarkCheckedByApp(root, change, runId) {
1385
- await rm(join3(runsDirOf(root), change, runId, AUTO_CHECKED), { force: true });
1447
+ await rm(join4(runsDirOf(root), change, runId, AUTO_CHECKED), { force: true });
1386
1448
  }
1387
1449
  async function checkedByApp(root, change, runId) {
1388
- return stat(join3(runsDirOf(root), change, runId, AUTO_CHECKED)).then(() => true, () => false);
1450
+ return stat(join4(runsDirOf(root), change, runId, AUTO_CHECKED)).then(() => true, () => false);
1389
1451
  }
1390
1452
  function answerComplete(s, text) {
1391
1453
  if (!text.trim())
@@ -1411,11 +1473,11 @@ async function answerFile(root, s) {
1411
1473
  const out = s.run.request.outputPath;
1412
1474
  if (!out)
1413
1475
  return void 0;
1414
- const inRun = join3(s.dir, out);
1476
+ const inRun = join4(s.dir, out);
1415
1477
  if (s.run.request.outputIn === "run" || s.run.parts?.length)
1416
1478
  return inRun;
1417
- const { changesDirOf: changesDirOf2 } = await import("./chunk-PPKH6ULR.js");
1418
- return join3(changesDirOf2(root), s.run.request.change, out);
1479
+ const { changesDirOf: changesDirOf2 } = await import("./chunk-4EBXR37M.js");
1480
+ return join4(changesDirOf2(root), s.run.request.change, out);
1419
1481
  }
1420
1482
  async function dueRuns(root, o) {
1421
1483
  const due = [];
@@ -1526,7 +1588,7 @@ async function openTaskWorktree(root, change, task, gitHost) {
1526
1588
  }).catch(() => void 0);
1527
1589
  if (!p)
1528
1590
  return void 0;
1529
- const text = await readFile2(join4(changesDirOf(root), change, "repos.yaml"), "utf8").catch(() => "");
1591
+ const text = await readFile2(join5(changesDirOf(root), change, "repos.yaml"), "utf8").catch(() => "");
1530
1592
  let has = false;
1531
1593
  try {
1532
1594
  const d = (0, import_yaml2.parse)(text);
@@ -1626,14 +1688,14 @@ async function changeDetail(root, id) {
1626
1688
  for (const f of findings)
1627
1689
  if (f.state === "open")
1628
1690
  open[f.severity] += 1;
1629
- const dir = join4(changesDirOf(root), id);
1691
+ const dir = join5(changesDirOf(root), id);
1630
1692
  const phases = report.type.phases;
1631
1693
  const current = report.phase ? phases.indexOf(report.phase) : phases.length;
1632
1694
  const artifacts = [];
1633
1695
  const blockedArtifacts = new Set(report.blockers.map((b) => b.artifact).filter(Boolean));
1634
1696
  const templateOnly = new Set(report.blockers.filter((b) => b.code === "unfilled-artifact").map((b) => b.artifact));
1635
1697
  const cctx = await loadChangeContext(root);
1636
- const onStages = (await Promise.all(cctx.policy.stages.map((s) => readFile2(join4(dir, ...s.loop.split("/"))).then(() => true, () => false)))).some(Boolean);
1698
+ const onStages = (await Promise.all(cctx.policy.stages.map((s) => readFile2(join5(dir, ...s.loop.split("/"))).then(() => true, () => false)))).some(Boolean);
1637
1699
  const type = report.type.artifacts;
1638
1700
  const ofStages = cctx.policy.stages.flatMap((s) => s.artifacts).filter((a, i, all) => type.includes(a) && all.indexOf(a) === i);
1639
1701
  const due = /* @__PURE__ */ new Set();
@@ -1667,7 +1729,7 @@ async function changeDetail(root, id) {
1667
1729
  state: c.state,
1668
1730
  // ADR 0191 (app-only audit): the repos it names and its target flows' ("Name its repos on its
1669
1731
  // brief" stayed after the stories named them; the brief has no repos).
1670
- repos: await (await import("./chunk-PT77IUYQ.js")).changeRepos(root, c),
1732
+ repos: await (await import("./chunk-Z56NN3AX.js")).changeRepos(root, c),
1671
1733
  openFindings: open,
1672
1734
  updatedAt: c.history.at(-1)?.at ?? c.createdAt,
1673
1735
  ...fast ? { fastPath: true } : {},
@@ -1691,10 +1753,10 @@ async function applyFirstOf(root, files) {
1691
1753
  const repo = /(?:^|\/)facts\/([^/]+)\.corrections\.jsonl$/.exec(f.path)?.[1] ?? await answeredMapQuestionRepo(root, f.path);
1692
1754
  if (!repo || out.includes(repo))
1693
1755
  continue;
1694
- const saved = await mtime(join4(root, ...f.path.split("/")));
1756
+ const saved = await mtime(join5(root, ...f.path.split("/")));
1695
1757
  if (saved === void 0)
1696
1758
  continue;
1697
- const applied = await mtime(join4(specDirOf(root, repo), SPEC_HEADER_FILE)) ?? await mtime(join4(factsDirOf(root), `${repo}.verify.yaml`));
1759
+ const applied = await mtime(join5(specDirOf(root, repo), SPEC_HEADER_FILE)) ?? await mtime(join5(factsDirOf(root), `${repo}.verify.yaml`));
1698
1760
  if (applied === void 0 || saved > applied)
1699
1761
  out.push(repo);
1700
1762
  }
@@ -1703,7 +1765,7 @@ async function applyFirstOf(root, files) {
1703
1765
  async function answeredMapQuestionRepo(root, path) {
1704
1766
  if (!/(?:^|\/)questions\/q-[^/]+\.yaml$/.test(path))
1705
1767
  return void 0;
1706
- const q = await readFile2(join4(root, ...path.split("/")), "utf8").then((t) => (0, import_yaml2.parse)(t), () => void 0);
1768
+ const q = await readFile2(join5(root, ...path.split("/")), "utf8").then((t) => (0, import_yaml2.parse)(t), () => void 0);
1707
1769
  if (!q || q.state !== "answered" || typeof q.repo !== "string")
1708
1770
  return void 0;
1709
1771
  const rerun = String(q.rerun ?? "").trim();
@@ -1711,7 +1773,7 @@ async function answeredMapQuestionRepo(root, path) {
1711
1773
  return of?.[1] === q.repo ? q.repo : void 0;
1712
1774
  }
1713
1775
  async function taskViews(root, change, prs) {
1714
- const dir = join4(changesDirOf(root), change);
1776
+ const dir = join5(changesDirOf(root), change);
1715
1777
  let tasks = readChangeTasks(await readChangeFiles(dir));
1716
1778
  const states = prs ? await Promise.all(tasks.map((t) => settleTaskPr(root, change, t.id, {
1717
1779
  ...prs.gitHost ? { gitHost: prs.gitHost } : {},
@@ -1765,12 +1827,12 @@ async function taskViews(root, change, prs) {
1765
1827
  return out;
1766
1828
  }
1767
1829
  async function runView(root, change, runId) {
1768
- const dir = join4(runsDirOf(root), change, runId);
1769
- const text = await readFile2(join4(dir, "run.json"), "utf8").catch(() => void 0);
1830
+ const dir = join5(runsDirOf(root), change, runId);
1831
+ const text = await readFile2(join5(dir, "run.json"), "utf8").catch(() => void 0);
1770
1832
  if (!text)
1771
1833
  return void 0;
1772
1834
  const r = JSON.parse(text);
1773
- const manifest = await readFile2(join4(dir, "context-manifest.json"), "utf8").catch(() => "");
1835
+ const manifest = await readFile2(join5(dir, "context-manifest.json"), "utf8").catch(() => "");
1774
1836
  const tr = await taskRunOfRun(root, change, runId).catch(() => void 0);
1775
1837
  return {
1776
1838
  schemaVersion: RUN_SCHEMA_VERSION,
@@ -1820,7 +1882,7 @@ async function artifactPath(root, id, artifact, o = {}) {
1820
1882
  const a = ChangeArtifact.safeParse(artifact);
1821
1883
  if (!a.success)
1822
1884
  throw badRequest(`${artifact} is not an artifact. Use one of ${ChangeArtifact.options.join(", ")}.`);
1823
- const dir = join4(changesDirOf(root), id);
1885
+ const dir = join5(changesDirOf(root), id);
1824
1886
  const files = o.listed ?? await artifactFiles(dir, a.data);
1825
1887
  if (o.file) {
1826
1888
  if (!files.includes(o.file))
@@ -1838,7 +1900,7 @@ function uiRoutes(r, ctx, deps = {}) {
1838
1900
  const { root, user, jobs } = ctx;
1839
1901
  const confirmed2 = (write, target, given) => requireConfirmation(ctx.confirmations, write, target, given);
1840
1902
  const readyView = async (change) => {
1841
- const { deployOrderOf } = await import("./chunk-WTLFRINF.js");
1903
+ const { deployOrderOf } = await import("./chunk-RGL7ZSJ7.js");
1842
1904
  const repoOrder = await deployOrderOf(root, change);
1843
1905
  const prStates = /* @__PURE__ */ new Map();
1844
1906
  for (const t of await taskViews(root, change, {
@@ -1866,7 +1928,7 @@ function uiRoutes(r, ctx, deps = {}) {
1866
1928
  throw badRequest("plan is the refusal's plan (its job's result's refused.plan) for the list being confirmed.");
1867
1929
  if (b.plan === void 0)
1868
1930
  return;
1869
- const { lastBuildOf } = await import("./chunk-B4WPO6FX.js");
1931
+ const { lastBuildOf } = await import("./chunk-XSLFANKH.js");
1870
1932
  const last = await lastBuildOf(root);
1871
1933
  if (last?.outcome !== "refused" || !ofCommand(last.command) || last.refused?.plan !== b.plan)
1872
1934
  throw conflict("What the build would remove or discard isn't what the page listed any more. Nothing written: look at the list again.");
@@ -1881,7 +1943,7 @@ function uiRoutes(r, ctx, deps = {}) {
1881
1943
  c.progress(1, 1, res.code === 0 ? "Done" : "Stopped");
1882
1944
  ctx.events.publish({ type: "file.changed", path: "." });
1883
1945
  const raw = [...res.out, ...res.err];
1884
- const { appLines: appLines2 } = await import("./chunk-E7Q52EOO.js");
1946
+ const { appLines: appLines2 } = await import("./chunk-ZLQQJBPF.js");
1885
1947
  const lines = appLines2(raw);
1886
1948
  const next = res.code === 0 ? void 0 : syncNextOf(raw);
1887
1949
  return {
@@ -1913,7 +1975,7 @@ function uiRoutes(r, ctx, deps = {}) {
1913
1975
  };
1914
1976
  const doneMayStart = async (runId) => {
1915
1977
  const before = await findRun(root, runId);
1916
- const { hasKeptResume: hasKeptResume2 } = await import("./chunk-E7Q52EOO.js");
1978
+ const { hasKeptResume: hasKeptResume2 } = await import("./chunk-ZLQQJBPF.js");
1917
1979
  const onlyResume = before.state === "validated" && await hasKeptResume2(root, runId);
1918
1980
  if (before.state === "validated" && !onlyResume || before.state === "cancelled")
1919
1981
  throw conflict(`Run ${runId} is already ${before.state}.`);
@@ -1935,17 +1997,17 @@ function uiRoutes(r, ctx, deps = {}) {
1935
1997
  }
1936
1998
  const after = await findRun(root, runId);
1937
1999
  ctx.events.publish({ type: "run.changed", runId: after.runId, state: after.state });
1938
- const { resumeAfterDone, appLines: appLines2 } = await import("./chunk-E7Q52EOO.js");
2000
+ const { resumeAfterDone, appLines: appLines2 } = await import("./chunk-ZLQQJBPF.js");
1939
2001
  if (res.code !== 0)
1940
2002
  throw refused({ ...res, out: appLines2(res.out), err: appLines2(res.err) });
1941
2003
  const stepRunner = deps.runStep ?? (async (args) => {
1942
- const { main } = await import("./chunk-DGNTEKF6.js");
2004
+ const { main } = await import("./chunk-VTE3MIWY.js");
1943
2005
  const out = [];
1944
2006
  const err = [];
1945
2007
  const code = await main([...args, "--root", root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
1946
2008
  return { code, out, err };
1947
2009
  });
1948
- const { hasKeptResume: kept } = await import("./chunk-E7Q52EOO.js");
2010
+ const { hasKeptResume: kept } = await import("./chunk-ZLQQJBPF.js");
1949
2011
  const resumed = !await kept(root, after.runId) ? void 0 : await trackedLocal(ctx, `Finishing the step: ${after.runId}`, () => resumeAfterDone(root, stepRunner, after.change, after.runId), { meta: { handoffRun: after.runId } }).catch((e) => ({ lines: [e.message] }));
1950
2012
  if (resumed)
1951
2013
  ctx.events.publish({ type: "file.changed", path: changesRelOf(root) });
@@ -1965,7 +2027,7 @@ function uiRoutes(r, ctx, deps = {}) {
1965
2027
  };
1966
2028
  startAutoDone(ctx, (runId) => doneRun(runId, "app"), deps.autoDone ?? {});
1967
2029
  return r.add("POST", "/api/facts/{repo}/apply", async ({ params, body }) => {
1968
- const { verifyCommand } = await import("./chunk-3NGHSBVS.js");
2030
+ const { verifyCommand } = await import("./chunk-6D7HF6V4.js");
1969
2031
  const b = parseBody(api_exports.FactsApplyRequest, body);
1970
2032
  const repo = params.repo;
1971
2033
  if (!FACTS_REPO.test(repo))
@@ -1974,7 +2036,7 @@ function uiRoutes(r, ctx, deps = {}) {
1974
2036
  throw notFound(`There is no repo ${repo} in this workspace.`);
1975
2037
  await refusalStillListed(b, (c) => c === `atticus verify ${repo} --write`);
1976
2038
  return asJob(`Applying to ${repo}`, async () => {
1977
- const { lastBuildOf } = await import("./chunk-B4WPO6FX.js");
2039
+ const { lastBuildOf } = await import("./chunk-XSLFANKH.js");
1978
2040
  const before = JSON.stringify(await lastBuildOf(root) ?? null);
1979
2041
  const ran = await run((io) => verifyCommand(root, repo, {
1980
2042
  write: true,
@@ -1991,7 +2053,7 @@ function uiRoutes(r, ctx, deps = {}) {
1991
2053
  });
1992
2054
  }).add("GET", "/api/upgrade", async () => {
1993
2055
  const r2 = await keptAnswer(root, "upgrade", async () => {
1994
- const { newerAtticusOf, upgradeCheck } = await import("./chunk-CWKQRP6Y.js");
2056
+ const { newerAtticusOf, upgradeCheck } = await import("./chunk-PNU5SNYP.js");
1995
2057
  const c = await upgradeCheck(root);
1996
2058
  const stamp3 = c.stamp?.atticus ?? newerAtticusOf(c);
1997
2059
  const body = {
@@ -2002,11 +2064,11 @@ function uiRoutes(r, ctx, deps = {}) {
2002
2064
  };
2003
2065
  return { status: 200, body };
2004
2066
  });
2005
- const { upgradedPaths, UPGRADE_STAMP } = await import("./chunk-W7NNZFIL.js");
2067
+ const { upgradedPaths, UPGRADE_STAMP } = await import("./chunk-OZN3KT74.js");
2006
2068
  const upgraded = upgradedPaths(root).filter((p) => p !== UPGRADE_STAMP);
2007
2069
  return { ...r2, body: { ...r2.body, upgraded } };
2008
2070
  }).add("POST", "/api/upgrade", async () => {
2009
- const { newerThan, newerWords, upgradeCheck, upgradeCommand } = await import("./chunk-CWKQRP6Y.js");
2071
+ const { newerThan, newerWords, upgradeCheck, upgradeCommand } = await import("./chunk-PNU5SNYP.js");
2010
2072
  const c = await upgradeCheck(root);
2011
2073
  if (c.newer)
2012
2074
  throw conflict(newerWords(c));
@@ -2014,12 +2076,12 @@ function uiRoutes(r, ctx, deps = {}) {
2014
2076
  throw conflict(`Nothing to upgrade: up to date for Atticus ${c.atticus}.`);
2015
2077
  return asJob("Upgrading the metarepo", async () => {
2016
2078
  const ran = await run((io) => upgradeCommand(root, { by: user }, io));
2017
- const { upgradedPaths, UPGRADE_STAMP } = await import("./chunk-W7NNZFIL.js");
2079
+ const { upgradedPaths, UPGRADE_STAMP } = await import("./chunk-OZN3KT74.js");
2018
2080
  const upgraded = upgradedPaths(root).filter((p) => p !== UPGRADE_STAMP);
2019
2081
  return { ...ran, extra: { upgraded } };
2020
2082
  });
2021
2083
  }).add("GET", "/api/propose", async ({ query }) => {
2022
- const { proposePlan, PROPOSE_SCOPES } = await import("./chunk-W7NNZFIL.js");
2084
+ const { proposePlan, PROPOSE_SCOPES } = await import("./chunk-OZN3KT74.js");
2023
2085
  const scope = query.get("scope") ?? "";
2024
2086
  if (!PROPOSE_SCOPES.includes(scope))
2025
2087
  throw refused({
@@ -2042,7 +2104,7 @@ function uiRoutes(r, ctx, deps = {}) {
2042
2104
  }).add("POST", "/api/propose", async ({ body }) => {
2043
2105
  const b = parseBody(api_exports.ProposeRequest, body);
2044
2106
  confirmed2("propose", b.scope, b.confirmation);
2045
- const { proposeForReview } = await import("./chunk-W7NNZFIL.js");
2107
+ const { proposeForReview } = await import("./chunk-OZN3KT74.js");
2046
2108
  return asJob("Proposing for review", () => run((io) => proposeForReview(root, {
2047
2109
  scope: b.scope,
2048
2110
  by: user,
@@ -2051,15 +2113,15 @@ function uiRoutes(r, ctx, deps = {}) {
2051
2113
  ...b.branch ? { branch: b.branch } : {}
2052
2114
  }, io)));
2053
2115
  }).add("POST", "/api/propose/bring-in", async () => {
2054
- const { bringInMerged } = await import("./chunk-W7NNZFIL.js");
2116
+ const { bringInMerged } = await import("./chunk-OZN3KT74.js");
2055
2117
  return asJob("Bringing in what merged", () => run((io) => bringInMerged(root, io)));
2056
2118
  }).add("POST", "/api/propose/upstream", async ({ body }) => {
2057
2119
  const b = parseBody(api_exports.UpstreamRequest, body);
2058
- const { setUpstream } = await import("./chunk-W7NNZFIL.js");
2120
+ const { setUpstream } = await import("./chunk-OZN3KT74.js");
2059
2121
  return asJob(`Setting the upstream to ${b.upstream}`, () => run((io) => setUpstream(root, b.upstream, io)));
2060
2122
  }).add("POST", "/api/changes/{changeId}/conformance", async ({ params }) => {
2061
2123
  await readChange(root, params.changeId);
2062
- const { changeConformCommand } = await import("./chunk-M25UUEKC.js");
2124
+ const { changeConformCommand } = await import("./chunk-VKBJ4JDV.js");
2063
2125
  return asJob(`Checking ${params.changeId}'s code against its design`, () => run((io) => changeConformCommand(root, params.changeId, { findingsAnswer: true }, io)));
2064
2126
  }).add("GET", "/api/change-types", async () => {
2065
2127
  const op = await loadOrgPack(orgPackDirOf(root));
@@ -2148,7 +2210,7 @@ function uiRoutes(r, ctx, deps = {}) {
2148
2210
  const art = ChangeArtifact.safeParse(params.artifact);
2149
2211
  if (!art.success)
2150
2212
  await artifactPath(root, params.changeId, params.artifact);
2151
- const dir = join4(changesDirOf(root), params.changeId);
2213
+ const dir = join5(changesDirOf(root), params.changeId);
2152
2214
  const listed = art.success ? await artifactFiles(dir, art.data) : [];
2153
2215
  const files = [];
2154
2216
  const problems = /* @__PURE__ */ Object.create(null);
@@ -2168,7 +2230,7 @@ function uiRoutes(r, ctx, deps = {}) {
2168
2230
  file,
2169
2231
  listed
2170
2232
  });
2171
- content = await readFile2(join4(dir, rel), "utf8").catch((e) => {
2233
+ content = await readFile2(join5(dir, rel), "utf8").catch((e) => {
2172
2234
  if (e.code === "ENOENT")
2173
2235
  throw notFound(`${file} isn't there any more: it was deleted or moved.`);
2174
2236
  return "";
@@ -2194,7 +2256,7 @@ function uiRoutes(r, ctx, deps = {}) {
2194
2256
  orNew: true,
2195
2257
  file: query.get("file")
2196
2258
  });
2197
- const content = await readFile2(join4(changesDirOf(root), params.changeId, rel), "utf8").catch(() => "");
2259
+ const content = await readFile2(join5(changesDirOf(root), params.changeId, rel), "utf8").catch(() => "");
2198
2260
  return {
2199
2261
  status: 200,
2200
2262
  body: {
@@ -2211,15 +2273,15 @@ function uiRoutes(r, ctx, deps = {}) {
2211
2273
  orNew: true,
2212
2274
  file: query.get("file")
2213
2275
  });
2214
- const file = join4(changesDirOf(root), params.changeId, rel);
2276
+ const file = join5(changesDirOf(root), params.changeId, rel);
2215
2277
  const was = await readFile2(file, "utf8").catch(() => void 0);
2216
2278
  const now = was ?? "";
2217
2279
  if (sha2(now) !== b.baseSha256)
2218
2280
  throw conflict(`${rel} changed since you opened it. Reload it, then make your edit again.`);
2219
2281
  await mkdir(dirname3(file), { recursive: true });
2220
2282
  await writeFileIfUnchanged(file, was, b.content);
2221
- const { recordPersonSave: recordPersonSave2 } = await import("./chunk-YPXBGNUV.js");
2222
- await recordPersonSave2(join4(changesDirOf(root), params.changeId), params.changeId, {
2283
+ const { recordPersonSave: recordPersonSave2 } = await import("./chunk-SU2JHMIS.js");
2284
+ await recordPersonSave2(join5(changesDirOf(root), params.changeId), params.changeId, {
2223
2285
  file: rel,
2224
2286
  who: user,
2225
2287
  at: (deps.now ? new Date(deps.now) : /* @__PURE__ */ new Date()).toISOString(),
@@ -2444,7 +2506,7 @@ function uiRoutes(r, ctx, deps = {}) {
2444
2506
  })));
2445
2507
  if (res.code !== 0)
2446
2508
  throw refused(res);
2447
- const repos = await readFile2(join4(changesDirOf(root), params.changeId, "repos.yaml"), "utf8").catch(() => "");
2509
+ const repos = await readFile2(join5(changesDirOf(root), params.changeId, "repos.yaml"), "utf8").catch(() => "");
2448
2510
  return { status: 200, body: { lines: res.out, reposYaml: repos } };
2449
2511
  }).add("POST", "/api/changes/{changeId}/handoff", async ({ params, body }) => {
2450
2512
  await readChange(root, params.changeId);
@@ -2516,7 +2578,7 @@ function uiRoutes(r, ctx, deps = {}) {
2516
2578
  const res = await run((io) => changeSync(root, params.changeId, { by: user, approve, ...b.repo ? { repo: b.repo } : {} }, io, changeDeps));
2517
2579
  if (res.code === 2)
2518
2580
  throw refused(res);
2519
- const { appLines: appLines2 } = await import("./chunk-E7Q52EOO.js");
2581
+ const { appLines: appLines2 } = await import("./chunk-ZLQQJBPF.js");
2520
2582
  return {
2521
2583
  status: 200,
2522
2584
  body: {
@@ -2526,14 +2588,14 @@ function uiRoutes(r, ctx, deps = {}) {
2526
2588
  };
2527
2589
  }).add("GET", "/api/changes/{changeId}/inputs", async ({ params }) => {
2528
2590
  const c = await readChange(root, params.changeId);
2529
- const { readChangeInputs } = await import("./chunk-W6OY2PMB.js");
2591
+ const { readChangeInputs } = await import("./chunk-CP4KZA33.js");
2530
2592
  return {
2531
2593
  status: 200,
2532
- body: api_exports.ChangeInputList.parse(await readChangeInputs(join4(changesDirOf(root), c.id)))
2594
+ body: api_exports.ChangeInputList.parse(await readChangeInputs(join5(changesDirOf(root), c.id)))
2533
2595
  };
2534
2596
  }).add("GET", "/api/changes/{changeId}/prototypes", async ({ params }) => {
2535
2597
  const c = await readChange(root, params.changeId);
2536
- const { changePrototypes } = await import("./chunk-VTQ55N4O.js");
2598
+ const { changePrototypes } = await import("./chunk-GOB2TYE5.js");
2537
2599
  return {
2538
2600
  status: 200,
2539
2601
  body: api_exports.ChangePrototypeList.parse(await changePrototypes(root, c.id))
@@ -2541,7 +2603,7 @@ function uiRoutes(r, ctx, deps = {}) {
2541
2603
  }).add("POST", "/api/changes/{changeId}/prototypes", async ({ params, body }) => {
2542
2604
  const c = await readChange(root, params.changeId);
2543
2605
  const b = parseBody(api_exports.ComparePrototypeRequest, body);
2544
- const { attachPrototype, changePrototypes } = await import("./chunk-VTQ55N4O.js");
2606
+ const { attachPrototype, changePrototypes } = await import("./chunk-GOB2TYE5.js");
2545
2607
  const res = await run((io) => attachPrototype(root, c.id, b.repo, { by: user, ...deps.now ? { now: new Date(deps.now) } : {} }, io));
2546
2608
  if (res.code !== 0)
2547
2609
  throw refused(res);
@@ -2559,7 +2621,7 @@ function uiRoutes(r, ctx, deps = {}) {
2559
2621
  const bytes = new Uint8Array(Buffer.from(b.content, "base64"));
2560
2622
  if (bytes.length > MAX_ATTACH)
2561
2623
  throw new HttpError(413, "The file is too large", "Attach a file of 15 MB or less.");
2562
- const { attachFiles } = await import("./chunk-OY2VC2IU.js");
2624
+ const { attachFiles } = await import("./chunk-OHAMT5OA.js");
2563
2625
  const r2 = await attachFiles(root, c.id, [{ name: b.name, bytes }], user);
2564
2626
  if (!r2.added.length)
2565
2627
  throw new HttpError(422, "Atticus can't attach that", r2.refused[0]?.why ?? "", {
@@ -2568,7 +2630,7 @@ function uiRoutes(r, ctx, deps = {}) {
2568
2630
  return { status: 201, body: api_exports.AttachResult.parse(r2) };
2569
2631
  }, { maxBody: Math.ceil(MAX_ATTACH * 4 / 3) + 64 * 1024 }).add("GET", "/api/changes/{changeId}/runs", async ({ params }) => {
2570
2632
  await readChange(root, params.changeId);
2571
- const dir = join4(runsDirOf(root), params.changeId);
2633
+ const dir = join5(runsDirOf(root), params.changeId);
2572
2634
  const out = [];
2573
2635
  for (const id of (await readdir2(dir).catch(() => [])).sort()) {
2574
2636
  const v = await runView(root, params.changeId, id);
@@ -2580,7 +2642,7 @@ function uiRoutes(r, ctx, deps = {}) {
2580
2642
  await readChange(root, params.changeId);
2581
2643
  const b = parseBody(api_exports.StartRunRequest, body);
2582
2644
  await requireConfirmedModel(root, b.runtime);
2583
- const before = new Set(await readdir2(join4(runsDirOf(root), params.changeId)).catch(() => []));
2645
+ const before = new Set(await readdir2(join5(runsDirOf(root), params.changeId)).catch(() => []));
2584
2646
  let res;
2585
2647
  if (b.task) {
2586
2648
  let level = b.autonomy ? b.autonomy === "draft-and-pr" ? "pr" : b.autonomy === "plan-only" ? "plan" : "draft" : void 0;
@@ -2625,7 +2687,7 @@ function uiRoutes(r, ctx, deps = {}) {
2625
2687
  throw badRequest(`Start ${b.agent} from its screen; this call starts task runs, the story writer and the critic.`);
2626
2688
  if (res.code === 2)
2627
2689
  throw refused(res);
2628
- const after = (await readdir2(join4(runsDirOf(root), params.changeId)).catch(() => [])).filter((x) => !before.has(x)).sort();
2690
+ const after = (await readdir2(join5(runsDirOf(root), params.changeId)).catch(() => [])).filter((x) => !before.has(x)).sort();
2629
2691
  if (after.length === 0)
2630
2692
  throw refused(res);
2631
2693
  const v = await runView(root, params.changeId, after.at(-1));
@@ -2678,7 +2740,7 @@ function uiRoutes(r, ctx, deps = {}) {
2678
2740
  const owner = await findTaskRunOfRun(root, v.runId);
2679
2741
  if (owner && owner.waiting !== v.runId)
2680
2742
  throw conflict(taskRunNotWaiting(v.runId, owner));
2681
- const file = join4(runsDirOf(root), v.change, v.runId, "run.json");
2743
+ const file = join5(runsDirOf(root), v.change, v.runId, "run.json");
2682
2744
  const was = await readFile2(file, "utf8");
2683
2745
  const rec = JSON.parse(was);
2684
2746
  rec.state = "prepared";
@@ -2723,7 +2785,7 @@ function uiRoutes(r, ctx, deps = {}) {
2723
2785
  throw conflict(`Run ${v.runId} is already ${v.state}.`);
2724
2786
  if (doneBusy.has(v.runId))
2725
2787
  throw conflict(`Done for ${v.runId} is running; wait for it to finish.`);
2726
- const file = join4(runsDirOf(root), v.change, v.runId, "run.json");
2788
+ const file = join5(runsDirOf(root), v.change, v.runId, "run.json");
2727
2789
  const cancelRun = async () => {
2728
2790
  const was = await readFile2(file, "utf8");
2729
2791
  const rec = JSON.parse(was);
@@ -2880,7 +2942,7 @@ var import_yaml3 = __toESM(require_dist(), 1);
2880
2942
  import { createHash as createHash4 } from "node:crypto";
2881
2943
  import { readdir as readdir3, readFile as readFile3, stat as stat3 } from "node:fs/promises";
2882
2944
  import { homedir } from "node:os";
2883
- import { join as join5, resolve } from "node:path";
2945
+ import { join as join6, resolve } from "node:path";
2884
2946
  async function run2(f) {
2885
2947
  const out = [];
2886
2948
  const err = [];
@@ -2956,9 +3018,9 @@ async function filesUnder2(dir, prefix = "") {
2956
3018
  for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {
2957
3019
  const rel = prefix ? `${prefix}/${e.name}` : e.name;
2958
3020
  if (e.isDirectory())
2959
- out.push(...await filesUnder2(join5(dir, e.name), rel));
3021
+ out.push(...await filesUnder2(join6(dir, e.name), rel));
2960
3022
  else
2961
- out.push({ path: rel, bytes: (await stat3(join5(dir, e.name))).size });
3023
+ out.push({ path: rel, bytes: (await stat3(join6(dir, e.name))).size });
2962
3024
  }
2963
3025
  return out;
2964
3026
  }
@@ -3019,7 +3081,7 @@ async function findStep(root, id, change) {
3019
3081
  return s;
3020
3082
  }
3021
3083
  var sha3 = (s) => createHash4("sha256").update(s).digest("hex");
3022
- var snowText = (dir) => readFile3(join5(dir, "snow.md"), "utf8").catch(() => "");
3084
+ var snowText = (dir) => readFile3(join6(dir, "snow.md"), "utf8").catch(() => "");
3023
3085
  var SyncEntries = external_exports.object({
3024
3086
  requests: external_exports.array(external_exports.object({ key: external_exports.string(), id: external_exports.string() })).default([])
3025
3087
  });
@@ -3034,7 +3096,7 @@ async function changeRequests(root, change, templates, steps) {
3034
3096
  };
3035
3097
  let synced = [];
3036
3098
  try {
3037
- synced = SyncEntries.parse((0, import_yaml3.parse)(await readFile3(join5(dir, SYNC_FILE), "utf8"))).requests;
3099
+ synced = SyncEntries.parse((0, import_yaml3.parse)(await readFile3(join6(dir, SYNC_FILE), "utf8"))).requests;
3038
3100
  } catch {
3039
3101
  }
3040
3102
  return drafts.map((d) => {
@@ -3288,7 +3350,7 @@ function uiRunRoutes(r, ctx, deps = {}) {
3288
3350
  const b = parseBody2(api_exports.FillRequestFieldsRequest, body);
3289
3351
  const dir = changeFolder(root, c.id);
3290
3352
  const rel2 = `${changesRelOf(root)}/${c.id}/snow.md`;
3291
- const was = await readFile3(join5(dir, "snow.md"), "utf8").catch(() => void 0);
3353
+ const was = await readFile3(join6(dir, "snow.md"), "utf8").catch(() => void 0);
3292
3354
  if (was === void 0)
3293
3355
  throw notFound(`${c.id} has no snow.md: draft its requests first.`);
3294
3356
  if (sha3(was) !== b.baseSha256)
@@ -3301,7 +3363,7 @@ function uiRunRoutes(r, ctx, deps = {}) {
3301
3363
  throw new HttpError(422, "Atticus can't fill that", e.message);
3302
3364
  throw e;
3303
3365
  }
3304
- await writeFileIfUnchanged(join5(dir, "snow.md"), was, next);
3366
+ await writeFileIfUnchanged(join6(dir, "snow.md"), was, next);
3305
3367
  ctx.events.publish({ type: "file.changed", path: rel2 });
3306
3368
  const op = await pack();
3307
3369
  const now = (await changeRequests(root, c.id, op.serviceRequests, [])).find((r2) => r2.heading === b.heading);
@@ -3465,8 +3527,8 @@ function uiRunRoutes(r, ctx, deps = {}) {
3465
3527
  }).add("GET", "/api/governance", async () => {
3466
3528
  const conf = jsonOf(await run2((io) => conformanceCommand(orgPackDirOf(root), { kind: "org-pack", json: true }, io)));
3467
3529
  const constitution = await loadConstitution();
3468
- const org = await readPackFiles(root, join5(orgPackDirOf(root), "checklists"));
3469
- const team = await readPackFiles(root, join5(orgPackDirOf(root), "teams"));
3530
+ const org = await readPackFiles(root, join6(orgPackDirOf(root), "checklists"));
3531
+ const team = await readPackFiles(root, join6(orgPackDirOf(root), "teams"));
3470
3532
  const layered = layerRules([
3471
3533
  { pack: constitution, file: "built-in", origin: "constitution" },
3472
3534
  ...org.packs.map((p) => ({ ...p, origin: "org" })),
@@ -3565,12 +3627,12 @@ function uiRunRoutes(r, ctx, deps = {}) {
3565
3627
  };
3566
3628
  const items = [];
3567
3629
  for (const c of await openChanges2(root)) {
3568
- const dir = join5(changeFolder(root, c.id), "review", "defences");
3630
+ const dir = join6(changeFolder(root, c.id), "review", "defences");
3569
3631
  for (const f of (await readdir3(dir).catch(() => [])).sort()) {
3570
3632
  if (!f.endsWith(".json"))
3571
3633
  continue;
3572
3634
  try {
3573
- const list = JSON.parse(await readFile3(join5(dir, f), "utf8"));
3635
+ const list = JSON.parse(await readFile3(join6(dir, f), "utf8"));
3574
3636
  for (const q of list)
3575
3637
  items.push({
3576
3638
  change: c.id,
@@ -3870,7 +3932,7 @@ function uiKnowRoutes(r, ctx, o = {}) {
3870
3932
  const args = build(arg);
3871
3933
  if (!args)
3872
3934
  throw badRequest(`The ${name} view needs an id: /api/view/${name}/<id>.`);
3873
- const { main } = await import("./chunk-DGNTEKF6.js");
3935
+ const { main } = await import("./chunk-VTE3MIWY.js");
3874
3936
  const out = [];
3875
3937
  const err = [];
3876
3938
  const code = await main([...args, "--json", "--root", ctx.root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
@@ -3900,7 +3962,7 @@ function uiKnowRoutes(r, ctx, o = {}) {
3900
3962
  return { status: 200, body: { code, data: body, problems: err } };
3901
3963
  };
3902
3964
  const text = async (args) => {
3903
- const { main } = await import("./chunk-DGNTEKF6.js");
3965
+ const { main } = await import("./chunk-VTE3MIWY.js");
3904
3966
  const out = [];
3905
3967
  const err = [];
3906
3968
  const code = await main([...args, "--root", ctx.root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
@@ -3918,7 +3980,7 @@ function uiKnowRoutes(r, ctx, o = {}) {
3918
3980
  throw badRequest("Some fields aren't right.", {
3919
3981
  errors: b.error.issues.map((i) => ({ path: i.path.join("."), message: i.message }))
3920
3982
  });
3921
- const { triageDecide } = await import("./chunk-MP7W6OKP.js");
3983
+ const { triageDecide } = await import("./chunk-65VII57C.js");
3922
3984
  const out = [];
3923
3985
  const err = [];
3924
3986
  const code = await triageDecide(ctx.root, params.itemId, b.data.option, { by: ctx.user, ...b.data.reason ? { reason: b.data.reason } : {} }, { out: (l) => out.push(l), err: (l) => err.push(l) });
@@ -4045,7 +4107,7 @@ function refused3(r) {
4045
4107
  return r.code === 2 ? badRequest(detail) : new HttpError(422, "Atticus refused", detail);
4046
4108
  }
4047
4109
  function uiInitiativeRoutes(r, ctx) {
4048
- const commands = () => import("./chunk-W4SWXJZQ.js");
4110
+ const commands = () => import("./chunk-J5AJRTID.js");
4049
4111
  const changed = () => ctx.events.publish({ type: "file.changed", path: "catalog/curated" });
4050
4112
  return r.add("POST", "/api/initiatives", async ({ body }) => {
4051
4113
  const b = parseBody3(api_exports.NewInitiativeRequest, body);
@@ -4124,9 +4186,9 @@ function uiQuestionRoutes(r, ctx, deps = {}) {
4124
4186
  throw badRequest("role is product, architecture, analysis or delivery, or left out.");
4125
4187
  const onFile = await listQuestions(ctx.root);
4126
4188
  const every = { ...onFile, questions: onFile.questions.filter((q) => !q.finding) };
4127
- const { routeQuestions } = await import("./chunk-CHS5BJ34.js");
4189
+ const { routeQuestions } = await import("./chunk-GGCRLU4L.js");
4128
4190
  const routedAll = await routeQuestions(ctx.root, every.questions, mine ? { mine: ctx.user } : {});
4129
- const { stageQuestions, roleWithStage, isChangeQuestion, countByRole, personsRoles } = await import("./chunk-HDWVR5KD.js");
4191
+ const { stageQuestions, roleWithStage, isChangeQuestion, countByRole, personsRoles } = await import("./chunk-JNAJH2KI.js");
4130
4192
  const stages = await stageQuestions(ctx.root);
4131
4193
  const roleOf = (q) => roleWithStage(q, stages);
4132
4194
  for (const q of every.questions) {
@@ -4177,13 +4239,13 @@ function uiQuestionRoutes(r, ctx, deps = {}) {
4177
4239
  return { status: 200, body };
4178
4240
  };
4179
4241
  return r.add("GET", "/api/questions", async ({ query }) => keptAnswer(ctx.root, `questions?${query.toString()}&by=${ctx.user}`, () => questionsAnswer(query), () => checkoutsStamp(ctx.root))).add("GET", "/api/owner-questions", async () => keptAnswer(ctx.root, "owner-questions", async () => {
4180
- const { ownerQuestions } = await import("./chunk-SSYD4XIW.js");
4242
+ const { ownerQuestions } = await import("./chunk-LQM2YZUX.js");
4181
4243
  return { status: 200, body: await ownerQuestions(ctx.root, { now: now() }) };
4182
4244
  })).add("POST", "/api/owner-questions/{id}/answer", async ({ params, body }) => {
4183
4245
  const b = api_exports.OwnerAnswerRequest.safeParse(body ?? {});
4184
4246
  if (!b.success || !b.data.answer.trim())
4185
4247
  throw badRequest('Answer with { answer: "what the owner said" }.');
4186
- const { answerOwnerQuestion, OwnerQuestionError } = await import("./chunk-SSYD4XIW.js");
4248
+ const { answerOwnerQuestion, OwnerQuestionError } = await import("./chunk-LQM2YZUX.js");
4187
4249
  try {
4188
4250
  const r2 = await answerOwnerQuestion(ctx.root, params.id, b.data.answer, {
4189
4251
  by: ctx.user,
@@ -4208,13 +4270,13 @@ function uiQuestionRoutes(r, ctx, deps = {}) {
4208
4270
  throw notFound(`There is no question ${params.id}.`);
4209
4271
  if (q.askedBy.step !== TARGETS_STEP_ID && q.askedBy.step !== TOPICS_STEP_ID)
4210
4272
  throw new HttpError(422, "That question doesn't ask where a call goes or who owns a topic", `${q.id} isn't a targets or topics question, so it has no picker.`);
4211
- const { pickerOf } = await import("./chunk-R7VX5BSP.js");
4273
+ const { pickerOf } = await import("./chunk-6J4PQWNI.js");
4212
4274
  return { status: 200, body: { picks: await pickerOf(ctx.root) } };
4213
4275
  }).add("GET", "/api/questions/{id}/evidence", async ({ params }) => {
4214
4276
  const q = await readQuestion(ctx.root, params.id).catch(() => void 0);
4215
4277
  if (!q)
4216
4278
  throw notFound(`There is no question ${params.id}.`);
4217
- const { evidenceExcerpts } = await import("./chunk-S6TLXRBR.js");
4279
+ const { evidenceExcerpts } = await import("./chunk-GNY4LOHN.js");
4218
4280
  return {
4219
4281
  status: 200,
4220
4282
  body: {
@@ -4259,7 +4321,7 @@ function uiQuestionRoutes(r, ctx, deps = {}) {
4259
4321
  const q0 = await readQuestion(ctx.root, params.id).catch(() => void 0);
4260
4322
  if (!q0)
4261
4323
  throw notFound(`There is no question ${params.id}.`);
4262
- const { targetAnswerOf, offerLine } = await import("./chunk-R7VX5BSP.js");
4324
+ const { targetAnswerOf, offerLine } = await import("./chunk-6J4PQWNI.js");
4263
4325
  const t = await targetAnswerOf(ctx.root, q0, target, {
4264
4326
  ...addSystem ? { addSystem } : {},
4265
4327
  ...name ? { name } : {}
@@ -4548,7 +4610,7 @@ function uiAcrossRoutes(r, ctx) {
4548
4610
  var import_yaml4 = __toESM(require_dist(), 1);
4549
4611
  import { readdir as readdir5, readFile as readFile4 } from "node:fs/promises";
4550
4612
  import { existsSync as existsSync2 } from "node:fs";
4551
- import { join as join6 } from "node:path";
4613
+ import { join as join7 } from "node:path";
4552
4614
  var lensOf = (v, fallback) => {
4553
4615
  if (v === null)
4554
4616
  return fallback;
@@ -4613,7 +4675,7 @@ function uiGraphRoutes(r, ctx) {
4613
4675
  const viewsRel = diagramsRelOf(ctx.root) + "/views";
4614
4676
  const readLayout = async (view3) => {
4615
4677
  try {
4616
- const f = DiagramLayout.safeParse((0, import_yaml4.parse)(await readFile4(join6(ctx.root, layoutRel(view3)), "utf8")));
4678
+ const f = DiagramLayout.safeParse((0, import_yaml4.parse)(await readFile4(join7(ctx.root, layoutRel(view3)), "utf8")));
4617
4679
  if (!f.success)
4618
4680
  throw new HttpError(422, "Atticus refused", `${layoutRel(view3)} isn't a layout file.`);
4619
4681
  return f.data;
@@ -4669,11 +4731,11 @@ function uiGraphRoutes(r, ctx) {
4669
4731
  }
4670
4732
  };
4671
4733
  }).add("GET", "/api/graph/views", async () => {
4672
- const dir = join6(ctx.root, ...viewsRel.split("/"));
4734
+ const dir = join7(ctx.root, ...viewsRel.split("/"));
4673
4735
  const names = (await readdir5(dir).catch(() => [])).filter((n) => n.endsWith(".yaml")).sort();
4674
4736
  const views = [];
4675
4737
  for (const n of names) {
4676
- const v = api_exports.SavedCanvasView.safeParse((0, import_yaml4.parse)(await readFile4(join6(dir, n), "utf8").catch(() => "")));
4738
+ const v = api_exports.SavedCanvasView.safeParse((0, import_yaml4.parse)(await readFile4(join7(dir, n), "utf8").catch(() => "")));
4677
4739
  if (v.success)
4678
4740
  views.push(v.data);
4679
4741
  }
@@ -4689,9 +4751,9 @@ function uiGraphRoutes(r, ctx) {
4689
4751
  });
4690
4752
  const v = { ...b.data, by: ctx.user, at: (/* @__PURE__ */ new Date()).toISOString() };
4691
4753
  const rel = `${viewsRel}/${v.name}.yaml`;
4692
- if (existsSync2(join6(ctx.root, rel)) && query.get("replace") !== "1")
4754
+ if (existsSync2(join7(ctx.root, rel)) && query.get("replace") !== "1")
4693
4755
  throw conflict(`There is a view ${v.name} already (${rel}): pick another name, or replace it.`);
4694
- await writeFileAtomic(join6(ctx.root, rel), (0, import_yaml4.stringify)(v));
4756
+ await writeFileAtomic(join7(ctx.root, rel), (0, import_yaml4.stringify)(v));
4695
4757
  ctx.events.publish({ type: "file.changed", path: rel });
4696
4758
  return { status: 200, body: v };
4697
4759
  }).add("GET", "/api/code-link", async ({ query }) => {
@@ -4712,7 +4774,7 @@ function uiGraphRoutes(r, ctx) {
4712
4774
  missing: `There is no checkout of ${repo} here (atticus sync clones it into the workspace).`
4713
4775
  }
4714
4776
  };
4715
- const path = join6(dir, ...m[1].split("/"));
4777
+ const path = join7(dir, ...m[1].split("/"));
4716
4778
  return {
4717
4779
  status: 200,
4718
4780
  body: {
@@ -4751,7 +4813,7 @@ function uiGraphRoutes(r, ctx) {
4751
4813
  at: (/* @__PURE__ */ new Date()).toISOString(),
4752
4814
  positions: sorted
4753
4815
  });
4754
- await writeFileAtomic(join6(ctx.root, layoutRel(view3)), (0, import_yaml4.stringify)(file));
4816
+ await writeFileAtomic(join7(ctx.root, layoutRel(view3)), (0, import_yaml4.stringify)(file));
4755
4817
  ctx.events.publish({ type: "file.changed", path: layoutRel(view3) });
4756
4818
  return {
4757
4819
  status: 200,
@@ -4762,7 +4824,7 @@ function uiGraphRoutes(r, ctx) {
4762
4824
 
4763
4825
  // packages/cli/dist/ui-api-specs.js
4764
4826
  import { stat as stat4 } from "node:fs/promises";
4765
- import { join as join7 } from "node:path";
4827
+ import { join as join8 } from "node:path";
4766
4828
  var idOf2 = (v, what) => {
4767
4829
  if (!RecordId.safeParse(v).success)
4768
4830
  throw badRequest(`${v} isn't a ${what} id. Ids are lowercase: a-z, 0-9, '.', '_' and '-'.`);
@@ -4867,8 +4929,8 @@ function uiSpecRoutes(r, ctx) {
4867
4929
  return { status: 200, body };
4868
4930
  });
4869
4931
  const deltasOf = async (change) => {
4870
- const dir = join7(changesDirOf(root), change);
4871
- if (!await stat4(join7(dir, "change.yaml")).catch(() => void 0))
4932
+ const dir = join8(changesDirOf(root), change);
4933
+ if (!await stat4(join8(dir, "change.yaml")).catch(() => void 0))
4872
4934
  throw notFound(`There is no change ${change}.`);
4873
4935
  return readDeltas(dir);
4874
4936
  };
@@ -4892,7 +4954,7 @@ function uiSpecRoutes(r, ctx) {
4892
4954
  });
4893
4955
  r.add("GET", "/api/changes/{changeId}/conformance", async ({ params }) => {
4894
4956
  const change = idOf2(params.changeId, "change");
4895
- const { conformanceOf } = await import("./chunk-GLNSLQSV.js");
4957
+ const { conformanceOf } = await import("./chunk-YRK6FTYB.js");
4896
4958
  const c = await conformanceOf(root, change);
4897
4959
  if (!c)
4898
4960
  throw notFound(`There is no change ${change}.`);
@@ -4907,7 +4969,7 @@ function uiSpecRoutes(r, ctx) {
4907
4969
  });
4908
4970
  r.add("GET", "/api/changes/{changeId}/impact", async ({ params }) => {
4909
4971
  const change = idOf2(params.changeId, "change");
4910
- const { changeImpactOf } = await import("./chunk-JGR4X2UA.js");
4972
+ const { changeImpactOf } = await import("./chunk-2YB35HY6.js");
4911
4973
  const i = await changeImpactOf(root, change);
4912
4974
  if (!i)
4913
4975
  throw notFound(`There is no change ${change}.`);
@@ -4943,7 +5005,7 @@ function uiSpecRoutes(r, ctx) {
4943
5005
  // packages/cli/dist/ui-api-knowledge.js
4944
5006
  var import_yaml5 = __toESM(require_dist(), 1);
4945
5007
  import { readFile as readFile5, stat as stat5 } from "node:fs/promises";
4946
- import { join as join8 } from "node:path";
5008
+ import { join as join9 } from "node:path";
4947
5009
  var STALE_DAYS = 14;
4948
5010
  var SLUG = /^[a-z0-9][a-z0-9-]*$/;
4949
5011
  var DAY = 864e5;
@@ -5028,7 +5090,7 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5028
5090
  const changed = (path) => ctx.events.publish({ type: "file.changed", path });
5029
5091
  const appliesView = async (change) => {
5030
5092
  const file = `${changesRelOf(root)}/${change}/knowledge.yaml`;
5031
- const present = await exists(join8(changeFolder(root, change), "knowledge.yaml"));
5093
+ const present = await exists(join9(changeFolder(root, change), "knowledge.yaml"));
5032
5094
  const doc = present ? await readKnowledgeApplies(root, change) : void 0;
5033
5095
  if (present && !doc)
5034
5096
  throw new HttpError(422, "Atticus can't read that file", `${file} isn't a valid knowledge list.`);
@@ -5060,8 +5122,8 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5060
5122
  const slash = id.indexOf("/");
5061
5123
  return hash > 0 && slash > 0 && slash < hash ? { source: id.slice(0, slash), page: id.slice(slash + 1, hash) } : void 0;
5062
5124
  };
5063
- const { knowledgePages } = await import("./chunk-PT77IUYQ.js");
5064
- const { sectionOf } = await import("./chunk-GF6GBHFN.js");
5125
+ const { knowledgePages } = await import("./chunk-Z56NN3AX.js");
5126
+ const { sectionOf } = await import("./chunk-OUVEXAM2.js");
5065
5127
  const pages = doc?.items.some((i) => i.id.includes("#")) ? await knowledgePages(root) : [];
5066
5128
  const records = doc?.items.length ? new Map((await readKnowledge(root, { cacheRoot: root })).items.map((r2) => [r2.id, r2])) : /* @__PURE__ */ new Map();
5067
5129
  const passageOf = (id) => {
@@ -5132,7 +5194,7 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5132
5194
  const op = await loadOrgPack(orgPackDirOf(root));
5133
5195
  const platforms = [];
5134
5196
  for (const { platform } of op.profiles) {
5135
- const text = await readFile5(join8(proposalsDirOf(root), "orgpack", `${platform}.yaml`), "utf8").catch(() => void 0);
5197
+ const text = await readFile5(join9(proposalsDirOf(root), "orgpack", `${platform}.yaml`), "utf8").catch(() => void 0);
5136
5198
  const data = text === void 0 ? void 0 : (0, import_yaml5.parse)(text);
5137
5199
  const proposals = Array.isArray(data?.proposals) ? data.proposals.flatMap((p) => {
5138
5200
  const x = OrgPackProposal.safeParse(p);
@@ -5163,7 +5225,7 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5163
5225
  const date = (await snapshotDates(root, w.id))[0];
5164
5226
  let snapshot;
5165
5227
  if (date) {
5166
- const file = join8(knowledgeDirOf(root), "snapshots", w.id, date, SNAPSHOT_FILE);
5228
+ const file = join9(knowledgeDirOf(root), "snapshots", w.id, date, SNAPSHOT_FILE);
5167
5229
  const text = await readFile5(file, "utf8").catch(() => void 0);
5168
5230
  const m = text === void 0 ? void 0 : SnapshotManifest.safeParse((0, import_yaml5.parse)(text));
5169
5231
  if (m?.success)
@@ -5352,7 +5414,7 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5352
5414
  if (source !== void 0)
5353
5415
  idOf3(source, "source");
5354
5416
  const ids = await snapshotSources(root);
5355
- const { inputsPassagePages, pastableArg } = await import("./chunk-PT77IUYQ.js");
5417
+ const { inputsPassagePages, pastableArg } = await import("./chunk-Z56NN3AX.js");
5356
5418
  const live = !ids.includes(INPUTS_SOURCE_ID) && (!source || source === INPUTS_SOURCE_ID) ? await inputsPassagePages(root) : [];
5357
5419
  if (source && !ids.includes(source) && !(source === INPUTS_SOURCE_ID && live.length))
5358
5420
  throw notFound(`${source} has no snapshot yet: atticus sources sync --source ${source}.`);
@@ -5423,7 +5485,7 @@ function uiKnowledgeRoutes(r, ctx, deps = {}) {
5423
5485
  const change = idOf3(params.changeId, "change");
5424
5486
  if (!await exists(changeFolder(root, change)))
5425
5487
  throw notFound(`There is no change ${change}.`);
5426
- const fileExists = await exists(join8(changeFolder(root, change), NEEDS_FILE));
5488
+ const fileExists = await exists(join9(changeFolder(root, change), NEEDS_FILE));
5427
5489
  const f = await readNeeds(root, change);
5428
5490
  if (fileExists && !f)
5429
5491
  throw new HttpError(422, "Atticus can't read that file", `${changesRelOf(root)}/${change}/${NEEDS_FILE} isn't a valid needs file.`);
@@ -5540,13 +5602,13 @@ git commit -m "${change}: the knowledge that applies"`
5540
5602
 
5541
5603
  // packages/cli/dist/ui-api-runs.js
5542
5604
  import { readFile as readFile6 } from "node:fs/promises";
5543
- import { join as join9 } from "node:path";
5605
+ import { join as join10 } from "node:path";
5544
5606
  var import_yaml6 = __toESM(require_dist(), 1);
5545
5607
  async function serverModel(root) {
5546
5608
  return (await configuredModel(root))?.type ?? null;
5547
5609
  }
5548
5610
  async function configuredModel(root) {
5549
- const text = await readFile6(join9(orgPackDirOf(root), "runtime.yaml"), "utf8").catch(() => void 0);
5611
+ const text = await readFile6(join10(orgPackDirOf(root), "runtime.yaml"), "utf8").catch(() => void 0);
5550
5612
  if (!text)
5551
5613
  return null;
5552
5614
  let y;
@@ -5567,7 +5629,7 @@ async function configuredModel(root) {
5567
5629
  function uiModelRunRoutes(r, ctx, deps = {}) {
5568
5630
  const root = ctx.root;
5569
5631
  const runStep = deps.runStep ?? (async (args) => {
5570
- const { main } = await import("./chunk-DGNTEKF6.js");
5632
+ const { main } = await import("./chunk-VTE3MIWY.js");
5571
5633
  const out = [];
5572
5634
  const err = [];
5573
5635
  const code = await main([...args, "--root", root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
@@ -5575,7 +5637,7 @@ function uiModelRunRoutes(r, ctx, deps = {}) {
5575
5637
  });
5576
5638
  return r.add("POST", "/api/runs/handoff", async ({ body }) => {
5577
5639
  const words = stepWords(body);
5578
- const { prepareStep } = await import("./chunk-E7Q52EOO.js");
5640
+ const { prepareStep } = await import("./chunk-ZLQQJBPF.js");
5579
5641
  const { code, prepared } = await prepareStep(root, runStep, words);
5580
5642
  ctx.events.publish({ type: "file.changed", path: runsRelOf(root) });
5581
5643
  if (!prepared.runId && code !== 0) {
@@ -5593,7 +5655,7 @@ function uiModelRunRoutes(r, ctx, deps = {}) {
5593
5655
  const busy = ctx.jobs.runningOf("step");
5594
5656
  if (busy)
5595
5657
  throw conflict(`An AI step is running on this server (${busy.id}): wait for it to finish, or cancel it.`);
5596
- const { commandTitleInputsOf } = await import("./chunk-DGNTEKF6.js");
5658
+ const { commandTitleInputsOf } = await import("./chunk-VTE3MIWY.js");
5597
5659
  const log = { command: commandTitleInputsOf([...words, "--mode", "model"]) };
5598
5660
  const job = ctx.jobs.start("step", async (c) => {
5599
5661
  c.progress(0, 1, `Running atticus ${words.join(" ")} with ${model}`);
@@ -5775,7 +5837,8 @@ var CopilotRun = class {
5775
5837
  return out;
5776
5838
  }
5777
5839
  /** How it ended: done, stopped by a person, or failed with the error said. */
5778
- finish(state, at, message) {
5840
+ /** `said` replaces the run's last line (beta.28: a Stop whose work is still ending says so). */
5841
+ finish(state, at, message, said) {
5779
5842
  const v = this.view;
5780
5843
  v.state = state;
5781
5844
  v.finishedAt = at;
@@ -5789,7 +5852,7 @@ var CopilotRun = class {
5789
5852
  }
5790
5853
  this.current = "run";
5791
5854
  return this.push("run", [
5792
- state === "done" ? "The run finished." : state === "stopped" ? "Stopped. The next run carries on from here." : `The run stopped: ${message ?? "an error"}`
5855
+ said ?? (state === "done" ? "The run finished." : state === "stopped" ? "Stopped. The next run carries on from here." : `The run stopped: ${message ?? "an error"}`)
5793
5856
  ]);
5794
5857
  }
5795
5858
  /** The state without the lines, for the live event. */
@@ -5801,15 +5864,35 @@ var CopilotRun = class {
5801
5864
 
5802
5865
  // packages/cli/dist/ui-api-copilot-runs.js
5803
5866
  var defaultStarter = (root) => async (o, io, deps) => {
5804
- const { mapAllCommand } = await import("./chunk-U36V664P.js");
5867
+ const { mapAllCommand } = await import("./chunk-G4USCLYQ.js");
5805
5868
  return mapAllCommand(root, o, io, {
5806
5869
  ...deps,
5807
- makeAcp: async () => (await import("./chunk-V7DGFWDB.js")).acpStepRunner(root)
5870
+ makeAcp: async () => (await import("./chunk-X4HPOZCJ.js")).acpStepRunner(root)
5808
5871
  });
5809
5872
  };
5873
+ var STOP_GRACE_MS = 15e3;
5874
+ var cutOff = (phase) => `The run didn't end within a few seconds of Stop, so it is shown stopped here; it was last ${phase}. Its work is still ending: a new run can start once it has.`;
5875
+ var WORK_ENDED = "The stopped run's work has ended: a new run can start.";
5876
+ function phaseOf(e) {
5877
+ switch (e?.type) {
5878
+ case void 0:
5879
+ case "plan":
5880
+ return "planning the run";
5881
+ case "repo":
5882
+ return `starting ${e.repo}`;
5883
+ case "session":
5884
+ return `in a Copilot session (${e.repo}, ${e.label})`;
5885
+ case "session.end":
5886
+ return `verifying and saving what a session of ${e.repo} wrote`;
5887
+ case "verify":
5888
+ return `saving where the run stands after verifying ${e.repo}`;
5889
+ case "repo.stopped":
5890
+ return `stopping its read of ${e.repo}`;
5891
+ }
5892
+ }
5810
5893
  var TAIL = 200;
5811
5894
  var NOT_ALLOWED = "runtime.yaml doesn't allow copilot-acp here (schemaVersion 3, copilot-acp in modes.allowed and copilot in assistants.allowed), so the app can't start Copilot itself. Read through Copilot Chat instead: atticus map --all in a terminal gives each part to paste.";
5812
- var defaultCheck = async (root) => (await import("./chunk-QXXEOH3A.js")).generateAssistantFiles(root, {
5895
+ var defaultCheck = async (root) => (await import("./chunk-ABY7IKHT.js")).generateAssistantFiles(root, {
5813
5896
  check: true,
5814
5897
  assistants: ["copilot"]
5815
5898
  });
@@ -5820,7 +5903,7 @@ async function allowedHere(root, check) {
5820
5903
  const allowed = copilotAcpAllowed(op);
5821
5904
  if (!allowed)
5822
5905
  return { allowed, ...c.model ? { model: c.model } : {} };
5823
- const { assistantFilesState, limitFor, limitToOffer } = await import("./chunk-U36V664P.js");
5906
+ const { assistantFilesState, limitFor, limitToOffer } = await import("./chunk-G4USCLYQ.js");
5824
5907
  const known = await limitFor(root, op, void 0).catch(() => void 0);
5825
5908
  const offer = known ? void 0 : await limitToOffer(root);
5826
5909
  const limit = known ? {
@@ -5857,9 +5940,13 @@ function uiCopilotRunRoutes(r, ctx, deps = {}) {
5857
5940
  const check = deps.assistantFiles ?? defaultCheck;
5858
5941
  const now = deps.now ?? (() => /* @__PURE__ */ new Date());
5859
5942
  const flushMs = deps.flushMs ?? 100;
5943
+ const stopGraceMs = deps.stopGraceMs ?? STOP_GRACE_MS;
5860
5944
  let run5;
5861
5945
  let allowed;
5862
5946
  let seq = 0;
5947
+ const stopTimers = /* @__PURE__ */ new Map();
5948
+ const lastEvent = /* @__PURE__ */ new Map();
5949
+ let ending;
5863
5950
  let starting = false;
5864
5951
  const pending = /* @__PURE__ */ new Map();
5865
5952
  let timer;
@@ -5917,6 +6004,8 @@ function uiCopilotRunRoutes(r, ctx, deps = {}) {
5917
6004
  throw badRequest("Name the repos to read (repos), or pick stale, gaps or all.");
5918
6005
  if (run5?.view.state === "running")
5919
6006
  throw conflict(`A Copilot run is under way (${run5.view.runId}, started ${run5.view.startedAt}): stop it, or wait for it to finish.`);
6007
+ if (ending)
6008
+ throw conflict(`The stopped run ${ending.view.runId} is still ending its work (it was last ${phaseOf(lastEvent.get(ending))}): a new run can start once it has.`);
5920
6009
  if (starting)
5921
6010
  throw conflict("A Copilot run is starting: wait for it, then stop it if need be.");
5922
6011
  const busy = ctx.jobs.runningOf("step");
@@ -5936,13 +6025,13 @@ function uiCopilotRunRoutes(r, ctx, deps = {}) {
5936
6025
  throw new HttpError(400, "The model's limit is needed", "Atticus doesn't know your model's limit, and a part planned too big overflows the reader: give it in the dialog (Your model's limit, in tokens), the context window of the model Copilot uses. It is kept on this machine for the next run.", { code: "limit-unknown" });
5937
6026
  }
5938
6027
  if (a.assistantFiles?.edited.length) {
5939
- const { assistantFilesEditedWords } = await import("./chunk-U36V664P.js");
6028
+ const { assistantFilesEditedWords } = await import("./chunk-G4USCLYQ.js");
5940
6029
  throw new HttpError(409, "Assistant files edited by hand", assistantFilesEditedWords(a.assistantFiles.edited), { code: "assistant-files-edited", files: a.assistantFiles.edited });
5941
6030
  }
5942
6031
  if (ctx.jobs.runningOf("step")?.state === "running")
5943
6032
  throw conflict("An AI step started on this server meanwhile: wait for it to finish.");
5944
6033
  if (b.data.maxTokens !== void 0) {
5945
- const { saveLastLimit } = await import("./chunk-U36V664P.js");
6034
+ const { saveLastLimit } = await import("./chunk-G4USCLYQ.js");
5946
6035
  await saveLastLimit(ctx.root, b.data.maxTokens, now().getTime());
5947
6036
  allowed = void 0;
5948
6037
  }
@@ -5960,36 +6049,62 @@ function uiCopilotRunRoutes(r, ctx, deps = {}) {
5960
6049
  run5 = me;
5961
6050
  let lastErr;
5962
6051
  const job = ctx.jobs.start("step", async (c) => {
6052
+ const live = () => me.view.state === "running";
5963
6053
  const io = {
5964
- out: (l) => queue(me.line(l)),
6054
+ out: (l) => {
6055
+ if (live())
6056
+ queue(me.line(l));
6057
+ },
5965
6058
  err: (l) => {
6059
+ if (!live())
6060
+ return;
5966
6061
  lastErr = l;
5967
6062
  queue(me.line(l));
5968
6063
  }
5969
6064
  };
5970
6065
  const onEvent = (e) => {
6066
+ if (!live())
6067
+ return;
6068
+ lastEvent.set(me, e);
5971
6069
  for (const n of me.event(e))
5972
6070
  queue(n);
5973
6071
  const p = me.view.progress;
5974
6072
  c.progress(p.repoIndex, p.repos, p.session ?? p.repo ?? "Planning");
5975
6073
  state();
5976
6074
  };
5977
- const signal = currentSignal();
6075
+ const signal = c.signal;
6076
+ const ended = () => {
6077
+ if (ending === me)
6078
+ ending = void 0;
6079
+ lastEvent.delete(me);
6080
+ queue(me.line(WORK_ENDED));
6081
+ flush();
6082
+ if (run5 === me)
6083
+ state();
6084
+ ctx.events.publish({ type: "file.changed", path: "facts" });
6085
+ };
5978
6086
  let code;
5979
6087
  try {
5980
- code = await start(optionsOf(b.data), io, {
5981
- ...signal ? { signal } : {},
5982
- onEvent
5983
- });
6088
+ code = await start(optionsOf(b.data), io, { signal, onEvent });
5984
6089
  } catch (e) {
5985
6090
  const msg = e instanceof Error ? e.message : String(e);
5986
- queue(me.finish(signal?.aborted ? "stopped" : "failed", now().toISOString(), msg));
6091
+ if (!live()) {
6092
+ ended();
6093
+ return { errors: [msg] };
6094
+ }
6095
+ lastEvent.delete(me);
6096
+ queue(me.finish(signal.aborted ? "stopped" : "failed", now().toISOString(), msg));
5987
6097
  flush();
5988
6098
  state();
5989
6099
  ctx.events.publish({ type: "file.changed", path: "facts" });
5990
6100
  return { errors: [msg] };
5991
6101
  }
5992
- const stopped = signal?.aborted === true;
6102
+ if (!live()) {
6103
+ ended();
6104
+ return { result: { code, runId } };
6105
+ }
6106
+ lastEvent.delete(me);
6107
+ const stopped = signal.aborted;
5993
6108
  queue(me.finish(stopped ? "stopped" : code === 0 ? "done" : "failed", now().toISOString(), stopped || code === 0 ? void 0 : lastErr ?? `atticus map --all ended with ${code}`));
5994
6109
  flush();
5995
6110
  state();
@@ -6015,9 +6130,25 @@ function uiCopilotRunRoutes(r, ctx, deps = {}) {
6015
6130
  throw notFound(`There is no run ${params.runId}.`);
6016
6131
  if (run5.view.state !== "running")
6017
6132
  throw conflict(`${params.runId} has already ${run5.view.state === "done" ? "finished" : run5.view.state}.`);
6018
- ctx.jobs.cancel(run5.view.jobId);
6019
- queue(run5.line("Stopping: the session under way is cancelled..."));
6020
- return { status: 200, body: structuredClone(run5.view) };
6133
+ const r0 = run5;
6134
+ ctx.jobs.cancel(r0.view.jobId);
6135
+ queue(r0.line("Stopping: the session under way is cancelled..."));
6136
+ if (!stopTimers.has(r0)) {
6137
+ const t = setTimeout(() => {
6138
+ stopTimers.delete(r0);
6139
+ if (r0.view.state !== "running")
6140
+ return;
6141
+ ending = r0;
6142
+ queue(r0.finish("stopped", now().toISOString(), void 0, cutOff(phaseOf(lastEvent.get(r0)))));
6143
+ flush();
6144
+ if (run5 === r0)
6145
+ state();
6146
+ ctx.events.publish({ type: "file.changed", path: "facts" });
6147
+ }, stopGraceMs);
6148
+ t.unref?.();
6149
+ stopTimers.set(r0, t);
6150
+ }
6151
+ return { status: 200, body: structuredClone(r0.view) };
6021
6152
  });
6022
6153
  }
6023
6154
 
@@ -6170,7 +6301,7 @@ function uiDecisionRoutes(r, ctx, deps = {}) {
6170
6301
  ctx.events.publish({ type: "file.changed", path });
6171
6302
  return { status: 200, body: out };
6172
6303
  }).add("GET", "/api/propose-answers", async () => {
6173
- const { openDecideRun, PROPOSE_CHANGE } = await import("./chunk-LCWC6NDE.js");
6304
+ const { openDecideRun, PROPOSE_CHANGE } = await import("./chunk-LD35W2PC.js");
6174
6305
  const run5 = await openDecideRun(ctx.root, PROPOSE_CHANGE);
6175
6306
  const body = run5 ? {
6176
6307
  state: "waiting",
@@ -6184,7 +6315,7 @@ function uiDecisionRoutes(r, ctx, deps = {}) {
6184
6315
  const op = await loadOrgPack(orgPackDirOf(ctx.root));
6185
6316
  if (op.runtime.ai === "off")
6186
6317
  throw conflict("runtime.yaml turns AI off here (ai: off): answer the questions yourself.");
6187
- const { startProposeHandoff } = await import("./chunk-V7DGFWDB.js");
6318
+ const { startProposeHandoff } = await import("./chunk-X4HPOZCJ.js");
6188
6319
  const h = await startProposeHandoff(ctx.root, { now: now() });
6189
6320
  const body = {
6190
6321
  state: "waiting",
@@ -6213,7 +6344,7 @@ function uiDecisionRoutes(r, ctx, deps = {}) {
6213
6344
  // packages/cli/dist/ui-api-sketch.js
6214
6345
  import { createHash as createHash5 } from "node:crypto";
6215
6346
  import { readFile as readFile7 } from "node:fs/promises";
6216
- import { join as join10 } from "node:path";
6347
+ import { join as join11 } from "node:path";
6217
6348
  var CHANGE = /^[a-z0-9][a-z0-9._-]{0,199}$/;
6218
6349
  var drawnOf = (deltas) => drawnStrokes(deltas);
6219
6350
  function uiSketchRoutes(r, ctx) {
@@ -6230,7 +6361,7 @@ git commit -m "${safeMessage(`${change}: drawn on the canvas`)}"`;
6230
6361
  const m = await changeMapOf(root, change);
6231
6362
  if (!m)
6232
6363
  throw notFound(`There is no change ${change}.`);
6233
- const dir = join10(changesDirOf(root), change);
6364
+ const dir = join11(changesDirOf(root), change);
6234
6365
  const { deltas } = await readDeltas(dir);
6235
6366
  return {
6236
6367
  status: 200,
@@ -6262,7 +6393,7 @@ git commit -m "${safeMessage(`${change}: drawn on the canvas`)}"`;
6262
6393
  throw notFound(`There is no change ${change}.`);
6263
6394
  const estate = await loadEstate(root, t.records);
6264
6395
  const by = ctx.user ?? "a person";
6265
- return withFileLock(join10(dir, TARGET_DIR), async () => {
6396
+ return withFileLock(join11(dir, TARGET_DIR), async () => {
6266
6397
  const fingerprint = await sketchFingerprint(dir);
6267
6398
  const { deltas, problems } = await readDeltas(dir);
6268
6399
  const answer = (extra) => ({
@@ -6290,7 +6421,7 @@ git commit -m "${safeMessage(`${change}: drawn on the canvas`)}"`;
6290
6421
  const plan = await planSketchWrite(dir, res.deltas, res.changed, estate, by);
6291
6422
  const files = (await Promise.all(plan.map(async (f) => ({
6292
6423
  file: `${changesRelOf(root)}/${change}/${f.file}`,
6293
- changes: changedLines(lfOnly(await readFile7(join10(dir, ...f.file.split("/")), "utf8").catch(() => "")), lfOnly(f.now ?? ""))
6424
+ changes: changedLines(lfOnly(await readFile7(join11(dir, ...f.file.split("/")), "utf8").catch(() => "")), lfOnly(f.now ?? ""))
6294
6425
  })))).filter((f) => f.changes.length);
6295
6426
  if (b.data.preview)
6296
6427
  return { status: 200, body: answer({ files, drawn: drawnOf(res.deltas) }) };
@@ -6416,7 +6547,7 @@ git commit -m "${safeMessage(`${repo}: ${[owner ? `owner ${owner}` : "", system
6416
6547
 
6417
6548
  // packages/cli/dist/ui-api-declared.js
6418
6549
  import { readFile as readFile8 } from "node:fs/promises";
6419
- import { join as join11 } from "node:path";
6550
+ import { join as join12 } from "node:path";
6420
6551
  var REPO3 = /^[A-Za-z0-9._-]{1,200}$/;
6421
6552
  var says = (c) => {
6422
6553
  const what = `${c.target.kind} ${c.target.value} (${c.target.file}:${c.target.line})`;
@@ -6569,7 +6700,7 @@ git commit -m "${safeMessage(`profile: ${b.data.system}: a declaration undone`)}
6569
6700
  if (!REPO3.test(repo))
6570
6701
  throw badRequest(`${JSON.stringify(repo)} isn't a repo name.`);
6571
6702
  const rel = `${factsRelOf(ctx.root)}/${repo}.corrections.jsonl`;
6572
- const text = await readFile8(join11(factsDirOf(ctx.root), `${repo}.corrections.jsonl`), "utf8").catch(() => "");
6703
+ const text = await readFile8(join12(factsDirOf(ctx.root), `${repo}.corrections.jsonl`), "utf8").catch(() => "");
6573
6704
  for (const line of text.split(/\r?\n/).filter((l) => l.trim())) {
6574
6705
  const c = parseCorrections(line).corrections[0];
6575
6706
  if (!c)
@@ -6636,7 +6767,7 @@ var import_yaml7 = __toESM(require_dist(), 1);
6636
6767
  import { execFileSync } from "node:child_process";
6637
6768
  import { existsSync as existsSync3 } from "node:fs";
6638
6769
  import { readFile as readFile9 } from "node:fs/promises";
6639
- import { basename, dirname as dirname4, join as join12, relative, sep as sep2 } from "node:path";
6770
+ import { basename, dirname as dirname4, join as join13, relative, sep as sep2 } from "node:path";
6640
6771
  var unprocessable = (detail) => new HttpError(422, "The settings aren't valid", detail);
6641
6772
  var ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/;
6642
6773
  function canonical(v) {
@@ -6665,7 +6796,7 @@ function uiAiRoutes(r, ctx, deps = {}) {
6665
6796
  const root = ctx.root;
6666
6797
  const env = deps.env ?? process.env;
6667
6798
  const keys = () => deps.keys ?? defaultKeyStore();
6668
- const file = () => join12(orgPackDirOf(root), "runtime.yaml");
6799
+ const file = () => join13(orgPackDirOf(root), "runtime.yaml");
6669
6800
  const rel = () => relative(root, file()).split(sep2).join("/");
6670
6801
  const build = async (op, type, settings) => {
6671
6802
  if (deps.provider)
@@ -6841,7 +6972,7 @@ function uiDocumentRoutes(r, ctx) {
6841
6972
  const root = ctx.root;
6842
6973
  const changed = (path) => ctx.events.publish({ type: "file.changed", path });
6843
6974
  return r.add("GET", "/api/knowledge/documents", async () => {
6844
- const { listDocuments } = await import("./chunk-7HUCEHUK.js");
6975
+ const { listDocuments } = await import("./chunk-O77FAGKZ.js");
6845
6976
  return { status: 200, body: api_exports.DocumentList.parse(await listDocuments(root)) };
6846
6977
  }).add("POST", "/api/knowledge/documents", async ({ body }) => {
6847
6978
  const b = api_exports.AttachFileRequest.safeParse(body ?? {});
@@ -6850,7 +6981,7 @@ function uiDocumentRoutes(r, ctx) {
6850
6981
  const bytes = new Uint8Array(Buffer.from(b.data.content, "base64"));
6851
6982
  if (bytes.length > MAX_FILE)
6852
6983
  throw new HttpError(413, "The file is too large", "Add a file of 15 MB or less.");
6853
- const { addToInbox } = await import("./chunk-MP7W6OKP.js");
6984
+ const { addToInbox } = await import("./chunk-65VII57C.js");
6854
6985
  const res = await addToInbox(root, [{ name: b.data.name, bytes }]);
6855
6986
  if (!res.added.length)
6856
6987
  throw new HttpError(422, "Atticus can't add that", res.refused[0]?.why ?? "", {
@@ -6860,7 +6991,7 @@ function uiDocumentRoutes(r, ctx) {
6860
6991
  changed(a.path);
6861
6992
  return { status: 201, body: api_exports.AddDocumentResult.parse(res) };
6862
6993
  }, { maxBody: Math.ceil(MAX_FILE * 4 / 3) + 64 * 1024 }).add("POST", "/api/changes/{changeId}/inputs/{name}/promote", async ({ params }) => {
6863
- const { AttachError, promoteChangeInput } = await import("./chunk-OY2VC2IU.js");
6994
+ const { AttachError, promoteChangeInput } = await import("./chunk-OHAMT5OA.js");
6864
6995
  try {
6865
6996
  const res = await promoteChangeInput(root, params.changeId, params.name);
6866
6997
  changed(res.path);
@@ -6877,13 +7008,13 @@ function uiDocumentRoutes(r, ctx) {
6877
7008
  function uiRepoRoutes(r, ctx) {
6878
7009
  const root = ctx.root;
6879
7010
  return r.add("GET", "/api/repos/branches", async () => {
6880
- const { repoBranches } = await import("./chunk-LQEMCF43.js");
7011
+ const { repoBranches } = await import("./chunk-NTWOEULN.js");
6881
7012
  return { status: 200, body: api_exports.RepoBranchesList.parse(await repoBranches(root)) };
6882
7013
  }).add("GET", "/api/repos/compare", async ({ query }) => {
6883
7014
  const branch = query.get("branch")?.trim() ?? "";
6884
7015
  if (!branch)
6885
7016
  throw badRequest("Say which branch: ?branch=<name>.");
6886
- const { compareBranch } = await import("./chunk-LQEMCF43.js");
7017
+ const { compareBranch } = await import("./chunk-NTWOEULN.js");
6887
7018
  const c = await compareBranch(root, branch);
6888
7019
  if (!c)
6889
7020
  throw notFound(`${branch} hasn't been scanned beside the baseline yet.`);
@@ -6892,7 +7023,7 @@ function uiRepoRoutes(r, ctx) {
6892
7023
  const b = api_exports.EditRepoBranchesRequest.safeParse(body ?? {});
6893
7024
  if (!b.success)
6894
7025
  throw badRequest("Send defaultBranch and branches as branch names.");
6895
- const { editRepoBranches, RepoEditError } = await import("./chunk-LQEMCF43.js");
7026
+ const { editRepoBranches, RepoEditError } = await import("./chunk-NTWOEULN.js");
6896
7027
  try {
6897
7028
  const file = await editRepoBranches(root, params.repoId, b.data);
6898
7029
  ctx.events.publish({ type: "file.changed", path: file });
@@ -6912,7 +7043,7 @@ function uiRepoRoutes(r, ctx) {
6912
7043
  const b = api_exports.EditRepoBuildRequest.safeParse(body ?? {});
6913
7044
  if (!b.success)
6914
7045
  throw badRequest('Send the build command as build ("" clears it), up to 500 characters.');
6915
- const { editRepoBuild, RepoEditError } = await import("./chunk-LQEMCF43.js");
7046
+ const { editRepoBuild, RepoEditError } = await import("./chunk-NTWOEULN.js");
6916
7047
  try {
6917
7048
  const r2 = await editRepoBuild(root, params.repoId, b.data);
6918
7049
  ctx.events.publish({ type: "file.changed", path: r2.file });
@@ -6933,7 +7064,7 @@ function uiRepoRoutes(r, ctx) {
6933
7064
  const b = api_exports.SetOrgPackOwnerRequest.safeParse(body ?? {});
6934
7065
  if (!b.success)
6935
7066
  throw badRequest("Send the owner as one handle: { owner }.");
6936
- const { setOrgPackOwner, OwnerEditError } = await import("./chunk-RZYRUXSU.js");
7067
+ const { setOrgPackOwner, OwnerEditError } = await import("./chunk-RV32IY7X.js");
6937
7068
  try {
6938
7069
  const r2 = await setOrgPackOwner(root, b.data.owner, b.data.was);
6939
7070
  ctx.events.publish({ type: "file.changed", path: r2.file });
@@ -6954,7 +7085,7 @@ function uiRepoRoutes(r, ctx) {
6954
7085
  const b = api_exports.EditRepoDescriptionRequest.safeParse(body ?? {});
6955
7086
  if (!b.success)
6956
7087
  throw badRequest("Send what the repo is as text, or accept: true to confirm the draft, or reject: true to drop it.");
6957
- const { editRepoDescription, RepoEditError } = await import("./chunk-LQEMCF43.js");
7088
+ const { editRepoDescription, RepoEditError } = await import("./chunk-NTWOEULN.js");
6958
7089
  try {
6959
7090
  const r2 = await editRepoDescription(root, params.repoId, b.data);
6960
7091
  ctx.events.publish({ type: "file.changed", path: r2.file });
@@ -6983,7 +7114,7 @@ function changeIdOf(v) {
6983
7114
  function uiCockpitRoutes(r, ctx) {
6984
7115
  return r.add("GET", "/api/changes/{changeId}/cockpit", async ({ params }) => {
6985
7116
  const id = changeIdOf(params.changeId);
6986
- const { cockpit } = await import("./chunk-FFIHRQ3O.js");
7117
+ const { cockpit } = await import("./chunk-3MKQXZWB.js");
6987
7118
  try {
6988
7119
  return await keptAnswer(ctx.root, `cockpit:${id}:${ctx.user}`, async () => ({
6989
7120
  status: 200,
@@ -6991,13 +7122,13 @@ function uiCockpitRoutes(r, ctx) {
6991
7122
  }), () => checkoutsStamp(ctx.root));
6992
7123
  } catch (e) {
6993
7124
  if (e instanceof Error && e.name === "ChangeFileError") {
6994
- const { missingChangeWords: missingChangeWords2 } = await import("./chunk-VGXE7XFO.js");
7125
+ const { missingChangeWords: missingChangeWords2 } = await import("./chunk-M4XMRGH3.js");
6995
7126
  throw notFound(await missingChangeWords2(ctx.root, id));
6996
7127
  }
6997
7128
  throw e;
6998
7129
  }
6999
7130
  }).add("GET", "/api/past-changes", async ({ query }) => {
7000
- const { changeAboutText, similarChanges } = await import("./chunk-FYRBBFIF.js");
7131
+ const { changeAboutText, similarChanges } = await import("./chunk-TUYZSEKB.js");
7001
7132
  const given = query.get("change");
7002
7133
  const change = given ? changeIdOf(given) : void 0;
7003
7134
  const text = change ? await changeAboutText(ctx.root, change) : query.get("text")?.trim();
@@ -7016,11 +7147,11 @@ function uiCockpitRoutes(r, ctx) {
7016
7147
  const b = api_exports.AttachPastChangeRequest.safeParse(body ?? {});
7017
7148
  if (!b.success)
7018
7149
  throw badRequest("Say which archived change: { like: <its folder or id> }.");
7019
- const { attachPastChange, findPastChange } = await import("./chunk-FYRBBFIF.js");
7150
+ const { attachPastChange, findPastChange } = await import("./chunk-TUYZSEKB.js");
7020
7151
  const folder = await findPastChange(ctx.root, b.data.like);
7021
7152
  if (!folder)
7022
7153
  throw notFound(`There is no archived change ${b.data.like}.`);
7023
- const { AttachError } = await import("./chunk-OY2VC2IU.js");
7154
+ const { AttachError } = await import("./chunk-OHAMT5OA.js");
7024
7155
  try {
7025
7156
  const name = await attachPastChange(ctx.root, params.changeId, folder, ctx.user);
7026
7157
  ctx.events.publish({ type: "file.changed", path: `inputs/${name}` });
@@ -7142,7 +7273,7 @@ git commit -m "${repo}: a person's sample audit answers"`
7142
7273
 
7143
7274
  // packages/cli/dist/ui-api-outside.js
7144
7275
  import { readFile as readFile10 } from "node:fs/promises";
7145
- import { join as join13 } from "node:path";
7276
+ import { join as join14 } from "node:path";
7146
7277
  var SPECS = /* @__PURE__ */ new Set(["openapi", "swagger"]);
7147
7278
  var cmp = (a, b) => a < b ? -1 : a > b ? 1 : 0;
7148
7279
  var OUTSIDE_ADD_SPEC = (id) => [
@@ -7173,7 +7304,7 @@ async function outsideView(root) {
7173
7304
  const system = systems.find((s) => s.id === d.systems[0]);
7174
7305
  if (!system || specs.has(system.id))
7175
7306
  continue;
7176
- const body = await readFile10(join13(inputsDirOf(root), ...d.path.split("/").slice(1)), "utf8");
7307
+ const body = await readFile10(join14(inputsDirOf(root), ...d.path.split("/").slice(1)), "utf8");
7177
7308
  const spec = readVendorSpec(d.path, body, system.id);
7178
7309
  if (spec)
7179
7310
  specs.set(system.id, spec);
@@ -7219,7 +7350,7 @@ async function outsideView(root) {
7219
7350
  const manifests = estateRepos(op);
7220
7351
  const clashes = (hosts) => hosts.flatMap((h) => manifests.filter((m) => [...m.hosts ?? [], ...(m.modules ?? []).flatMap((x) => x.hosts ?? [])].some((p) => hostMatches(p, h))).map((m) => ({ host: h, repo: m.id })));
7221
7352
  const contracts = await contractCheckOf(root).catch(() => void 0);
7222
- const catalog = records.length ? records : (await readCatalog(join13(catalogDirOf(root), "generated"), { cacheRoot: root })).records;
7353
+ const catalog = records.length ? records : (await readCatalog(join14(catalogDirOf(root), "generated"), { cacheRoot: root })).records;
7223
7354
  const ifaces = catalog.filter((r) => r.kind === "Interface");
7224
7355
  const componentsOf = (id) => /* @__PURE__ */ new Set([
7225
7356
  id,
@@ -7388,11 +7519,11 @@ function uiContractsRoutes(r, ctx, o = {}) {
7388
7519
  var import_yaml8 = __toESM(require_dist(), 1);
7389
7520
  import { createHash as createHash6 } from "node:crypto";
7390
7521
  import { readFile as readFile12, stat as stat7 } from "node:fs/promises";
7391
- import { join as join15 } from "node:path";
7522
+ import { join as join16 } from "node:path";
7392
7523
 
7393
7524
  // packages/cli/dist/ui-api-drafts.js
7394
7525
  import { readdir as readdir6, readFile as readFile11, stat as stat6 } from "node:fs/promises";
7395
- import { join as join14 } from "node:path";
7526
+ import { join as join15 } from "node:path";
7396
7527
  var ID5 = /^[a-z0-9][a-z0-9._-]{0,99}$/;
7397
7528
  var CORRECTION_ID = /^c-[0-9a-f]{10}$/;
7398
7529
  var exists2 = (p) => stat6(p).then(() => true, () => false);
@@ -7411,7 +7542,7 @@ var ON_PAGE = {
7411
7542
  var pageOfFile = (f) => Object.keys(ON_PAGE).find((p) => ON_PAGE[p](f));
7412
7543
  async function walk(dir, sub = "") {
7413
7544
  const out = [];
7414
- for (const e of await readdir6(join14(dir, sub), { withFileTypes: true }).catch(() => [])) {
7545
+ for (const e of await readdir6(join15(dir, sub), { withFileTypes: true }).catch(() => [])) {
7415
7546
  if (e.name.startsWith("."))
7416
7547
  continue;
7417
7548
  const rel = sub ? `${sub}/${e.name}` : e.name;
@@ -7455,7 +7586,7 @@ async function stageDraftsView(root, change, page) {
7455
7586
  const p = prov[f];
7456
7587
  if (!p)
7457
7588
  continue;
7458
- const text = await readFile11(join14(dir, ...f.split("/")), "utf8").catch(() => "") ?? "";
7589
+ const text = await readFile11(join15(dir, ...f.split("/")), "utf8").catch(() => "") ?? "";
7459
7590
  files.push({
7460
7591
  file: f,
7461
7592
  path: `${rel}/${f}`,
@@ -7499,7 +7630,7 @@ function uiDraftRoutes(r, ctx, deps = {}) {
7499
7630
  const changeOf = async (v) => {
7500
7631
  if (!ID5.test(v))
7501
7632
  throw badRequest(`${JSON.stringify(v)} isn't a change id.`);
7502
- if (!await exists2(join14(changeFolder(ctx.root, v), "change.yaml")))
7633
+ if (!await exists2(join15(changeFolder(ctx.root, v), "change.yaml")))
7503
7634
  throw notFound(`There is no change ${v}.`);
7504
7635
  return v;
7505
7636
  };
@@ -7687,7 +7818,7 @@ function draftedOf(text) {
7687
7818
  async function placementView(root, change) {
7688
7819
  const rel = `${changesRelOf(root)}/${change}`;
7689
7820
  const dir = changeFolder(root, change);
7690
- const read = (f) => readFile12(join15(dir, f), "utf8").catch(() => void 0);
7821
+ const read = (f) => readFile12(join16(dir, f), "utf8").catch(() => void 0);
7691
7822
  const source = await read(FEATURE_FILE);
7692
7823
  const content = await read("feature.md") ?? "";
7693
7824
  return {
@@ -7712,7 +7843,7 @@ function uiStageRoutes(r, ctx, deps = {}) {
7712
7843
  const changeOf = async (v) => {
7713
7844
  if (!ID6.test(v))
7714
7845
  throw badRequest(`${JSON.stringify(v)} isn't a change id.`);
7715
- if (!await exists3(join15(changeFolder(ctx.root, v), "change.yaml")))
7846
+ if (!await exists3(join16(changeFolder(ctx.root, v), "change.yaml")))
7716
7847
  throw notFound(`There is no change ${v}.`);
7717
7848
  return v;
7718
7849
  };
@@ -7727,7 +7858,7 @@ function uiStageRoutes(r, ctx, deps = {}) {
7727
7858
  errors: b.error.issues.map((i) => ({ path: i.path.join("."), message: i.message }))
7728
7859
  });
7729
7860
  const dir = changeFolder(ctx.root, change);
7730
- const file = join15(dir, FEATURE_FILE);
7861
+ const file = join16(dir, FEATURE_FILE);
7731
7862
  const was = await readFile12(file, "utf8").catch(() => void 0);
7732
7863
  if (sha4(was ?? "") !== b.data.baseSha256)
7733
7864
  throw conflict(`${FEATURE_FILE} changed since you opened it. Reload it, then edit again.`);
@@ -7750,7 +7881,7 @@ function uiStageRoutes(r, ctx, deps = {}) {
7750
7881
  ${own.join("\n")}`;
7751
7882
  await writeFileIfUnchanged(file, was, saved);
7752
7883
  const md = renderFeature(p.data);
7753
- await writeFileAtomic(join15(dir, "feature.md"), md);
7884
+ await writeFileAtomic(join16(dir, "feature.md"), md);
7754
7885
  for (const [f, content] of [
7755
7886
  [FEATURE_FILE, saved],
7756
7887
  ["feature.md", md]
@@ -7824,7 +7955,7 @@ git commit -m "${change}: a comment on ${f.finding.id}"`,
7824
7955
  // packages/cli/dist/ui-api-thread.js
7825
7956
  var import_yaml9 = __toESM(require_dist(), 1);
7826
7957
  import { stat as stat8 } from "node:fs/promises";
7827
- import { join as join16 } from "node:path";
7958
+ import { join as join17 } from "node:path";
7828
7959
  var ID7 = /^[a-z0-9][a-z0-9._-]{0,99}$/;
7829
7960
  var STAGE_AGENT = {
7830
7961
  proposal: "change-drafter",
@@ -7952,7 +8083,7 @@ async function stageThreadView(root, change, stage) {
7952
8083
  const writes = new Set(Object.keys(loop.written ?? {}));
7953
8084
  const source = loop.source;
7954
8085
  for (const f of review.findings) {
7955
- const at = f.finding.createdAt ?? await fileTime(join16(root, ...f.file.split("/"))) ?? loop.updatedAt;
8086
+ const at = f.finding.createdAt ?? await fileTime(join17(root, ...f.file.split("/"))) ?? loop.updatedAt;
7956
8087
  const art = f.finding.artifact;
7957
8088
  const assistantWrites = writes.has(art) || !!source && (art === source || art.startsWith(`${source.replace(/\/$/, "")}/`));
7958
8089
  const edit = assistantWrites ? void 0 : editOf(art, f.finding.locator.line);
@@ -8055,7 +8186,7 @@ function uiThreadRoutes(r, ctx, deps = {}) {
8055
8186
  const changeOf = async (v) => {
8056
8187
  if (!ID7.test(v))
8057
8188
  throw badRequest(`${JSON.stringify(v)} isn't a change id.`);
8058
- if (!await stat8(join16(changeFolder(ctx.root, v), "change.yaml")).catch(() => void 0))
8189
+ if (!await stat8(join17(changeFolder(ctx.root, v), "change.yaml")).catch(() => void 0))
8059
8190
  throw notFound(await missingChangeWords(ctx.root, v));
8060
8191
  return v;
8061
8192
  };
@@ -8133,7 +8264,7 @@ function uiThreadRoutes(r, ctx, deps = {}) {
8133
8264
  var import_yaml10 = __toESM(require_dist(), 1);
8134
8265
  import { execFile } from "node:child_process";
8135
8266
  import { readFile as readFile13, stat as stat9 } from "node:fs/promises";
8136
- import { basename as basename2, isAbsolute, join as join17, resolve as resolve2 } from "node:path";
8267
+ import { basename as basename2, isAbsolute, join as join18, resolve as resolve2 } from "node:path";
8137
8268
 
8138
8269
  // packages/cli/dist/setup-repos.js
8139
8270
  function normaliseCloneUrl(given) {
@@ -8248,7 +8379,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8248
8379
  };
8249
8380
  return r.add("GET", "/api/setup/metarepo", async () => {
8250
8381
  const origin = await originOf(root);
8251
- const { metarepoIdFromUrl } = await import("./chunk-U4K34CXK.js");
8382
+ const { metarepoIdFromUrl } = await import("./chunk-PZY4M3AZ.js");
8252
8383
  const folder = basename2(root);
8253
8384
  const body = {
8254
8385
  metarepo: isMetarepo(root),
@@ -8266,7 +8397,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8266
8397
  const b = parseBody4(api_exports.CreateMetarepoRequest, body);
8267
8398
  if (isMetarepo(root))
8268
8399
  throw conflict(`${root} is a metarepo already.`);
8269
- const { initCommand } = await import("./chunk-OOZKLLW7.js");
8400
+ const { initCommand } = await import("./chunk-DXSZXPFF.js");
8270
8401
  const res = await run4((io) => initCommand(root, {
8271
8402
  name: b.name,
8272
8403
  platform: b.platform,
@@ -8291,7 +8422,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8291
8422
  if (!await stat9(dir).then((s) => s.isDirectory(), () => false))
8292
8423
  throw notFound(`There is no folder ${dir} on this machine.`);
8293
8424
  const open = deps.openFolder ?? (async (d) => {
8294
- const { startUi: startUi2 } = await import("./chunk-MBIJNU3D.js");
8425
+ const { startUi: startUi2 } = await import("./chunk-G5ZQLW5K.js");
8295
8426
  const srv = await startUi2(d, {
8296
8427
  port: 0,
8297
8428
  user,
@@ -8324,7 +8455,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8324
8455
  };
8325
8456
  return { status: 200, body: ask };
8326
8457
  }
8327
- const { reposDiscover, AdoptError } = await import("./chunk-U4K34CXK.js");
8458
+ const { reposDiscover, AdoptError } = await import("./chunk-PZY4M3AZ.js");
8328
8459
  const found = await reposDiscover(root, { dir }, { dryRun: true, ...b.platform ? { platform: b.platform } : {} }).catch((e) => {
8329
8460
  if (e instanceof AdoptError)
8330
8461
  throw unprocessable2(e.message.replace(/ with --platform\b/g, " (choose the platform)"));
@@ -8341,7 +8472,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8341
8472
  detected: { signals: f.detection.signals, confidence: f.detection.confidence }
8342
8473
  }));
8343
8474
  } else {
8344
- const { cloneAt, typeOf } = await import("./chunk-UGJSKAZ2.js");
8475
+ const { cloneAt, typeOf } = await import("./chunk-4PYY4TMT.js");
8345
8476
  for (const given of pastedUrls(b.urls ?? "").slice(0, 500)) {
8346
8477
  const c = candidateOf(given);
8347
8478
  const clone = await cloneAt(c.url);
@@ -8412,13 +8543,13 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8412
8543
  const id = params.repoId;
8413
8544
  if (!(await loadRepos(root).catch(() => [])).some((x) => x.id === id))
8414
8545
  throw notFound(`There is no repo ${id} in any manifest.`);
8415
- const { repoFor } = await import("./chunk-ZIAMPN7N.js");
8546
+ const { repoFor } = await import("./chunk-72FLXGSN.js");
8416
8547
  const repo = await repoFor(root, id);
8417
8548
  if (!repo)
8418
8549
  throw conflict(`${id} isn't cloned here yet, so there are no files to read its type from: clone it first (Sync on Onboarding, or atticus workspace sync).`);
8419
8550
  const op = await loadOrgPack(orgPackDirOf(root));
8420
8551
  if (op.repoTypes.length) {
8421
- const { repoTypeDetect } = await import("./chunk-66CMRGI2.js");
8552
+ const { repoTypeDetect } = await import("./chunk-4OITEXVX.js");
8422
8553
  const res = await run4((io) => repoTypeDetect(root, id, { json: true }, io));
8423
8554
  if (res.code !== 0)
8424
8555
  throw unprocessable2([...res.err, ...res.out].join("\n"));
@@ -8432,7 +8563,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8432
8563
  };
8433
8564
  return { status: 200, body: body2 };
8434
8565
  }
8435
- const { typeOf } = await import("./chunk-UGJSKAZ2.js");
8566
+ const { typeOf } = await import("./chunk-4PYY4TMT.js");
8436
8567
  const t = await typeOf(repo.dir, void 0);
8437
8568
  const body = {
8438
8569
  repo: id,
@@ -8571,9 +8702,9 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8571
8702
  }).add("POST", "/api/setup/sources", async ({ body }) => {
8572
8703
  needMetarepo();
8573
8704
  const b = parseBody4(api_exports.SourceRequest, body);
8574
- const file = join17(orgPackDirOf(root), "sources.yaml");
8705
+ const file = join18(orgPackDirOf(root), "sources.yaml");
8575
8706
  const before = await readFile13(file, "utf8").catch(() => "");
8576
- const { sourcesAdd: sourcesAdd2 } = await import("./chunk-YTPND655.js");
8707
+ const { sourcesAdd: sourcesAdd2 } = await import("./chunk-E4AUZ5AC.js");
8577
8708
  const res = await run4((io) => sourcesAdd2(root, b.type, b.location.trim(), io, {
8578
8709
  ...b.id ? { id: b.id } : {},
8579
8710
  ...b.path ? { path: b.path } : {},
@@ -8596,7 +8727,7 @@ function uiSetupRoutes(r, ctx, deps = {}) {
8596
8727
  };
8597
8728
  }
8598
8729
  const after = await readFile13(file, "utf8").catch(() => "");
8599
- const { changedLines: changedLines2, lfOnly: lfOnly2 } = await import("./chunk-PPKH6ULR.js");
8730
+ const { changedLines: changedLines2, lfOnly: lfOnly2 } = await import("./chunk-4EBXR37M.js");
8600
8731
  changed(path);
8601
8732
  return {
8602
8733
  status: 200,
@@ -8622,7 +8753,7 @@ function uiRolesRoutes(r, ctx, deps = {}) {
8622
8753
  const now = deps.now ?? (() => /* @__PURE__ */ new Date());
8623
8754
  const sending = /* @__PURE__ */ new Set();
8624
8755
  ctx.askKnowledge = async (q) => {
8625
- const { knowledgeAnswerOf } = await import("./chunk-PT77IUYQ.js");
8756
+ const { knowledgeAnswerOf } = await import("./chunk-Z56NN3AX.js");
8626
8757
  return api_exports.KnowledgeAnswerView.parse(await knowledgeAnswerOf(root, q));
8627
8758
  };
8628
8759
  const exists4 = async (id) => {
@@ -8683,7 +8814,7 @@ function uiRolesRoutes(r, ctx, deps = {}) {
8683
8814
  const id = changeIdOf2(params.changeId);
8684
8815
  if (!await exists4(id))
8685
8816
  throw notFound(`There is no change ${id}.`);
8686
- const { ownerSuggestions } = await import("./chunk-PT77IUYQ.js");
8817
+ const { ownerSuggestions } = await import("./chunk-Z56NN3AX.js");
8687
8818
  return {
8688
8819
  status: 200,
8689
8820
  body: api_exports.OwnerSuggestionList.parse(await ownerSuggestions(root, id))
@@ -8795,12 +8926,12 @@ function uiRolesRoutes(r, ctx, deps = {}) {
8795
8926
  const b = api_exports.SendOwnerAskRequest.safeParse(body ?? {});
8796
8927
  if (!b.success)
8797
8928
  throw badRequest("Send { confirmation? }.");
8798
- const { ownerQuestions } = await import("./chunk-SSYD4XIW.js");
8929
+ const { ownerQuestions } = await import("./chunk-LQM2YZUX.js");
8799
8930
  const list = await ownerQuestions(root, { now: now() });
8800
8931
  const q = list.questions.find((x) => x.id === params.id);
8801
8932
  if (!q)
8802
8933
  throw notFound(`There is no owner question ${params.id}.`);
8803
- const { fallbackWords, notifierFor } = await import("./chunk-PT77IUYQ.js");
8934
+ const { fallbackWords, notifierFor } = await import("./chunk-Z56NN3AX.js");
8804
8935
  const n = await notifierFor(root, q.finding?.change, deps.notify, deps.adapterFactories ? { factories: deps.adapterFactories } : {});
8805
8936
  const to = q.owner;
8806
8937
  if (!n.notify || n.kind === "none")
@@ -8812,7 +8943,7 @@ function uiRolesRoutes(r, ctx, deps = {}) {
8812
8943
  why: "No notifications are set up here (runtime.yaml adapters.notify): copy the question and ask the owner, then record what they said."
8813
8944
  })
8814
8945
  };
8815
- const { ownerAskRef, recordedSendAt, recordOwnerSend } = await import("./chunk-SSYD4XIW.js");
8946
+ const { ownerAskRef, recordedSendAt, recordOwnerSend } = await import("./chunk-LQM2YZUX.js");
8816
8947
  if (sending.has(q.id))
8817
8948
  throw new HttpError(409, "Being sent", `${q.id} is being sent to ${to} now, from another tab or window: reload to see it sent.`, { code: "being-sent" });
8818
8949
  sending.add(q.id);
@@ -8886,7 +9017,7 @@ Answer it in Atticus (Questions \u203A Owner questions), or reply to ${ctx.user}
8886
9017
  const id = strParam(query, "id")?.trim();
8887
9018
  if (!id || id.length > 400 || /[\p{Cc}]/u.test(id))
8888
9019
  throw badRequest("Say which section: ?id=<source>/<page>#<heading>.");
8889
- const { passageOf } = await import("./chunk-PT77IUYQ.js");
9020
+ const { passageOf } = await import("./chunk-Z56NN3AX.js");
8890
9021
  const p = await passageOf(root, id);
8891
9022
  if (!p)
8892
9023
  throw notFound(`No page or section ${id} is in a snapshot or in inputs/.`);
@@ -8957,7 +9088,7 @@ async function startUi(root, o = {}, deps = {}) {
8957
9088
  });
8958
9089
  keepCatalogsInMemory(true);
8959
9090
  servingTheApp(true);
8960
- void readCatalog(join18(catalogDirOf(root), "generated"), { cacheRoot: root }).catch(() => void 0);
9091
+ void readCatalog(join19(catalogDirOf(root), "generated"), { cacheRoot: root }).catch(() => void 0);
8961
9092
  let followed = { at: 0, yes: false };
8962
9093
  const following = () => {
8963
9094
  if (Date.now() - followed.at > 1e3)
@@ -8972,7 +9103,7 @@ async function startUi(root, o = {}, deps = {}) {
8972
9103
  forgetCatalogs();
8973
9104
  if (e.type === "file.changed" || e.type === "index.rebuilt" || e.type === "job.done") {
8974
9105
  answersMayHaveChanged();
8975
- keptFilesMayHaveChanged(e.type === "file.changed" && typeof e.path === "string" ? join18(root, e.path) : void 0);
9106
+ keptFilesMayHaveChanged(e.type === "file.changed" && typeof e.path === "string" ? join19(root, e.path) : void 0);
8976
9107
  }
8977
9108
  });
8978
9109
  const close = srv.close;