@maycombhq/atticus 2.0.0-beta.22 → 2.0.0-beta.23

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 (279) hide show
  1. package/dist/bin.js +12 -7
  2. package/dist/{chunk-LYBNHMVZ.js → chunk-27AJAKX7.js} +3 -3
  3. package/dist/{chunk-KXITGYLF.js → chunk-2QPJ4E4Z.js} +2 -2
  4. package/dist/{chunk-EIPTLPFC.js → chunk-2UMSHYCB.js} +24 -24
  5. package/dist/{chunk-6PPOWY5E.js → chunk-2WUTCPPJ.js} +6 -6
  6. package/dist/{chunk-VNU26RCO.js → chunk-2YSD6E6V.js} +33 -32
  7. package/dist/{chunk-P32RUW3B.js → chunk-3424TLIJ.js} +39 -7
  8. package/dist/{chunk-2MMCFP5C.js → chunk-3ASYYMOX.js} +8 -8
  9. package/dist/{chunk-PKBHS4AA.js → chunk-3EWKO457.js} +48 -17
  10. package/dist/{chunk-J3IOLXWM.js → chunk-3EX5HCZD.js} +5 -5
  11. package/dist/{chunk-BDKC6H5P.js → chunk-3MYBT62N.js} +5 -5
  12. package/dist/{chunk-ZFL7NY4F.js → chunk-3UHV76UD.js} +69 -41
  13. package/dist/{chunk-Q4K5WB2W.js → chunk-3ZA3AK2D.js} +10 -10
  14. package/dist/{chunk-O7FDLW7L.js → chunk-4ETO2FXE.js} +5 -5
  15. package/dist/{chunk-AFWUDXEM.js → chunk-4FLNCK6Q.js} +26 -11
  16. package/dist/{chunk-745DAZ4L.js → chunk-4GAB5ZOZ.js} +901 -332
  17. package/dist/{chunk-3RM4UK6W.js → chunk-4MYHETJ3.js} +18 -18
  18. package/dist/chunk-4R3TO4VL.js +94 -0
  19. package/dist/chunk-5MYE42AP.js +43 -0
  20. package/dist/chunk-5O7U67UA.js +57 -0
  21. package/dist/{chunk-Y2EQNWKV.js → chunk-5OXKCH4Z.js} +31 -31
  22. package/dist/{chunk-O45HFTFS.js → chunk-5VTIWEWP.js} +2 -2
  23. package/dist/{chunk-UNAGJYET.js → chunk-63NFFAGI.js} +12 -12
  24. package/dist/{chunk-6ZJ5A7AF.js → chunk-66AQ2JIU.js} +9 -9
  25. package/dist/chunk-6JVPBGQG.js +50 -0
  26. package/dist/{chunk-VY72R2XZ.js → chunk-6NCPLIIP.js} +124 -2
  27. package/dist/{chunk-D73UEXYW.js → chunk-6NN36LVK.js} +3 -3
  28. package/dist/{chunk-7FTTA3HD.js → chunk-6R5VHR3N.js} +5 -5
  29. package/dist/{chunk-CADWLE2T.js → chunk-6RQOINER.js} +4 -4
  30. package/dist/{chunk-WG5U3F5V.js → chunk-6RYB3EET.js} +12 -12
  31. package/dist/{chunk-RXPJMEOW.js → chunk-6SNTHK43.js} +10 -10
  32. package/dist/{chunk-ZFFYNRIO.js → chunk-6Y4FXOMI.js} +24 -22
  33. package/dist/{chunk-SQV37XO2.js → chunk-6ZFF7XSL.js} +6 -6
  34. package/dist/{chunk-JA5FI3QV.js → chunk-6ZSYLZ7O.js} +3 -3
  35. package/dist/{chunk-JENSEMXF.js → chunk-73CC73I4.js} +1 -1
  36. package/dist/{chunk-2F4CYZKJ.js → chunk-73GFVW2L.js} +5 -5
  37. package/dist/{chunk-M3NANSDZ.js → chunk-73V2OONC.js} +15 -15
  38. package/dist/{chunk-WKUJ3KPV.js → chunk-75OMRKY2.js} +4 -4
  39. package/dist/{chunk-7BR7IPOH.js → chunk-7IFTSAHP.js} +8 -8
  40. package/dist/{chunk-OWNCM4ZN.js → chunk-7K5OH45X.js} +136 -16
  41. package/dist/{chunk-VCTWPLAO.js → chunk-7NQAGYK4.js} +8 -8
  42. package/dist/{chunk-O4GXGGBX.js → chunk-7XWJ6ED2.js} +12 -12
  43. package/dist/{chunk-MFR5OPBD.js → chunk-7XYLNQFO.js} +5 -5
  44. package/dist/{chunk-GCWRWSU7.js → chunk-7YQBDE5W.js} +4 -4
  45. package/dist/{chunk-QKUJMING.js → chunk-A4JXVO5O.js} +5 -5
  46. package/dist/{chunk-LKOR5UET.js → chunk-AFBCNZRZ.js} +24 -24
  47. package/dist/{chunk-BXYMYEJ4.js → chunk-AGOLEMHK.js} +13 -14
  48. package/dist/{chunk-AVTBS4OW.js → chunk-AHFQHPFF.js} +22 -22
  49. package/dist/{chunk-NY2XSR5K.js → chunk-APDN6UOR.js} +116 -18
  50. package/dist/chunk-AQRUQNFB.js +322 -0
  51. package/dist/{chunk-5NMKONLP.js → chunk-AVMWESFZ.js} +3 -2
  52. package/dist/chunk-B4AEL3RF.js +1011 -0
  53. package/dist/{chunk-H7KM7LZE.js → chunk-BAY4K55I.js} +11 -11
  54. package/dist/{chunk-XD75VZIH.js → chunk-BFL4PO64.js} +7 -7
  55. package/dist/{chunk-34S2WGOB.js → chunk-BFMTGNAQ.js} +5 -3
  56. package/dist/{chunk-SLXZOMA6.js → chunk-BP33TBLI.js} +4 -4
  57. package/dist/{chunk-IFKEI4SA.js → chunk-BUUJ7N4O.js} +11 -11
  58. package/dist/{chunk-EGQRREQH.js → chunk-BYBU2EIB.js} +26 -15
  59. package/dist/{chunk-SFUP7TTO.js → chunk-C6ORPLCN.js} +4 -4
  60. package/dist/{chunk-IVBOQAGB.js → chunk-CA3DKO4D.js} +24 -2
  61. package/dist/{chunk-57TDNMI3.js → chunk-CFUDAW3R.js} +15 -15
  62. package/dist/{chunk-FFTRTL6R.js → chunk-CJEBRJBS.js} +4 -4
  63. package/dist/{chunk-EPCJQQWD.js → chunk-CKVBDVIW.js} +4 -4
  64. package/dist/{chunk-FPJPLKDW.js → chunk-CMB7FXHJ.js} +38 -16
  65. package/dist/{chunk-INQHESFB.js → chunk-CQ7RF4QN.js} +4 -4
  66. package/dist/{chunk-63YRMR6J.js → chunk-CS4BMJLL.js} +5 -5
  67. package/dist/{chunk-BPK5P77O.js → chunk-CT6NINGR.js} +3 -3
  68. package/dist/chunk-CXTG6AWM.js +40 -0
  69. package/dist/{chunk-CXJ6FUKN.js → chunk-CZ2ZS7AT.js} +9 -4
  70. package/dist/{chunk-S4PMJU6H.js → chunk-D6BVLTDV.js} +85 -29
  71. package/dist/{chunk-M32BLWDH.js → chunk-DCRYOMTM.js} +12 -12
  72. package/dist/{chunk-REWWDVQB.js → chunk-DHKDH464.js} +4 -4
  73. package/dist/{chunk-2LGRMVCA.js → chunk-DSHRA72L.js} +10 -10
  74. package/dist/{chunk-THDMSZ3R.js → chunk-E3PDCQRH.js} +2765 -665
  75. package/dist/chunk-EHXDB3SA.js +25 -0
  76. package/dist/{chunk-BTGPE6CR.js → chunk-EMVZIOOD.js} +7 -7
  77. package/dist/{chunk-DOBQKHIF.js → chunk-ENH6Z4TY.js} +28 -27
  78. package/dist/{chunk-LGFL54FP.js → chunk-EVTI22PQ.js} +6 -2
  79. package/dist/{chunk-7MJSQTL5.js → chunk-EXJZBL5N.js} +20 -20
  80. package/dist/{chunk-N3XIYPU3.js → chunk-FBCVC2GJ.js} +12 -12
  81. package/dist/{chunk-UWOJLHFT.js → chunk-FJVUHQPS.js} +34 -23
  82. package/dist/{chunk-7IGKHZ4Z.js → chunk-FL344WQD.js} +218 -211
  83. package/dist/{chunk-IH2XURVQ.js → chunk-FMJYKLDY.js} +5 -5
  84. package/dist/chunk-FMR2D3AZ.js +41 -0
  85. package/dist/{chunk-Q2TECDIT.js → chunk-FPBUTZI5.js} +2201 -326
  86. package/dist/{chunk-PJSJPMJI.js → chunk-FQVSLBTV.js} +3 -3
  87. package/dist/{chunk-NXJ5URP6.js → chunk-FRAEQVYN.js} +23 -22
  88. package/dist/{chunk-RLDGWLQ7.js → chunk-FRCOKUU4.js} +7 -7
  89. package/dist/{chunk-DCZWQLYT.js → chunk-FSN6JFXB.js} +18 -15
  90. package/dist/{chunk-W7VWI2YH.js → chunk-FTLYXMHA.js} +5 -5
  91. package/dist/{chunk-7GJS6DNX.js → chunk-FVYZ4Y52.js} +11 -3
  92. package/dist/{chunk-CQDGOPGH.js → chunk-G6EFXTUO.js} +2 -2
  93. package/dist/{chunk-JB5LINEM.js → chunk-G7VBMOZH.js} +3 -3
  94. package/dist/{chunk-7ASNL4Q4.js → chunk-GM4EFHUX.js} +15 -15
  95. package/dist/chunk-GOZLTLRY.js +232 -0
  96. package/dist/chunk-GPNMSX5H.js +36 -0
  97. package/dist/{chunk-BQ4SQQC6.js → chunk-GUGQSIQM.js} +9 -9
  98. package/dist/{chunk-E3ISYXO3.js → chunk-HJQVUOUL.js} +12 -12
  99. package/dist/{chunk-MFHL5URL.js → chunk-HMWJWYE2.js} +16 -16
  100. package/dist/{chunk-YYY3AZFE.js → chunk-HMZ2DRBC.js} +2 -2
  101. package/dist/{chunk-C3RY6KU6.js → chunk-HRS5O7VV.js} +500 -163
  102. package/dist/{chunk-AJQ72EBM.js → chunk-HUGQZQ2K.js} +6 -6
  103. package/dist/{chunk-AJYXNTNZ.js → chunk-ICBGVVRI.js} +10 -10
  104. package/dist/{chunk-J2JAKCIW.js → chunk-IKAW2KJU.js} +17 -17
  105. package/dist/{chunk-OUBGGKDU.js → chunk-IMZFOMVX.js} +1 -1
  106. package/dist/{chunk-LDLL7LB3.js → chunk-ISG547IS.js} +22 -22
  107. package/dist/{chunk-GZY6RUZ6.js → chunk-IYNCSYU4.js} +5 -2
  108. package/dist/{chunk-H5HBGNXU.js → chunk-J25YOUIZ.js} +4 -4
  109. package/dist/chunk-J2CDBSFP.js +69 -0
  110. package/dist/chunk-J2H7YG3K.js +34 -0
  111. package/dist/{chunk-SFSPGFCV.js → chunk-J32IPTVQ.js} +20 -20
  112. package/dist/{chunk-BEVTIBRH.js → chunk-J4CPHJUL.js} +5 -5
  113. package/dist/{chunk-F3P7N7SF.js → chunk-JFFKHIM6.js} +1 -1
  114. package/dist/{chunk-RUGXBPWI.js → chunk-JMEWJPF2.js} +8 -8
  115. package/dist/{chunk-WERM6KPJ.js → chunk-JSP73CDW.js} +9 -4
  116. package/dist/{chunk-66PPNOON.js → chunk-JXAKYP45.js} +26 -25
  117. package/dist/{chunk-7JITZFJC.js → chunk-K4OXYSGS.js} +4 -4
  118. package/dist/{chunk-EHA7RMZ3.js → chunk-K4RNVDR4.js} +4 -4
  119. package/dist/{chunk-R44CYFPV.js → chunk-K757G7AD.js} +12 -12
  120. package/dist/{chunk-FUJM6RTF.js → chunk-KDJ2YKAZ.js} +7 -7
  121. package/dist/{chunk-QAXW2N3B.js → chunk-KT6Q44CA.js} +28 -30
  122. package/dist/{chunk-EBL2R3YG.js → chunk-KTNOBTV5.js} +4 -4
  123. package/dist/chunk-KVVNAUIG.js +66 -0
  124. package/dist/{chunk-X5F3Q5LV.js → chunk-L3RCQWVQ.js} +21 -18
  125. package/dist/{chunk-7IOWA5D5.js → chunk-LHH5KG5A.js} +13 -3
  126. package/dist/{chunk-TNR75OXT.js → chunk-LM45GMMB.js} +11 -8
  127. package/dist/{chunk-FSMSFDLD.js → chunk-LO6Y7OTG.js} +4 -4
  128. package/dist/{chunk-WF7B67YE.js → chunk-LPDTDFKA.js} +10 -10
  129. package/dist/{chunk-SU74NDMQ.js → chunk-LSHSDC6S.js} +17 -17
  130. package/dist/{chunk-LJXMYKZJ.js → chunk-LZVHP7CT.js} +5 -5
  131. package/dist/{chunk-3NWDLGG6.js → chunk-M3EOFSPY.js} +26 -26
  132. package/dist/chunk-MBYYQHPM.js +31 -0
  133. package/dist/{chunk-KQGURXFU.js → chunk-MEJ63LDG.js} +32 -11
  134. package/dist/{chunk-FZOJFH7Q.js → chunk-MH2ZK67S.js} +11 -11
  135. package/dist/{chunk-R7NYHMUU.js → chunk-MLGWSBF4.js} +5108 -3895
  136. package/dist/{chunk-WJF2CS6M.js → chunk-MNIPPBCT.js} +5 -5
  137. package/dist/{chunk-XERYFDB5.js → chunk-MWF4PXQR.js} +32 -31
  138. package/dist/{chunk-BO4KX37X.js → chunk-N2YX6JMY.js} +18 -18
  139. package/dist/{chunk-GUX3PTYM.js → chunk-NAPHHWW2.js} +3 -3
  140. package/dist/{chunk-UUU4CLJG.js → chunk-NC755EKE.js} +5 -1
  141. package/dist/{chunk-WMTRHUI5.js → chunk-NCLZJCXA.js} +21 -21
  142. package/dist/chunk-NKJDO4UC.js +39 -0
  143. package/dist/chunk-NOYOFYAJ.js +59 -0
  144. package/dist/{chunk-ZQ3ON2VQ.js → chunk-NROSSWMS.js} +5 -5
  145. package/dist/{chunk-UWMJKX5U.js → chunk-OBUB3H72.js} +12 -12
  146. package/dist/{chunk-VW62D6QE.js → chunk-OCQWSFJD.js} +7 -7
  147. package/dist/{chunk-UPOY4YSQ.js → chunk-OK6JGLE7.js} +12 -12
  148. package/dist/{chunk-TYQBFTBR.js → chunk-OPWGPQ2N.js} +5 -5
  149. package/dist/{chunk-PPD7HTDP.js → chunk-OSYHGGL3.js} +18 -18
  150. package/dist/chunk-OXXZZ7HQ.js +50 -0
  151. package/dist/{chunk-5BD2KYLE.js → chunk-P22EPEBR.js} +16 -16
  152. package/dist/chunk-P4YUT7W7.js +45 -0
  153. package/dist/chunk-PCCLVIDP.js +217 -0
  154. package/dist/{chunk-CMDXGQTS.js → chunk-PFULMC2D.js} +21 -20
  155. package/dist/chunk-PGAMTKBI.js +16 -0
  156. package/dist/{chunk-6MUGR4LS.js → chunk-PNSSE7JM.js} +93 -18
  157. package/dist/{chunk-HYU5VLGA.js → chunk-POEMZECG.js} +1 -1
  158. package/dist/{chunk-UCROWG2D.js → chunk-POSDBRKV.js} +23 -23
  159. package/dist/{chunk-KDNTAPLX.js → chunk-POSZFDSQ.js} +3 -3
  160. package/dist/{chunk-3NFFJL5D.js → chunk-PQQKZPBU.js} +1 -1
  161. package/dist/{chunk-4EURQWQD.js → chunk-PRMUQUWN.js} +10 -10
  162. package/dist/{chunk-MO6P2JZH.js → chunk-PT4USJNN.js} +7 -7
  163. package/dist/{chunk-BTY3HZBO.js → chunk-PWXB5GBB.js} +16 -16
  164. package/dist/{chunk-S7FCV7S5.js → chunk-PXW2RZGQ.js} +1 -1
  165. package/dist/{chunk-NDCF4R6S.js → chunk-Q367UGYN.js} +3 -3
  166. package/dist/{chunk-IUPG3UKI.js → chunk-QAVRDONY.js} +187 -123
  167. package/dist/{chunk-E6ZIEVOI.js → chunk-QBMLBCQH.js} +12 -12
  168. package/dist/{chunk-VZALIKIF.js → chunk-QLQIFJP3.js} +12 -12
  169. package/dist/{chunk-EMRIQUND.js → chunk-QLWDIKO4.js} +82 -27
  170. package/dist/{chunk-PMUAJGLI.js → chunk-QVVGJVVX.js} +16 -16
  171. package/dist/{chunk-LNBQOP7D.js → chunk-QX4MAMUG.js} +21 -21
  172. package/dist/{chunk-X3WY6MN3.js → chunk-QZWRPQTI.js} +6 -6
  173. package/dist/{chunk-ISUAAMGS.js → chunk-RCG5IAAT.js} +18 -11
  174. package/dist/chunk-RGZFOKVO.js +106 -0
  175. package/dist/{chunk-O5PXQR67.js → chunk-RLZFL76D.js} +4 -4
  176. package/dist/{chunk-UF4AZOZB.js → chunk-RPQITJNX.js} +5 -5
  177. package/dist/{chunk-NR2UJWOC.js → chunk-RQQYEDAC.js} +8 -8
  178. package/dist/chunk-RQSLHZ7T.js +36 -0
  179. package/dist/{chunk-UPS2DGFC.js → chunk-RRQUQAXP.js} +1 -1
  180. package/dist/chunk-RYQ4JCFT.js +65 -0
  181. package/dist/{chunk-JLUCKAEL.js → chunk-S35DIFJH.js} +17 -17
  182. package/dist/{chunk-UGUP3ZM6.js → chunk-S5GSQPIN.js} +9 -9
  183. package/dist/chunk-S5XFO4GY.js +42 -0
  184. package/dist/chunk-S6LW2RRC.js +25 -0
  185. package/dist/{chunk-W62H2XSO.js → chunk-S6W3D5GS.js} +23 -23
  186. package/dist/{chunk-CX4RZ2KS.js → chunk-S7GUZ45I.js} +3 -3
  187. package/dist/{chunk-L27SV425.js → chunk-SCT4CEF7.js} +20 -20
  188. package/dist/{chunk-VTZMAJ3W.js → chunk-SK5RVP7X.js} +8 -8
  189. package/dist/{chunk-JAVI7JSP.js → chunk-SRTUETF5.js} +23 -22
  190. package/dist/{chunk-MZCGSXVR.js → chunk-SVGGMBJI.js} +13 -13
  191. package/dist/{chunk-SDKLKB6I.js → chunk-SWNKO4C4.js} +32 -25
  192. package/dist/chunk-SYP56T2D.js +65 -0
  193. package/dist/{chunk-5SJZW52K.js → chunk-T33TPFGI.js} +22 -22
  194. package/dist/{chunk-ZJXLNDH4.js → chunk-T3FNG2H2.js} +12 -12
  195. package/dist/{chunk-BIGDQDHD.js → chunk-T6MAWL5P.js} +4 -4
  196. package/dist/{chunk-RGERPOIV.js → chunk-T6MX7WXM.js} +14 -11
  197. package/dist/{chunk-QFWA2DPH.js → chunk-T7IIEDA3.js} +5 -5
  198. package/dist/{chunk-Z5IA3WDR.js → chunk-TABH4RBZ.js} +156 -79
  199. package/dist/{chunk-6ZGLAACW.js → chunk-TDSCKP3V.js} +2 -2
  200. package/dist/{chunk-G6X77UJZ.js → chunk-TMFMXQEN.js} +21 -21
  201. package/dist/{chunk-P2V7QW4D.js → chunk-TNCF26JK.js} +11 -11
  202. package/dist/{chunk-2GF7OLF3.js → chunk-TUM52SOE.js} +19 -15
  203. package/dist/{chunk-PBPBMP2B.js → chunk-TV56QLLV.js} +3 -3
  204. package/dist/{chunk-SYV5LHML.js → chunk-TVQSXWWV.js} +33 -33
  205. package/dist/{chunk-VBTP56CE.js → chunk-TXNSQ24G.js} +9 -8
  206. package/dist/{chunk-ZX57KSEQ.js → chunk-UALE35WK.js} +3 -3
  207. package/dist/{chunk-42SIDKEU.js → chunk-UJF7PIMP.js} +26 -26
  208. package/dist/{chunk-ONUPY3H6.js → chunk-UMCDODBX.js} +24 -24
  209. package/dist/{chunk-JJF6HALY.js → chunk-UTPIFH4I.js} +3 -3
  210. package/dist/{chunk-O7XLYEFA.js → chunk-V7PEHQZU.js} +54 -22
  211. package/dist/{chunk-XI2LCCYQ.js → chunk-VJFXQISZ.js} +8 -8
  212. package/dist/{chunk-AFZ3QA6W.js → chunk-VJZI6KFP.js} +22 -22
  213. package/dist/{chunk-Q6DFNVRJ.js → chunk-VK7WYA64.js} +12 -12
  214. package/dist/{chunk-6OJQOPUN.js → chunk-VKTXFFOZ.js} +2 -2
  215. package/dist/{chunk-MG4ZL5RW.js → chunk-VNIN7Q6Q.js} +16 -16
  216. package/dist/{chunk-ZQXZ2SES.js → chunk-VRO7KSGL.js} +21 -21
  217. package/dist/{chunk-OHVTTOPS.js → chunk-W3AZE7LN.js} +3 -3
  218. package/dist/chunk-W4TNCEI4.js +44 -0
  219. package/dist/{chunk-X4CXA2IL.js → chunk-W5VYJWOG.js} +22 -22
  220. package/dist/{chunk-7DOR27HL.js → chunk-WF3RCZNO.js} +6 -6
  221. package/dist/{chunk-LGBMTVNT.js → chunk-WOMQQWTO.js} +5 -5
  222. package/dist/{chunk-2Q56PQPS.js → chunk-WXVTYLVH.js} +2 -2
  223. package/dist/{chunk-UOR2DTHH.js → chunk-WYGTSZHR.js} +16 -14
  224. package/dist/{chunk-IDKCWSM5.js → chunk-WZYM5M4U.js} +388 -104
  225. package/dist/{chunk-U76OWS3Q.js → chunk-X5ZHDSLU.js} +23 -23
  226. package/dist/chunk-X7XVMYIL.js +5 -0
  227. package/dist/{chunk-2IIMFOPM.js → chunk-X7ZKNSK4.js} +18 -18
  228. package/dist/{chunk-UF4GLFBX.js → chunk-XAPXKFIS.js} +22 -22
  229. package/dist/{chunk-LQJPN536.js → chunk-XF6TSZW2.js} +2 -2
  230. package/dist/{chunk-T6DQR5TV.js → chunk-XFDDJQT7.js} +12 -12
  231. package/dist/{chunk-OHNCWBKF.js → chunk-XGO74QWR.js} +4 -4
  232. package/dist/chunk-XLZAAAPX.js +43 -0
  233. package/dist/{chunk-2RLKFUUL.js → chunk-XMUWPA56.js} +23 -23
  234. package/dist/{chunk-JRBFANFE.js → chunk-XNFM6WUK.js} +15 -15
  235. package/dist/{chunk-LO6P2VYG.js → chunk-XOMEQVLK.js} +2 -2
  236. package/dist/{chunk-YHCMZC2J.js → chunk-Y2H7X3VI.js} +7 -7
  237. package/dist/{chunk-ZZK56BLP.js → chunk-Y5IE6YKD.js} +4 -4
  238. package/dist/{chunk-KFAVQZSX.js → chunk-YD3KTW4H.js} +12 -12
  239. package/dist/{chunk-LZ7NUC62.js → chunk-YDCOZOER.js} +18 -18
  240. package/dist/{chunk-LFGTYX5U.js → chunk-YERAAEO4.js} +17 -17
  241. package/dist/{chunk-BHT7QK4G.js → chunk-YHMPDIRG.js} +4 -4
  242. package/dist/{chunk-ZJFRMSJT.js → chunk-Z2D4P3R3.js} +12 -12
  243. package/dist/{chunk-O66DM6DJ.js → chunk-Z3H27OMV.js} +4 -4
  244. package/dist/{chunk-7UOMVMFG.js → chunk-Z3RAFU5B.js} +15 -15
  245. package/dist/{chunk-FFLNS6VP.js → chunk-ZENHDXRZ.js} +21 -17
  246. package/dist/{chunk-23XVSEV5.js → chunk-ZFHFC74B.js} +18 -18
  247. package/dist/{chunk-53T4O55J.js → chunk-ZJGCGKA4.js} +3 -3
  248. package/dist/{chunk-WXFLMQSR.js → chunk-ZLQEQR3D.js} +5 -5
  249. package/dist/{chunk-HNM2YQT2.js → chunk-ZNHQGG7J.js} +7 -7
  250. package/dist/{chunk-2Q5EDGEO.js → chunk-ZNTTW4IT.js} +5 -5
  251. package/dist/{chunk-ZQ7SKESZ.js → chunk-ZR6J4QFQ.js} +7 -7
  252. package/dist/{chunk-PAQ2AS5E.js → chunk-ZSNOILL5.js} +1 -1
  253. package/dist/files.json +563 -511
  254. package/dist/packages/sdk/npm/index.js +1043 -43
  255. package/dist/packages/ui/dist/assets/{elk-api-CIf-0gz5.js → elk-api-DxfAMOJq.js} +2 -2
  256. package/dist/packages/ui/dist/assets/index-Buit9TfP.js +62 -0
  257. package/dist/packages/ui/dist/assets/index-Jyc9dFeZ.css +1 -0
  258. package/dist/packages/ui/dist/index.html +2 -2
  259. package/package.json +4 -4
  260. package/dist/chunk-2SKB4O2E.js +0 -59
  261. package/dist/chunk-4U276ICE.js +0 -39
  262. package/dist/chunk-6H3Z5JHH.js +0 -64
  263. package/dist/chunk-C4R4JLHE.js +0 -40
  264. package/dist/chunk-CBGGOQWU.js +0 -82
  265. package/dist/chunk-DLOBCJL6.js +0 -48
  266. package/dist/chunk-GIW4ZVDB.js +0 -39
  267. package/dist/chunk-IP74LCOQ.js +0 -57
  268. package/dist/chunk-IPHHDDC6.js +0 -45
  269. package/dist/chunk-KJXD4PNL.js +0 -50
  270. package/dist/chunk-KN5BXMWN.js +0 -44
  271. package/dist/chunk-OMI6FPPN.js +0 -43
  272. package/dist/chunk-OTLDSZDV.js +0 -69
  273. package/dist/chunk-PSOFBQWB.js +0 -42
  274. package/dist/chunk-T4YPZIQN.js +0 -36
  275. package/dist/chunk-TUULXQRW.js +0 -420
  276. package/dist/chunk-WNKPRSGI.js +0 -36
  277. package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +0 -47
  278. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +0 -1
  279. package/dist/{chunk-24XLDU72.js → chunk-PXMV2LLY.js} +3 -3
@@ -3,6 +3,11 @@ 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
+ readRound,
8
+ reviewedGates,
9
+ roundsOf
10
+ } from "./chunk-D6BVLTDV.js";
6
11
  import {
7
12
  QueryError,
8
13
  askLookup,
@@ -10,21 +15,16 @@ import {
10
15
  impact,
11
16
  openIndex,
12
17
  translate
13
- } from "./chunk-ISUAAMGS.js";
14
- import {
15
- readRound,
16
- reviewedGates,
17
- roundsOf
18
- } from "./chunk-S4PMJU6H.js";
18
+ } from "./chunk-RCG5IAAT.js";
19
19
  import {
20
20
  changeFolder,
21
21
  changeStore
22
- } from "./chunk-IDKCWSM5.js";
22
+ } from "./chunk-WZYM5M4U.js";
23
23
  import {
24
24
  baseClonePath,
25
25
  gitUser,
26
26
  loadRepos
27
- } from "./chunk-PKBHS4AA.js";
27
+ } from "./chunk-3EWKO457.js";
28
28
  import {
29
29
  API_VERSION,
30
30
  DEFAULT_PORT,
@@ -33,7 +33,9 @@ import {
33
33
  RecordId,
34
34
  Severity,
35
35
  api_exports,
36
+ asksOfFinding,
36
37
  catalogDirOf,
38
+ catalogMayHaveChangedAt,
37
39
  factsDirOf,
38
40
  fastPathOf,
39
41
  inputsDirOf,
@@ -45,14 +47,17 @@ import {
45
47
  proposalsDirOf,
46
48
  questionOfLens,
47
49
  questionsDirOf,
50
+ rolesOfPerson,
48
51
  runsDirOf,
49
52
  specsDirOf,
50
53
  withSignal
51
- } from "./chunk-Q2TECDIT.js";
54
+ } from "./chunk-FPBUTZI5.js";
52
55
  import {
53
56
  FileChangedError,
54
- SCHEMA_VERSION
55
- } from "./chunk-TUULXQRW.js";
57
+ SCHEMA_VERSION,
58
+ printToCurrent,
59
+ withPrinter
60
+ } from "./chunk-B4AEL3RF.js";
56
61
 
57
62
  // packages/server/dist/http.js
58
63
  var HttpError = class extends Error {
@@ -136,125 +141,73 @@ function intParam(q, name, min, max) {
136
141
  }
137
142
  var strParam = (q, name) => q.get(name) || void 0;
138
143
 
139
- // packages/server/dist/server.js
140
- import { randomBytes as randomBytes2 } from "node:crypto";
141
- import { createServer } from "node:http";
142
-
143
- // packages/server/dist/jobs.js
144
- var JobManager = class {
145
- publish;
146
- now;
147
- jobs = /* @__PURE__ */ new Map();
148
- cancelledIds = /* @__PURE__ */ new Set();
149
- aborts = /* @__PURE__ */ new Map();
150
- seq = 0;
151
- /** Round 41: every running job of a kind, in start order (a later one never hides an earlier). */
152
- running = /* @__PURE__ */ new Map();
153
- constructor(publish, now = () => /* @__PURE__ */ new Date()) {
154
- this.publish = publish;
155
- this.now = now;
156
- }
157
- /**
158
- * A running job of a kind, if any: the earliest still running (one scan at a time: a second
159
- * ask gets 409).
160
- */
161
- runningOf(kind) {
162
- for (const id of this.running.get(kind) ?? []) {
163
- const j = this.jobs.get(id);
164
- if (j?.state === "running")
165
- return j;
166
- }
167
- return void 0;
168
- }
169
- get(id) {
170
- return this.jobs.get(id);
171
- }
172
- start(kind, work) {
173
- const id = `job-${++this.seq}`;
174
- const job = {
175
- id,
176
- kind,
177
- state: "running",
178
- progress: { done: 0, total: 0, message: "Starting" },
179
- startedAt: this.now().toISOString(),
180
- errors: []
181
- };
182
- this.jobs.set(id, job);
183
- const ofKind = this.running.get(kind) ?? /* @__PURE__ */ new Set();
184
- ofKind.add(id);
185
- this.running.set(kind, ofKind);
186
- const abort = new AbortController();
187
- this.aborts.set(id, abort);
188
- const cancelled = this.cancelledIds;
189
- const control = {
190
- progress: (done, total, message) => {
191
- job.progress = { done, total, message };
192
- this.publish({ type: "job.progress", jobId: id, done, total, message });
193
- },
194
- get cancelled() {
195
- return cancelled.has(id);
196
- }
197
- };
198
- void (async () => {
199
- try {
200
- const out = await withSignal(abort.signal, () => work(control));
201
- if (out?.result)
202
- job.result = out.result;
203
- if (out?.errors?.length)
204
- job.errors.push(...out.errors);
205
- job.state = this.cancelledIds.has(id) ? "cancelled" : job.errors.length ? "failed" : "done";
206
- } catch (e) {
207
- if (this.cancelledIds.has(id))
208
- job.state = "cancelled";
209
- else {
210
- job.errors.push(e instanceof Error ? e.message : String(e));
211
- job.state = "failed";
212
- }
213
- }
214
- this.aborts.delete(id);
215
- job.finishedAt = this.now().toISOString();
216
- ofKind.delete(id);
217
- if (!ofKind.size && this.running.get(kind) === ofKind)
218
- this.running.delete(kind);
219
- this.publish({ type: "job.done", jobId: id, state: job.state });
220
- })();
221
- return job;
222
- }
223
- /** Ask a running job to stop; false when it already finished. */
224
- cancel(id) {
225
- const j = this.jobs.get(id);
226
- if (!j || j.state !== "running")
227
- return false;
228
- this.cancelledIds.add(id);
229
- this.aborts.get(id)?.abort();
230
- return true;
231
- }
232
- /** Wait for a job to finish (tests and the CLI). */
233
- async settle(id, timeoutMs = 6e4) {
234
- const start = Date.now();
235
- for (; ; ) {
236
- const j = this.jobs.get(id);
237
- if (!j)
238
- throw new Error(`No job ${id}`);
239
- if (j.state !== "running" && j.state !== "queued")
240
- return j;
241
- if (Date.now() - start > timeoutMs)
242
- throw new Error(`Job ${id} did not finish`);
243
- await new Promise((r) => setTimeout(r, 20));
244
- }
245
- }
246
- };
247
-
248
144
  // packages/server/dist/routes.js
145
+ import { existsSync } from "node:fs";
249
146
  import { readFile, stat } from "node:fs/promises";
250
147
  import { join } from "node:path";
251
148
  var queues = /* @__PURE__ */ new Map();
252
- async function withIndex(root, f) {
149
+ var checked = /* @__PURE__ */ new Map();
150
+ var TRUST_MS = 3e4;
151
+ var following = /* @__PURE__ */ new Set();
152
+ var changes = /* @__PURE__ */ new Map();
153
+ function trustIndexBetweenChanges(root, on) {
154
+ if (on)
155
+ following.add(root);
156
+ else {
157
+ following.delete(root);
158
+ checked.delete(root);
159
+ }
160
+ }
161
+ function indexFilesChanged(root) {
162
+ for (const r of root ? [root] : [...following, ...checked.keys()]) {
163
+ checked.delete(r);
164
+ changes.set(r, (changes.get(r) ?? 0) + 1);
165
+ }
166
+ }
167
+ var embedding = /* @__PURE__ */ new Map();
168
+ var asked = /* @__PURE__ */ new Map();
169
+ function embedSoon(root) {
170
+ if (embedding.has(root) || process.env.ATTICUS_EMBEDDINGS === "off")
171
+ return;
172
+ const step = () => {
173
+ if (Date.now() - (asked.get(root) ?? 0) < 1500) {
174
+ embedding.set(root, setTimeout(step, 1e3).unref());
175
+ return;
176
+ }
177
+ void withIndex(root, (ix) => ix.embed({ max: 8 }), { meaning: true }).then((n) => n > 0, () => false).then((more) => {
178
+ if (more && embedding.has(root))
179
+ embedding.set(root, setTimeout(step, 50).unref());
180
+ else
181
+ embedding.delete(root);
182
+ });
183
+ };
184
+ embedding.set(root, setTimeout(step, 2e3).unref());
185
+ }
186
+ function stopEmbedding(root) {
187
+ const t = embedding.get(root);
188
+ if (t)
189
+ clearTimeout(t);
190
+ embedding.delete(root);
191
+ }
192
+ async function withIndex(root, f, o = {}) {
193
+ if (!o.meaning)
194
+ asked.set(root, Date.now());
253
195
  const before = queues.get(root) ?? Promise.resolve();
254
196
  const mine = before.then(async () => {
255
- const ix = await openIndex(root);
197
+ const trusted = following.has(root) && Date.now() - (checked.get(root) ?? -Infinity) < TRUST_MS;
198
+ const at = changes.get(root) ?? 0;
199
+ const ix = await openIndex(root, {
200
+ embedOnOpen: 0,
201
+ // Only search and ask compare by meaning; the counts, lists and graph never need the model.
202
+ ...o.meaning ? {} : { embeddings: "off" },
203
+ ...trusted ? { trusted: true } : {}
204
+ });
205
+ if (!trusted && following.has(root) && (changes.get(root) ?? 0) === at)
206
+ checked.set(root, Date.now());
207
+ if (!trusted && !o.meaning)
208
+ embedSoon(root);
256
209
  try {
257
- return f(ix);
210
+ return await f(ix);
258
211
  } finally {
259
212
  ix.close();
260
213
  }
@@ -317,7 +270,9 @@ function apiRoutes(r, ctx) {
317
270
  root,
318
271
  openspec: layoutOf(root).openspec.replace(/\/+$/, ""),
319
272
  user: ctx.user,
320
- full: ctx.full === true
273
+ full: ctx.full === true,
274
+ // ADR 0190: in a folder that isn't a metarepo yet, the app offers to create one.
275
+ metarepo: existsSync(join(root, "org-pack")) || existsSync(join(root, ".atticus", "org-pack"))
321
276
  }
322
277
  })).add("GET", "/api/catalog/kinds", async () => ({
323
278
  status: 200,
@@ -357,26 +312,25 @@ function apiRoutes(r, ctx) {
357
312
  const q = strParam(query, "q");
358
313
  if (!q)
359
314
  throw badRequest("Ask a question: ?q=<plain words>.");
360
- return {
361
- status: 200,
362
- body: await withIndex(root, (ix) => {
363
- const asked = translate(q, askLookup(ix));
364
- if (asked.action === "impact")
365
- return { question: q, ...asked, impact: impact(ix, asked.id, 4) };
366
- if (asked.action === "owner") {
367
- const r2 = ix.find(asked.id)[0];
368
- const owner = r2?.owner ?? r2?.ownerComponent ?? (r2 ? ix.find(String(r2.system ?? ""))[0]?.owner : void 0);
369
- return { question: q, ...asked, owner: owner ?? null };
370
- }
371
- try {
372
- return { question: q, ...asked, result: ix.query(asked.query, { limit: 60 }) };
373
- } catch (e) {
374
- if (e instanceof QueryError)
375
- return { question: q, ...asked, error: e.message };
376
- throw e;
377
- }
378
- })
379
- };
315
+ const knowledge = ctx.askKnowledge ? await ctx.askKnowledge(q).catch(() => void 0) : void 0;
316
+ const answer = await withIndex(root, (ix) => {
317
+ const asked2 = translate(q, askLookup(ix));
318
+ if (asked2.action === "impact")
319
+ return { question: q, ...asked2, impact: impact(ix, asked2.id, 4) };
320
+ if (asked2.action === "owner") {
321
+ const r2 = ix.find(asked2.id)[0];
322
+ const owner = r2?.owner ?? r2?.ownerComponent ?? (r2 ? ix.find(String(r2.system ?? ""))[0]?.owner : void 0);
323
+ return { question: q, ...asked2, owner: owner ?? null };
324
+ }
325
+ try {
326
+ return { question: q, ...asked2, result: ix.query(asked2.query, { limit: 60 }) };
327
+ } catch (e) {
328
+ if (e instanceof QueryError)
329
+ return { question: q, ...asked2, error: e.message };
330
+ throw e;
331
+ }
332
+ });
333
+ return { status: 200, body: knowledge ? { ...answer, knowledge } : answer };
380
334
  }).add("GET", "/api/graph", async ({ query }) => {
381
335
  const depth = intParam(query, "depth", 1, 6);
382
336
  const o = {
@@ -450,7 +404,7 @@ function apiRoutes(r, ctx) {
450
404
  if (!res)
451
405
  throw notFound(`There is no record ${params.id} in the catalog.`);
452
406
  const near = /* @__PURE__ */ new Set([...res.systems, params.id, ...res.reach.affected.map((a) => a.id)]);
453
- const changes = (await changeStore(root).list()).filter((c) => c.systems.some((s) => near.has(s)) || [...c.touches.records, ...c.touches.tables, ...c.touches.dataStores].some((x) => near.has(x))).map((c) => ({
407
+ const changes2 = (await changeStore(root).list()).filter((c) => c.systems.some((s) => near.has(s)) || [...c.touches.records, ...c.touches.tables, ...c.touches.dataStores].some((x) => near.has(x))).map((c) => ({
454
408
  id: c.id,
455
409
  title: c.title,
456
410
  state: c.state,
@@ -467,7 +421,7 @@ function apiRoutes(r, ctx) {
467
421
  call: res.owners,
468
422
  ownerUnknown: res.unowned,
469
423
  watch: res.watch,
470
- recentChanges: changes
424
+ recentChanges: changes2
471
425
  }
472
426
  };
473
427
  }).add("GET", "/api/repos", async () => {
@@ -480,13 +434,18 @@ function apiRoutes(r, ctx) {
480
434
  return { status: 200, body };
481
435
  }).add("GET", "/api/changes", async ({ query }) => {
482
436
  const state = strParam(query, "state");
483
- const changes = (await changeStore(root).list()).filter((c) => !state || c.state === state);
437
+ const changes2 = (await changeStore(root).list()).filter((c) => !state || c.state === state);
484
438
  const body = [];
485
- const types = await loadOrgPack(orgPackDirOf(root)).then((op) => op.changeTypes.types, () => []);
486
- for (const c of changes.sort((a, b) => a.id.localeCompare(b.id))) {
439
+ const op = await loadOrgPack(orgPackDirOf(root)).catch(() => void 0);
440
+ const types = op?.changeTypes.types ?? [];
441
+ const custom = op?.roles?.custom ?? [];
442
+ for (const c of changes2.sort((a, b) => a.id.localeCompare(b.id))) {
487
443
  const type = types.find((t) => t.id === c.type);
488
444
  const fast = !!type && (type.size === "small" || !!type.smallWhenBriefSays) && fastPathOf(type, await readFile(join(changeFolder(root, c.id), "brief.md"), "utf8").catch(() => "")).fast;
489
- body.push(summary(c, await latestFindings(root, c.id), fast));
445
+ body.push({
446
+ ...summary(c, await latestFindings(root, c.id), fast),
447
+ yourRoles: rolesOfPerson(ctx.user, c.owners ?? {}, custom)
448
+ });
490
449
  }
491
450
  return { status: 200, body };
492
451
  }).add("GET", "/api/findings", async ({ query }) => {
@@ -497,13 +456,16 @@ function apiRoutes(r, ctx) {
497
456
  const state = strParam(query, "state");
498
457
  const lens = enumParam(query, "lens", Lens.options);
499
458
  const severity = enumParam(query, "severity", Severity.options);
459
+ const asks = enumParam(query, "asks", ["business", "design", "delivery"]);
500
460
  const ids = change ? [change] : (await changeStore(root).list()).map((c) => c.id).sort();
501
461
  const body = [];
502
462
  for (const id of ids)
503
- for (const f of await latestFindings(root, id))
463
+ for (const f of await latestFindings(root, id)) {
464
+ const level = asksOfFinding(f);
504
465
  if ((!gate || f.gate === gate) && (!state || f.state === state) && // A lens filter asks its question: an old lens name finds what its question raised.
505
- (!lens || questionOfLens(f.lens) === questionOfLens(lens)) && (!severity || f.severity === severity))
506
- body.push(f);
466
+ (!lens || questionOfLens(f.lens) === questionOfLens(lens)) && (!severity || f.severity === severity) && (!asks || level === asks))
467
+ body.push({ ...f, asks: level });
468
+ }
507
469
  return { status: 200, body };
508
470
  }).add("GET", "/api/findings/{changeId}/{findingId}", async ({ params }) => {
509
471
  if (!RecordId.safeParse(params.changeId).success)
@@ -550,6 +512,224 @@ function apiRoutes(r, ctx) {
550
512
  });
551
513
  }
552
514
 
515
+ // packages/server/dist/server.js
516
+ import { randomBytes as randomBytes2 } from "node:crypto";
517
+ import { createServer } from "node:http";
518
+
519
+ // packages/server/dist/jobs.js
520
+ var JOB_LINES = 5e3;
521
+ var JOBS_KEPT = 100;
522
+ var jobLine = (line) => printToCurrent(line);
523
+ var JobManager = class {
524
+ publish;
525
+ now;
526
+ jobs = /* @__PURE__ */ new Map();
527
+ cancelledIds = /* @__PURE__ */ new Set();
528
+ aborts = /* @__PURE__ */ new Map();
529
+ seq = 0;
530
+ /** Round 41: every running job of a kind, in start order (a later one never hides an earlier). */
531
+ running = /* @__PURE__ */ new Map();
532
+ printed = /* @__PURE__ */ new Map();
533
+ metas = /* @__PURE__ */ new Map();
534
+ listeners = /* @__PURE__ */ new Set();
535
+ ends = /* @__PURE__ */ new Map();
536
+ constructor(publish, now = () => /* @__PURE__ */ new Date()) {
537
+ this.publish = publish;
538
+ this.now = now;
539
+ }
540
+ /**
541
+ * A running job of a kind, if any: the earliest still running (one scan at a time: a second
542
+ * ask gets 409).
543
+ */
544
+ runningOf(kind) {
545
+ for (const id of this.running.get(kind) ?? []) {
546
+ const j = this.jobs.get(id);
547
+ if (j?.state === "running")
548
+ return j;
549
+ }
550
+ return void 0;
551
+ }
552
+ get(id) {
553
+ return this.jobs.get(id);
554
+ }
555
+ /** Every job kept, newest first (ADR 0187). */
556
+ list() {
557
+ return [...this.jobs.values()].reverse();
558
+ }
559
+ /** What a job belongs to, as it was started. */
560
+ metaOf(id) {
561
+ return this.metas.get(id);
562
+ }
563
+ /** A job's printed lines from a line on (or its last `max`), and how many it printed. */
564
+ linesOf(id, from, max = JOB_LINES) {
565
+ const p = this.printed.get(id);
566
+ if (!p)
567
+ return void 0;
568
+ const total = p.from + p.lines.length;
569
+ const start = from === void 0 ? Math.max(total - max, p.from) : Math.max(Math.min(from, total), p.from);
570
+ return { from: start, lines: p.lines.slice(start - p.from, start - p.from + max), total };
571
+ }
572
+ /** Hear each job's new lines and changes of state. */
573
+ subscribe(f) {
574
+ this.listeners.add(f);
575
+ return () => this.listeners.delete(f);
576
+ }
577
+ tell(c) {
578
+ for (const f of this.listeners) {
579
+ try {
580
+ f(c);
581
+ } catch {
582
+ }
583
+ }
584
+ }
585
+ print(job, text) {
586
+ const p = this.printed.get(job.id);
587
+ if (!p)
588
+ return;
589
+ const lines = String(text).split(/\r?\n/);
590
+ const at = p.from + p.lines.length;
591
+ p.lines.push(...lines);
592
+ if (p.lines.length > JOB_LINES) {
593
+ const drop = p.lines.length - JOB_LINES;
594
+ p.lines.splice(0, drop);
595
+ p.from += drop;
596
+ }
597
+ this.tell({ type: "lines", job, at, lines });
598
+ }
599
+ /** Finished jobs past JOBS_KEPT go, oldest first; running ones stay. */
600
+ forget() {
601
+ let over = this.jobs.size - JOBS_KEPT;
602
+ if (over <= 0)
603
+ return;
604
+ for (const [id, j] of this.jobs) {
605
+ if (over <= 0)
606
+ break;
607
+ if (j.state === "running" || j.state === "queued")
608
+ continue;
609
+ this.jobs.delete(id);
610
+ this.printed.delete(id);
611
+ this.metas.delete(id);
612
+ this.cancelledIds.delete(id);
613
+ over--;
614
+ }
615
+ }
616
+ start(kind, work, o = {}) {
617
+ const id = `job-${++this.seq}`;
618
+ const job = {
619
+ id,
620
+ kind,
621
+ state: "running",
622
+ progress: { done: 0, total: 0, message: "Starting" },
623
+ ...o.title ? { title: o.title } : {},
624
+ startedAt: this.now().toISOString(),
625
+ errors: []
626
+ };
627
+ this.jobs.set(id, job);
628
+ this.printed.set(id, { from: 0, lines: [] });
629
+ if (o.meta)
630
+ this.metas.set(id, { ...o.meta });
631
+ this.forget();
632
+ const ofKind = this.running.get(kind) ?? /* @__PURE__ */ new Set();
633
+ ofKind.add(id);
634
+ this.running.set(kind, ofKind);
635
+ const abort = new AbortController();
636
+ this.aborts.set(id, abort);
637
+ const cancelled = this.cancelledIds;
638
+ const line = (text) => this.print(job, text);
639
+ const control = {
640
+ progress: (done, total, message) => {
641
+ job.progress = { done, total, message };
642
+ this.publish({ type: "job.progress", jobId: id, done, total, message });
643
+ this.tell({ type: "state", job });
644
+ },
645
+ line,
646
+ get cancelled() {
647
+ return cancelled.has(id);
648
+ }
649
+ };
650
+ this.tell({ type: "state", job });
651
+ void (async () => {
652
+ try {
653
+ const out = await withPrinter(line, () => withSignal(abort.signal, () => work(control)));
654
+ if (out?.result)
655
+ job.result = out.result;
656
+ if (out?.errors?.length)
657
+ job.errors.push(...out.errors);
658
+ job.state = this.cancelledIds.has(id) ? "cancelled" : job.errors.length ? "failed" : "done";
659
+ } catch (e) {
660
+ if (this.cancelledIds.has(id))
661
+ job.state = "cancelled";
662
+ else {
663
+ job.errors.push(e instanceof Error ? e.message : String(e));
664
+ job.state = "failed";
665
+ }
666
+ }
667
+ this.aborts.delete(id);
668
+ const p = this.printed.get(id);
669
+ if (p && p.from + p.lines.length === 0) {
670
+ const said = job.result?.lines;
671
+ const end = [
672
+ ...Array.isArray(said) ? said.filter((l) => typeof l === "string") : [],
673
+ ...job.errors.filter((e) => !(Array.isArray(said) && said.includes(e)))
674
+ ];
675
+ if (end.length)
676
+ line(end.join("\n"));
677
+ }
678
+ job.finishedAt = this.now().toISOString();
679
+ ofKind.delete(id);
680
+ if (!ofKind.size && this.running.get(kind) === ofKind)
681
+ this.running.delete(kind);
682
+ this.publish({ type: "job.done", jobId: id, state: job.state });
683
+ this.tell({ type: "state", job });
684
+ this.ends.get(id)?.();
685
+ this.ends.delete(id);
686
+ })();
687
+ return job;
688
+ }
689
+ /**
690
+ * Run work the caller waits for as a job (ADR 0187): the route keeps its answer, and the
691
+ * Console shows what it printed. Resolves with the work's value, or throws its error.
692
+ */
693
+ track(kind, work, o = {}) {
694
+ return new Promise((resolve2, reject) => {
695
+ let value;
696
+ let failed;
697
+ const job = this.start(kind, async (c) => {
698
+ try {
699
+ value = await work(c);
700
+ } catch (e) {
701
+ failed = { e };
702
+ throw e;
703
+ }
704
+ }, o);
705
+ this.ends.set(job.id, () => failed ? reject(failed.e) : resolve2(value));
706
+ });
707
+ }
708
+ /** Ask a running job to stop; false when it already finished. */
709
+ cancel(id) {
710
+ const j = this.jobs.get(id);
711
+ if (!j || j.state !== "running")
712
+ return false;
713
+ this.cancelledIds.add(id);
714
+ this.aborts.get(id)?.abort();
715
+ return true;
716
+ }
717
+ /** Wait for a job to finish (tests and the CLI). */
718
+ async settle(id, timeoutMs = 6e4) {
719
+ const start = Date.now();
720
+ for (; ; ) {
721
+ const j = this.jobs.get(id);
722
+ if (!j)
723
+ throw new Error(`No job ${id}`);
724
+ if (j.state !== "running" && j.state !== "queued")
725
+ return j;
726
+ if (Date.now() - start > timeoutMs)
727
+ throw new Error(`Job ${id} did not finish`);
728
+ await new Promise((r) => setTimeout(r, 20));
729
+ }
730
+ }
731
+ };
732
+
553
733
  // packages/server/dist/static.js
554
734
  import { readFile as readFile2, stat as stat2 } from "node:fs/promises";
555
735
  import { extname, join as join2, normalize, resolve, sep } from "node:path";
@@ -689,9 +869,20 @@ var WITHOUT_THE_APP = {
689
869
  what: "Changing where runtime.yaml sends the model's key (its provider, keyEnv or address)",
690
870
  cli: "edit runtime.yaml yourself and propose it for review"
691
871
  },
872
+ // Review round 50: committing them doesn't stand for the person's yes (the assistant can
873
+ // commit); the address the person last confirmed does (kept outside the metarepo).
692
874
  "ai-test": {
693
- what: "Testing model settings that aren't committed sends the key to them",
694
- cli: "commit runtime.yaml first, or run the step from the command line"
875
+ what: "Testing the model settings sends the key to an address you haven't confirmed",
876
+ cli: "a step in model mode yourself"
877
+ },
878
+ // ADR 0191: the plan's work items written to a live tracker, and an owner question sent.
879
+ "work-items": {
880
+ what: "Putting the plan's stories and tasks in the work tracker writes work items",
881
+ cli: "atticus ado sync <change> --approve <you>"
882
+ },
883
+ "owner-ask": {
884
+ what: "Sending an owner question posts a message",
885
+ cli: "copy the question and ask the owner yourself"
695
886
  }
696
887
  };
697
888
  function needsConfirmation(write) {
@@ -707,8 +898,21 @@ function requireConfirmation(c, write, target, given) {
707
898
  import { statSync, watch } from "node:fs";
708
899
  import { join as join3, relative, sep as sep2 } from "node:path";
709
900
  var SKIP = /* @__PURE__ */ new Set([".git", "node_modules", ".index", "workspace", "logs", ".vitest-cache"]);
710
- var TEMP = /(~|\.swp|\.swx|\.tmp|\.crdownload|\.part)$/i;
901
+ var TEMP = /(~|\.swp|\.swx|\.tmp|\.crdownload|\.part|(^|\/)\.doctor-\d+)$/i;
711
902
  var posix = (p) => p.split(sep2).join("/");
903
+ function onlyRead(abs, seen, since) {
904
+ let s;
905
+ try {
906
+ s = statSync(abs);
907
+ } catch {
908
+ seen.delete(abs);
909
+ return false;
910
+ }
911
+ const now = `${s.size}:${s.mtimeMs}:${s.ctimeMs}`;
912
+ const was = seen.get(abs);
913
+ seen.set(abs, now);
914
+ return was !== void 0 ? was === now : Math.max(s.mtimeMs, s.ctimeMs) < since;
915
+ }
712
916
  var isDir = (p) => {
713
917
  try {
714
918
  return statSync(p).isDirectory();
@@ -731,6 +935,8 @@ function watchMetarepo(o) {
731
935
  };
732
936
  const problems = [];
733
937
  const pending = /* @__PURE__ */ new Set();
938
+ const stamps = /* @__PURE__ */ new Map();
939
+ const since = Date.now();
734
940
  let timer;
735
941
  let first = 0;
736
942
  let closed = false;
@@ -776,17 +982,39 @@ function watchMetarepo(o) {
776
982
  const unique = [...new Set(all)].sort();
777
983
  return unique.filter((d) => !unique.some((p) => p !== d && d.startsWith(p + sep2)));
778
984
  };
985
+ const logsDir = join3(root, ".atticus", "logs");
986
+ const runLogDirs = [join3(logsDir, "running"), join3(logsDir, "runs")];
987
+ const runLogDelay = o.runLogDelayMs ?? 200;
988
+ let runLogTimer;
989
+ let runLogLast = 0;
990
+ const runLogChanged = () => {
991
+ if (runLogTimer || !o.onRunLog)
992
+ return;
993
+ runLogTimer = setTimeout(() => {
994
+ runLogTimer = void 0;
995
+ runLogLast = Date.now();
996
+ if (!closed)
997
+ o.onRunLog?.();
998
+ }, Math.max(runLogLast + runLogDelay - Date.now(), 0));
999
+ };
779
1000
  const follow = (dir, recursive) => {
780
1001
  if (closed || watchers.has(dir) || !isDir(dir))
781
1002
  return;
782
1003
  try {
783
- const w = watch(dir, { recursive }, (_event, name) => {
1004
+ const w = watch(dir, { recursive }, (event, name) => {
1005
+ if (dir === logsDir)
1006
+ return attach();
1007
+ if (runLogDirs.includes(dir))
1008
+ return runLogChanged();
784
1009
  if (!recursive && name) {
785
1010
  attach();
786
1011
  if (watchers.has(join3(dir, String(name))))
787
1012
  return;
788
1013
  }
789
- note(name ? join3(dir, String(name)) : dir);
1014
+ const abs = name ? join3(dir, String(name)) : dir;
1015
+ if (event === "change" && process.platform === "win32" && onlyRead(abs, stamps, since))
1016
+ return;
1017
+ note(abs);
790
1018
  });
791
1019
  w.on("error", (e) => {
792
1020
  w.close();
@@ -821,16 +1049,22 @@ function watchMetarepo(o) {
821
1049
  follow(join3(root, ".atticus"), false);
822
1050
  for (const d of folders())
823
1051
  follow(d, true);
1052
+ if (o.onRunLog) {
1053
+ follow(logsDir, false);
1054
+ for (const d of runLogDirs)
1055
+ follow(d, false);
1056
+ }
824
1057
  };
825
1058
  attach();
826
1059
  return {
827
1060
  get following() {
828
- return [...watchers.keys()].filter((d) => d !== root && d !== join3(root, ".atticus")).map((d) => posix(relative(root, d))).sort();
1061
+ return [...watchers.keys()].filter((d) => d !== root && d !== join3(root, ".atticus") && d !== logsDir && !runLogDirs.includes(d)).map((d) => posix(relative(root, d))).sort();
829
1062
  },
830
1063
  problems,
831
1064
  close() {
832
1065
  closed = true;
833
1066
  clearTimeout(timer);
1067
+ clearTimeout(runLogTimer);
834
1068
  for (const w of watchers.values())
835
1069
  w.close();
836
1070
  watchers.clear();
@@ -954,9 +1188,27 @@ function upgrade(req, sock, onClose) {
954
1188
  }
955
1189
 
956
1190
  // packages/server/dist/server.js
1191
+ var JOB_KINDS = {
1192
+ scan: true,
1193
+ sync: true,
1194
+ reconcile: true,
1195
+ index: true,
1196
+ intake: true,
1197
+ step: true,
1198
+ local: true,
1199
+ work: true
1200
+ };
957
1201
  var EventHub = class {
1202
+ root;
958
1203
  sockets = /* @__PURE__ */ new Set();
959
1204
  listeners = /* @__PURE__ */ new Set();
1205
+ /**
1206
+ * `root`: each file.changed event is published saying whether it can change the catalog
1207
+ * (`catalog`, beta.23 review), by the layout the org pack names, so a page needn't guess it.
1208
+ */
1209
+ constructor(root) {
1210
+ this.root = root;
1211
+ }
960
1212
  /** Hear every event in this process too (ADR 0119: a reader that keeps files in memory). */
961
1213
  listen(fn) {
962
1214
  this.listeners.add(fn);
@@ -971,7 +1223,16 @@ var EventHub = class {
971
1223
  get size() {
972
1224
  return this.sockets.size;
973
1225
  }
974
- publish(e) {
1226
+ publish(given) {
1227
+ let e = given;
1228
+ if (this.root !== void 0 && e.type === "file.changed" && typeof e.path === "string" && typeof e.catalog !== "boolean") {
1229
+ let catalog = true;
1230
+ try {
1231
+ catalog = catalogMayHaveChangedAt(this.root, e.path);
1232
+ } catch {
1233
+ }
1234
+ e = { ...e, catalog };
1235
+ }
975
1236
  for (const fn of this.listeners)
976
1237
  fn(e);
977
1238
  const text = JSON.stringify(e);
@@ -983,6 +1244,21 @@ var EventHub = class {
983
1244
  s.close();
984
1245
  }
985
1246
  };
1247
+ var Signal = class {
1248
+ fs = /* @__PURE__ */ new Set();
1249
+ subscribe(f) {
1250
+ this.fs.add(f);
1251
+ return () => this.fs.delete(f);
1252
+ }
1253
+ emit() {
1254
+ for (const f of this.fs) {
1255
+ try {
1256
+ f();
1257
+ } catch {
1258
+ }
1259
+ }
1260
+ }
1261
+ };
986
1262
  var MAX_BODY = 4 * 1024 * 1024;
987
1263
  var sameToken = sameSecret;
988
1264
  var STRONG = /^[A-Za-z0-9_-]{32,}$/;
@@ -1029,10 +1305,13 @@ async function startServer(o) {
1029
1305
  throw new Error(`Atticus only listens on 127.0.0.1 (asked for ${host}).`);
1030
1306
  const token = o.token && STRONG.test(o.token) ? o.token : randomBytes2(32).toString("base64url");
1031
1307
  const pageKey = o.pageKey && STRONG.test(o.pageKey) && o.pageKey !== token ? o.pageKey : randomBytes2(32).toString("base64url");
1032
- const events = new EventHub();
1308
+ const events = new EventHub(o.root);
1309
+ let writing = 0;
1033
1310
  const jobs = new JobManager((e) => events.publish(e));
1034
1311
  const confirmations = new Confirmations();
1035
1312
  const person = o.user ? { handle: o.user, source: "given" } : await gitUser(o.root);
1313
+ const runLogs = new Signal();
1314
+ const onClose = /* @__PURE__ */ new Set();
1036
1315
  const ctx = {
1037
1316
  root: o.root,
1038
1317
  user: person.handle,
@@ -1041,7 +1320,9 @@ async function startServer(o) {
1041
1320
  full: o.full === true,
1042
1321
  events,
1043
1322
  jobs,
1044
- confirmations
1323
+ confirmations,
1324
+ runLogs,
1325
+ onClose
1045
1326
  };
1046
1327
  const router = apiRoutes(new Router(), ctx).add("POST", "/api/confirmations", ({ body }) => {
1047
1328
  const b = api_exports.ConfirmationRequest.safeParse(body ?? {});
@@ -1078,7 +1359,15 @@ async function startServer(o) {
1078
1359
  };
1079
1360
  const server = createServer(async (req, res) => {
1080
1361
  const t0 = Date.now();
1362
+ let writes = req.method !== "GET" && req.method !== "HEAD";
1363
+ if (writes)
1364
+ writing++;
1081
1365
  const done = (status, error) => {
1366
+ if (writes) {
1367
+ writes = false;
1368
+ writing--;
1369
+ indexFilesChanged(o.root);
1370
+ }
1082
1371
  const path = (req.url ?? "/").split("?")[0];
1083
1372
  if (path.startsWith("/api/"))
1084
1373
  o.onRequest?.({
@@ -1157,7 +1446,17 @@ Connection: close\r
1157
1446
  server.listen(o.port ?? DEFAULT_PORT, host, () => resolve2());
1158
1447
  });
1159
1448
  port = server.address().port;
1160
- const watcher = o.watch === false ? void 0 : watchMetarepo({ root: o.root, publish: (e) => events.publish(e) });
1449
+ const watcher = o.watch === false ? void 0 : watchMetarepo({
1450
+ root: o.root,
1451
+ publish: (e) => events.publish(e),
1452
+ onRunLog: () => runLogs.emit()
1453
+ });
1454
+ const stopHearing = events.listen((e) => {
1455
+ if (e.type === "file.changed" || e.type === "index.rebuilt" || e.type === "job.done")
1456
+ indexFilesChanged(o.root);
1457
+ });
1458
+ if (watcher)
1459
+ trustIndexBetweenChanges(o.root, true);
1161
1460
  return {
1162
1461
  url: `http://127.0.0.1:${port}`,
1163
1462
  port,
@@ -1170,8 +1469,20 @@ Connection: close\r
1170
1469
  get following() {
1171
1470
  return watcher?.following ?? [];
1172
1471
  },
1472
+ get quiet() {
1473
+ return writing === 0 && !Object.keys(JOB_KINDS).some((k) => jobs.runningOf(k));
1474
+ },
1173
1475
  close: () => new Promise((resolve2) => {
1174
1476
  watcher?.close();
1477
+ for (const f of onClose) {
1478
+ try {
1479
+ f();
1480
+ } catch {
1481
+ }
1482
+ }
1483
+ stopHearing();
1484
+ trustIndexBetweenChanges(o.root, false);
1485
+ stopEmbedding(o.root);
1175
1486
  events.closeAll();
1176
1487
  server.closeAllConnections?.();
1177
1488
  server.close(() => resolve2());
@@ -1184,7 +1495,33 @@ export {
1184
1495
  badRequest,
1185
1496
  notFound,
1186
1497
  conflict,
1498
+ Router,
1499
+ problem,
1500
+ intParam,
1187
1501
  strParam,
1502
+ trustIndexBetweenChanges,
1503
+ indexFilesChanged,
1504
+ stopEmbedding,
1505
+ apiRoutes,
1506
+ JOB_LINES,
1507
+ JOBS_KEPT,
1508
+ jobLine,
1509
+ JobManager,
1510
+ appCsp,
1511
+ staticFile,
1512
+ CONFIRM_TTL_MS,
1513
+ Confirmations,
1514
+ sameSecret,
1515
+ needsConfirmation,
1188
1516
  requireConfirmation,
1517
+ onlyRead,
1518
+ watchMetarepo,
1519
+ acceptKey,
1520
+ frame,
1521
+ Socket,
1522
+ upgrade,
1523
+ EventHub,
1524
+ Signal,
1525
+ HARDENING,
1189
1526
  startServer
1190
1527
  };