@maycombhq/atticus 2.0.0-beta.18 → 2.0.0-beta.21

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 (270) hide show
  1. package/dist/bin.js +8 -4
  2. package/dist/{chunk-MUSJJ6CQ.js → chunk-265LWMOA.js} +16 -16
  3. package/dist/chunk-26WBY34Y.js +37 -0
  4. package/dist/{chunk-6H5JG5GL.js → chunk-26Z7OGQW.js} +63 -30
  5. package/dist/{chunk-4REDBQOZ.js → chunk-2D7PWSOK.js} +20 -20
  6. package/dist/{chunk-YPH6ZJ6R.js → chunk-2HH3UCZM.js} +4 -4
  7. package/dist/{chunk-RTUUX7PX.js → chunk-2HTEMYTB.js} +12 -26
  8. package/dist/{chunk-EHQUY26D.js → chunk-2UCRFXFZ.js} +11 -11
  9. package/dist/{chunk-ILDGIXNH.js → chunk-2V2ZPQQU.js} +81 -13
  10. package/dist/{chunk-YSEZQ6D3.js → chunk-36RY7ZXM.js} +107 -64
  11. package/dist/{chunk-QXFDM2FZ.js → chunk-37WE3LS2.js} +3 -3
  12. package/dist/{chunk-BAXM3JFQ.js → chunk-3AQ2R5NL.js} +1212 -754
  13. package/dist/chunk-3G6S7LAA.js +43 -0
  14. package/dist/{chunk-7TOAS7KI.js → chunk-3J5I7ZOU.js} +4 -4
  15. package/dist/{chunk-TAKAEJRD.js → chunk-3LZ6P5EP.js} +1 -1
  16. package/dist/chunk-3SSTNB4E.js +191 -0
  17. package/dist/chunk-3TD6S4TC.js +49 -0
  18. package/dist/{chunk-UUL6ZGMU.js → chunk-3UTYPHN3.js} +1 -1
  19. package/dist/{chunk-6AP2ZUUM.js → chunk-3WON4G3M.js} +2 -2
  20. package/dist/{chunk-AXY6LBW4.js → chunk-42EPP7OB.js} +12 -12
  21. package/dist/{chunk-QKMDT7VU.js → chunk-455SYIIE.js} +2 -2
  22. package/dist/{chunk-MFUFB3LN.js → chunk-4B6BT75O.js} +110 -20
  23. package/dist/{chunk-75MYLZSB.js → chunk-4CLK2RJO.js} +7 -7
  24. package/dist/chunk-4CYTJ5TZ.js +38 -0
  25. package/dist/{chunk-IH7RANGB.js → chunk-4D62IZII.js} +5 -5
  26. package/dist/{chunk-2QMZOCWN.js → chunk-4FOAYLI4.js} +14 -7
  27. package/dist/{chunk-V3UEPUHT.js → chunk-4KNOJC6J.js} +294 -215
  28. package/dist/{chunk-O6ILVBYB.js → chunk-4PYC2UGC.js} +1 -1
  29. package/dist/{chunk-EZBAS5BL.js → chunk-4SLBCEPD.js} +82 -50
  30. package/dist/{chunk-VIRTPODJ.js → chunk-4TKVU2I2.js} +6 -14
  31. package/dist/{chunk-IVCDU443.js → chunk-4WXRPQDE.js} +281 -51
  32. package/dist/{chunk-RMEEHH24.js → chunk-5CMPVC3N.js} +24 -24
  33. package/dist/chunk-5G7ILBUG.js +66 -0
  34. package/dist/{chunk-Z75XDWQR.js → chunk-5PV7S2ZP.js} +3 -3
  35. package/dist/{chunk-WWPC2AZ2.js → chunk-5QUOPNLN.js} +4 -4
  36. package/dist/{chunk-7OVH2L7L.js → chunk-5TDRBOAV.js} +5 -5
  37. package/dist/{chunk-YXUIUOQZ.js → chunk-5WERBKLE.js} +199 -63
  38. package/dist/{chunk-6WNNXEG6.js → chunk-62DLJSLV.js} +8 -8
  39. package/dist/{chunk-KCQS52TH.js → chunk-64AADMTW.js} +99 -25
  40. package/dist/{chunk-KLRUXRPN.js → chunk-67BP7HXL.js} +17 -17
  41. package/dist/chunk-6DQYZU2W.js +379 -0
  42. package/dist/{chunk-RONDYDMQ.js → chunk-6EXDI5GI.js} +51 -34
  43. package/dist/chunk-6FNAKCET.js +38 -0
  44. package/dist/{chunk-6SNEA73E.js → chunk-75ASLHBT.js} +21 -15
  45. package/dist/{chunk-EFT4KM6K.js → chunk-75ZOZFGH.js} +18 -18
  46. package/dist/{chunk-B3KW7EQW.js → chunk-77O633L5.js} +12 -12
  47. package/dist/{chunk-TLDL2ZZI.js → chunk-7AB6OWTV.js} +3 -3
  48. package/dist/{chunk-R5YXY6NT.js → chunk-7CZHUZBL.js} +25 -25
  49. package/dist/{chunk-F4D4G2A6.js → chunk-7FHNFCHK.js} +306 -125
  50. package/dist/{chunk-CC5RNYZF.js → chunk-7FUIVIBG.js} +19 -9
  51. package/dist/{chunk-UBTOSSNK.js → chunk-7QPCGTPS.js} +21 -21
  52. package/dist/{chunk-CDLTRJ4N.js → chunk-A2G72UI4.js} +7 -7
  53. package/dist/{chunk-YGSOQ5LX.js → chunk-AE4P57KK.js} +23 -17
  54. package/dist/{chunk-PGQL5YGH.js → chunk-AHW3RY3X.js} +7 -7
  55. package/dist/chunk-AM6FP6JW.js +43 -0
  56. package/dist/{chunk-DYNC6BAQ.js → chunk-AOCWFA7T.js} +93 -10
  57. package/dist/{chunk-CYX36GKZ.js → chunk-API5TOUB.js} +1 -1
  58. package/dist/{chunk-BJ5T3KDF.js → chunk-AZDITBCT.js} +3 -3
  59. package/dist/{chunk-U6GZSUMC.js → chunk-BA2HUMDN.js} +25 -3
  60. package/dist/chunk-BA3U7ALS.js +99 -0
  61. package/dist/{chunk-63565QTF.js → chunk-BC6KKZ67.js} +5 -5
  62. package/dist/{chunk-XO5RQKNM.js → chunk-BEPCKDCP.js} +1843 -577
  63. package/dist/{chunk-KUH62AQ3.js → chunk-BPPU3PW7.js} +4 -4
  64. package/dist/{chunk-52ULYRV4.js → chunk-BVWWPBKD.js} +18 -18
  65. package/dist/{chunk-R2FGEBIU.js → chunk-BXZ4PKIT.js} +13 -11
  66. package/dist/{chunk-4BU26GFB.js → chunk-C7CEK3KW.js} +4 -4
  67. package/dist/chunk-CFH3QH26.js +29 -0
  68. package/dist/chunk-CG6CULP6.js +170 -0
  69. package/dist/chunk-CLD4RVTA.js +45 -0
  70. package/dist/{chunk-BU543ZEC.js → chunk-CNPY4NTZ.js} +13 -13
  71. package/dist/{chunk-PLBIWEPV.js → chunk-CNU5Q2D5.js} +32 -31
  72. package/dist/{chunk-JTYYEYRR.js → chunk-COYN3UAN.js} +124 -21
  73. package/dist/{chunk-TNCROWPQ.js → chunk-CPK7QSBG.js} +10 -10
  74. package/dist/{chunk-43E6XX67.js → chunk-D2WSW4GU.js} +1 -1
  75. package/dist/{chunk-SHEUEHKC.js → chunk-D57MFJPP.js} +3 -3
  76. package/dist/chunk-D5KV5PSK.js +45 -0
  77. package/dist/chunk-D5MASS4I.js +48 -0
  78. package/dist/{chunk-TQYBXDVH.js → chunk-DCWN3HFV.js} +1 -1
  79. package/dist/{chunk-FF4IGX4Z.js → chunk-DDJPM5YX.js} +2 -2
  80. package/dist/chunk-DN4A2Q2O.js +57 -0
  81. package/dist/{chunk-4ZCFCIEL.js → chunk-DUPZPDCJ.js} +52 -16
  82. package/dist/{chunk-CUJ5TIEB.js → chunk-E2VXBSIR.js} +4 -4
  83. package/dist/{chunk-BX47X5DJ.js → chunk-E57AOFYN.js} +13 -13
  84. package/dist/{chunk-SSTI7GAV.js → chunk-ECLXZWAG.js} +12 -12
  85. package/dist/{chunk-KYK3TA4Q.js → chunk-EDZ45WIR.js} +14 -14
  86. package/dist/chunk-EFCQSMXB.js +37 -0
  87. package/dist/{chunk-YC2K3FJG.js → chunk-EZIN5E5B.js} +8 -8
  88. package/dist/{chunk-MIZNACDI.js → chunk-F6H2RJ3N.js} +1 -1
  89. package/dist/{chunk-EMZVHDJP.js → chunk-FAJDKNSD.js} +7 -3
  90. package/dist/chunk-FGAGWYZB.js +47 -0
  91. package/dist/{chunk-KBGQ3IAM.js → chunk-FLVZFTLQ.js} +18 -18
  92. package/dist/{chunk-2NNXLH53.js → chunk-FQ6WH6PB.js} +22 -7
  93. package/dist/{chunk-QWSLMVHI.js → chunk-FRHD22WM.js} +61 -23
  94. package/dist/{chunk-5MEN4SM5.js → chunk-FVMPFCDS.js} +4 -4
  95. package/dist/{chunk-KLRZKW7Y.js → chunk-FY3QIRTL.js} +3 -3
  96. package/dist/{chunk-B3SWPNJF.js → chunk-FYBF5MB2.js} +13 -11
  97. package/dist/{chunk-CVZCW3NI.js → chunk-G5YJBNDZ.js} +14 -5
  98. package/dist/{chunk-U6EPS5PF.js → chunk-G6IQYM25.js} +5 -5
  99. package/dist/chunk-G6X4YL4D.js +161 -0
  100. package/dist/{chunk-DOSX3MRW.js → chunk-GC2VK3JT.js} +25 -25
  101. package/dist/{chunk-EEWBTFRP.js → chunk-GCS3FZOB.js} +27 -3
  102. package/dist/{chunk-6H6OPNEP.js → chunk-GDZB57IU.js} +5 -5
  103. package/dist/chunk-GIFMBCTW.js +221 -0
  104. package/dist/{chunk-X5WYPIH3.js → chunk-GK4PYVEC.js} +18 -8
  105. package/dist/{chunk-VBSJ5NRB.js → chunk-GNWAOVFQ.js} +5 -5
  106. package/dist/{chunk-TXFDQRBL.js → chunk-GS76RXQE.js} +11 -11
  107. package/dist/{chunk-U3YC4RGC.js → chunk-GSGIZ2OO.js} +23 -23
  108. package/dist/chunk-GUYL7RMK.js +60 -0
  109. package/dist/{chunk-AZYBHPV4.js → chunk-GX74YWR7.js} +14 -13
  110. package/dist/{chunk-YY7VP7KW.js → chunk-HE3HRDNZ.js} +2 -2
  111. package/dist/{chunk-Z7HYYDZM.js → chunk-HGHRSF3E.js} +14 -13
  112. package/dist/{chunk-Q2X4IREC.js → chunk-HK3VOHIE.js} +106 -36
  113. package/dist/{chunk-P5JYMO7Y.js → chunk-HS4BGB4G.js} +22 -22
  114. package/dist/{chunk-IOW6BF3U.js → chunk-HSZMPH5T.js} +798 -141
  115. package/dist/{chunk-L3T33FA7.js → chunk-HWD4JPU7.js} +4 -2
  116. package/dist/{chunk-7NYCH5HY.js → chunk-HXXP2NTE.js} +6 -6
  117. package/dist/{chunk-7S7OFVIU.js → chunk-I2A3Z5AK.js} +4 -4
  118. package/dist/{chunk-WQSDKX7M.js → chunk-ICHDSWEY.js} +7 -7
  119. package/dist/chunk-IFFRGC3N.js +31 -0
  120. package/dist/{chunk-HMZQAIR5.js → chunk-IFHDV6KQ.js} +24 -17
  121. package/dist/chunk-J2O4LFVI.js +80 -0
  122. package/dist/chunk-J5AAZ6OJ.js +161 -0
  123. package/dist/{chunk-CVRWAG76.js → chunk-JAABT3DA.js} +3 -3
  124. package/dist/chunk-JITJP64K.js +34 -0
  125. package/dist/chunk-JKIGL3XQ.js +162 -0
  126. package/dist/chunk-JRVNXLZP.js +615 -0
  127. package/dist/chunk-JRXHON4E.js +41 -0
  128. package/dist/{chunk-XFCK5B27.js → chunk-JS6WMC3J.js} +8 -8
  129. package/dist/chunk-JU4QNJSR.js +62 -0
  130. package/dist/{chunk-IPSFMTK2.js → chunk-JYMIB5XY.js} +152 -42
  131. package/dist/{chunk-L336AJCZ.js → chunk-JYTIHTIK.js} +8 -6
  132. package/dist/{chunk-VEJYZEPC.js → chunk-K332XW7K.js} +135 -16
  133. package/dist/{chunk-KCF7TFOE.js → chunk-K6JB6XTX.js} +11 -11
  134. package/dist/{chunk-LFIIX4OV.js → chunk-KDAHXQIE.js} +46 -34
  135. package/dist/chunk-KYZMRSPS.js +93 -0
  136. package/dist/chunk-L4CESDPB.js +22 -0
  137. package/dist/{chunk-3LR4522O.js → chunk-LEBR5NHW.js} +14 -14
  138. package/dist/{chunk-US3QZU23.js → chunk-LIJJCBQI.js} +67 -7
  139. package/dist/{chunk-XLHL6WTI.js → chunk-LIRVU3HW.js} +16 -16
  140. package/dist/{chunk-BAT4CBB7.js → chunk-LN77DXBM.js} +19 -10
  141. package/dist/{chunk-E5FM44EJ.js → chunk-LNWEWYCM.js} +2474 -315
  142. package/dist/{chunk-TX4OGZKU.js → chunk-LO3BLMVG.js} +3 -3
  143. package/dist/{chunk-RUOGHYSK.js → chunk-LPV6T362.js} +5 -5
  144. package/dist/{chunk-2T5CQH4R.js → chunk-LQH4P45K.js} +1 -1
  145. package/dist/chunk-LU4MQVAL.js +41 -0
  146. package/dist/{chunk-HW4RRIJA.js → chunk-LWDNKE4X.js} +12 -10
  147. package/dist/chunk-M4H2UG4R.js +218 -0
  148. package/dist/{chunk-CANMOOE6.js → chunk-M6D2U3YM.js} +3 -3
  149. package/dist/{chunk-AB5E5HCN.js → chunk-MD7KUEJ3.js} +14 -272
  150. package/dist/{chunk-ENTAAEDK.js → chunk-MMZUN7ZO.js} +20 -20
  151. package/dist/{chunk-L4MHJG3I.js → chunk-MZGRDONP.js} +46 -36
  152. package/dist/{chunk-IYI2S6BB.js → chunk-N3RUGTGV.js} +18 -18
  153. package/dist/{chunk-WZRCGGXG.js → chunk-NCB6656Z.js} +7 -7
  154. package/dist/{chunk-SBE773JU.js → chunk-NRQ65LTQ.js} +5 -5
  155. package/dist/{chunk-NRPMPZWJ.js → chunk-NTAVOWYD.js} +117 -18
  156. package/dist/{chunk-UJBZS5I7.js → chunk-NYOABJNK.js} +36 -27
  157. package/dist/{chunk-LXAPJ3BL.js → chunk-O4IKAIZ2.js} +24 -20
  158. package/dist/{chunk-MMB2OHUY.js → chunk-ODMBPDDV.js} +48 -13
  159. package/dist/chunk-OKUB6RJA.js +533 -0
  160. package/dist/{chunk-MKFYQQ5Q.js → chunk-OMPENNWY.js} +4 -1
  161. package/dist/chunk-OPQZISG3.js +25 -0
  162. package/dist/{chunk-ROJMXG4E.js → chunk-OV57AHCG.js} +24 -24
  163. package/dist/{chunk-7KGXDIWV.js → chunk-OZJ3JLYI.js} +9 -8
  164. package/dist/{chunk-G5BYKJIM.js → chunk-P2VBXX7N.js} +11 -10
  165. package/dist/{chunk-YK6CSODO.js → chunk-PAINMSID.js} +4353 -1106
  166. package/dist/chunk-PKJAV25S.js +43 -0
  167. package/dist/{chunk-R5MNPIMD.js → chunk-PNQLCRSS.js} +4 -4
  168. package/dist/{chunk-3SMMFQED.js → chunk-PQH56YF6.js} +37 -5
  169. package/dist/chunk-PRTBPXYA.js +50 -0
  170. package/dist/{chunk-FF4ZMLSL.js → chunk-PRW3HXM3.js} +2 -2
  171. package/dist/chunk-PRZ7KMWL.js +42 -0
  172. package/dist/{chunk-IFV6MKYV.js → chunk-PTQ3ZALZ.js} +42 -4
  173. package/dist/{chunk-ELQSLAP6.js → chunk-PUEWDYGP.js} +2 -2
  174. package/dist/{chunk-F2ZCZYIK.js → chunk-Q26LDIUV.js} +12 -11
  175. package/dist/chunk-Q46QDDMF.js +277 -0
  176. package/dist/chunk-QBNWF5ZU.js +19 -0
  177. package/dist/{chunk-ANETFNTV.js → chunk-QE527XRY.js} +24 -21
  178. package/dist/{chunk-QNMLLYTN.js → chunk-QHJJMZLX.js} +397 -32
  179. package/dist/chunk-QJCJOMW3.js +425 -0
  180. package/dist/{chunk-3HOONZUE.js → chunk-QKMRFNMA.js} +15 -15
  181. package/dist/{chunk-7S6VJ643.js → chunk-QOOEYDNJ.js} +101 -13
  182. package/dist/{chunk-4YNKN4DF.js → chunk-QSIDVFB7.js} +20 -18
  183. package/dist/{chunk-2IT7SIJY.js → chunk-RA33EYS4.js} +19 -18
  184. package/dist/{chunk-P7NV3FEJ.js → chunk-RALY3E5U.js} +4 -4
  185. package/dist/{chunk-6NESNLVU.js → chunk-S2RY3BOD.js} +35 -21
  186. package/dist/chunk-SB5GRUFM.js +54 -0
  187. package/dist/{chunk-EUQHM2CH.js → chunk-SH27FYPF.js} +18 -18
  188. package/dist/chunk-T74WQQGS.js +40 -0
  189. package/dist/{chunk-LGDW4G73.js → chunk-TGVVUKTG.js} +2 -2
  190. package/dist/chunk-THN26IEF.js +48 -0
  191. package/dist/{chunk-ZV2VCBMQ.js → chunk-TJH2EUAZ.js} +18 -12
  192. package/dist/{chunk-NGT5LLSE.js → chunk-TQ4TG57V.js} +6 -6
  193. package/dist/{chunk-WEDXFJPG.js → chunk-TQTRWENN.js} +12 -12
  194. package/dist/{chunk-ZRWS54RI.js → chunk-TSM6T6GQ.js} +23 -23
  195. package/dist/{chunk-KET7KOVE.js → chunk-TW3KOSQK.js} +15 -7
  196. package/dist/{chunk-RBXDHCN7.js → chunk-TWQRPM76.js} +2 -2
  197. package/dist/{chunk-IO6DQCZX.js → chunk-TYD6I4CZ.js} +4 -4
  198. package/dist/{chunk-5NLJH6R4.js → chunk-U3NBK4EU.js} +56 -17
  199. package/dist/{chunk-U542BJME.js → chunk-UDXWIPCB.js} +7 -7
  200. package/dist/{chunk-OSB6AKF2.js → chunk-UEVZZZU2.js} +4 -4
  201. package/dist/{chunk-5ZV7BK22.js → chunk-UF4UHCIG.js} +2 -2
  202. package/dist/{chunk-PHJOOL6U.js → chunk-UFE36WJH.js} +4 -4
  203. package/dist/{chunk-IHRP4OYV.js → chunk-URIKUID7.js} +12 -12
  204. package/dist/chunk-UYLBRRFK.js +1106 -0
  205. package/dist/chunk-UZACEG2C.js +515 -0
  206. package/dist/{chunk-LR4XBH4L.js → chunk-VAMHOHUU.js} +12 -12
  207. package/dist/{chunk-S5PSGAQ2.js → chunk-VUVGX5L2.js} +1 -1
  208. package/dist/{chunk-2TG2QGKW.js → chunk-VYOCPTUB.js} +18 -16
  209. package/dist/{chunk-VTEDQ6GY.js → chunk-WAZEXEJH.js} +175 -3
  210. package/dist/{chunk-UTSFKZ72.js → chunk-WCEF7H6L.js} +3 -3
  211. package/dist/{chunk-DXPUYG5L.js → chunk-WEOMJHPV.js} +12 -12
  212. package/dist/{chunk-NFKBU2UH.js → chunk-WFU77T3A.js} +5 -5
  213. package/dist/chunk-WIWTJMMR.js +292 -0
  214. package/dist/{chunk-MRFSUAJH.js → chunk-WNTIOBOG.js} +18 -18
  215. package/dist/{chunk-UROTYIGJ.js → chunk-X2CUXTWU.js} +6 -6
  216. package/dist/chunk-X7EMBM5X.js +34 -0
  217. package/dist/{chunk-OO5TKEAG.js → chunk-XEQCQO66.js} +8 -8
  218. package/dist/{chunk-NBQO75XT.js → chunk-XG4WJHLQ.js} +17 -1
  219. package/dist/{chunk-ZQC7MNQB.js → chunk-XOL3GFW2.js} +101 -30
  220. package/dist/{chunk-GXDATVSY.js → chunk-XQ3YZ4QW.js} +22 -22
  221. package/dist/{chunk-GTW54D3D.js → chunk-Y6K3CJBU.js} +726 -88
  222. package/dist/{chunk-CQCAJI6G.js → chunk-YAH5IQAL.js} +5 -5
  223. package/dist/{chunk-U6TD7UOH.js → chunk-YBOVNMHC.js} +51 -14
  224. package/dist/{chunk-OJICVOZH.js → chunk-YF5DZCPN.js} +79 -39
  225. package/dist/chunk-YIGBJNH4.js +37 -0
  226. package/dist/{chunk-7C7OZARH.js → chunk-YJ3TBOTK.js} +25 -25
  227. package/dist/{chunk-HXFSM4LG.js → chunk-YKTE2RU3.js} +2 -2
  228. package/dist/{chunk-7IM4BVVH.js → chunk-YO2PKTXT.js} +268 -36
  229. package/dist/{chunk-Z3UU7XV6.js → chunk-YTTNTQOX.js} +15 -15
  230. package/dist/{chunk-2ZICHO3V.js → chunk-YWAKDNMH.js} +183 -33
  231. package/dist/{chunk-OXOSJXOI.js → chunk-YZDZOEV4.js} +4 -4
  232. package/dist/{chunk-MRCETHW5.js → chunk-Z3QFH7YG.js} +4 -4
  233. package/dist/{chunk-5KZTRD4V.js → chunk-Z6VLC5X4.js} +17 -17
  234. package/dist/{chunk-EDURU5DF.js → chunk-ZFQMMU5Y.js} +2 -2
  235. package/dist/{chunk-3GLDB4IT.js → chunk-ZKYRDV7A.js} +12 -12
  236. package/dist/{chunk-GBGJ6WSO.js → chunk-ZLS6PU2O.js} +3 -3
  237. package/dist/{chunk-JZOOX3PQ.js → chunk-ZOSD4FXV.js} +3 -3
  238. package/dist/chunk-ZPDDEVQX.js +47 -0
  239. package/dist/{chunk-2TTSX7NB.js → chunk-ZQLRCA2V.js} +7 -7
  240. package/dist/{chunk-ESP3RUUR.js → chunk-ZX7235KR.js} +128 -54
  241. package/dist/{chunk-MH4XG5XS.js → chunk-ZZFHLRQW.js} +18 -16
  242. package/dist/files.json +559 -439
  243. package/dist/packages/sdk/npm/index.js +4679 -2672
  244. package/dist/packages/ui/dist/assets/{elk-api-BuFBvNyV.js → elk-api-CowTnhEJ.js} +2 -2
  245. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
  246. package/dist/packages/ui/dist/assets/index-z2wv0d5d.js +47 -0
  247. package/dist/packages/ui/dist/index.html +2 -2
  248. package/package.json +3 -3
  249. package/dist/chunk-25TJC2CL.js +0 -48
  250. package/dist/chunk-3Q5RHGCA.js +0 -47
  251. package/dist/chunk-4W7FOGAB.js +0 -41
  252. package/dist/chunk-6AF3CVJT.js +0 -48
  253. package/dist/chunk-A3KEXFQS.js +0 -34
  254. package/dist/chunk-BAUINGGJ.js +0 -41
  255. package/dist/chunk-BOFUCRJX.js +0 -47
  256. package/dist/chunk-GGKGILIP.js +0 -54
  257. package/dist/chunk-IKN6C67W.js +0 -53
  258. package/dist/chunk-K7MYVIFK.js +0 -54
  259. package/dist/chunk-KHA5LVPE.js +0 -34
  260. package/dist/chunk-LSXGM6MB.js +0 -37
  261. package/dist/chunk-M54TDRM3.js +0 -29
  262. package/dist/chunk-M5GF4NAB.js +0 -45
  263. package/dist/chunk-UTZGBCXE.js +0 -38
  264. package/dist/chunk-UVTSMBM4.js +0 -43
  265. package/dist/chunk-XXE3S3OG.js +0 -44
  266. package/dist/chunk-YJRQCUVJ.js +0 -43
  267. package/dist/chunk-ZFTK4BDN.js +0 -41
  268. package/dist/chunk-ZMARAW37.js +0 -38
  269. package/dist/packages/ui/dist/assets/index-C5QnK82A.css +0 -1
  270. package/dist/packages/ui/dist/assets/index-CQ0a1cBg.js +0 -29
@@ -28,14 +28,114 @@ import {
28
28
  runsRelOf,
29
29
  stateDirOf,
30
30
  stepModelsOf
31
- } from "./chunk-YK6CSODO.js";
31
+ } from "./chunk-PAINMSID.js";
32
32
  import {
33
33
  writeFileAtomic
34
- } from "./chunk-MMB2OHUY.js";
34
+ } from "./chunk-ODMBPDDV.js";
35
35
  import {
36
36
  __toESM
37
37
  } from "./chunk-TV45EUGM.js";
38
38
 
39
+ // packages/ai/dist/person-only.js
40
+ var flag = (a, ...names) => a.some((x) => names.some((n) => x === n || x.startsWith(`${n}=`)));
41
+ var RULES = [
42
+ {
43
+ test: (w, a) => w[0] === "change" && w[1] === "release-prs" && flag(a, "--approve"),
44
+ why: "a person raises the release PRs into each repo's default branch (ADR 0184); a session never approves a push or a PR"
45
+ },
46
+ {
47
+ test: (w, a) => w[0] === "task" && w[1] === "run-ready" && flag(a, "--approve"),
48
+ why: "a person approves each ready task's push and PR into the change branch (ADR 0181); a session never approves a push or a PR"
49
+ },
50
+ { test: (w) => w[0] === "questions" && w[1] === "answer", why: "a person answers questions" },
51
+ {
52
+ // ADR 0181: the AI decides as itself, through Atticus; correcting it, spreading the
53
+ // correction and undoing a batch are a person's word.
54
+ test: (w) => w[0] === "questions" && (w[1] === "correct" || w[1] === "undo"),
55
+ why: "a person corrects an AI decision and undoes a batch of decisions (ADR 0181); the AI decides only as itself, through Atticus"
56
+ },
57
+ {
58
+ test: (w, a) => w[0] === "questions" && w[1] === "sheet" && flag(a, "--apply"),
59
+ why: "a person answers questions (questions sheet --apply answers as them)"
60
+ },
61
+ {
62
+ test: (w, a) => w[0] === "verify" && w[1] === "audit" && flag(a, "--right", "--wrong", "--unsure", "--answers"),
63
+ why: "a person answers an audit: its record says who confirmed each fact"
64
+ },
65
+ {
66
+ test: (w) => w[0] === "knowledge" && ["verify", "correct", "reject"].includes(w[1] ?? ""),
67
+ why: "a person verifies, corrects or rejects a knowledge item"
68
+ },
69
+ { test: (w) => w[1] === "accept", why: "a person accepts what is proposed" },
70
+ { test: (w) => w[0] === "baseline", why: "a person accepts the catalog as the baseline" },
71
+ { test: (w) => w[0] === "triage" && w[1] === "decide", why: "a person decides a triage item" },
72
+ { test: (w) => w[0] === "finding", why: "a person acts on a finding (it is recorded with them)" },
73
+ {
74
+ test: (w) => w[0] === "feature" && ["name", "link"].includes(w[1] ?? ""),
75
+ why: "a person names a feature or links it to work"
76
+ },
77
+ { test: (w) => w[0] === "todo" && w[1] === "done", why: "a person records a manual step done" },
78
+ {
79
+ test: (w) => {
80
+ const n = w[0] === "change" && w[1] === "needs" ? w.slice(1) : w;
81
+ return n[0] === "needs" && ["done", "skip"].includes(n[1] ?? "");
82
+ },
83
+ why: "a person records a need done or not needed"
84
+ },
85
+ { test: (_w, a) => flag(a, "--by"), why: "--by names a person; a session acts as no one" },
86
+ {
87
+ test: (_w, a) => flag(a, "--approve", "--send"),
88
+ why: "--approve and --send are a person's: a human approves every write to shared systems"
89
+ },
90
+ { test: (_w, a) => flag(a, "--as"), why: "--as names a person; a session acts as no one" },
91
+ {
92
+ test: (w, a) => w[0] === "rules" && (w[1] === "activate" || w[1] === "off" || w[1] === "add" && !flag(a, "--draft")),
93
+ why: "a person sets a reading rule active or off (a session drafts)"
94
+ },
95
+ {
96
+ test: (w) => w[0] === "initiative" && ["commit", "new", "plan", "request"].includes(w[1] ?? ""),
97
+ why: "a person starts, plans and records an initiative"
98
+ },
99
+ {
100
+ test: (w) => w[0] === "questions" && w[1] === "owner",
101
+ why: "an owner answers a knowledge gap's question"
102
+ },
103
+ { test: (w) => w[0] === "outcome" && w[1] === "record", why: "a person records an outcome" },
104
+ {
105
+ test: (_w, a) => flag(a, "--accept", "--accept-proposal"),
106
+ why: "a person accepts what is proposed (--accept is theirs)"
107
+ },
108
+ {
109
+ test: (w, a) => w[0] === "repo" && (w[1] === "add" || w[1] === "describe" && flag(a, "--description", "--reject")),
110
+ why: "a person adds a repo and writes or drops its description (a session drafts with --drafted)"
111
+ },
112
+ {
113
+ test: (w) => w[0] === "knowledge" && w[1] === "keep",
114
+ why: "a person keeps a knowledge item (it is recorded as verified by them)"
115
+ },
116
+ { test: (w) => w[0] === "alias", why: "a person decides what a name means" },
117
+ {
118
+ test: (w) => w[0] === "glossary" && ["define", "link", "alias"].includes(w[1] ?? ""),
119
+ why: "a person defines, links or aliases a glossary term"
120
+ },
121
+ {
122
+ // Seventh UX walk: shown by anyone; set (a handle given) only by a person, as in the app.
123
+ test: (w) => w[0] === "orgpack" && w[1] === "owner" && !!w[2],
124
+ why: "a person says who looks after the org pack"
125
+ }
126
+ ];
127
+ function personOnlyWhy(argv) {
128
+ const words2 = [];
129
+ for (const x of argv) {
130
+ if (x.startsWith("-"))
131
+ break;
132
+ words2.push(x);
133
+ }
134
+ return RULES.find((r) => r.test(words2, argv))?.why;
135
+ }
136
+ var isPersonsFactsFile = (name) => /\.audit\.yaml$|\.corrections\.jsonl$/i.test(windowsName(name));
137
+ var windowsName = (name) => name.replace(/:.*$/, "").replace(/[. ]+$/, "");
138
+
39
139
  // packages/ai/dist/context.js
40
140
  import { createHash as createHash2 } from "node:crypto";
41
141
 
@@ -1134,7 +1234,9 @@ function toRunSummary(run) {
1134
1234
  ...run.request.retrieval ? { retrieval: run.request.retrieval } : {},
1135
1235
  stepClass: run.stepClass ?? stepClassOf(run.request),
1136
1236
  ...run.model ? { model: run.model } : {},
1137
- ...run.assistant ? { assistant: run.assistant } : {}
1237
+ ...run.assistant ? { assistant: run.assistant } : {},
1238
+ ...run.batch ? { batch: run.batch } : {},
1239
+ ...run.parts?.length ? { parts: run.parts } : {}
1138
1240
  };
1139
1241
  }
1140
1242
  var OneShotRuntime = class {
@@ -1554,6 +1656,36 @@ ${DATA_RULE}`;
1554
1656
  // packages/ai/dist/handoff.js
1555
1657
  import { mkdir as mkdir3, readdir as readdir3, readFile as readFile3, rm, stat, writeFile as writeFile3 } from "node:fs/promises";
1556
1658
  import { join as join3 } from "node:path";
1659
+ var BATCH_OUTPUT = "answers.md";
1660
+ var DEFAULT_BATCH_MAX_TOKENS = 6e4;
1661
+ var SECTION = /^===[ \t]*([a-z][a-z0-9-]*)[ \t]*$/;
1662
+ function batchSections(text) {
1663
+ const out = /* @__PURE__ */ new Map();
1664
+ let name;
1665
+ let lines = [];
1666
+ const end = () => {
1667
+ if (name === void 0)
1668
+ return;
1669
+ while (lines.length && !lines[0].trim())
1670
+ lines.shift();
1671
+ while (lines.length && !lines.at(-1).trim())
1672
+ lines.pop();
1673
+ const body = lines.length ? `${lines.join("\n")}
1674
+ ` : "";
1675
+ out.set(name, out.has(name) ? { text: body, twice: true } : { text: body });
1676
+ };
1677
+ for (const line of text.replace(/\r\n/g, "\n").split("\n")) {
1678
+ const m = SECTION.exec(line);
1679
+ if (m) {
1680
+ end();
1681
+ name = m[1];
1682
+ lines = [];
1683
+ } else
1684
+ lines.push(line);
1685
+ }
1686
+ end();
1687
+ return out;
1688
+ }
1557
1689
  var HandoffRuntime = class _HandoffRuntime {
1558
1690
  o;
1559
1691
  kind = "hand-off";
@@ -1579,6 +1711,39 @@ var HandoffRuntime = class _HandoffRuntime {
1579
1711
  const { outputPath, change } = run.request;
1580
1712
  return run.request.outputIn === "run" ? `${runsRel}/${change}/${run.runId}/${outputPath}` : `${changesRel}/${change}/${outputPath}`;
1581
1713
  }
1714
+ /**
1715
+ * A batched hand-off's prompt (ADR 0185): one section to write per part, then each part's own
1716
+ * prompt, whole and in order, under its name. It ends with the completion command.
1717
+ */
1718
+ static promptForBatch(run, parts, changesRel = "openspec/changes", runsRel = ".runs") {
1719
+ const { agent, change } = run.request;
1720
+ const where = _HandoffRuntime.outputRel(run, changesRel, runsRel);
1721
+ const n = parts.length;
1722
+ return [
1723
+ `# ${agent.id}: ${n} parts for change ${change}, in one answer`,
1724
+ "",
1725
+ agent.description,
1726
+ "",
1727
+ `Write the result to ${where}. Change no other files.`,
1728
+ "",
1729
+ `The file holds one section per part below. Start each section with a line that holds only "=== " and the part's name, then write that part's answer exactly as the part asks for it, and nothing else. Answer each part from its own instructions and its own data only: the parts are separate. Leave no part out. Atticus checks each section on its own, as if that part were answered alone: a section that is missing or fails its check is asked for again, and the others are kept.`,
1730
+ "",
1731
+ ...parts.flatMap((p) => [`=== ${p.name}`, `<the ${p.name} part's answer>`]),
1732
+ "",
1733
+ ...parts.flatMap((p, i) => [
1734
+ "---",
1735
+ "",
1736
+ `Part ${i + 1} of ${n}: ${p.name}. Its answer is the section "=== ${p.name}".`,
1737
+ "",
1738
+ p.prompt.trimEnd(),
1739
+ ""
1740
+ ]),
1741
+ "---",
1742
+ "",
1743
+ `When the file is complete, run: atticus handoff done ${run.runId}`,
1744
+ ""
1745
+ ].join("\n");
1746
+ }
1582
1747
  /** The prompt the person's assistant gets. It ends with the completion command. */
1583
1748
  static promptFor(run, changesRel = "openspec/changes", runsRel = ".runs") {
1584
1749
  const { agent, pack, outputPath, change } = run.request;
@@ -1596,15 +1761,96 @@ var HandoffRuntime = class _HandoffRuntime {
1596
1761
  ""
1597
1762
  ].join("\n");
1598
1763
  }
1764
+ /** A run id no run folder of the change has yet. */
1765
+ async freshId(change, now) {
1766
+ let runId = makeRunId(now, ++this.seq);
1767
+ while (await stat(this.runDir(change, runId)).catch(() => void 0))
1768
+ runId = makeRunId(now, ++this.seq);
1769
+ return runId;
1770
+ }
1771
+ /**
1772
+ * Whether `parts` runs that wait together, `tokens` in all, are asked in one prompt (ADR 0185):
1773
+ * only when this runtime batches, for two parts or more, within the size a batch may hold.
1774
+ */
1775
+ canBatch(parts, tokens) {
1776
+ return !!this.o.batch && parts >= 2 && tokens <= (this.o.batchMaxTokens ?? DEFAULT_BATCH_MAX_TOKENS);
1777
+ }
1778
+ /**
1779
+ * Ask several waiting runs of one change in one prompt (ADR 0185). Each part keeps its own run,
1780
+ * prompt, pack and answer file, and can still be answered alone; the batch links them, and each
1781
+ * part names the batch. The batch's pack is its parts' packs together: their sources, each id
1782
+ * under its part's name, and their sizes added up. Run it (`run`) to hand it over.
1783
+ */
1784
+ async prepareBatch(o) {
1785
+ checkAllowed(this.kind, o.agent);
1786
+ if (o.parts.length < 2)
1787
+ throw new RuntimeError("a batched hand-off needs two parts or more");
1788
+ const twice = o.parts.find((p, i) => o.parts.findIndex((x) => x.name === p.name) !== i);
1789
+ if (twice)
1790
+ throw new RuntimeError(`a batched hand-off can't have two parts named ${twice.name}`);
1791
+ const parts = [];
1792
+ for (const p of o.parts) {
1793
+ const run2 = await this.load(p.runId);
1794
+ if (run2.request.change !== o.change)
1795
+ throw new RuntimeError(`run ${p.runId} isn't a run of ${o.change}`);
1796
+ if (run2.state !== "waiting" && run2.state !== "prepared")
1797
+ throw new RuntimeError(`run ${p.runId} is ${run2.state}: only a run still waiting for its answer can be batched`);
1798
+ if (run2.batch)
1799
+ throw new RuntimeError(`run ${p.runId} is already asked in ${run2.batch}`);
1800
+ parts.push({ name: p.name, run: run2 });
1801
+ }
1802
+ const now = this.now();
1803
+ const runId = await this.freshId(o.change, now);
1804
+ const manifests = parts.map((p) => ({ name: p.name, m: p.run.request.pack.manifest }));
1805
+ const totalTokens = manifests.reduce((n, x) => n + x.m.totalTokens, 0);
1806
+ const agent = { ...o.agent, tokenBudget: Math.max(o.agent.tokenBudget, totalTokens) };
1807
+ const run = {
1808
+ runId,
1809
+ request: {
1810
+ change: o.change,
1811
+ agent,
1812
+ pack: { prompt: "", manifest: manifests[0].m },
1813
+ outputPath: BATCH_OUTPUT,
1814
+ outputIn: "run",
1815
+ ...o.stepClass ? { stepClass: o.stepClass } : {}
1816
+ },
1817
+ runtime: this.kind,
1818
+ state: "prepared",
1819
+ attempt: 1,
1820
+ startedAt: now.toISOString(),
1821
+ errors: [],
1822
+ stepClass: o.stepClass ?? stepClassOf({ agent }),
1823
+ parts: parts.map((p) => ({ name: p.name, runId: p.run.runId }))
1824
+ };
1825
+ const prompt = _HandoffRuntime.promptForBatch(run, parts.map((p) => ({ name: p.name, prompt: p.run.request.pack.prompt })), changesRelOf(this.o.root), runsRelOf(this.o.root));
1826
+ const manifest = {
1827
+ schemaVersion: 1,
1828
+ change: o.change,
1829
+ agent: o.agent.id,
1830
+ createdAt: now.toISOString(),
1831
+ budget: manifests.reduce((n, x) => n + x.m.budget, 0),
1832
+ totalTokens,
1833
+ sources: manifests.flatMap((x) => x.m.sources.map((s) => ({ ...s, id: `${x.name}/${s.id}` }))),
1834
+ dropped: manifests.flatMap((x) => x.m.dropped.map((d) => ({ ...d, id: `${x.name}/${d.id}` }))),
1835
+ promptSha256: sha2562(prompt)
1836
+ };
1837
+ run.request.pack = { prompt, manifest };
1838
+ const dir = this.runDir(o.change, runId);
1839
+ await mkdir3(dir, { recursive: true });
1840
+ await writeFile3(join3(dir, "prompt.md"), prompt, "utf8");
1841
+ await writeFile3(join3(dir, "context-manifest.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8");
1842
+ await this.save(run);
1843
+ for (const p of parts)
1844
+ await this.save({ ...p.run, batch: runId });
1845
+ return run;
1846
+ }
1599
1847
  async prepare(request) {
1600
1848
  checkAllowed(this.kind, request.agent);
1601
1849
  if (request.pack.manifest.totalTokens > request.agent.tokenBudget) {
1602
1850
  throw new RuntimeError(`context pack (${request.pack.manifest.totalTokens} tokens) is over agent ${request.agent.id}'s budget of ${request.agent.tokenBudget}`);
1603
1851
  }
1604
1852
  const now = this.now();
1605
- let runId = makeRunId(now, ++this.seq);
1606
- while (await stat(this.runDir(request.change, runId)).catch(() => void 0))
1607
- runId = makeRunId(now, ++this.seq);
1853
+ const runId = await this.freshId(request.change, now);
1608
1854
  const run = {
1609
1855
  runId,
1610
1856
  request,
@@ -1638,6 +1884,8 @@ var HandoffRuntime = class _HandoffRuntime {
1638
1884
  async done(runId, o = {}) {
1639
1885
  let run = await this.load(runId);
1640
1886
  const model = o.model?.trim();
1887
+ if (run.parts?.length)
1888
+ return this.doneBatch(run, model);
1641
1889
  if (model)
1642
1890
  run = { ...run, model };
1643
1891
  if (run.state === "failed") {
@@ -1661,8 +1909,61 @@ var HandoffRuntime = class _HandoffRuntime {
1661
1909
  return run;
1662
1910
  if (this.now().getTime() - info.mtimeMs < (this.o.stableMs ?? 3e4))
1663
1911
  return run;
1912
+ if (run.parts?.length)
1913
+ return this.doneBatch(run);
1664
1914
  return this.validate(transition(run, "produced", this.now()));
1665
1915
  }
1916
+ /**
1917
+ * A batched hand-off's Done (ADR 0185): its answer is split into its parts' sections, each
1918
+ * written to its part's own answer file and checked there as that part's Done would check it.
1919
+ * A part that passes is in; a missing, doubled or failing section fails only its part, which can
1920
+ * be fixed in the batch (Done again checks only the parts still out) or answered alone. The
1921
+ * batch passes once every part is in; until then it fails, naming each part that is out and why.
1922
+ */
1923
+ async doneBatch(start, model) {
1924
+ let run = start;
1925
+ if (run.state === "validated" || run.state === "cancelled")
1926
+ return run;
1927
+ if (run.state === "failed")
1928
+ run = transition(transition(run, "prepared", this.now(), { attempt: run.attempt + 1, errors: [] }), "waiting", this.now());
1929
+ if (model)
1930
+ run = { ...run, model };
1931
+ const output = await readFile3(this.outputFile(run), "utf8").catch(() => void 0);
1932
+ if (output === void 0)
1933
+ return this.save(transition(run, "failed", this.now(), {
1934
+ errors: [`${run.request.outputPath} was not written`]
1935
+ }));
1936
+ const names = run.parts.map((p) => p.name);
1937
+ const sections = batchSections(output);
1938
+ if (!names.some((n) => sections.has(n)))
1939
+ return this.save(transition(run, "failed", this.now(), {
1940
+ output,
1941
+ errors: [
1942
+ `${run.request.outputPath} has no section of any part. Start each part's answer with its own line "=== <part>": ${names.map((n) => `=== ${n}`).join(", ")}.`
1943
+ ]
1944
+ }));
1945
+ run = transition(run, "produced", this.now(), { output });
1946
+ const errors = [];
1947
+ const runsRel = runsRelOf(this.o.root);
1948
+ for (const p of run.parts) {
1949
+ const part = await this.load(p.runId);
1950
+ if (part.state === "validated" || part.state === "cancelled")
1951
+ continue;
1952
+ const s = sections.get(p.name);
1953
+ const alone = `answer that part alone: its prompt is ${_HandoffRuntime.promptRel(part, runsRel)}.`;
1954
+ if (!s || s.twice) {
1955
+ errors.push(s ? `${p.name}: the answer has two "=== ${p.name}" sections. Keep one, or ${alone}` : `${p.name}: the answer has no "=== ${p.name}" section. Add it, or ${alone}`);
1956
+ const why = `The batched answer (run ${run.runId}) has ${s ? 'two "=== ' + p.name + '" sections' : 'no "=== ' + p.name + '" section'}. Answer this part here.`;
1957
+ await this.save(part.state === "failed" ? { ...part, errors: [why] } : transition(part, "failed", this.now(), { errors: [why] }));
1958
+ continue;
1959
+ }
1960
+ await writeFile3(this.outputFile(part), s.text, "utf8");
1961
+ const r = await this.done(p.runId, model ? { model } : {});
1962
+ if (r.state !== "validated")
1963
+ errors.push(...r.errors.map((e) => `${p.name}: ${e}`));
1964
+ }
1965
+ return this.save(errors.length ? transition(run, "failed", this.now(), { errors }) : transition(run, "validated", this.now()));
1966
+ }
1666
1967
  /** Retry after a failure: a fresh attempt with the same request. */
1667
1968
  async retry(runId) {
1668
1969
  const run = await this.load(runId);
@@ -1711,6 +2012,7 @@ async function pruneRuns(root, days, now = /* @__PURE__ */ new Date(), only) {
1711
2012
  }
1712
2013
 
1713
2014
  // packages/ai/dist/factory.js
2015
+ import { existsSync as existsSync2 } from "node:fs";
1714
2016
  import { spawn as spawn2 } from "node:child_process";
1715
2017
  import { mkdir as mkdir5, mkdtemp, readFile as readFile5, rm as rm2, stat as stat3, writeFile as writeFile5 } from "node:fs/promises";
1716
2018
  import { tmpdir } from "node:os";
@@ -1969,18 +2271,7 @@ function commandLineOf(line) {
1969
2271
  var RuntimeConfigLikeError = class extends RuntimeError {
1970
2272
  };
1971
2273
  var PERSONS = [
1972
- {
1973
- test: (a) => a[0] === "questions" && a[1] === "answer",
1974
- why: "a person answers questions (atticus questions answer is theirs to run)"
1975
- },
1976
- {
1977
- test: (a) => a.includes("--approve"),
1978
- why: "--approve is a person's: a human approves every write to shared systems"
1979
- },
1980
- {
1981
- test: (a) => a.includes("--accept") || a.includes("--accept-proposal"),
1982
- why: "a person accepts what is proposed (--accept is theirs)"
1983
- },
2274
+ // What only a person does is personOnlyWhy's list (person-only.ts), shared with the CLI.
1984
2275
  {
1985
2276
  test: (a) => a[0] === "map" && a.includes("--all"),
1986
2277
  why: "this session is one step of atticus map --all; Atticus runs the loop, not the session"
@@ -2013,6 +2304,13 @@ function atticusArgvOf(command, args = []) {
2013
2304
  for (const p of PERSONS)
2014
2305
  if (p.test(argv))
2015
2306
  return { refused: `Refused: ${p.why}.` };
2307
+ if (argv[0].startsWith("-") && !["--help", "--version", "-h"].includes(argv[0]))
2308
+ return {
2309
+ refused: `Put the command first: atticus <command> [arguments] (got ${short(argv.join(" "))})`
2310
+ };
2311
+ const person = personOnlyWhy(argv);
2312
+ if (person)
2313
+ return { refused: `Refused: ${person}; Atticus lets a session act as no one.` };
2016
2314
  return { argv };
2017
2315
  }
2018
2316
  var short = (s, n = 120) => s.length > n ? `${s.slice(0, n - 1)}\u2026` : s;
@@ -2059,6 +2357,11 @@ var Paths = class {
2059
2357
  const r = caseOf(real(path));
2060
2358
  if (r.split(sep).includes(".git"))
2061
2359
  return `Atticus never lets a session write in .git (${short(path)})`;
2360
+ const parts = r.split(sep).slice(/^[A-Za-z]:$/.test(r.split(sep)[0] ?? "") ? 1 : 0);
2361
+ if (parts.some((x) => x !== "." && x !== ".." && (/[. ]$/.test(x) || x.includes(":"))))
2362
+ return `Atticus never lets a session write a name that ends in a dot or space or names a stream (${short(path)})`;
2363
+ if (isPersonsFactsFile(basename(r)))
2364
+ return `Atticus never lets a session write a person's record (${short(path)}: an audit's answers or a person's corrections)`;
2062
2365
  if (this.files.includes(r) || this.writeDirs.some((x) => sameOrUnder(x, r)))
2063
2366
  return void 0;
2064
2367
  const base = this.p.readRoots[0] ?? "";
@@ -2073,6 +2376,7 @@ var Paths = class {
2073
2376
  return `Atticus lets this session write only its step's result: it writes only under ${where || "nothing"}; ${short(path)} is refused`;
2074
2377
  }
2075
2378
  };
2379
+ var acpPathsOf = (p) => new Paths(p);
2076
2380
  var factsOnly = (root, factsDir) => ({
2077
2381
  readRoots: readRootsOf(root),
2078
2382
  writeRoots: [factsDir]
@@ -2084,8 +2388,22 @@ function readRootsOf(root) {
2084
2388
  out.push(state);
2085
2389
  return out;
2086
2390
  }
2087
- var needsShell = (command) => process.platform === "win32" && !/\.(exe|com)$/i.test(command);
2391
+ var needsShell = (command, platform = process.platform) => platform === "win32" && !/\.(exe|com)$/i.test(command);
2088
2392
  var quoteForCmd = (a) => /[\s"]/.test(a) ? `"${a.replace(/"/g, '""')}"` : a;
2393
+ function killTree(child, platform = process.platform, run = spawn) {
2394
+ if (platform === "win32" && child.pid) {
2395
+ try {
2396
+ const k = run("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
2397
+ windowsHide: true,
2398
+ stdio: "ignore"
2399
+ });
2400
+ k.on("error", () => child.kill());
2401
+ return;
2402
+ } catch {
2403
+ }
2404
+ }
2405
+ child.kill();
2406
+ }
2089
2407
  var spawnAcpServer = (o) => {
2090
2408
  const shell = needsShell(o.command);
2091
2409
  let child;
@@ -2152,7 +2470,7 @@ var spawnAcpServer = (o) => {
2152
2470
  child.stdin?.end();
2153
2471
  await new Promise((res) => {
2154
2472
  const t = setTimeout(() => {
2155
- child.kill();
2473
+ killTree(child);
2156
2474
  res();
2157
2475
  }, 2e3);
2158
2476
  closes.push(() => {
@@ -2588,7 +2906,7 @@ async function copilotAcpProbe(o) {
2588
2906
  res({ ok: false, text: e.message });
2589
2907
  return;
2590
2908
  }
2591
- const t = setTimeout(() => child.kill(), o.timeoutMs ?? 6e4);
2909
+ const t = setTimeout(() => killTree(child), o.timeoutMs ?? 6e4);
2592
2910
  child.stdout?.on("data", (d) => out += d.toString("utf8"));
2593
2911
  child.stderr?.on("data", (d) => out += d.toString("utf8"));
2594
2912
  child.on("error", (e) => {
@@ -2764,15 +3082,48 @@ var AiOffError = class extends RuntimeConfigError {
2764
3082
  }
2765
3083
  };
2766
3084
  function claudeCodeCliRunner(o = {}) {
2767
- return (i) => collectChild(() => spawn2(o.command ?? "claude", i.args, {
2768
- cwd: i.cwd,
2769
- env: { ...process.env, ...i.env },
2770
- stdio: ["pipe", "pipe", "pipe"],
2771
- windowsHide: true,
2772
- ...i.signal ? { signal: i.signal } : {}
2773
- }), i.prompt, i.timeoutMs, i.cwd);
2774
- }
2775
- function collectChild(start, prompt, timeoutMs, cwd, platform = process.platform) {
3085
+ return (i) => {
3086
+ const command = resolveWindowsCommand(o.command ?? "claude");
3087
+ const shell = isShim(command);
3088
+ let started;
3089
+ const end = () => {
3090
+ if (started)
3091
+ killTree(started);
3092
+ };
3093
+ if (shell && i.signal) {
3094
+ if (i.signal.aborted)
3095
+ queueMicrotask(end);
3096
+ else
3097
+ i.signal.addEventListener("abort", end, { once: true });
3098
+ }
3099
+ return collectChild(() => {
3100
+ started = spawn2(shell ? quoteForCmdAlways(command) : command, shell ? i.args.map(quoteForCmdAlways) : i.args, {
3101
+ cwd: i.cwd,
3102
+ env: { ...process.env, ...i.env },
3103
+ stdio: ["pipe", "pipe", "pipe"],
3104
+ windowsHide: true,
3105
+ shell,
3106
+ ...i.signal && !shell ? { signal: i.signal } : {}
3107
+ });
3108
+ return started;
3109
+ }, i.prompt, i.timeoutMs, i.cwd, process.platform, shell ? (c) => killTree(c) : void 0);
3110
+ };
3111
+ }
3112
+ var isShim = (command, platform = process.platform) => platform === "win32" && /\.(cmd|bat)$/i.test(command);
3113
+ function resolveWindowsCommand(command, env = process.env, platform = process.platform, exists = existsSync2) {
3114
+ if (platform !== "win32" || /[\\/]/.test(command) || /\.[a-z0-9]+$/i.test(command))
3115
+ return command;
3116
+ const exts = (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);
3117
+ for (const dir of (env.Path ?? env.PATH ?? "").split(";").map((d) => d.trim().replace(/^"(.*)"$/, "$1")).filter(Boolean))
3118
+ for (const ext of exts) {
3119
+ const full = `${dir.replace(/[\\/]+$/, "")}\\${command}${ext.toLowerCase()}`;
3120
+ if (exists(full))
3121
+ return full;
3122
+ }
3123
+ return command;
3124
+ }
3125
+ var quoteForCmdAlways = (a) => `"${a.replace(/"/g, '""')}"`;
3126
+ function collectChild(start, prompt, timeoutMs, cwd, platform = process.platform, stop) {
2776
3127
  return new Promise((resolve2, reject) => {
2777
3128
  let done = false;
2778
3129
  const timer = {};
@@ -2794,7 +3145,7 @@ function collectChild(start, prompt, timeoutMs, cwd, platform = process.platform
2794
3145
  }
2795
3146
  let stdout = "";
2796
3147
  let stderr = "";
2797
- timer.id = setTimeout(() => child.kill("SIGINT"), timeoutMs);
3148
+ timer.id = setTimeout(() => stop ? stop(child) : child.kill("SIGINT"), timeoutMs);
2798
3149
  for (const s of [child.stdin, child.stdout, child.stderr])
2799
3150
  s.on("error", fail);
2800
3151
  child.stdout.setEncoding("utf8").on("data", (d) => stdout += d);
@@ -3012,7 +3363,9 @@ async function createRuntime(orgPack, o) {
3012
3363
  return new HandoffRuntime({
3013
3364
  root: o.root,
3014
3365
  validate: o.handoffValidate ?? nonEmpty,
3015
- ...o.now ? { now: o.now } : {}
3366
+ ...o.now ? { now: o.now } : {},
3367
+ // ADR 0185: a stage's critic lenses go to the person's assistant in one prompt.
3368
+ batch: true
3016
3369
  });
3017
3370
  case "model": {
3018
3371
  const cfg = rt.adapters.model;
@@ -3692,6 +4045,9 @@ function recordedJudge(byTexts, o = {}) {
3692
4045
  }
3693
4046
 
3694
4047
  export {
4048
+ personOnlyWhy,
4049
+ isPersonsFactsFile,
4050
+ windowsName,
3695
4051
  DEFENCES_VERSION,
3696
4052
  INSTRUCTION_RULES,
3697
4053
  riskAtLeast,
@@ -3757,6 +4113,9 @@ export {
3757
4113
  recordRun,
3758
4114
  MockModelProvider,
3759
4115
  ModelRuntime,
4116
+ BATCH_OUTPUT,
4117
+ DEFAULT_BATCH_MAX_TOKENS,
4118
+ batchSections,
3760
4119
  HandoffRuntime,
3761
4120
  pruneRuns,
3762
4121
  ACP_PROTOCOL_VERSION,
@@ -3770,8 +4129,12 @@ export {
3770
4129
  isAuthRequired,
3771
4130
  commandLineOf,
3772
4131
  atticusArgvOf,
4132
+ acpPathsOf,
3773
4133
  factsOnly,
3774
4134
  readRootsOf,
4135
+ needsShell,
4136
+ quoteForCmd,
4137
+ killTree,
3775
4138
  spawnAcpServer,
3776
4139
  atticusExec,
3777
4140
  AcpSignInError,
@@ -3787,6 +4150,8 @@ export {
3787
4150
  RuntimeConfigError,
3788
4151
  AiOffError,
3789
4152
  claudeCodeCliRunner,
4153
+ resolveWindowsCommand,
4154
+ quoteForCmdAlways,
3790
4155
  collectChild,
3791
4156
  posixPath,
3792
4157
  HeadlessClaudeCodeRuntime,