@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.
- package/dist/bin.js +8 -4
- package/dist/{chunk-MUSJJ6CQ.js → chunk-265LWMOA.js} +16 -16
- package/dist/chunk-26WBY34Y.js +37 -0
- package/dist/{chunk-6H5JG5GL.js → chunk-26Z7OGQW.js} +63 -30
- package/dist/{chunk-4REDBQOZ.js → chunk-2D7PWSOK.js} +20 -20
- package/dist/{chunk-YPH6ZJ6R.js → chunk-2HH3UCZM.js} +4 -4
- package/dist/{chunk-RTUUX7PX.js → chunk-2HTEMYTB.js} +12 -26
- package/dist/{chunk-EHQUY26D.js → chunk-2UCRFXFZ.js} +11 -11
- package/dist/{chunk-ILDGIXNH.js → chunk-2V2ZPQQU.js} +81 -13
- package/dist/{chunk-YSEZQ6D3.js → chunk-36RY7ZXM.js} +107 -64
- package/dist/{chunk-QXFDM2FZ.js → chunk-37WE3LS2.js} +3 -3
- package/dist/{chunk-BAXM3JFQ.js → chunk-3AQ2R5NL.js} +1212 -754
- package/dist/chunk-3G6S7LAA.js +43 -0
- package/dist/{chunk-7TOAS7KI.js → chunk-3J5I7ZOU.js} +4 -4
- package/dist/{chunk-TAKAEJRD.js → chunk-3LZ6P5EP.js} +1 -1
- package/dist/chunk-3SSTNB4E.js +191 -0
- package/dist/chunk-3TD6S4TC.js +49 -0
- package/dist/{chunk-UUL6ZGMU.js → chunk-3UTYPHN3.js} +1 -1
- package/dist/{chunk-6AP2ZUUM.js → chunk-3WON4G3M.js} +2 -2
- package/dist/{chunk-AXY6LBW4.js → chunk-42EPP7OB.js} +12 -12
- package/dist/{chunk-QKMDT7VU.js → chunk-455SYIIE.js} +2 -2
- package/dist/{chunk-MFUFB3LN.js → chunk-4B6BT75O.js} +110 -20
- package/dist/{chunk-75MYLZSB.js → chunk-4CLK2RJO.js} +7 -7
- package/dist/chunk-4CYTJ5TZ.js +38 -0
- package/dist/{chunk-IH7RANGB.js → chunk-4D62IZII.js} +5 -5
- package/dist/{chunk-2QMZOCWN.js → chunk-4FOAYLI4.js} +14 -7
- package/dist/{chunk-V3UEPUHT.js → chunk-4KNOJC6J.js} +294 -215
- package/dist/{chunk-O6ILVBYB.js → chunk-4PYC2UGC.js} +1 -1
- package/dist/{chunk-EZBAS5BL.js → chunk-4SLBCEPD.js} +82 -50
- package/dist/{chunk-VIRTPODJ.js → chunk-4TKVU2I2.js} +6 -14
- package/dist/{chunk-IVCDU443.js → chunk-4WXRPQDE.js} +281 -51
- package/dist/{chunk-RMEEHH24.js → chunk-5CMPVC3N.js} +24 -24
- package/dist/chunk-5G7ILBUG.js +66 -0
- package/dist/{chunk-Z75XDWQR.js → chunk-5PV7S2ZP.js} +3 -3
- package/dist/{chunk-WWPC2AZ2.js → chunk-5QUOPNLN.js} +4 -4
- package/dist/{chunk-7OVH2L7L.js → chunk-5TDRBOAV.js} +5 -5
- package/dist/{chunk-YXUIUOQZ.js → chunk-5WERBKLE.js} +199 -63
- package/dist/{chunk-6WNNXEG6.js → chunk-62DLJSLV.js} +8 -8
- package/dist/{chunk-KCQS52TH.js → chunk-64AADMTW.js} +99 -25
- package/dist/{chunk-KLRUXRPN.js → chunk-67BP7HXL.js} +17 -17
- package/dist/chunk-6DQYZU2W.js +379 -0
- package/dist/{chunk-RONDYDMQ.js → chunk-6EXDI5GI.js} +51 -34
- package/dist/chunk-6FNAKCET.js +38 -0
- package/dist/{chunk-6SNEA73E.js → chunk-75ASLHBT.js} +21 -15
- package/dist/{chunk-EFT4KM6K.js → chunk-75ZOZFGH.js} +18 -18
- package/dist/{chunk-B3KW7EQW.js → chunk-77O633L5.js} +12 -12
- package/dist/{chunk-TLDL2ZZI.js → chunk-7AB6OWTV.js} +3 -3
- package/dist/{chunk-R5YXY6NT.js → chunk-7CZHUZBL.js} +25 -25
- package/dist/{chunk-F4D4G2A6.js → chunk-7FHNFCHK.js} +306 -125
- package/dist/{chunk-CC5RNYZF.js → chunk-7FUIVIBG.js} +19 -9
- package/dist/{chunk-UBTOSSNK.js → chunk-7QPCGTPS.js} +21 -21
- package/dist/{chunk-CDLTRJ4N.js → chunk-A2G72UI4.js} +7 -7
- package/dist/{chunk-YGSOQ5LX.js → chunk-AE4P57KK.js} +23 -17
- package/dist/{chunk-PGQL5YGH.js → chunk-AHW3RY3X.js} +7 -7
- package/dist/chunk-AM6FP6JW.js +43 -0
- package/dist/{chunk-DYNC6BAQ.js → chunk-AOCWFA7T.js} +93 -10
- package/dist/{chunk-CYX36GKZ.js → chunk-API5TOUB.js} +1 -1
- package/dist/{chunk-BJ5T3KDF.js → chunk-AZDITBCT.js} +3 -3
- package/dist/{chunk-U6GZSUMC.js → chunk-BA2HUMDN.js} +25 -3
- package/dist/chunk-BA3U7ALS.js +99 -0
- package/dist/{chunk-63565QTF.js → chunk-BC6KKZ67.js} +5 -5
- package/dist/{chunk-XO5RQKNM.js → chunk-BEPCKDCP.js} +1843 -577
- package/dist/{chunk-KUH62AQ3.js → chunk-BPPU3PW7.js} +4 -4
- package/dist/{chunk-52ULYRV4.js → chunk-BVWWPBKD.js} +18 -18
- package/dist/{chunk-R2FGEBIU.js → chunk-BXZ4PKIT.js} +13 -11
- package/dist/{chunk-4BU26GFB.js → chunk-C7CEK3KW.js} +4 -4
- package/dist/chunk-CFH3QH26.js +29 -0
- package/dist/chunk-CG6CULP6.js +170 -0
- package/dist/chunk-CLD4RVTA.js +45 -0
- package/dist/{chunk-BU543ZEC.js → chunk-CNPY4NTZ.js} +13 -13
- package/dist/{chunk-PLBIWEPV.js → chunk-CNU5Q2D5.js} +32 -31
- package/dist/{chunk-JTYYEYRR.js → chunk-COYN3UAN.js} +124 -21
- package/dist/{chunk-TNCROWPQ.js → chunk-CPK7QSBG.js} +10 -10
- package/dist/{chunk-43E6XX67.js → chunk-D2WSW4GU.js} +1 -1
- package/dist/{chunk-SHEUEHKC.js → chunk-D57MFJPP.js} +3 -3
- package/dist/chunk-D5KV5PSK.js +45 -0
- package/dist/chunk-D5MASS4I.js +48 -0
- package/dist/{chunk-TQYBXDVH.js → chunk-DCWN3HFV.js} +1 -1
- package/dist/{chunk-FF4IGX4Z.js → chunk-DDJPM5YX.js} +2 -2
- package/dist/chunk-DN4A2Q2O.js +57 -0
- package/dist/{chunk-4ZCFCIEL.js → chunk-DUPZPDCJ.js} +52 -16
- package/dist/{chunk-CUJ5TIEB.js → chunk-E2VXBSIR.js} +4 -4
- package/dist/{chunk-BX47X5DJ.js → chunk-E57AOFYN.js} +13 -13
- package/dist/{chunk-SSTI7GAV.js → chunk-ECLXZWAG.js} +12 -12
- package/dist/{chunk-KYK3TA4Q.js → chunk-EDZ45WIR.js} +14 -14
- package/dist/chunk-EFCQSMXB.js +37 -0
- package/dist/{chunk-YC2K3FJG.js → chunk-EZIN5E5B.js} +8 -8
- package/dist/{chunk-MIZNACDI.js → chunk-F6H2RJ3N.js} +1 -1
- package/dist/{chunk-EMZVHDJP.js → chunk-FAJDKNSD.js} +7 -3
- package/dist/chunk-FGAGWYZB.js +47 -0
- package/dist/{chunk-KBGQ3IAM.js → chunk-FLVZFTLQ.js} +18 -18
- package/dist/{chunk-2NNXLH53.js → chunk-FQ6WH6PB.js} +22 -7
- package/dist/{chunk-QWSLMVHI.js → chunk-FRHD22WM.js} +61 -23
- package/dist/{chunk-5MEN4SM5.js → chunk-FVMPFCDS.js} +4 -4
- package/dist/{chunk-KLRZKW7Y.js → chunk-FY3QIRTL.js} +3 -3
- package/dist/{chunk-B3SWPNJF.js → chunk-FYBF5MB2.js} +13 -11
- package/dist/{chunk-CVZCW3NI.js → chunk-G5YJBNDZ.js} +14 -5
- package/dist/{chunk-U6EPS5PF.js → chunk-G6IQYM25.js} +5 -5
- package/dist/chunk-G6X4YL4D.js +161 -0
- package/dist/{chunk-DOSX3MRW.js → chunk-GC2VK3JT.js} +25 -25
- package/dist/{chunk-EEWBTFRP.js → chunk-GCS3FZOB.js} +27 -3
- package/dist/{chunk-6H6OPNEP.js → chunk-GDZB57IU.js} +5 -5
- package/dist/chunk-GIFMBCTW.js +221 -0
- package/dist/{chunk-X5WYPIH3.js → chunk-GK4PYVEC.js} +18 -8
- package/dist/{chunk-VBSJ5NRB.js → chunk-GNWAOVFQ.js} +5 -5
- package/dist/{chunk-TXFDQRBL.js → chunk-GS76RXQE.js} +11 -11
- package/dist/{chunk-U3YC4RGC.js → chunk-GSGIZ2OO.js} +23 -23
- package/dist/chunk-GUYL7RMK.js +60 -0
- package/dist/{chunk-AZYBHPV4.js → chunk-GX74YWR7.js} +14 -13
- package/dist/{chunk-YY7VP7KW.js → chunk-HE3HRDNZ.js} +2 -2
- package/dist/{chunk-Z7HYYDZM.js → chunk-HGHRSF3E.js} +14 -13
- package/dist/{chunk-Q2X4IREC.js → chunk-HK3VOHIE.js} +106 -36
- package/dist/{chunk-P5JYMO7Y.js → chunk-HS4BGB4G.js} +22 -22
- package/dist/{chunk-IOW6BF3U.js → chunk-HSZMPH5T.js} +798 -141
- package/dist/{chunk-L3T33FA7.js → chunk-HWD4JPU7.js} +4 -2
- package/dist/{chunk-7NYCH5HY.js → chunk-HXXP2NTE.js} +6 -6
- package/dist/{chunk-7S7OFVIU.js → chunk-I2A3Z5AK.js} +4 -4
- package/dist/{chunk-WQSDKX7M.js → chunk-ICHDSWEY.js} +7 -7
- package/dist/chunk-IFFRGC3N.js +31 -0
- package/dist/{chunk-HMZQAIR5.js → chunk-IFHDV6KQ.js} +24 -17
- package/dist/chunk-J2O4LFVI.js +80 -0
- package/dist/chunk-J5AAZ6OJ.js +161 -0
- package/dist/{chunk-CVRWAG76.js → chunk-JAABT3DA.js} +3 -3
- package/dist/chunk-JITJP64K.js +34 -0
- package/dist/chunk-JKIGL3XQ.js +162 -0
- package/dist/chunk-JRVNXLZP.js +615 -0
- package/dist/chunk-JRXHON4E.js +41 -0
- package/dist/{chunk-XFCK5B27.js → chunk-JS6WMC3J.js} +8 -8
- package/dist/chunk-JU4QNJSR.js +62 -0
- package/dist/{chunk-IPSFMTK2.js → chunk-JYMIB5XY.js} +152 -42
- package/dist/{chunk-L336AJCZ.js → chunk-JYTIHTIK.js} +8 -6
- package/dist/{chunk-VEJYZEPC.js → chunk-K332XW7K.js} +135 -16
- package/dist/{chunk-KCF7TFOE.js → chunk-K6JB6XTX.js} +11 -11
- package/dist/{chunk-LFIIX4OV.js → chunk-KDAHXQIE.js} +46 -34
- package/dist/chunk-KYZMRSPS.js +93 -0
- package/dist/chunk-L4CESDPB.js +22 -0
- package/dist/{chunk-3LR4522O.js → chunk-LEBR5NHW.js} +14 -14
- package/dist/{chunk-US3QZU23.js → chunk-LIJJCBQI.js} +67 -7
- package/dist/{chunk-XLHL6WTI.js → chunk-LIRVU3HW.js} +16 -16
- package/dist/{chunk-BAT4CBB7.js → chunk-LN77DXBM.js} +19 -10
- package/dist/{chunk-E5FM44EJ.js → chunk-LNWEWYCM.js} +2474 -315
- package/dist/{chunk-TX4OGZKU.js → chunk-LO3BLMVG.js} +3 -3
- package/dist/{chunk-RUOGHYSK.js → chunk-LPV6T362.js} +5 -5
- package/dist/{chunk-2T5CQH4R.js → chunk-LQH4P45K.js} +1 -1
- package/dist/chunk-LU4MQVAL.js +41 -0
- package/dist/{chunk-HW4RRIJA.js → chunk-LWDNKE4X.js} +12 -10
- package/dist/chunk-M4H2UG4R.js +218 -0
- package/dist/{chunk-CANMOOE6.js → chunk-M6D2U3YM.js} +3 -3
- package/dist/{chunk-AB5E5HCN.js → chunk-MD7KUEJ3.js} +14 -272
- package/dist/{chunk-ENTAAEDK.js → chunk-MMZUN7ZO.js} +20 -20
- package/dist/{chunk-L4MHJG3I.js → chunk-MZGRDONP.js} +46 -36
- package/dist/{chunk-IYI2S6BB.js → chunk-N3RUGTGV.js} +18 -18
- package/dist/{chunk-WZRCGGXG.js → chunk-NCB6656Z.js} +7 -7
- package/dist/{chunk-SBE773JU.js → chunk-NRQ65LTQ.js} +5 -5
- package/dist/{chunk-NRPMPZWJ.js → chunk-NTAVOWYD.js} +117 -18
- package/dist/{chunk-UJBZS5I7.js → chunk-NYOABJNK.js} +36 -27
- package/dist/{chunk-LXAPJ3BL.js → chunk-O4IKAIZ2.js} +24 -20
- package/dist/{chunk-MMB2OHUY.js → chunk-ODMBPDDV.js} +48 -13
- package/dist/chunk-OKUB6RJA.js +533 -0
- package/dist/{chunk-MKFYQQ5Q.js → chunk-OMPENNWY.js} +4 -1
- package/dist/chunk-OPQZISG3.js +25 -0
- package/dist/{chunk-ROJMXG4E.js → chunk-OV57AHCG.js} +24 -24
- package/dist/{chunk-7KGXDIWV.js → chunk-OZJ3JLYI.js} +9 -8
- package/dist/{chunk-G5BYKJIM.js → chunk-P2VBXX7N.js} +11 -10
- package/dist/{chunk-YK6CSODO.js → chunk-PAINMSID.js} +4353 -1106
- package/dist/chunk-PKJAV25S.js +43 -0
- package/dist/{chunk-R5MNPIMD.js → chunk-PNQLCRSS.js} +4 -4
- package/dist/{chunk-3SMMFQED.js → chunk-PQH56YF6.js} +37 -5
- package/dist/chunk-PRTBPXYA.js +50 -0
- package/dist/{chunk-FF4ZMLSL.js → chunk-PRW3HXM3.js} +2 -2
- package/dist/chunk-PRZ7KMWL.js +42 -0
- package/dist/{chunk-IFV6MKYV.js → chunk-PTQ3ZALZ.js} +42 -4
- package/dist/{chunk-ELQSLAP6.js → chunk-PUEWDYGP.js} +2 -2
- package/dist/{chunk-F2ZCZYIK.js → chunk-Q26LDIUV.js} +12 -11
- package/dist/chunk-Q46QDDMF.js +277 -0
- package/dist/chunk-QBNWF5ZU.js +19 -0
- package/dist/{chunk-ANETFNTV.js → chunk-QE527XRY.js} +24 -21
- package/dist/{chunk-QNMLLYTN.js → chunk-QHJJMZLX.js} +397 -32
- package/dist/chunk-QJCJOMW3.js +425 -0
- package/dist/{chunk-3HOONZUE.js → chunk-QKMRFNMA.js} +15 -15
- package/dist/{chunk-7S6VJ643.js → chunk-QOOEYDNJ.js} +101 -13
- package/dist/{chunk-4YNKN4DF.js → chunk-QSIDVFB7.js} +20 -18
- package/dist/{chunk-2IT7SIJY.js → chunk-RA33EYS4.js} +19 -18
- package/dist/{chunk-P7NV3FEJ.js → chunk-RALY3E5U.js} +4 -4
- package/dist/{chunk-6NESNLVU.js → chunk-S2RY3BOD.js} +35 -21
- package/dist/chunk-SB5GRUFM.js +54 -0
- package/dist/{chunk-EUQHM2CH.js → chunk-SH27FYPF.js} +18 -18
- package/dist/chunk-T74WQQGS.js +40 -0
- package/dist/{chunk-LGDW4G73.js → chunk-TGVVUKTG.js} +2 -2
- package/dist/chunk-THN26IEF.js +48 -0
- package/dist/{chunk-ZV2VCBMQ.js → chunk-TJH2EUAZ.js} +18 -12
- package/dist/{chunk-NGT5LLSE.js → chunk-TQ4TG57V.js} +6 -6
- package/dist/{chunk-WEDXFJPG.js → chunk-TQTRWENN.js} +12 -12
- package/dist/{chunk-ZRWS54RI.js → chunk-TSM6T6GQ.js} +23 -23
- package/dist/{chunk-KET7KOVE.js → chunk-TW3KOSQK.js} +15 -7
- package/dist/{chunk-RBXDHCN7.js → chunk-TWQRPM76.js} +2 -2
- package/dist/{chunk-IO6DQCZX.js → chunk-TYD6I4CZ.js} +4 -4
- package/dist/{chunk-5NLJH6R4.js → chunk-U3NBK4EU.js} +56 -17
- package/dist/{chunk-U542BJME.js → chunk-UDXWIPCB.js} +7 -7
- package/dist/{chunk-OSB6AKF2.js → chunk-UEVZZZU2.js} +4 -4
- package/dist/{chunk-5ZV7BK22.js → chunk-UF4UHCIG.js} +2 -2
- package/dist/{chunk-PHJOOL6U.js → chunk-UFE36WJH.js} +4 -4
- package/dist/{chunk-IHRP4OYV.js → chunk-URIKUID7.js} +12 -12
- package/dist/chunk-UYLBRRFK.js +1106 -0
- package/dist/chunk-UZACEG2C.js +515 -0
- package/dist/{chunk-LR4XBH4L.js → chunk-VAMHOHUU.js} +12 -12
- package/dist/{chunk-S5PSGAQ2.js → chunk-VUVGX5L2.js} +1 -1
- package/dist/{chunk-2TG2QGKW.js → chunk-VYOCPTUB.js} +18 -16
- package/dist/{chunk-VTEDQ6GY.js → chunk-WAZEXEJH.js} +175 -3
- package/dist/{chunk-UTSFKZ72.js → chunk-WCEF7H6L.js} +3 -3
- package/dist/{chunk-DXPUYG5L.js → chunk-WEOMJHPV.js} +12 -12
- package/dist/{chunk-NFKBU2UH.js → chunk-WFU77T3A.js} +5 -5
- package/dist/chunk-WIWTJMMR.js +292 -0
- package/dist/{chunk-MRFSUAJH.js → chunk-WNTIOBOG.js} +18 -18
- package/dist/{chunk-UROTYIGJ.js → chunk-X2CUXTWU.js} +6 -6
- package/dist/chunk-X7EMBM5X.js +34 -0
- package/dist/{chunk-OO5TKEAG.js → chunk-XEQCQO66.js} +8 -8
- package/dist/{chunk-NBQO75XT.js → chunk-XG4WJHLQ.js} +17 -1
- package/dist/{chunk-ZQC7MNQB.js → chunk-XOL3GFW2.js} +101 -30
- package/dist/{chunk-GXDATVSY.js → chunk-XQ3YZ4QW.js} +22 -22
- package/dist/{chunk-GTW54D3D.js → chunk-Y6K3CJBU.js} +726 -88
- package/dist/{chunk-CQCAJI6G.js → chunk-YAH5IQAL.js} +5 -5
- package/dist/{chunk-U6TD7UOH.js → chunk-YBOVNMHC.js} +51 -14
- package/dist/{chunk-OJICVOZH.js → chunk-YF5DZCPN.js} +79 -39
- package/dist/chunk-YIGBJNH4.js +37 -0
- package/dist/{chunk-7C7OZARH.js → chunk-YJ3TBOTK.js} +25 -25
- package/dist/{chunk-HXFSM4LG.js → chunk-YKTE2RU3.js} +2 -2
- package/dist/{chunk-7IM4BVVH.js → chunk-YO2PKTXT.js} +268 -36
- package/dist/{chunk-Z3UU7XV6.js → chunk-YTTNTQOX.js} +15 -15
- package/dist/{chunk-2ZICHO3V.js → chunk-YWAKDNMH.js} +183 -33
- package/dist/{chunk-OXOSJXOI.js → chunk-YZDZOEV4.js} +4 -4
- package/dist/{chunk-MRCETHW5.js → chunk-Z3QFH7YG.js} +4 -4
- package/dist/{chunk-5KZTRD4V.js → chunk-Z6VLC5X4.js} +17 -17
- package/dist/{chunk-EDURU5DF.js → chunk-ZFQMMU5Y.js} +2 -2
- package/dist/{chunk-3GLDB4IT.js → chunk-ZKYRDV7A.js} +12 -12
- package/dist/{chunk-GBGJ6WSO.js → chunk-ZLS6PU2O.js} +3 -3
- package/dist/{chunk-JZOOX3PQ.js → chunk-ZOSD4FXV.js} +3 -3
- package/dist/chunk-ZPDDEVQX.js +47 -0
- package/dist/{chunk-2TTSX7NB.js → chunk-ZQLRCA2V.js} +7 -7
- package/dist/{chunk-ESP3RUUR.js → chunk-ZX7235KR.js} +128 -54
- package/dist/{chunk-MH4XG5XS.js → chunk-ZZFHLRQW.js} +18 -16
- package/dist/files.json +559 -439
- package/dist/packages/sdk/npm/index.js +4679 -2672
- package/dist/packages/ui/dist/assets/{elk-api-BuFBvNyV.js → elk-api-CowTnhEJ.js} +2 -2
- package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
- package/dist/packages/ui/dist/assets/index-z2wv0d5d.js +47 -0
- package/dist/packages/ui/dist/index.html +2 -2
- package/package.json +3 -3
- package/dist/chunk-25TJC2CL.js +0 -48
- package/dist/chunk-3Q5RHGCA.js +0 -47
- package/dist/chunk-4W7FOGAB.js +0 -41
- package/dist/chunk-6AF3CVJT.js +0 -48
- package/dist/chunk-A3KEXFQS.js +0 -34
- package/dist/chunk-BAUINGGJ.js +0 -41
- package/dist/chunk-BOFUCRJX.js +0 -47
- package/dist/chunk-GGKGILIP.js +0 -54
- package/dist/chunk-IKN6C67W.js +0 -53
- package/dist/chunk-K7MYVIFK.js +0 -54
- package/dist/chunk-KHA5LVPE.js +0 -34
- package/dist/chunk-LSXGM6MB.js +0 -37
- package/dist/chunk-M54TDRM3.js +0 -29
- package/dist/chunk-M5GF4NAB.js +0 -45
- package/dist/chunk-UTZGBCXE.js +0 -38
- package/dist/chunk-UVTSMBM4.js +0 -43
- package/dist/chunk-XXE3S3OG.js +0 -44
- package/dist/chunk-YJRQCUVJ.js +0 -43
- package/dist/chunk-ZFTK4BDN.js +0 -41
- package/dist/chunk-ZMARAW37.js +0 -38
- package/dist/packages/ui/dist/assets/index-C5QnK82A.css +0 -1
- 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-
|
|
31
|
+
} from "./chunk-PAINMSID.js";
|
|
32
32
|
import {
|
|
33
33
|
writeFileAtomic
|
|
34
|
-
} from "./chunk-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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) =>
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
}
|
|
2775
|
-
|
|
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,
|