@maycombhq/atticus 2.0.0-beta.26 → 2.0.0-beta.27

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 (325) hide show
  1. package/dist/bin.js +3 -3
  2. package/dist/chunk-22A2K555.js +653 -0
  3. package/dist/{chunk-UTZMF5CV.js → chunk-23TTURB2.js} +1 -1
  4. package/dist/{chunk-XIGVTH24.js → chunk-2666BPJE.js} +19 -19
  5. package/dist/{chunk-KFZ5IXEZ.js → chunk-2ALBHI4Q.js} +28 -27
  6. package/dist/chunk-2ANBMA74.js +107 -0
  7. package/dist/{chunk-UIYPX2BA.js → chunk-2HCW6HXK.js} +27 -26
  8. package/dist/{chunk-DJBXXYYA.js → chunk-2ISR6MWD.js} +15 -15
  9. package/dist/{chunk-ZDA72732.js → chunk-2MRYL45Z.js} +50 -9
  10. package/dist/{chunk-DB3NWAU3.js → chunk-3GNUHLAN.js} +4 -4
  11. package/dist/chunk-3GURU22K.js +44 -0
  12. package/dist/{chunk-UFIQ5FWY.js → chunk-3M3MDBOG.js} +1 -1
  13. package/dist/{chunk-DHQXCP2X.js → chunk-3PBIZBWN.js} +1 -1
  14. package/dist/{chunk-7IWMRZRI.js → chunk-3PWXVBCB.js} +83 -40
  15. package/dist/chunk-3W2QX6TT.js +58 -0
  16. package/dist/{chunk-H7CSCA73.js → chunk-3Z7ATALI.js} +5 -5
  17. package/dist/{chunk-ZGULQAPZ.js → chunk-44SWXDD7.js} +8 -5
  18. package/dist/{chunk-IEIHVMM6.js → chunk-46N5O5H7.js} +5 -5
  19. package/dist/{chunk-4DHYXODN.js → chunk-4D4DNTFE.js} +4 -4
  20. package/dist/{chunk-B3JHERXM.js → chunk-4EAT7HOX.js} +7 -5
  21. package/dist/{chunk-OH2OHNB5.js → chunk-4FLIW5PJ.js} +4 -4
  22. package/dist/{chunk-PGDVJWCI.js → chunk-4LWA5VMJ.js} +52 -37
  23. package/dist/{chunk-YWQZ7CCW.js → chunk-4ODVHNA6.js} +18 -17
  24. package/dist/{chunk-IH6BYFMH.js → chunk-4POSAXNC.js} +6 -6
  25. package/dist/{chunk-D5H3RZNE.js → chunk-4PQ4KDOA.js} +16 -15
  26. package/dist/{chunk-RQM5Y3HJ.js → chunk-4UVTNHA6.js} +1 -1
  27. package/dist/{chunk-KVVNAUIG.js → chunk-4XK3HLOH.js} +1 -0
  28. package/dist/{chunk-ZQGFZJH5.js → chunk-523NRKHF.js} +4 -4
  29. package/dist/{chunk-GJSLO2E2.js → chunk-5GCCG3GJ.js} +11 -5
  30. package/dist/{chunk-VGGSHDQU.js → chunk-5XW6RUDV.js} +8 -8
  31. package/dist/{chunk-K35VNKJH.js → chunk-5YEUAZZE.js} +8 -8
  32. package/dist/{chunk-YEHSJY6B.js → chunk-62LD7CSY.js} +13 -13
  33. package/dist/{chunk-DB6TDJ4T.js → chunk-67Y2J55V.js} +22 -21
  34. package/dist/{chunk-KL7UHAOR.js → chunk-6DSZ4CL7.js} +36 -21
  35. package/dist/{chunk-WM4EMP7T.js → chunk-6G67LSBG.js} +283 -61
  36. package/dist/{chunk-TLBPTUFU.js → chunk-6OEB4FTC.js} +20 -19
  37. package/dist/{chunk-GXJ2PSDW.js → chunk-6OTGCKYH.js} +9 -9
  38. package/dist/{chunk-EQMNMG6X.js → chunk-6XLCMDIP.js} +13 -13
  39. package/dist/chunk-76DZJTU7.js +190 -0
  40. package/dist/chunk-7764GVJK.js +37 -0
  41. package/dist/{chunk-KS2IQYTZ.js → chunk-7BOGXFZ3.js} +11 -11
  42. package/dist/{chunk-ZA2PWNR3.js → chunk-7CVHKNAF.js} +16 -15
  43. package/dist/{chunk-LBBI5P5G.js → chunk-7FEIS3KV.js} +25 -24
  44. package/dist/{chunk-OXCHO2QS.js → chunk-7GXM45T5.js} +26 -23
  45. package/dist/{chunk-YLXPJWNO.js → chunk-7YMAMNMT.js} +17 -16
  46. package/dist/chunk-7YWS47SE.js +56 -0
  47. package/dist/{chunk-LZFKJ2BR.js → chunk-A3LVMCA5.js} +1 -1
  48. package/dist/{chunk-PXDAGXQN.js → chunk-A7ZJKLFC.js} +11 -11
  49. package/dist/chunk-AANQC5QP.js +47 -0
  50. package/dist/{chunk-HV6PXXK7.js → chunk-AIQLTDC3.js} +3 -3
  51. package/dist/{chunk-PFWP624T.js → chunk-AKZTCZ6F.js} +4 -4
  52. package/dist/{chunk-KAWWXCPI.js → chunk-ALCSTVWQ.js} +3 -3
  53. package/dist/{chunk-7ZBYRMWK.js → chunk-ALUHO7SE.js} +26 -25
  54. package/dist/{chunk-3KP7OOJ4.js → chunk-AMZ4XMES.js} +8 -8
  55. package/dist/{chunk-V5ZKGBYL.js → chunk-AOQG37K4.js} +8 -6
  56. package/dist/{chunk-CNT6T2JM.js → chunk-ARXZTHEI.js} +16 -15
  57. package/dist/{chunk-KFJMQUSK.js → chunk-AS4CTARY.js} +16 -15
  58. package/dist/{chunk-MM7JSMLW.js → chunk-AVUPW23W.js} +18 -17
  59. package/dist/{chunk-NQDVD2YR.js → chunk-B56FCIEJ.js} +12 -12
  60. package/dist/{chunk-CPE7HLIK.js → chunk-BABATPOZ.js} +18 -17
  61. package/dist/{chunk-63572EFC.js → chunk-BIOKDLLX.js} +21 -19
  62. package/dist/{chunk-D4TW3PUO.js → chunk-BUBKKEUV.js} +5 -5
  63. package/dist/{chunk-FOOU5OJE.js → chunk-CDC6VECU.js} +3 -3
  64. package/dist/chunk-CHEFUNZ4.js +425 -0
  65. package/dist/{chunk-IL7PVMUO.js → chunk-CIFR3DPV.js} +6 -6
  66. package/dist/{chunk-DS5M2J2H.js → chunk-CLBVKD4P.js} +16 -15
  67. package/dist/{chunk-2FTHLB2H.js → chunk-CLM5Z3R5.js} +5 -5
  68. package/dist/{chunk-CFK6CFXM.js → chunk-CLYV5MB6.js} +9 -9
  69. package/dist/{chunk-KZ4I5M2X.js → chunk-CRYIBCGP.js} +37 -19
  70. package/dist/{chunk-PLSCWC2V.js → chunk-D3L5SO27.js} +5 -5
  71. package/dist/chunk-DAZM2INZ.js +34 -0
  72. package/dist/{chunk-I72PEROE.js → chunk-DF4BXBB2.js} +6 -6
  73. package/dist/{chunk-PZFZPHCT.js → chunk-E7Q52EOO.js} +11 -11
  74. package/dist/{chunk-R2FUFBHW.js → chunk-EFDUC35B.js} +3 -3
  75. package/dist/{chunk-43OWNS5N.js → chunk-EHXEJFHD.js} +5 -5
  76. package/dist/{chunk-HQMLY2R6.js → chunk-ELJ5Q4J2.js} +2 -2
  77. package/dist/{chunk-F4EGHECF.js → chunk-EM6DKBTJ.js} +3 -3
  78. package/dist/{chunk-UZBLVNW6.js → chunk-EMC46SU4.js} +38 -17
  79. package/dist/{chunk-F6GRBF5L.js → chunk-EQEDIWFQ.js} +25 -24
  80. package/dist/chunk-EW574EZI.js +57 -0
  81. package/dist/{chunk-HSJKYDHI.js → chunk-EYINWNXL.js} +5 -5
  82. package/dist/{chunk-KUEG2Y7M.js → chunk-EYVYHYCA.js} +8 -8
  83. package/dist/{chunk-ELR7DEQM.js → chunk-F66542M6.js} +34 -9
  84. package/dist/{chunk-RCLBIJRN.js → chunk-F74OMLNU.js} +6 -6
  85. package/dist/{chunk-PBDIVTFL.js → chunk-FADIWOA5.js} +3 -3
  86. package/dist/{chunk-LHN5UCXD.js → chunk-FC3ZVD3O.js} +3 -3
  87. package/dist/{chunk-DXLWZ3BJ.js → chunk-FG65LXED.js} +8 -8
  88. package/dist/{chunk-V5FT3MZG.js → chunk-FKAUBC4Y.js} +8 -8
  89. package/dist/{chunk-RBO4A7TC.js → chunk-FM3EEDS2.js} +15 -15
  90. package/dist/{chunk-TYN5SG5H.js → chunk-FS4E7F6O.js} +403 -148
  91. package/dist/{chunk-HVWPN2RY.js → chunk-FSYJPYLE.js} +16 -15
  92. package/dist/{chunk-IBIIKUC7.js → chunk-G33UIUG3.js} +46 -20
  93. package/dist/{chunk-4NWE2KY3.js → chunk-G3F4BYML.js} +15 -14
  94. package/dist/{chunk-2GT47PWU.js → chunk-GBJRFFDW.js} +5 -5
  95. package/dist/{chunk-NMURRF5F.js → chunk-GF6GBHFN.js} +13 -11
  96. package/dist/{chunk-C3TBDX7Y.js → chunk-GLHOUT5E.js} +26 -25
  97. package/dist/{chunk-ZWMHL346.js → chunk-GM6GXO2A.js} +20 -19
  98. package/dist/{chunk-MKUBDKE2.js → chunk-GSJ2RXE7.js} +29 -28
  99. package/dist/{chunk-YJBD5NDV.js → chunk-GT72FDER.js} +6 -6
  100. package/dist/{chunk-BEEHCL5O.js → chunk-GW6ZH77P.js} +37 -36
  101. package/dist/{chunk-BABRMZET.js → chunk-GZILYRGC.js} +3 -3
  102. package/dist/{chunk-5JGRF53S.js → chunk-GZSOZYEP.js} +3 -3
  103. package/dist/{chunk-IP6ARMZU.js → chunk-H25QNDKK.js} +58 -36
  104. package/dist/{chunk-BIAQ6NQS.js → chunk-H3RKW4RF.js} +7 -7
  105. package/dist/chunk-H7M7ZH6H.js +52 -0
  106. package/dist/chunk-H7NRWSMP.js +55 -0
  107. package/dist/{chunk-2JT4QV3Q.js → chunk-HDWVR5KD.js} +4 -4
  108. package/dist/{chunk-UAYU6K24.js → chunk-HG24EF5S.js} +16 -15
  109. package/dist/chunk-HPNYSY5M.js +1068 -0
  110. package/dist/{chunk-JJEXMHNZ.js → chunk-HUMM4S5I.js} +6 -6
  111. package/dist/{chunk-DARX3ATP.js → chunk-HVPS2YCW.js} +11 -11
  112. package/dist/{chunk-IGOE6KPG.js → chunk-I34CXV2C.js} +185 -11
  113. package/dist/{chunk-6U65YB54.js → chunk-I57IH5X6.js} +360 -271
  114. package/dist/{chunk-WYO4L4NU.js → chunk-I5X4WU7U.js} +6 -6
  115. package/dist/chunk-IAVVJ34R.js +55 -0
  116. package/dist/chunk-IBJE2E2S.js +51 -0
  117. package/dist/{chunk-HNNMT5L2.js → chunk-IF3X6FMO.js} +1 -1
  118. package/dist/{chunk-CUTMM4NY.js → chunk-IJHJIL6T.js} +154 -25
  119. package/dist/chunk-IM435QAM.js +72 -0
  120. package/dist/{chunk-MQ6HP2TU.js → chunk-IMBJ7WAO.js} +6 -6
  121. package/dist/{chunk-5A4RHEEL.js → chunk-INCFIDCB.js} +2 -2
  122. package/dist/{chunk-RTCZKKG7.js → chunk-IPMPLTEG.js} +3 -3
  123. package/dist/{chunk-QAFQLILX.js → chunk-IPSZDVLI.js} +12 -12
  124. package/dist/{chunk-JLTJAOO4.js → chunk-IX2EOYOU.js} +50 -13
  125. package/dist/{chunk-DOU52XFZ.js → chunk-IXNMGPF7.js} +61 -28
  126. package/dist/{chunk-XT3ZW7C7.js → chunk-J6GO3K7G.js} +19 -18
  127. package/dist/chunk-JBLM6IUA.js +42 -0
  128. package/dist/{chunk-CSHJZFOE.js → chunk-JL2VOYSL.js} +91 -93
  129. package/dist/{chunk-ACY3U2RD.js → chunk-JRXFZB6J.js} +8 -8
  130. package/dist/{chunk-P6EJNPFF.js → chunk-JTOLBS7R.js} +951 -409
  131. package/dist/{chunk-FYCN2Y5P.js → chunk-K73BHPTQ.js} +19 -18
  132. package/dist/{chunk-EVKDWJ5Y.js → chunk-KF7KVUNJ.js} +5 -5
  133. package/dist/{chunk-SRB54QGX.js → chunk-KKUCBKJE.js} +20 -19
  134. package/dist/{chunk-LTOBNBJ6.js → chunk-KLFFHBWG.js} +27 -26
  135. package/dist/{chunk-DXBXZNKV.js → chunk-KMYB2XO7.js} +21 -13
  136. package/dist/chunk-KNYQUWFN.js +52 -0
  137. package/dist/{chunk-6EMJ4XFC.js → chunk-KOAJPMU2.js} +31 -20
  138. package/dist/chunk-KRTSE73S.js +55 -0
  139. package/dist/{chunk-GAJBMPWC.js → chunk-L3AM5YRP.js} +28 -9
  140. package/dist/{chunk-YYV276DM.js → chunk-LCIIFAID.js} +22 -21
  141. package/dist/{chunk-SZDOBIWE.js → chunk-LCQIRCOT.js} +55 -10
  142. package/dist/{chunk-OI32KTDM.js → chunk-LFHBAWIM.js} +13 -13
  143. package/dist/chunk-LIHEMWIT.js +39 -0
  144. package/dist/{chunk-CG6MG7SE.js → chunk-LJLYWILK.js} +14 -14
  145. package/dist/{chunk-6SIGGA37.js → chunk-LNJKDS5C.js} +26 -25
  146. package/dist/{chunk-3GEAUW62.js → chunk-LTHY7E2P.js} +16 -15
  147. package/dist/{chunk-RO6BE7ZS.js → chunk-LTVOQJKT.js} +7 -7
  148. package/dist/{chunk-BD7HBZLP.js → chunk-LZO3JABE.js} +6 -6
  149. package/dist/{chunk-PXMV2LLY.js → chunk-M65AZ4ZE.js} +3 -5
  150. package/dist/chunk-MPNTEWNY.js +492 -0
  151. package/dist/chunk-MQGQ3AWK.js +58 -0
  152. package/dist/{chunk-ZNYSBQIA.js → chunk-MUXYUIBV.js} +6 -6
  153. package/dist/{chunk-CNEOKSTO.js → chunk-MWRRJDXQ.js} +34 -31
  154. package/dist/{chunk-VJO7M34N.js → chunk-MZDHFWTN.js} +2 -2
  155. package/dist/chunk-N2XCT5OX.js +68 -0
  156. package/dist/{chunk-2IO6XH37.js → chunk-N3JGYAMD.js} +15 -15
  157. package/dist/{chunk-K3QKOVZN.js → chunk-N5DLB74D.js} +367 -71
  158. package/dist/{chunk-H5BIVULF.js → chunk-NC3Q7RIB.js} +10 -10
  159. package/dist/{chunk-HVOE7ZW2.js → chunk-NCNLX4DL.js} +19 -18
  160. package/dist/{chunk-3D74UADA.js → chunk-NGSGJLKW.js} +2 -2
  161. package/dist/{chunk-B7KGNEFI.js → chunk-NN7K2LLN.js} +25 -24
  162. package/dist/{chunk-76AHTJVY.js → chunk-NNURP7VO.js} +15 -15
  163. package/dist/chunk-NSQB24WR.js +56 -0
  164. package/dist/{chunk-GFFTVQ7R.js → chunk-NV5S63YK.js} +7 -7
  165. package/dist/{chunk-CTJHEG6A.js → chunk-NWMFVPEP.js} +2 -0
  166. package/dist/{chunk-7JZONWAA.js → chunk-NYT6QGZA.js} +22 -18
  167. package/dist/chunk-OB2DAIJX.js +62 -0
  168. package/dist/{chunk-IZIGZ7KY.js → chunk-OC3OXDTG.js} +13 -8
  169. package/dist/{chunk-2XIIUXGX.js → chunk-OD6RNYMQ.js} +16 -16
  170. package/dist/{chunk-723OQZ3N.js → chunk-OFYBRMRG.js} +6 -6
  171. package/dist/chunk-OGTELPDN.js +43 -0
  172. package/dist/{chunk-E5NHFHGC.js → chunk-OQ7SBQ2Z.js} +7 -7
  173. package/dist/{chunk-6TZ4YRGJ.js → chunk-OUDGBJC2.js} +16 -9
  174. package/dist/{chunk-W4SMKUAK.js → chunk-OUGTAOGA.js} +2 -2
  175. package/dist/chunk-OWP5FCYM.js +60 -0
  176. package/dist/{chunk-ET7SPOBA.js → chunk-P36PTWBM.js} +8 -8
  177. package/dist/{chunk-64LSDT3D.js → chunk-P6Y2J2QY.js} +12 -12
  178. package/dist/{chunk-ANFBBJEV.js → chunk-PDJL2HO5.js} +24 -22
  179. package/dist/{chunk-UXVKFOMC.js → chunk-PPKH6ULR.js} +152 -20
  180. package/dist/{chunk-WLA2JZ2K.js → chunk-Q4PFF2ZE.js} +8 -8
  181. package/dist/chunk-Q7EUPQEG.js +5 -0
  182. package/dist/{chunk-2HDNOUJU.js → chunk-QC6GSNIK.js} +7055 -3456
  183. package/dist/chunk-QCRQNYGI.js +211 -0
  184. package/dist/chunk-QDF533AW.js +90 -0
  185. package/dist/chunk-QDGNDNBG.js +50 -0
  186. package/dist/{chunk-HWPX3T55.js → chunk-QGMD3PYL.js} +31 -24
  187. package/dist/{chunk-VCXFMXMX.js → chunk-QLT3WYTD.js} +6 -6
  188. package/dist/{chunk-ZFLBWL2G.js → chunk-QNDMAKQS.js} +11 -3
  189. package/dist/{chunk-UWBPC5XH.js → chunk-QNXMVJMA.js} +8 -8
  190. package/dist/{chunk-XDLMQL5A.js → chunk-QPAANKUR.js} +7 -7
  191. package/dist/{chunk-BGOAJFPB.js → chunk-QS4VX3HZ.js} +1 -1
  192. package/dist/{chunk-YIOYKA4V.js → chunk-QSM4K6LI.js} +7 -7
  193. package/dist/{chunk-TPKJD42W.js → chunk-QUFZDWPC.js} +8 -8
  194. package/dist/{chunk-QXCGRQGO.js → chunk-QXXEOH3A.js} +18 -6
  195. package/dist/{chunk-QA4O2GGC.js → chunk-R4TUWD4C.js} +17 -1
  196. package/dist/{chunk-UJ5ZJS4B.js → chunk-ROI64BAI.js} +22 -21
  197. package/dist/{chunk-LCRQPWTC.js → chunk-RPVL3RTX.js} +19 -18
  198. package/dist/{chunk-QQAWI5LD.js → chunk-RUNHVUCW.js} +16 -15
  199. package/dist/{chunk-7AEB74KW.js → chunk-RWYPLODE.js} +9 -9
  200. package/dist/{chunk-VTR4AC2U.js → chunk-RZYRUXSU.js} +4 -4
  201. package/dist/{chunk-CWLXVRFH.js → chunk-S6TLXRBR.js} +7 -7
  202. package/dist/{chunk-Z33UNTHI.js → chunk-SCOP3J6X.js} +7 -7
  203. package/dist/{chunk-XEWFVHOT.js → chunk-SCP24MJX.js} +24 -23
  204. package/dist/{chunk-MCORC2LG.js → chunk-SF3HXNXR.js} +6 -6
  205. package/dist/{chunk-BSZII65X.js → chunk-SFCFL7Y5.js} +1 -1
  206. package/dist/{chunk-LY7DOYX2.js → chunk-SHFY73RI.js} +53 -112
  207. package/dist/{chunk-IERXBWQU.js → chunk-SHIARIEZ.js} +20 -19
  208. package/dist/chunk-SMFFUFMN.js +1876 -0
  209. package/dist/{chunk-WH3ZFLXT.js → chunk-SVOGRJO6.js} +197 -124
  210. package/dist/chunk-SVZAAOHJ.js +46 -0
  211. package/dist/{chunk-NCZS2BN2.js → chunk-SZOU32VF.js} +21 -20
  212. package/dist/{chunk-MTIRNHRJ.js → chunk-T2MN24LZ.js} +1 -1
  213. package/dist/{chunk-KZH5YV6J.js → chunk-TD5WWJLN.js} +6 -6
  214. package/dist/{chunk-UBEFT3MQ.js → chunk-TFN2N227.js} +6 -6
  215. package/dist/{chunk-BIKMME4S.js → chunk-TFXNOQEU.js} +28 -27
  216. package/dist/{chunk-6P67IUET.js → chunk-TMETWJFO.js} +11 -11
  217. package/dist/chunk-TNSAIISO.js +50 -0
  218. package/dist/{chunk-SDHGFMES.js → chunk-TRJO2I4S.js} +3 -3
  219. package/dist/{chunk-NVVEVP5O.js → chunk-TRSNIJNM.js} +7 -7
  220. package/dist/{chunk-VIQHZA53.js → chunk-U3Z2QZE3.js} +6 -6
  221. package/dist/{chunk-TQG2DDWH.js → chunk-U7L3ORPK.js} +22 -21
  222. package/dist/{chunk-3KIMLBGZ.js → chunk-UDM6HGF4.js} +6 -6
  223. package/dist/{chunk-NMCPIYTF.js → chunk-UDM7LXNJ.js} +7 -7
  224. package/dist/chunk-UDTO3U6E.js +35 -0
  225. package/dist/{chunk-ZFEOIYK5.js → chunk-UEUPEUZX.js} +3 -3
  226. package/dist/chunk-UWBODTY7.js +514 -0
  227. package/dist/{chunk-BIWNRS5I.js → chunk-UYYYQTPD.js} +78 -47
  228. package/dist/{chunk-IDRCBMJF.js → chunk-V34N6JAN.js} +32 -31
  229. package/dist/{chunk-EY3OVHNC.js → chunk-V3Y5P7OS.js} +24 -23
  230. package/dist/chunk-V6MLVGTP.js +89 -0
  231. package/dist/{chunk-EECFUQP3.js → chunk-VC2XHC7P.js} +184 -46
  232. package/dist/{chunk-H26T2LQL.js → chunk-VCYE4MUD.js} +29 -28
  233. package/dist/{chunk-EUTZTJIO.js → chunk-VN2VJ6BV.js} +19 -15
  234. package/dist/{chunk-P6DM2EFI.js → chunk-VVLWEM2Y.js} +6 -6
  235. package/dist/{chunk-YXKCE5BA.js → chunk-VWCNMDMZ.js} +5 -5
  236. package/dist/{chunk-BV2BZIUF.js → chunk-W2A4NHQD.js} +25 -24
  237. package/dist/{chunk-VPQUFIE7.js → chunk-W6OY2PMB.js} +10 -10
  238. package/dist/{chunk-FIZ5LYL2.js → chunk-WC6DHBVG.js} +16 -15
  239. package/dist/{chunk-GHST3KAB.js → chunk-WCA3WIGG.js} +5 -5
  240. package/dist/{chunk-6ZDAEUKB.js → chunk-WJWSB65O.js} +1602 -452
  241. package/dist/{chunk-IFQJ3YQE.js → chunk-WNPGLGCJ.js} +5 -5
  242. package/dist/chunk-WTOVWEY3.js +67 -0
  243. package/dist/{chunk-XIJBQM45.js → chunk-X5B7KYPD.js} +507 -20
  244. package/dist/{chunk-ZLBUFK7L.js → chunk-X73WLHSN.js} +7 -7
  245. package/dist/{chunk-GNFZ227W.js → chunk-XIIT4PVT.js} +3 -3
  246. package/dist/{chunk-U3JXMY56.js → chunk-XLTT5QCX.js} +28 -25
  247. package/dist/{chunk-5UIGGXA5.js → chunk-XMIS25ZJ.js} +21 -20
  248. package/dist/{chunk-IYEET4VM.js → chunk-XPDQ4T6G.js} +27 -26
  249. package/dist/{chunk-WT6EXYEY.js → chunk-XRWUYOX3.js} +138 -22
  250. package/dist/{chunk-I2EWY3MG.js → chunk-XZY4GTCX.js} +14 -9
  251. package/dist/{chunk-2SCZZQNQ.js → chunk-Y2TVTI4P.js} +121 -15
  252. package/dist/{chunk-Q3RKXK5Z.js → chunk-Y2U4CSCA.js} +28 -27
  253. package/dist/chunk-Y2U63JKE.js +41 -0
  254. package/dist/{chunk-V3M4VFUB.js → chunk-Y6S7VCYN.js} +6 -6
  255. package/dist/{chunk-SAPX3PVK.js → chunk-YAPMGK7E.js} +11 -11
  256. package/dist/{chunk-MY3LDBMR.js → chunk-YAPVAYZN.js} +3 -3
  257. package/dist/{chunk-ZYLGEWTC.js → chunk-YCBDNWX3.js} +78 -57
  258. package/dist/{chunk-RK5P2DWD.js → chunk-YIGSUTW2.js} +1329 -92
  259. package/dist/{chunk-XI3GPYP4.js → chunk-YJTBE6AJ.js} +5 -5
  260. package/dist/chunk-YQ3IXQIH.js +185 -0
  261. package/dist/{chunk-MZXDSAKW.js → chunk-YRHKEXTP.js} +11 -11
  262. package/dist/{chunk-DPH4BS3F.js → chunk-YSSFS3YC.js} +17 -17
  263. package/dist/{chunk-ISCX25D7.js → chunk-YXG2VQJJ.js} +200 -56
  264. package/dist/{chunk-VUSYN4R4.js → chunk-Z4GLFTEH.js} +8 -8
  265. package/dist/{chunk-NP3PG6OI.js → chunk-Z65FWO6A.js} +157 -89
  266. package/dist/{chunk-KJD4DLRZ.js → chunk-ZDG637ZT.js} +22 -21
  267. package/dist/{chunk-DASVVML7.js → chunk-ZIAMPN7N.js} +6 -6
  268. package/dist/chunk-ZIIBQHCX.js +53 -0
  269. package/dist/{chunk-IJN5PSDU.js → chunk-ZJJMYPGZ.js} +57 -27
  270. package/dist/{chunk-NECDBPFP.js → chunk-ZOAX7W5S.js} +11 -11
  271. package/dist/chunk-ZSSR5GGB.js +48 -0
  272. package/dist/files.json +657 -553
  273. package/dist/fixtures/forge/expected/crosscheck.json +726 -0
  274. package/dist/fixtures/forge/slots/README.md +13 -0
  275. package/dist/fixtures/forge/slots/build.json +2686 -0
  276. package/dist/fixtures/forge/slots/crosscheck/forge-ledger.crosscheck.yaml +8 -0
  277. package/dist/fixtures/forge/slots/facts/forge-ledger.jsonl +17 -0
  278. package/dist/fixtures/forge/slots/facts/forge-ledger.meta.json +9 -0
  279. package/dist/fixtures/forge/slots/legacy/joins.json +113 -0
  280. package/dist/fixtures/forge/slots/readers/forge-events.json +306 -0
  281. package/dist/fixtures/forge/slots/readers/forge-gateway.json +238 -0
  282. package/dist/fixtures/forge/slots/readers/forge-infra.json +264 -0
  283. package/dist/fixtures/forge/slots/readers/forge-ledger.json +756 -0
  284. package/dist/fixtures/forge/slots/readers/forge-portal-bff.json +349 -0
  285. package/dist/fixtures/forge/slots/readers/forge-portal-ui.json +214 -0
  286. package/dist/fixtures/forge/slots/readers/forge-reports-job.json +258 -0
  287. package/dist/packages/sdk/npm/index.js +3788 -2939
  288. package/dist/packages/ui/dist/assets/{elk-api-BdXSPeBO.js → elk-api-CPE6PVL8.js} +2 -2
  289. package/dist/packages/ui/dist/assets/index-BYcVqj0l.js +65 -0
  290. package/dist/packages/ui/dist/assets/index-DF52Ejvz.css +1 -0
  291. package/dist/packages/ui/dist/index.html +2 -2
  292. package/package.json +4 -4
  293. package/dist/chunk-24OXGB3P.js +0 -82
  294. package/dist/chunk-3FFIDQQB.js +0 -42
  295. package/dist/chunk-4N5W7LYW.js +0 -41
  296. package/dist/chunk-7NVLGPER.js +0 -45
  297. package/dist/chunk-A6LGX56J.js +0 -52
  298. package/dist/chunk-AHACUPGL.js +0 -46
  299. package/dist/chunk-DG7KYZAL.js +0 -40
  300. package/dist/chunk-DWD6BKHG.js +0 -52
  301. package/dist/chunk-EEVSFGIU.js +0 -50
  302. package/dist/chunk-EN3N6LNU.js +0 -52
  303. package/dist/chunk-FWQDH5NK.js +0 -55
  304. package/dist/chunk-GHCFWIUW.js +0 -38
  305. package/dist/chunk-GSIJWDXH.js +0 -43
  306. package/dist/chunk-HCC5547C.js +0 -232
  307. package/dist/chunk-HLDUWEO7.js +0 -36
  308. package/dist/chunk-K2NQTROJ.js +0 -170
  309. package/dist/chunk-LH4WAJLC.js +0 -45
  310. package/dist/chunk-M5IQUWJR.js +0 -59
  311. package/dist/chunk-MEMEO7YO.js +0 -988
  312. package/dist/chunk-MGNO4Q6V.js +0 -51
  313. package/dist/chunk-MZ6GOFRF.js +0 -55
  314. package/dist/chunk-N2AW2DHF.js +0 -51
  315. package/dist/chunk-N35Y5HZO.js +0 -47
  316. package/dist/chunk-NHFMLMLN.js +0 -257
  317. package/dist/chunk-PR6Z5L7W.js +0 -67
  318. package/dist/chunk-STBJ6SVJ.js +0 -50
  319. package/dist/chunk-U3RGBYXE.js +0 -62
  320. package/dist/chunk-URZKIL37.js +0 -42
  321. package/dist/chunk-W7HNZDHB.js +0 -71
  322. package/dist/chunk-YYZWSVIS.js +0 -33
  323. package/dist/chunk-ZAMSF2DF.js +0 -54
  324. package/dist/packages/ui/dist/assets/index-DRSUhpFi.css +0 -1
  325. package/dist/packages/ui/dist/assets/index-RZe5iotJ.js +0 -63
@@ -9,16 +9,18 @@ import {
9
9
  orgPackDirOf,
10
10
  runsDirOf,
11
11
  toCanonicalYaml
12
- } from "./chunk-6ZDAEUKB.js";
12
+ } from "./chunk-WJWSB65O.js";
13
13
  import {
14
+ killProcessTree,
15
+ trackTree,
14
16
  withSharedFileLock
15
- } from "./chunk-MEMEO7YO.js";
17
+ } from "./chunk-SMFFUFMN.js";
16
18
  import {
17
19
  ChangeRepos,
18
20
  RecordId,
19
21
  RepoManifest,
20
22
  WORKSPACE_SCHEMA_VERSION
21
- } from "./chunk-LZFKJ2BR.js";
23
+ } from "./chunk-A3LVMCA5.js";
22
24
  import {
23
25
  require_dist
24
26
  } from "./chunk-BQGDB6ZL.js";
@@ -40,6 +42,12 @@ var GitError = class extends Error {
40
42
  this.name = "GitError";
41
43
  }
42
44
  };
45
+ var GitStoppedError = class extends GitError {
46
+ constructor(args) {
47
+ super(`git ${args[0] ?? ""} stopped`, args, null, "");
48
+ this.name = "GitStoppedError";
49
+ }
50
+ };
43
51
  function createGit(opts = {}) {
44
52
  const env = {
45
53
  ...opts.env ?? process.env,
@@ -48,15 +56,30 @@ function createGit(opts = {}) {
48
56
  LC_ALL: "C"
49
57
  };
50
58
  const pre = process.platform === "win32" ? ["-c", "core.longpaths=true"] : [];
51
- return (args, cwd) => new Promise((resolve, reject) => {
52
- execFile("git", [...pre, ...args], {
59
+ return (args, cwd, o = {}) => new Promise((resolve, reject) => {
60
+ const signal = o.signal;
61
+ if (signal?.aborted) {
62
+ reject(new GitStoppedError(args));
63
+ return;
64
+ }
65
+ let stopped = false;
66
+ const child = execFile("git", [...pre, ...args], {
53
67
  cwd,
54
68
  env,
55
69
  timeout: opts.timeoutMs ?? 10 * 6e4,
56
70
  maxBuffer: 64 * 1024 * 1024,
57
71
  windowsHide: true,
58
- encoding: "utf8"
72
+ encoding: "utf8",
73
+ // A git that may be stopped runs in its own process group (POSIX), so the stop takes
74
+ // what it started too. Only then: a terminal's Ctrl+C still reaches a plain git.
75
+ ...signal && process.platform !== "win32" ? { detached: true } : {}
59
76
  }, (err, stdout, stderr) => {
77
+ signal?.removeEventListener("abort", onAbort);
78
+ untrack?.();
79
+ if (stopped) {
80
+ reject(new GitStoppedError(args));
81
+ return;
82
+ }
60
83
  if (err) {
61
84
  const code = typeof err.code === "number" ? err.code : null;
62
85
  const detail = (stderr || err.message).trim().split(/\r?\n/).slice(-3).join(" ");
@@ -65,6 +88,15 @@ function createGit(opts = {}) {
65
88
  }
66
89
  resolve({ stdout, stderr });
67
90
  });
91
+ const onAbort = () => {
92
+ stopped = true;
93
+ killProcessTree(child);
94
+ };
95
+ const untrack = signal ? trackTree(child, (s) => {
96
+ stopped = true;
97
+ killProcessTree(child, s);
98
+ }) : void 0;
99
+ signal?.addEventListener("abort", onAbort, { once: true });
68
100
  });
69
101
  }
70
102
 
@@ -367,15 +399,22 @@ async function removeEditorWorkspaces(root, change) {
367
399
  }
368
400
 
369
401
  // packages/workspace/dist/state.js
370
- async function checkoutState(dir, git = createGit()) {
371
- const commit = (await git(["rev-parse", "HEAD"], dir)).stdout.trim();
402
+ async function checkoutState(dir, git = createGit(), o = {}) {
403
+ const head = (await git(["show", "-s", "--format=%H%n%cI", "HEAD"], dir)).stdout.trim();
404
+ const [commit = "", committedAt] = head.split("\n");
372
405
  const status = (await git(["status", "--porcelain", "--untracked-files=normal"], dir)).stdout.trim();
373
- return { commit, dirty: status !== "" };
406
+ const ignore = o.ignore ?? [];
407
+ const changed = status.split("\n").filter(Boolean).map((l) => l.slice(3).replace(/^"|"$/g, "")).flatMap((p) => p.split(" -> ")).filter((p) => !ignore.some((i) => p === i.replace(/\/$/, "") || p.startsWith(i)));
408
+ return {
409
+ commit: commit.trim(),
410
+ dirty: changed.length > 0,
411
+ ...committedAt?.trim() ? { committedAt: committedAt.trim() } : {}
412
+ };
374
413
  }
375
414
 
376
415
  // packages/workspace/dist/manager.js
377
- import { existsSync as existsSync2 } from "node:fs";
378
- import { mkdir as mkdir3, readdir as readdir3, rm as rm2 } from "node:fs/promises";
416
+ import { constants as fsConstants, existsSync as existsSync2, statSync } from "node:fs";
417
+ import { copyFile, lstat, mkdir as mkdir3, readdir as readdir3, readFile as readFile3, readlink, realpath, rm as rm2, rmdir, symlink, unlink, writeFile as writeFile4 } from "node:fs/promises";
379
418
  import { basename, dirname as dirname2, join as join4 } from "node:path";
380
419
  var BASE_CLONE_WAIT_MS = 30 * 6e4;
381
420
  function withBaseCloneLock(dest, id2, work, waitMs = BASE_CLONE_WAIT_MS) {
@@ -413,8 +452,79 @@ async function remoteDefaultBranch(dir, git = createGit()) {
413
452
  return void 0;
414
453
  }
415
454
  }
455
+ var SYNC_CHECKOUT_MARK = "atticus-sync-checkout.json";
456
+ var TAKES_INDEX_LOCK = /* @__PURE__ */ new Set(["checkout", "status", "sparse-checkout", "read-tree", "reset"]);
457
+ var SHA = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
458
+ var PUT_BACK_DIR = "atticus-put-back";
459
+ function linkTextIsBlob(text, mode, blob, platform = process.platform) {
460
+ if (mode !== "120000")
461
+ return false;
462
+ if (platform !== "win32")
463
+ return text === blob;
464
+ const slashed = (s) => s.replaceAll("\\", "/");
465
+ return slashed(text) === slashed(blob);
466
+ }
467
+ function sayKept(kept) {
468
+ const said = kept.slice(0, 5).map((k2) => `your version of ${k2.path} was kept at ${k2.copy}`).join("; ");
469
+ const k = kept[0];
470
+ const folder = k.copy.slice(0, k.copy.length - k.path.length - 1);
471
+ return kept.length > 5 ? `${said}; and ${kept.length - 5} more, kept under ${folder}` : said;
472
+ }
473
+ function inGroups(paths, max = 8e3) {
474
+ const out = [];
475
+ let cur = [];
476
+ let len = 0;
477
+ for (const p of paths) {
478
+ if (cur.length > 0 && len + p.length + 1 > max) {
479
+ out.push(cur);
480
+ cur = [];
481
+ len = 0;
482
+ }
483
+ cur.push(p);
484
+ len += p.length + 1;
485
+ }
486
+ if (cur.length > 0)
487
+ out.push(cur);
488
+ return out;
489
+ }
490
+ async function throughLink(dest, dir) {
491
+ if (dir === "." || dir === "")
492
+ return false;
493
+ let at = dest;
494
+ for (const part of dir.split("/")) {
495
+ at = join4(at, part);
496
+ const st = await lstat(at).catch(() => void 0);
497
+ if (!st)
498
+ return false;
499
+ if (st.isSymbolicLink())
500
+ return true;
501
+ }
502
+ return false;
503
+ }
504
+ function statusEntries(z) {
505
+ return z.split("\0").filter((e) => e.length > 3).map((e) => [e.slice(0, 2), e.slice(3)]);
506
+ }
507
+ function sayPaths(entries) {
508
+ const said = entries.slice(0, 5).map(([xy, p]) => `${p} (${xy === "??" ? "not tracked" : "changed"})`).join(", ");
509
+ return entries.length > 5 ? `${said} and ${entries.length - 5} more` : said;
510
+ }
416
511
  function createWorkspace(root, git = createGit(), opts = {}) {
417
- const g = (args, cwd = root) => git(args, cwd);
512
+ const signal = opts.signal;
513
+ let busy;
514
+ let running;
515
+ let lockAtStop;
516
+ signal?.addEventListener("abort", () => {
517
+ if (busy && running && TAKES_INDEX_LOCK.has(running))
518
+ lockAtStop = lockOf(busy);
519
+ }, { once: true });
520
+ const g = async (args, cwd = root) => {
521
+ running = args[0];
522
+ try {
523
+ return await (signal ? git(args, cwd, { signal }) : git(args, cwd));
524
+ } finally {
525
+ running = void 0;
526
+ }
527
+ };
418
528
  const withBaseClone = (dest, id2, work) => withBaseCloneLock(dest, id2, work, opts.lockWaitMs);
419
529
  const head = async (cwd) => (await g(["rev-parse", "HEAD"], cwd)).stdout.trim();
420
530
  const dirty = async (cwd) => (await g(["status", "--porcelain", "--untracked-files=normal"], cwd)).stdout.trim() !== "";
@@ -471,6 +581,344 @@ function createWorkspace(root, git = createGit(), opts = {}) {
471
581
  await g(["checkout", "--quiet", "-B", branch, at], dest);
472
582
  return { id: repo.id, action: "cloned", sha: await head(dest), from };
473
583
  }
584
+ const markOf = (dest) => join4(dest, ".git", SYNC_CHECKOUT_MARK);
585
+ function lockOf(dest) {
586
+ try {
587
+ const st = statSync(join4(dest, ".git", "index.lock"), { throwIfNoEntry: false });
588
+ return st ? `${st.dev}:${st.ino}:${st.mtimeMs}` : void 0;
589
+ } catch {
590
+ return void 0;
591
+ }
592
+ }
593
+ async function dropKilledLock(dest, atStop) {
594
+ const now = lockOf(dest);
595
+ if (!now)
596
+ return true;
597
+ if (now !== atStop)
598
+ return false;
599
+ await rm2(join4(dest, ".git", "index.lock"), { force: true });
600
+ return true;
601
+ }
602
+ async function restoreBaseClone(repo, dest, atStop) {
603
+ const kept = [];
604
+ const no = (why) => ({ why, kept });
605
+ const mark = markOf(dest);
606
+ const keep = (what) => no(`${what}. Nothing was changed. To keep it, move it out of ${dest} (base clones are read-only) and sync again; or delete ${mark} to keep the clone as it is`);
607
+ const notOurs = (detail) => no(`its mark ${mark} isn't one a sync writes (${detail}). Nothing was changed. If nothing in ${dest} is yours, put it back with git -C ${dest} checkout --force ${repo.defaultBranch} and git -C ${dest} clean -fd, then delete the mark; or delete the mark to keep the clone as it is`);
608
+ let was;
609
+ try {
610
+ was = JSON.parse(await readFile3(mark, "utf8"));
611
+ } catch {
612
+ return notOurs("it can't be read");
613
+ }
614
+ if (typeof was !== "object" || was === null)
615
+ return notOurs("it can't be read");
616
+ const head2 = typeof was.head === "string" && SHA.test(was.head) ? was.head : "";
617
+ const target = typeof was.target === "string" && SHA.test(was.target) ? was.target : "";
618
+ if (!head2 || !target)
619
+ return notOurs("it names no commit it was on and none it fetched");
620
+ const branch = typeof was.branch === "string" ? was.branch : "";
621
+ if (branch !== repo.defaultBranch || branch.startsWith("-") || branch.startsWith("refs/"))
622
+ return notOurs(`its branch isn't ${repo.defaultBranch}, the manifest's`);
623
+ const ref = `refs/heads/${branch}`;
624
+ const read = async (args) => {
625
+ try {
626
+ return (await git(args, dest)).stdout.trim();
627
+ } catch {
628
+ return "";
629
+ }
630
+ };
631
+ const ok = (args) => git(args, dest).then(() => true, () => false);
632
+ try {
633
+ if ((await lstat(dest)).isSymbolicLink())
634
+ return keep(`${dest} is a link (to ${await realpath(dest).catch(() => "a folder that isn't there")}), not a base clone Atticus made`);
635
+ const noClone = no(`${dest} is no git clone of its own (its .git folder is broken). Nothing was changed. If nothing in it is yours, delete the folder ${dest} and sync again to clone it afresh; or delete ${mark} to keep it as it is`);
636
+ if (!(await lstat(join4(dest, ".git"))).isDirectory())
637
+ return noClone;
638
+ const top = await read(["rev-parse", "--show-toplevel"]);
639
+ if (!top || await realpath(top) !== await realpath(dest))
640
+ return noClone;
641
+ if (!await ok(["check-ref-format", ref]))
642
+ return notOurs(`${branch} is no branch name`);
643
+ if (await read(["symbolic-ref", "--quiet", "HEAD"]) !== ref)
644
+ return keep(`the base clone isn't on ${branch} as the sync left it`);
645
+ const origin = `refs/remotes/origin/${branch}`;
646
+ if (await read(["rev-parse", "--verify", "--quiet", origin]) !== target && !(await read(["rev-parse", "--verify", "--quiet", `${target}^{commit}`]) === target && (await ok(["merge-base", "--is-ancestor", target, origin]) || (await read(["reflog", "show", "--format=%H", origin, "--"])).split("\n").includes(target))))
647
+ return notOurs(`the commit it names as fetched was never origin/${branch}`);
648
+ const tip = await read(["rev-parse", "--verify", "--quiet", ref]);
649
+ if (tip !== head2 && tip !== target)
650
+ return keep(`${branch} is at ${tip.slice(0, 12) || "no commit"}, a commit that sync didn't leave`);
651
+ if (tip === target && target !== head2) {
652
+ const before = await read(["rev-parse", "--verify", "--quiet", `${ref}@{1}`]);
653
+ if (before !== head2 && !await ok(["reflog", "exists", ref]))
654
+ return no(`${branch} is at ${tip.slice(0, 12)}, the commit that sync fetched, but this clone's history can't show the sync left it (git keeps no reflog of ${branch} there). Nothing was changed. To let Atticus put it back, set ${branch} back to the commit it was on with git -C ${dest} update-ref ${ref} ${head2} ${target} and sync again; or delete ${mark} to keep the clone as it is`);
655
+ if (before !== head2)
656
+ return keep(`${branch} is at ${tip.slice(0, 12)} but wasn't moved there from ${head2.slice(0, 12)} by that sync`);
657
+ }
658
+ if (!await read(["rev-parse", "--verify", "--quiet", `${head2}^{commit}`]))
659
+ return notOurs(`it names a commit the clone hasn't got`);
660
+ const differ = (await git(["diff-tree", "-r", "-z", "--no-renames", "--no-commit-id", head2, target], dest)).stdout.split("\0");
661
+ const added = /* @__PURE__ */ new Set();
662
+ const inBoth = /* @__PURE__ */ new Set();
663
+ const blobs = /* @__PURE__ */ new Map();
664
+ const entries = /* @__PURE__ */ new Map();
665
+ const ignoreCase = await read(["config", "--bool", "core.ignorecase"]) === "true";
666
+ const keyOf = (p) => ignoreCase ? p.toLowerCase() : p;
667
+ const NONE = /^0+$/;
668
+ const swapped = [];
669
+ for (let i = 0; i + 1 < differ.length; i += 2) {
670
+ const [from, to, was2, now2, st] = differ[i].split(" ");
671
+ const p = differ[i + 1];
672
+ (st === "A" ? added : inBoth).add(p);
673
+ const modes = [from.slice(1), to];
674
+ if (modes.includes("160000") && !modes.includes("000000") && modes[0] !== modes[1])
675
+ swapped.push(p);
676
+ const known = blobs.get(keyOf(p)) ?? /* @__PURE__ */ new Set();
677
+ for (const b of [was2, now2])
678
+ if (b && !NONE.test(b))
679
+ known.add(b);
680
+ blobs.set(keyOf(p), known);
681
+ const both = entries.get(keyOf(p)) ?? [];
682
+ [was2, now2].forEach((b, k) => {
683
+ if (b && !NONE.test(b))
684
+ both.push([modes[k], b]);
685
+ });
686
+ entries.set(keyOf(p), both);
687
+ }
688
+ const inDiff = (p) => added.has(p) || inBoth.has(p);
689
+ const ownLinks = [];
690
+ for (const p of swapped) {
691
+ if (await throughLink(dest, dirname2(p)))
692
+ return keep(`a folder on the way to ${p} is a link, where one commit has a submodule and the other a file`);
693
+ const st = await lstat(join4(dest, p)).catch(() => void 0);
694
+ if (st?.isSymbolicLink()) {
695
+ const to = await readlink(join4(dest, p));
696
+ if (!await gitsOwnLink(dest, to, entries.get(keyOf(p)) ?? []))
697
+ return keep(`${p} is a link, where one commit has a submodule and the other a file`);
698
+ ownLinks.push(p);
699
+ } else if (st?.isDirectory() && (await readdir3(join4(dest, p))).length > 0)
700
+ return keep(`${p} is a folder with files in it, where one commit has a submodule and the other a file`);
701
+ }
702
+ const status = async (skip = []) => statusEntries((await git([
703
+ "status",
704
+ "--porcelain=v1",
705
+ "-z",
706
+ "--no-renames",
707
+ "--untracked-files=all",
708
+ "--ignore-submodules=none",
709
+ // each path as written, from the clone's top (a link of git's own, put back below)
710
+ ...skip.length ? ["--", ...skip.map((p) => `:(top,exclude,literal)${p}`)] : []
711
+ ], dest)).stdout);
712
+ const theirs = (await status(ownLinks)).filter(([, p]) => !inDiff(p));
713
+ if (theirs.length > 0)
714
+ return keep(`what that checkout didn't write is changed: ${sayPaths(theirs)}`);
715
+ const staged = /* @__PURE__ */ new Set();
716
+ const indexed = [];
717
+ for (const e of (await git(["ls-files", "--stage", "-z"], dest)).stdout.split("\0")) {
718
+ const tab = e.indexOf(" ");
719
+ if (tab >= 0)
720
+ indexed.push(e.slice(tab + 1));
721
+ if (tab < 0 || !inDiff(e.slice(tab + 1)))
722
+ continue;
723
+ const [, blob, stage] = e.slice(0, tab).split(" ");
724
+ if (stage !== "0" || !blobs.get(keyOf(e.slice(tab + 1)))?.has(blob))
725
+ staged.add(e.slice(tab + 1));
726
+ }
727
+ if (staged.size > 0)
728
+ return no(`what that checkout didn't write is staged: ${sayPaths([...staged].map((p) => ["A ", p]))}. Nothing was changed. To keep it, move it out of ${dest} (base clones are read-only) and unstage it there (git -C ${dest} restore --staged -- <path>), then sync again; or delete ${mark} to keep the clone as it is`);
729
+ if (!await dropKilledLock(dest, atStop))
730
+ return no(`git's lock ${join4(dest, ".git", "index.lock")} is there: if no git is running in ${dest}, delete it; the next sync puts the clone back (its mark ${mark} stays until then)`);
731
+ if (tip !== head2)
732
+ await git(["update-ref", "-m", "atticus: a stopped sync put back", ref, head2, tip], dest);
733
+ for (const p of ownLinks)
734
+ if ((await lstat(join4(dest, p)).catch(() => void 0))?.isSymbolicLink())
735
+ await unlink(join4(dest, p));
736
+ const now = (await status()).map(([, p]) => p);
737
+ const strays = ignoreCase ? await hiddenByCase(dest, [...added], now, indexed) : [];
738
+ kept.push(...await keepTheirs(dest, [...now, ...strays], (p) => blobs.get(keyOf(p)) ?? /* @__PURE__ */ new Set(), (p) => entries.get(keyOf(p)) ?? [], new Set(indexed)));
739
+ const back = now.filter((p) => inBoth.has(p));
740
+ const out = now.filter((p) => added.has(p));
741
+ for (const ps of inGroups(out))
742
+ await git(["update-index", "--force-remove", "--", ...ps], dest);
743
+ const lit = (ps) => ps.map((p) => `:(literal)${p}`);
744
+ const files = [];
745
+ for (const p of out) {
746
+ const st = await lstat(join4(dest, p)).catch(() => void 0);
747
+ if (st && !st.isDirectory() && !await throughLink(dest, dirname2(p)))
748
+ files.push(p);
749
+ }
750
+ for (const ps of inGroups(files))
751
+ await git(["clean", "-fq", "--", ...lit(ps)], dest);
752
+ for (const p of strays)
753
+ await rm2(join4(dest, p), { force: true });
754
+ const headFolders = /* @__PURE__ */ new Set();
755
+ for (const e of (await git(["ls-tree", "-r", "-t", "-z", head2], dest)).stdout.split("\0")) {
756
+ const [, type] = e.slice(0, Math.max(0, e.indexOf(" "))).split(" ");
757
+ if (type === "tree" || type === "commit")
758
+ headFolders.add(keyOf(e.slice(e.indexOf(" ") + 1)));
759
+ }
760
+ for (const p of added)
761
+ for (let d = dirname2(p); d !== "." && d !== "" && d !== "/"; d = dirname2(d))
762
+ if (headFolders.has(keyOf(d)) || await throughLink(dest, d) || !await rmdir(join4(dest, d)).then(() => true, () => false))
763
+ break;
764
+ for (const ps of inGroups(back))
765
+ await git(["checkout", "--quiet", head2, "--", ...lit(ps)], dest);
766
+ const left = await status();
767
+ if (left.length > 0)
768
+ return no(`putting it back left ${sayPaths(left)}; its mark ${mark} stays, so the next sync tries again${kept.length ? `; ${sayKept(kept)}` : ""}`);
769
+ await rm2(mark, { force: true });
770
+ return { kept };
771
+ } catch (e) {
772
+ return no(`${e.message}; its mark ${mark} stays, so the next sync tries again${kept.length ? `; ${sayKept(kept)}` : ""}`);
773
+ }
774
+ }
775
+ async function hiddenByCase(dest, added, listed, indexed) {
776
+ const seen = new Set(listed);
777
+ const exact = new Set(indexed);
778
+ const byCase = /* @__PURE__ */ new Map();
779
+ for (const q of indexed)
780
+ byCase.set(q.toLowerCase(), [...byCase.get(q.toLowerCase()) ?? [], q]);
781
+ const out = [];
782
+ for (const p of added) {
783
+ if (seen.has(p) || exact.has(p))
784
+ continue;
785
+ const others = byCase.get(p.toLowerCase()) ?? [];
786
+ if (others.length === 0)
787
+ continue;
788
+ const st = await lstat(join4(dest, p)).catch(() => void 0);
789
+ if (!st || st.isDirectory())
790
+ continue;
791
+ let same = false;
792
+ for (const q of others) {
793
+ const o = await lstat(join4(dest, q)).catch(() => void 0);
794
+ if (o && o.dev === st.dev && o.ino === st.ino)
795
+ same = true;
796
+ }
797
+ if (!same && !await throughLink(dest, dirname2(p)))
798
+ out.push(p);
799
+ }
800
+ return out;
801
+ }
802
+ async function gitsOwnLink(dest, to, entries) {
803
+ for (const [mode, b] of entries) {
804
+ if (mode !== "120000")
805
+ continue;
806
+ const text = (await git(["cat-file", "blob", b], dest).catch(() => void 0))?.stdout;
807
+ if (text !== void 0 && linkTextIsBlob(to, mode, text))
808
+ return true;
809
+ }
810
+ return false;
811
+ }
812
+ async function keepTheirs(dest, paths, known, entries, indexed) {
813
+ const files = [];
814
+ const links = [];
815
+ const seen = /* @__PURE__ */ new Map();
816
+ const first = [...new Set(paths)].sort((a, b) => +indexed.has(b) - +indexed.has(a));
817
+ for (const p of first) {
818
+ if (await throughLink(dest, dirname2(p)))
819
+ continue;
820
+ const st = await lstat(join4(dest, p), { bigint: true }).catch(() => void 0);
821
+ if (!st)
822
+ continue;
823
+ const id2 = `${st.dev}:${st.ino}`;
824
+ const was = seen.get(id2);
825
+ if (st.ino !== 0n && was !== void 0 && was.toLowerCase() === p.toLowerCase())
826
+ continue;
827
+ if (was === void 0)
828
+ seen.set(id2, p);
829
+ if (st.isFile())
830
+ files.push(p);
831
+ else if (st.isSymbolicLink())
832
+ links.push(p);
833
+ }
834
+ const theirs = [];
835
+ for (const ps of inGroups(files)) {
836
+ const ids = (await git(["hash-object", "--", ...ps], dest)).stdout.trim().split("\n");
837
+ ps.forEach((p, i) => {
838
+ if (!known(p).has(ids[i].trim()))
839
+ theirs.push(p);
840
+ });
841
+ }
842
+ const linkText = /* @__PURE__ */ new Map();
843
+ for (const p of links) {
844
+ const to = await readlink(join4(dest, p));
845
+ linkText.set(p, to);
846
+ if (!await gitsOwnLink(dest, to, entries(p)))
847
+ theirs.push(p);
848
+ }
849
+ if (theirs.length === 0)
850
+ return [];
851
+ const top = join4(dest, ".git", PUT_BACK_DIR);
852
+ await mkdir3(top, { recursive: true });
853
+ if (!(await lstat(top)).isDirectory())
854
+ throw new Error(`${top} isn't a folder of its own (a link?): nothing was copied there`);
855
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
856
+ let at = join4(top, stamp);
857
+ for (let n = 2; ; n++) {
858
+ try {
859
+ await mkdir3(at);
860
+ break;
861
+ } catch (e) {
862
+ if (e.code !== "EEXIST" || n > 100)
863
+ throw e;
864
+ at = join4(top, `${stamp}-${n}`);
865
+ }
866
+ }
867
+ const out = [];
868
+ for (const p of theirs) {
869
+ const copy = join4(at, ...p.split("/"));
870
+ await mkdir3(dirname2(copy), { recursive: true });
871
+ const to = linkText.get(p);
872
+ try {
873
+ if (to === void 0)
874
+ await copyFile(join4(dest, p), copy, fsConstants.COPYFILE_EXCL);
875
+ else
876
+ await symlink(to, copy).catch(() => writeFile4(copy, to, { flag: "wx" }));
877
+ } catch (e) {
878
+ if (e.code !== "EEXIST")
879
+ throw e;
880
+ const c = await lstat(copy);
881
+ const there = c.isSymbolicLink() ? await readlink(copy) === to : c.isFile() && (await readFile3(copy)).equals(to === void 0 ? await readFile3(join4(dest, p)) : Buffer.from(to));
882
+ if (!there)
883
+ throw e;
884
+ continue;
885
+ }
886
+ out.push({ path: p, copy });
887
+ }
888
+ return out;
889
+ }
890
+ async function stoppedOne(repo, dest, made, updatedTo) {
891
+ if (made) {
892
+ const gone = await rm2(dest, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }).then(() => true).catch(() => false);
893
+ return {
894
+ id: repo.id,
895
+ action: "stopped",
896
+ reason: gone ? "stopped: the clone it had started was taken away; sync again to clone it" : `stopped: the clone it had started couldn't be taken away; delete ${dest} before you sync again`
897
+ };
898
+ }
899
+ if (updatedTo !== void 0)
900
+ return {
901
+ id: repo.id,
902
+ action: "stopped",
903
+ sha: updatedTo,
904
+ reason: `stopped once the base clone was updated, to ${repo.defaultBranch} at ${updatedTo.slice(0, 12)}; sync again to finish`
905
+ };
906
+ if (existsSync2(markOf(dest))) {
907
+ const { why, kept } = await restoreBaseClone(repo, dest, lockAtStop);
908
+ return {
909
+ id: repo.id,
910
+ action: "stopped",
911
+ ...kept.length ? { kept } : {},
912
+ reason: why ? `stopped in the base clone's checkout, and it wasn't put back as it was: ${why}` : `stopped: the base clone is back as it was before this sync${kept.length ? `; ${sayKept(kept)}` : ""}; sync again`
913
+ };
914
+ }
915
+ await dropKilledLock(dest, lockAtStop).catch(() => false);
916
+ return {
917
+ id: repo.id,
918
+ action: "stopped",
919
+ reason: "stopped: the base clone is as it was before this sync; sync again"
920
+ };
921
+ }
474
922
  async function syncOne(repo, local) {
475
923
  if (repo.archived)
476
924
  return { id: repo.id, action: "skipped", reason: "archived" };
@@ -483,6 +931,14 @@ function createWorkspace(root, git = createGit(), opts = {}) {
483
931
  const dest = baseClonePath(root, repo.id);
484
932
  const branch = repo.defaultBranch;
485
933
  const made = !existsSync2(dest);
934
+ busy = made ? void 0 : dest;
935
+ let earlier = [];
936
+ let updatedTo;
937
+ const said = (r) => earlier.length === 0 ? r : {
938
+ ...r,
939
+ kept: [...earlier, ...r.kept ?? []],
940
+ reason: `${r.reason ? `${r.reason}; ` : ""}an earlier sync's stopped checkout was put back first: ${sayKept(earlier)}`
941
+ };
486
942
  try {
487
943
  if (made) {
488
944
  await mkdir3(dirname2(dest), { recursive: true });
@@ -511,33 +967,56 @@ function createWorkspace(root, git = createGit(), opts = {}) {
511
967
  ...await remoteDefault(dest)
512
968
  };
513
969
  }
970
+ if (existsSync2(markOf(dest))) {
971
+ const { why, kept } = await restoreBaseClone(repo, dest);
972
+ if (why)
973
+ return {
974
+ id: repo.id,
975
+ action: "failed",
976
+ ...kept.length ? { kept } : {},
977
+ reason: `an earlier sync was stopped in the base clone's checkout, and it wasn't put back: ${why}`
978
+ };
979
+ earlier = kept;
980
+ }
514
981
  if (await dirty(dest)) {
515
- return {
982
+ return said({
516
983
  id: repo.id,
517
984
  action: "skipped",
518
985
  sha: await head(dest),
519
986
  reason: "the base clone has local changes; base clones are read-only"
520
- };
987
+ });
521
988
  }
989
+ const before = await head(dest);
522
990
  await g(["fetch", "--no-tags", "origin", `+refs/heads/${branch}:refs/remotes/origin/${branch}`], dest);
991
+ const target = (await g(["rev-parse", "--verify", "--quiet", `refs/remotes/origin/${branch}^{commit}`], dest)).stdout.trim();
992
+ await writeFile4(markOf(dest), `${JSON.stringify({ head: before, target, branch, at: (/* @__PURE__ */ new Date()).toISOString() })}
993
+ `, "utf8");
523
994
  await g(["checkout", "--quiet", "-B", branch, `refs/remotes/origin/${branch}`], dest);
524
995
  if (repo.sparse.length > 0)
525
996
  await g(["sparse-checkout", "set", "--", ...repo.sparse], dest);
526
- return {
997
+ await rm2(markOf(dest), { force: true });
998
+ updatedTo = target;
999
+ return said({
527
1000
  id: repo.id,
528
1001
  action: "updated",
529
1002
  sha: await head(dest),
530
1003
  ...await remoteDefault(dest)
531
- };
1004
+ });
532
1005
  } catch (err) {
1006
+ if (signal?.aborted || err instanceof GitStoppedError)
1007
+ return said(await stoppedOne(repo, dest, made, updatedTo));
533
1008
  if (made)
534
1009
  await rm2(dest, { recursive: true, force: true }).catch(() => void 0);
535
1010
  const msg = err.message;
536
- return {
1011
+ const marked = !made && existsSync2(markOf(dest)) ? `; the base clone's checkout mark ${markOf(dest)} stays, so the next sync puts the clone back first` : "";
1012
+ return said({
537
1013
  id: repo.id,
538
1014
  action: "failed",
539
- reason: /Filename too long/i.test(msg) ? `${msg.trim()} \u2014 a path in the repo is longer than Windows allows: run git config --global core.longpaths true, then sync again` : msg
540
- };
1015
+ reason: /Filename too long/i.test(msg) ? `${msg.trim()} \u2014 a path in the repo is longer than Windows allows: run git config --global core.longpaths true, then sync again${marked}` : `${msg}${marked}`
1016
+ });
1017
+ } finally {
1018
+ busy = void 0;
1019
+ lockAtStop = void 0;
541
1020
  }
542
1021
  }
543
1022
  async function worktreeFor(change, repo) {
@@ -602,11 +1081,16 @@ function createWorkspace(root, git = createGit(), opts = {}) {
602
1081
  await ensureGitignore(root);
603
1082
  const out = [];
604
1083
  const local = opts2.from ? await localClones(opts2.from, git) : void 0;
605
- for (const repo of repos)
1084
+ for (const repo of repos) {
1085
+ if (signal?.aborted) {
1086
+ out.push({ id: repo.id, action: "stopped", reason: "not started: the sync was stopped" });
1087
+ continue;
1088
+ }
606
1089
  out.push(
607
1090
  // Nothing to lock (nor a folder to make) for an archived or in-place repo.
608
1091
  repo.archived || isInPlace(repo.url) ? await syncOne(repo, local) : await withBaseClone(baseClonePath(root, repo.id), repo.id, () => syncOne(repo, local))
609
1092
  );
1093
+ }
610
1094
  return out;
611
1095
  },
612
1096
  checkoutBranch(repo, branch) {
@@ -805,6 +1289,7 @@ function nearRepos(entry, listed) {
805
1289
 
806
1290
  export {
807
1291
  GitError,
1292
+ GitStoppedError,
808
1293
  createGit,
809
1294
  changedFiles,
810
1295
  changesSince,
@@ -837,6 +1322,8 @@ export {
837
1322
  inPlacePath,
838
1323
  inPlaceDir,
839
1324
  remoteDefaultBranch,
1325
+ SYNC_CHECKOUT_MARK,
1326
+ PUT_BACK_DIR,
840
1327
  createWorkspace,
841
1328
  toHandle,
842
1329
  gitUser,
@@ -18,14 +18,14 @@ import {
18
18
  proposedSince,
19
19
  sha256,
20
20
  startDecideRun
21
- } from "./chunk-3KP7OOJ4.js";
22
- import "./chunk-ZDA72732.js";
23
- import "./chunk-QA4O2GGC.js";
24
- import "./chunk-6ZDAEUKB.js";
25
- import "./chunk-MEMEO7YO.js";
26
- import "./chunk-LZFKJ2BR.js";
27
- import "./chunk-CTJHEG6A.js";
21
+ } from "./chunk-AMZ4XMES.js";
22
+ import "./chunk-2MRYL45Z.js";
23
+ import "./chunk-WJWSB65O.js";
24
+ import "./chunk-SMFFUFMN.js";
25
+ import "./chunk-A3LVMCA5.js";
26
+ import "./chunk-NWMFVPEP.js";
28
27
  import "./chunk-BQGDB6ZL.js";
28
+ import "./chunk-R4TUWD4C.js";
29
29
  import "./chunk-TV45EUGM.js";
30
30
  export {
31
31
  DECIDE_AGENTS,