@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.
- package/dist/bin.js +12 -7
- package/dist/{chunk-LYBNHMVZ.js → chunk-27AJAKX7.js} +3 -3
- package/dist/{chunk-KXITGYLF.js → chunk-2QPJ4E4Z.js} +2 -2
- package/dist/{chunk-EIPTLPFC.js → chunk-2UMSHYCB.js} +24 -24
- package/dist/{chunk-6PPOWY5E.js → chunk-2WUTCPPJ.js} +6 -6
- package/dist/{chunk-VNU26RCO.js → chunk-2YSD6E6V.js} +33 -32
- package/dist/{chunk-P32RUW3B.js → chunk-3424TLIJ.js} +39 -7
- package/dist/{chunk-2MMCFP5C.js → chunk-3ASYYMOX.js} +8 -8
- package/dist/{chunk-PKBHS4AA.js → chunk-3EWKO457.js} +48 -17
- package/dist/{chunk-J3IOLXWM.js → chunk-3EX5HCZD.js} +5 -5
- package/dist/{chunk-BDKC6H5P.js → chunk-3MYBT62N.js} +5 -5
- package/dist/{chunk-ZFL7NY4F.js → chunk-3UHV76UD.js} +69 -41
- package/dist/{chunk-Q4K5WB2W.js → chunk-3ZA3AK2D.js} +10 -10
- package/dist/{chunk-O7FDLW7L.js → chunk-4ETO2FXE.js} +5 -5
- package/dist/{chunk-AFWUDXEM.js → chunk-4FLNCK6Q.js} +26 -11
- package/dist/{chunk-745DAZ4L.js → chunk-4GAB5ZOZ.js} +901 -332
- package/dist/{chunk-3RM4UK6W.js → chunk-4MYHETJ3.js} +18 -18
- package/dist/chunk-4R3TO4VL.js +94 -0
- package/dist/chunk-5MYE42AP.js +43 -0
- package/dist/chunk-5O7U67UA.js +57 -0
- package/dist/{chunk-Y2EQNWKV.js → chunk-5OXKCH4Z.js} +31 -31
- package/dist/{chunk-O45HFTFS.js → chunk-5VTIWEWP.js} +2 -2
- package/dist/{chunk-UNAGJYET.js → chunk-63NFFAGI.js} +12 -12
- package/dist/{chunk-6ZJ5A7AF.js → chunk-66AQ2JIU.js} +9 -9
- package/dist/chunk-6JVPBGQG.js +50 -0
- package/dist/{chunk-VY72R2XZ.js → chunk-6NCPLIIP.js} +124 -2
- package/dist/{chunk-D73UEXYW.js → chunk-6NN36LVK.js} +3 -3
- package/dist/{chunk-7FTTA3HD.js → chunk-6R5VHR3N.js} +5 -5
- package/dist/{chunk-CADWLE2T.js → chunk-6RQOINER.js} +4 -4
- package/dist/{chunk-WG5U3F5V.js → chunk-6RYB3EET.js} +12 -12
- package/dist/{chunk-RXPJMEOW.js → chunk-6SNTHK43.js} +10 -10
- package/dist/{chunk-ZFFYNRIO.js → chunk-6Y4FXOMI.js} +24 -22
- package/dist/{chunk-SQV37XO2.js → chunk-6ZFF7XSL.js} +6 -6
- package/dist/{chunk-JA5FI3QV.js → chunk-6ZSYLZ7O.js} +3 -3
- package/dist/{chunk-JENSEMXF.js → chunk-73CC73I4.js} +1 -1
- package/dist/{chunk-2F4CYZKJ.js → chunk-73GFVW2L.js} +5 -5
- package/dist/{chunk-M3NANSDZ.js → chunk-73V2OONC.js} +15 -15
- package/dist/{chunk-WKUJ3KPV.js → chunk-75OMRKY2.js} +4 -4
- package/dist/{chunk-7BR7IPOH.js → chunk-7IFTSAHP.js} +8 -8
- package/dist/{chunk-OWNCM4ZN.js → chunk-7K5OH45X.js} +136 -16
- package/dist/{chunk-VCTWPLAO.js → chunk-7NQAGYK4.js} +8 -8
- package/dist/{chunk-O4GXGGBX.js → chunk-7XWJ6ED2.js} +12 -12
- package/dist/{chunk-MFR5OPBD.js → chunk-7XYLNQFO.js} +5 -5
- package/dist/{chunk-GCWRWSU7.js → chunk-7YQBDE5W.js} +4 -4
- package/dist/{chunk-QKUJMING.js → chunk-A4JXVO5O.js} +5 -5
- package/dist/{chunk-LKOR5UET.js → chunk-AFBCNZRZ.js} +24 -24
- package/dist/{chunk-BXYMYEJ4.js → chunk-AGOLEMHK.js} +13 -14
- package/dist/{chunk-AVTBS4OW.js → chunk-AHFQHPFF.js} +22 -22
- package/dist/{chunk-NY2XSR5K.js → chunk-APDN6UOR.js} +116 -18
- package/dist/chunk-AQRUQNFB.js +322 -0
- package/dist/{chunk-5NMKONLP.js → chunk-AVMWESFZ.js} +3 -2
- package/dist/chunk-B4AEL3RF.js +1011 -0
- package/dist/{chunk-H7KM7LZE.js → chunk-BAY4K55I.js} +11 -11
- package/dist/{chunk-XD75VZIH.js → chunk-BFL4PO64.js} +7 -7
- package/dist/{chunk-34S2WGOB.js → chunk-BFMTGNAQ.js} +5 -3
- package/dist/{chunk-SLXZOMA6.js → chunk-BP33TBLI.js} +4 -4
- package/dist/{chunk-IFKEI4SA.js → chunk-BUUJ7N4O.js} +11 -11
- package/dist/{chunk-EGQRREQH.js → chunk-BYBU2EIB.js} +26 -15
- package/dist/{chunk-SFUP7TTO.js → chunk-C6ORPLCN.js} +4 -4
- package/dist/{chunk-IVBOQAGB.js → chunk-CA3DKO4D.js} +24 -2
- package/dist/{chunk-57TDNMI3.js → chunk-CFUDAW3R.js} +15 -15
- package/dist/{chunk-FFTRTL6R.js → chunk-CJEBRJBS.js} +4 -4
- package/dist/{chunk-EPCJQQWD.js → chunk-CKVBDVIW.js} +4 -4
- package/dist/{chunk-FPJPLKDW.js → chunk-CMB7FXHJ.js} +38 -16
- package/dist/{chunk-INQHESFB.js → chunk-CQ7RF4QN.js} +4 -4
- package/dist/{chunk-63YRMR6J.js → chunk-CS4BMJLL.js} +5 -5
- package/dist/{chunk-BPK5P77O.js → chunk-CT6NINGR.js} +3 -3
- package/dist/chunk-CXTG6AWM.js +40 -0
- package/dist/{chunk-CXJ6FUKN.js → chunk-CZ2ZS7AT.js} +9 -4
- package/dist/{chunk-S4PMJU6H.js → chunk-D6BVLTDV.js} +85 -29
- package/dist/{chunk-M32BLWDH.js → chunk-DCRYOMTM.js} +12 -12
- package/dist/{chunk-REWWDVQB.js → chunk-DHKDH464.js} +4 -4
- package/dist/{chunk-2LGRMVCA.js → chunk-DSHRA72L.js} +10 -10
- package/dist/{chunk-THDMSZ3R.js → chunk-E3PDCQRH.js} +2765 -665
- package/dist/chunk-EHXDB3SA.js +25 -0
- package/dist/{chunk-BTGPE6CR.js → chunk-EMVZIOOD.js} +7 -7
- package/dist/{chunk-DOBQKHIF.js → chunk-ENH6Z4TY.js} +28 -27
- package/dist/{chunk-LGFL54FP.js → chunk-EVTI22PQ.js} +6 -2
- package/dist/{chunk-7MJSQTL5.js → chunk-EXJZBL5N.js} +20 -20
- package/dist/{chunk-N3XIYPU3.js → chunk-FBCVC2GJ.js} +12 -12
- package/dist/{chunk-UWOJLHFT.js → chunk-FJVUHQPS.js} +34 -23
- package/dist/{chunk-7IGKHZ4Z.js → chunk-FL344WQD.js} +218 -211
- package/dist/{chunk-IH2XURVQ.js → chunk-FMJYKLDY.js} +5 -5
- package/dist/chunk-FMR2D3AZ.js +41 -0
- package/dist/{chunk-Q2TECDIT.js → chunk-FPBUTZI5.js} +2201 -326
- package/dist/{chunk-PJSJPMJI.js → chunk-FQVSLBTV.js} +3 -3
- package/dist/{chunk-NXJ5URP6.js → chunk-FRAEQVYN.js} +23 -22
- package/dist/{chunk-RLDGWLQ7.js → chunk-FRCOKUU4.js} +7 -7
- package/dist/{chunk-DCZWQLYT.js → chunk-FSN6JFXB.js} +18 -15
- package/dist/{chunk-W7VWI2YH.js → chunk-FTLYXMHA.js} +5 -5
- package/dist/{chunk-7GJS6DNX.js → chunk-FVYZ4Y52.js} +11 -3
- package/dist/{chunk-CQDGOPGH.js → chunk-G6EFXTUO.js} +2 -2
- package/dist/{chunk-JB5LINEM.js → chunk-G7VBMOZH.js} +3 -3
- package/dist/{chunk-7ASNL4Q4.js → chunk-GM4EFHUX.js} +15 -15
- package/dist/chunk-GOZLTLRY.js +232 -0
- package/dist/chunk-GPNMSX5H.js +36 -0
- package/dist/{chunk-BQ4SQQC6.js → chunk-GUGQSIQM.js} +9 -9
- package/dist/{chunk-E3ISYXO3.js → chunk-HJQVUOUL.js} +12 -12
- package/dist/{chunk-MFHL5URL.js → chunk-HMWJWYE2.js} +16 -16
- package/dist/{chunk-YYY3AZFE.js → chunk-HMZ2DRBC.js} +2 -2
- package/dist/{chunk-C3RY6KU6.js → chunk-HRS5O7VV.js} +500 -163
- package/dist/{chunk-AJQ72EBM.js → chunk-HUGQZQ2K.js} +6 -6
- package/dist/{chunk-AJYXNTNZ.js → chunk-ICBGVVRI.js} +10 -10
- package/dist/{chunk-J2JAKCIW.js → chunk-IKAW2KJU.js} +17 -17
- package/dist/{chunk-OUBGGKDU.js → chunk-IMZFOMVX.js} +1 -1
- package/dist/{chunk-LDLL7LB3.js → chunk-ISG547IS.js} +22 -22
- package/dist/{chunk-GZY6RUZ6.js → chunk-IYNCSYU4.js} +5 -2
- package/dist/{chunk-H5HBGNXU.js → chunk-J25YOUIZ.js} +4 -4
- package/dist/chunk-J2CDBSFP.js +69 -0
- package/dist/chunk-J2H7YG3K.js +34 -0
- package/dist/{chunk-SFSPGFCV.js → chunk-J32IPTVQ.js} +20 -20
- package/dist/{chunk-BEVTIBRH.js → chunk-J4CPHJUL.js} +5 -5
- package/dist/{chunk-F3P7N7SF.js → chunk-JFFKHIM6.js} +1 -1
- package/dist/{chunk-RUGXBPWI.js → chunk-JMEWJPF2.js} +8 -8
- package/dist/{chunk-WERM6KPJ.js → chunk-JSP73CDW.js} +9 -4
- package/dist/{chunk-66PPNOON.js → chunk-JXAKYP45.js} +26 -25
- package/dist/{chunk-7JITZFJC.js → chunk-K4OXYSGS.js} +4 -4
- package/dist/{chunk-EHA7RMZ3.js → chunk-K4RNVDR4.js} +4 -4
- package/dist/{chunk-R44CYFPV.js → chunk-K757G7AD.js} +12 -12
- package/dist/{chunk-FUJM6RTF.js → chunk-KDJ2YKAZ.js} +7 -7
- package/dist/{chunk-QAXW2N3B.js → chunk-KT6Q44CA.js} +28 -30
- package/dist/{chunk-EBL2R3YG.js → chunk-KTNOBTV5.js} +4 -4
- package/dist/chunk-KVVNAUIG.js +66 -0
- package/dist/{chunk-X5F3Q5LV.js → chunk-L3RCQWVQ.js} +21 -18
- package/dist/{chunk-7IOWA5D5.js → chunk-LHH5KG5A.js} +13 -3
- package/dist/{chunk-TNR75OXT.js → chunk-LM45GMMB.js} +11 -8
- package/dist/{chunk-FSMSFDLD.js → chunk-LO6Y7OTG.js} +4 -4
- package/dist/{chunk-WF7B67YE.js → chunk-LPDTDFKA.js} +10 -10
- package/dist/{chunk-SU74NDMQ.js → chunk-LSHSDC6S.js} +17 -17
- package/dist/{chunk-LJXMYKZJ.js → chunk-LZVHP7CT.js} +5 -5
- package/dist/{chunk-3NWDLGG6.js → chunk-M3EOFSPY.js} +26 -26
- package/dist/chunk-MBYYQHPM.js +31 -0
- package/dist/{chunk-KQGURXFU.js → chunk-MEJ63LDG.js} +32 -11
- package/dist/{chunk-FZOJFH7Q.js → chunk-MH2ZK67S.js} +11 -11
- package/dist/{chunk-R7NYHMUU.js → chunk-MLGWSBF4.js} +5108 -3895
- package/dist/{chunk-WJF2CS6M.js → chunk-MNIPPBCT.js} +5 -5
- package/dist/{chunk-XERYFDB5.js → chunk-MWF4PXQR.js} +32 -31
- package/dist/{chunk-BO4KX37X.js → chunk-N2YX6JMY.js} +18 -18
- package/dist/{chunk-GUX3PTYM.js → chunk-NAPHHWW2.js} +3 -3
- package/dist/{chunk-UUU4CLJG.js → chunk-NC755EKE.js} +5 -1
- package/dist/{chunk-WMTRHUI5.js → chunk-NCLZJCXA.js} +21 -21
- package/dist/chunk-NKJDO4UC.js +39 -0
- package/dist/chunk-NOYOFYAJ.js +59 -0
- package/dist/{chunk-ZQ3ON2VQ.js → chunk-NROSSWMS.js} +5 -5
- package/dist/{chunk-UWMJKX5U.js → chunk-OBUB3H72.js} +12 -12
- package/dist/{chunk-VW62D6QE.js → chunk-OCQWSFJD.js} +7 -7
- package/dist/{chunk-UPOY4YSQ.js → chunk-OK6JGLE7.js} +12 -12
- package/dist/{chunk-TYQBFTBR.js → chunk-OPWGPQ2N.js} +5 -5
- package/dist/{chunk-PPD7HTDP.js → chunk-OSYHGGL3.js} +18 -18
- package/dist/chunk-OXXZZ7HQ.js +50 -0
- package/dist/{chunk-5BD2KYLE.js → chunk-P22EPEBR.js} +16 -16
- package/dist/chunk-P4YUT7W7.js +45 -0
- package/dist/chunk-PCCLVIDP.js +217 -0
- package/dist/{chunk-CMDXGQTS.js → chunk-PFULMC2D.js} +21 -20
- package/dist/chunk-PGAMTKBI.js +16 -0
- package/dist/{chunk-6MUGR4LS.js → chunk-PNSSE7JM.js} +93 -18
- package/dist/{chunk-HYU5VLGA.js → chunk-POEMZECG.js} +1 -1
- package/dist/{chunk-UCROWG2D.js → chunk-POSDBRKV.js} +23 -23
- package/dist/{chunk-KDNTAPLX.js → chunk-POSZFDSQ.js} +3 -3
- package/dist/{chunk-3NFFJL5D.js → chunk-PQQKZPBU.js} +1 -1
- package/dist/{chunk-4EURQWQD.js → chunk-PRMUQUWN.js} +10 -10
- package/dist/{chunk-MO6P2JZH.js → chunk-PT4USJNN.js} +7 -7
- package/dist/{chunk-BTY3HZBO.js → chunk-PWXB5GBB.js} +16 -16
- package/dist/{chunk-S7FCV7S5.js → chunk-PXW2RZGQ.js} +1 -1
- package/dist/{chunk-NDCF4R6S.js → chunk-Q367UGYN.js} +3 -3
- package/dist/{chunk-IUPG3UKI.js → chunk-QAVRDONY.js} +187 -123
- package/dist/{chunk-E6ZIEVOI.js → chunk-QBMLBCQH.js} +12 -12
- package/dist/{chunk-VZALIKIF.js → chunk-QLQIFJP3.js} +12 -12
- package/dist/{chunk-EMRIQUND.js → chunk-QLWDIKO4.js} +82 -27
- package/dist/{chunk-PMUAJGLI.js → chunk-QVVGJVVX.js} +16 -16
- package/dist/{chunk-LNBQOP7D.js → chunk-QX4MAMUG.js} +21 -21
- package/dist/{chunk-X3WY6MN3.js → chunk-QZWRPQTI.js} +6 -6
- package/dist/{chunk-ISUAAMGS.js → chunk-RCG5IAAT.js} +18 -11
- package/dist/chunk-RGZFOKVO.js +106 -0
- package/dist/{chunk-O5PXQR67.js → chunk-RLZFL76D.js} +4 -4
- package/dist/{chunk-UF4AZOZB.js → chunk-RPQITJNX.js} +5 -5
- package/dist/{chunk-NR2UJWOC.js → chunk-RQQYEDAC.js} +8 -8
- package/dist/chunk-RQSLHZ7T.js +36 -0
- package/dist/{chunk-UPS2DGFC.js → chunk-RRQUQAXP.js} +1 -1
- package/dist/chunk-RYQ4JCFT.js +65 -0
- package/dist/{chunk-JLUCKAEL.js → chunk-S35DIFJH.js} +17 -17
- package/dist/{chunk-UGUP3ZM6.js → chunk-S5GSQPIN.js} +9 -9
- package/dist/chunk-S5XFO4GY.js +42 -0
- package/dist/chunk-S6LW2RRC.js +25 -0
- package/dist/{chunk-W62H2XSO.js → chunk-S6W3D5GS.js} +23 -23
- package/dist/{chunk-CX4RZ2KS.js → chunk-S7GUZ45I.js} +3 -3
- package/dist/{chunk-L27SV425.js → chunk-SCT4CEF7.js} +20 -20
- package/dist/{chunk-VTZMAJ3W.js → chunk-SK5RVP7X.js} +8 -8
- package/dist/{chunk-JAVI7JSP.js → chunk-SRTUETF5.js} +23 -22
- package/dist/{chunk-MZCGSXVR.js → chunk-SVGGMBJI.js} +13 -13
- package/dist/{chunk-SDKLKB6I.js → chunk-SWNKO4C4.js} +32 -25
- package/dist/chunk-SYP56T2D.js +65 -0
- package/dist/{chunk-5SJZW52K.js → chunk-T33TPFGI.js} +22 -22
- package/dist/{chunk-ZJXLNDH4.js → chunk-T3FNG2H2.js} +12 -12
- package/dist/{chunk-BIGDQDHD.js → chunk-T6MAWL5P.js} +4 -4
- package/dist/{chunk-RGERPOIV.js → chunk-T6MX7WXM.js} +14 -11
- package/dist/{chunk-QFWA2DPH.js → chunk-T7IIEDA3.js} +5 -5
- package/dist/{chunk-Z5IA3WDR.js → chunk-TABH4RBZ.js} +156 -79
- package/dist/{chunk-6ZGLAACW.js → chunk-TDSCKP3V.js} +2 -2
- package/dist/{chunk-G6X77UJZ.js → chunk-TMFMXQEN.js} +21 -21
- package/dist/{chunk-P2V7QW4D.js → chunk-TNCF26JK.js} +11 -11
- package/dist/{chunk-2GF7OLF3.js → chunk-TUM52SOE.js} +19 -15
- package/dist/{chunk-PBPBMP2B.js → chunk-TV56QLLV.js} +3 -3
- package/dist/{chunk-SYV5LHML.js → chunk-TVQSXWWV.js} +33 -33
- package/dist/{chunk-VBTP56CE.js → chunk-TXNSQ24G.js} +9 -8
- package/dist/{chunk-ZX57KSEQ.js → chunk-UALE35WK.js} +3 -3
- package/dist/{chunk-42SIDKEU.js → chunk-UJF7PIMP.js} +26 -26
- package/dist/{chunk-ONUPY3H6.js → chunk-UMCDODBX.js} +24 -24
- package/dist/{chunk-JJF6HALY.js → chunk-UTPIFH4I.js} +3 -3
- package/dist/{chunk-O7XLYEFA.js → chunk-V7PEHQZU.js} +54 -22
- package/dist/{chunk-XI2LCCYQ.js → chunk-VJFXQISZ.js} +8 -8
- package/dist/{chunk-AFZ3QA6W.js → chunk-VJZI6KFP.js} +22 -22
- package/dist/{chunk-Q6DFNVRJ.js → chunk-VK7WYA64.js} +12 -12
- package/dist/{chunk-6OJQOPUN.js → chunk-VKTXFFOZ.js} +2 -2
- package/dist/{chunk-MG4ZL5RW.js → chunk-VNIN7Q6Q.js} +16 -16
- package/dist/{chunk-ZQXZ2SES.js → chunk-VRO7KSGL.js} +21 -21
- package/dist/{chunk-OHVTTOPS.js → chunk-W3AZE7LN.js} +3 -3
- package/dist/chunk-W4TNCEI4.js +44 -0
- package/dist/{chunk-X4CXA2IL.js → chunk-W5VYJWOG.js} +22 -22
- package/dist/{chunk-7DOR27HL.js → chunk-WF3RCZNO.js} +6 -6
- package/dist/{chunk-LGBMTVNT.js → chunk-WOMQQWTO.js} +5 -5
- package/dist/{chunk-2Q56PQPS.js → chunk-WXVTYLVH.js} +2 -2
- package/dist/{chunk-UOR2DTHH.js → chunk-WYGTSZHR.js} +16 -14
- package/dist/{chunk-IDKCWSM5.js → chunk-WZYM5M4U.js} +388 -104
- package/dist/{chunk-U76OWS3Q.js → chunk-X5ZHDSLU.js} +23 -23
- package/dist/chunk-X7XVMYIL.js +5 -0
- package/dist/{chunk-2IIMFOPM.js → chunk-X7ZKNSK4.js} +18 -18
- package/dist/{chunk-UF4GLFBX.js → chunk-XAPXKFIS.js} +22 -22
- package/dist/{chunk-LQJPN536.js → chunk-XF6TSZW2.js} +2 -2
- package/dist/{chunk-T6DQR5TV.js → chunk-XFDDJQT7.js} +12 -12
- package/dist/{chunk-OHNCWBKF.js → chunk-XGO74QWR.js} +4 -4
- package/dist/chunk-XLZAAAPX.js +43 -0
- package/dist/{chunk-2RLKFUUL.js → chunk-XMUWPA56.js} +23 -23
- package/dist/{chunk-JRBFANFE.js → chunk-XNFM6WUK.js} +15 -15
- package/dist/{chunk-LO6P2VYG.js → chunk-XOMEQVLK.js} +2 -2
- package/dist/{chunk-YHCMZC2J.js → chunk-Y2H7X3VI.js} +7 -7
- package/dist/{chunk-ZZK56BLP.js → chunk-Y5IE6YKD.js} +4 -4
- package/dist/{chunk-KFAVQZSX.js → chunk-YD3KTW4H.js} +12 -12
- package/dist/{chunk-LZ7NUC62.js → chunk-YDCOZOER.js} +18 -18
- package/dist/{chunk-LFGTYX5U.js → chunk-YERAAEO4.js} +17 -17
- package/dist/{chunk-BHT7QK4G.js → chunk-YHMPDIRG.js} +4 -4
- package/dist/{chunk-ZJFRMSJT.js → chunk-Z2D4P3R3.js} +12 -12
- package/dist/{chunk-O66DM6DJ.js → chunk-Z3H27OMV.js} +4 -4
- package/dist/{chunk-7UOMVMFG.js → chunk-Z3RAFU5B.js} +15 -15
- package/dist/{chunk-FFLNS6VP.js → chunk-ZENHDXRZ.js} +21 -17
- package/dist/{chunk-23XVSEV5.js → chunk-ZFHFC74B.js} +18 -18
- package/dist/{chunk-53T4O55J.js → chunk-ZJGCGKA4.js} +3 -3
- package/dist/{chunk-WXFLMQSR.js → chunk-ZLQEQR3D.js} +5 -5
- package/dist/{chunk-HNM2YQT2.js → chunk-ZNHQGG7J.js} +7 -7
- package/dist/{chunk-2Q5EDGEO.js → chunk-ZNTTW4IT.js} +5 -5
- package/dist/{chunk-ZQ7SKESZ.js → chunk-ZR6J4QFQ.js} +7 -7
- package/dist/{chunk-PAQ2AS5E.js → chunk-ZSNOILL5.js} +1 -1
- package/dist/files.json +563 -511
- package/dist/packages/sdk/npm/index.js +1043 -43
- package/dist/packages/ui/dist/assets/{elk-api-CIf-0gz5.js → elk-api-DxfAMOJq.js} +2 -2
- package/dist/packages/ui/dist/assets/index-Buit9TfP.js +62 -0
- package/dist/packages/ui/dist/assets/index-Jyc9dFeZ.css +1 -0
- package/dist/packages/ui/dist/index.html +2 -2
- package/package.json +4 -4
- package/dist/chunk-2SKB4O2E.js +0 -59
- package/dist/chunk-4U276ICE.js +0 -39
- package/dist/chunk-6H3Z5JHH.js +0 -64
- package/dist/chunk-C4R4JLHE.js +0 -40
- package/dist/chunk-CBGGOQWU.js +0 -82
- package/dist/chunk-DLOBCJL6.js +0 -48
- package/dist/chunk-GIW4ZVDB.js +0 -39
- package/dist/chunk-IP74LCOQ.js +0 -57
- package/dist/chunk-IPHHDDC6.js +0 -45
- package/dist/chunk-KJXD4PNL.js +0 -50
- package/dist/chunk-KN5BXMWN.js +0 -44
- package/dist/chunk-OMI6FPPN.js +0 -43
- package/dist/chunk-OTLDSZDV.js +0 -69
- package/dist/chunk-PSOFBQWB.js +0 -42
- package/dist/chunk-T4YPZIQN.js +0 -36
- package/dist/chunk-TUULXQRW.js +0 -420
- package/dist/chunk-WNKPRSGI.js +0 -36
- package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +0 -47
- package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +0 -1
- 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-
|
|
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-
|
|
22
|
+
} from "./chunk-WZYM5M4U.js";
|
|
23
23
|
import {
|
|
24
24
|
baseClonePath,
|
|
25
25
|
gitUser,
|
|
26
26
|
loadRepos
|
|
27
|
-
} from "./chunk-
|
|
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-
|
|
54
|
+
} from "./chunk-FPBUTZI5.js";
|
|
52
55
|
import {
|
|
53
56
|
FileChangedError,
|
|
54
|
-
SCHEMA_VERSION
|
|
55
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
|
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:
|
|
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
|
|
437
|
+
const changes2 = (await changeStore(root).list()).filter((c) => !state || c.state === state);
|
|
484
438
|
const body = [];
|
|
485
|
-
const
|
|
486
|
-
|
|
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(
|
|
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
|
|
694
|
-
cli: "
|
|
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 }, (
|
|
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
|
-
|
|
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(
|
|
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({
|
|
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
|
};
|