agentic-qe 3.15.11 → 3.15.13
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/.claude/hooks/aqe-hook.cjs +38 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +267 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-KCQDVYY2.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-6RRQWMNE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-AOH6TV7W.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-2P54SF5N.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +2 -0
- package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-NSVFCAF5.js} +2 -2
- package/dist/cli/chunks/{arena-36DTATJV.js → arena-X6MOGQHA.js} +4 -4
- package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-27DJLQNM.js} +3 -3
- package/dist/cli/chunks/base-WCACU3FN.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BU5GXILS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-GTQNHHZS.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-5CLULOCU.js} +2 -2
- package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-R4DMU3LN.js} +2 -2
- package/dist/cli/chunks/browser-workflow-G6IASEAP.js +2 -0
- package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-2G7TVT6W.js} +2 -2
- package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-32ZMWEP3.js} +2 -2
- package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-3AN5TNGD.js} +3 -3
- package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-3LJ7LQMV.js} +1 -1
- package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-3QZEGE67.js} +1 -1
- package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-3RZV5DGO.js} +2 -2
- package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-3Y2ROSCL.js} +2 -2
- package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-3Y7TJFHU.js} +2 -2
- package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-3YNLWPBF.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-42J34YG4.js} +2 -2
- package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-4OVC4RIL.js} +1 -1
- package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-526QYFJU.js} +2 -2
- package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-5FKWCZNF.js} +2 -2
- package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-5K26BEYB.js} +2 -2
- package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-5MDERQH3.js} +1 -1
- package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-5VMAV6T6.js} +1 -1
- package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5ZGM3RMH.js} +1 -1
- package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-6KATY3KS.js} +2 -2
- package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-6Z7PRBSG.js} +2 -2
- package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-72ASBE35.js} +7 -7
- package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-756CGMEH.js} +1 -1
- package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-75RDHBAX.js} +3 -3
- package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-7CMTY45A.js} +2 -2
- package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-7JUC2MVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-7NA7JXNB.js} +2 -2
- package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-7PLIEBY7.js} +2 -2
- package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-7YTGHGK4.js} +2 -2
- package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-A64JFBWI.js} +2 -2
- package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-AL6FBH3E.js} +2 -2
- package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-AQSVJNEH.js} +2 -2
- package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-ARJW4I2O.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-ASQYASNV.js} +1 -1
- package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-BEGR4D6N.js} +2 -2
- package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-BK577VL7.js} +2 -2
- package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-BLSLEVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-BTVEYBW2.js} +2 -2
- package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-C6JTLKG7.js} +5 -5
- package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-C7JM7CD3.js} +2 -2
- package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-CCMKSHAT.js} +2 -2
- package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-CE7B5LU7.js} +1 -1
- package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-CM4LSLKR.js} +2 -2
- package/dist/cli/chunks/chunk-CRWPZT74.js +62 -0
- package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-CT6SAVXQ.js} +2 -2
- package/dist/cli/chunks/chunk-CV77DMDQ.js +2 -0
- package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-DFUASIKA.js} +2 -2
- package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-DLD7RUZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-DNDL7SOS.js} +2 -2
- package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-DVGRPK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-E56B6IDX.js} +2 -2
- package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-E7CLYGS7.js} +1 -1
- package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-EXGMJFAT.js} +1 -1
- package/dist/cli/chunks/chunk-F3YS57NF.js +21 -0
- package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-FZ76G4QJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-G2Q66Z23.js} +2 -2
- package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-G6WDYBLQ.js} +1 -1
- package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-G77ERMUD.js} +1 -1
- package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-GB6HBNH2.js} +2 -2
- package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-GHM6MQNK.js} +2 -2
- package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-GHY6Z6KO.js} +5 -5
- package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-GII6UM3F.js} +1 -1
- package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-GU5HNCWI.js} +1 -1
- package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-H4GG2NLO.js} +2 -2
- package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-H4H2YSFH.js} +1 -1
- package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-HD7YIFOI.js} +2 -2
- package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-HOAJUIBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-HQZGPJYG.js} +2 -2
- package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-HZ5NXFXH.js} +2 -2
- package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-I3C7JOXC.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-IC3TQEOA.js} +1 -1
- package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-IJUHSJ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-J2ZIFFM6.js} +2 -2
- package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-JGZ722G3.js} +2 -2
- package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-JQGMW45H.js} +1 -1
- package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-JRRXCODW.js} +2 -2
- package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-K3TLLJMX.js} +1 -1
- package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-K4CZA77U.js} +2 -2
- package/dist/cli/chunks/chunk-K65CGKLD.js +8 -0
- package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-KADFXPPN.js} +2 -2
- package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-KB56CPU4.js} +2 -2
- package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-KCW47QR5.js} +1 -1
- package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-KDNJ4F3P.js} +2 -2
- package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-KDVZND5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-KUAKV3IW.js} +1 -1
- package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-KV4T4MXK.js} +2 -2
- package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-KWYH3FI4.js} +1 -1
- package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-LFJALJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-LL7LDPXS.js} +1 -1
- package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-LUZNKJE6.js} +3 -3
- package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-LWR3FV3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-LZYQHVD4.js} +2 -2
- package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-M6AAGIG7.js} +1 -1
- package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-MAMQA43L.js} +1 -1
- package/dist/cli/chunks/chunk-MB46UBGY.js +3 -0
- package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-MFW5HSG4.js} +2 -2
- package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-MGZ5FJUW.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-MVVB7C2E.js} +410 -410
- package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-N4CYAKOX.js} +2 -2
- package/dist/cli/chunks/chunk-NT4DBXSX.js +2 -0
- package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-NU3W5WFT.js} +2 -2
- package/dist/cli/chunks/chunk-NURIILUB.js +2 -0
- package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-NW7IBHJA.js} +4 -4
- package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-NZ3GUMB2.js} +2 -2
- package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-NZD4DPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-O6FGXMHD.js} +1 -1
- package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-OCAEXYFA.js} +2 -2
- package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-OFACHK5O.js} +2 -2
- package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-P7A4NKTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-PB6J6HAA.js} +2 -2
- package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-PHP5UBT4.js} +2 -2
- package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-PIDQVU3L.js} +2 -2
- package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-PSFSPGUD.js} +2 -2
- package/dist/cli/chunks/chunk-PT4FMJPQ.js +3 -0
- package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-Q3UDLV5Z.js} +1 -1
- package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-QDEJ4CI2.js} +2 -2
- package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-QPNG5ZN2.js} +2 -2
- package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-R7SYRCRP.js} +1 -1
- package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-RF7HWBHN.js} +2 -2
- package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-RFNW2LGD.js} +2 -2
- package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-S5AZCIZS.js} +2 -2
- package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-SE4VNN4I.js} +3 -3
- package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-SG3NX7QE.js} +2 -2
- package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-SSU73QAX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-SVLQRAMF.js} +1 -1
- package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-SYV2V3PL.js} +4 -4
- package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-T3PGQFDI.js} +2 -2
- package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-TCBBNUBP.js} +17 -17
- package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-TOQWL2ZF.js} +2 -2
- package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-TSQC2KKZ.js} +4 -4
- package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-TWDW32W2.js} +2 -2
- package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-TWJTK4CC.js} +2 -2
- package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-U2FUXDDJ.js} +3 -3
- package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-UDQSYWVF.js} +1 -1
- package/dist/cli/chunks/chunk-UOC3O6RP.js +5 -0
- package/dist/cli/chunks/chunk-UT2VZ33P.js +2 -0
- package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-UTRV7T2N.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-UXZSUMEA.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-VRHRBAEM.js} +1 -1
- package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-VRVMIPTM.js} +2 -2
- package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-VTDFVFST.js} +2 -2
- package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-VTOBUZL6.js} +2 -2
- package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-VU5TBX2V.js} +2 -2
- package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-W26B7ERY.js} +1 -1
- package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-W2QWSQVE.js} +2 -2
- package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-W3INMZZ6.js} +1 -1
- package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-W3PPFHI5.js} +59 -59
- package/dist/cli/chunks/chunk-WKGTGOYS.js +13 -0
- package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-WNQS4WTS.js} +2 -2
- package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-WO274FRI.js} +2 -2
- package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-WOCGL4QP.js} +2 -2
- package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-WQL7WCIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-X2Z7F4EU.js} +2 -2
- package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-X7N2JF2X.js} +2 -2
- package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-XEAEYC6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-XNBOGCF3.js} +2 -2
- package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-XPRVF4YE.js} +2 -2
- package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-YBQH2VOP.js} +2 -2
- package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-YQFLQE53.js} +2 -2
- package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-YSZ5OE3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-YXRASAPI.js} +2 -2
- package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-YZEXYO4W.js} +1 -1
- package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-YZWBNBTW.js} +2 -2
- package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-ZAKQLAHT.js} +1 -1
- package/dist/cli/chunks/ci-ENOASTYB.js +81 -0
- package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-B26OXHQM.js} +2 -2
- package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-JTCLLNOQ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-23JMFNM5.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-ON6L462G.js} +2 -2
- package/dist/cli/chunks/client-TV3V2YZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-OWQ4D2FQ.js} +2 -2
- package/dist/cli/chunks/{code-LV2HAGJY.js → code-2ZRL7SEU.js} +19 -18
- package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-JXSQVM67.js} +2 -2
- package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-7LXZYBSQ.js} +2 -2
- package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-C2LR623C.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-TGQLHCYJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-RUGD24D2.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-ZLFVLEJP.js} +2 -2
- package/dist/cli/chunks/core-handlers-PZT4OLWR.js +2 -0
- package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-RT4QL745.js} +2 -2
- package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-NV3C4IMM.js} +11 -10
- package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +2 -0
- package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-LJKLNFF6.js} +2 -2
- package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-BMDXCQT5.js} +3 -3
- package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-FBH3IRYN.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-JGDED55I.js} +2 -2
- package/dist/cli/chunks/{detect-TYR7HT23.js → detect-SZIHIVCJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-FV3KWXQ6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-GI5JWQOV.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-BUWY36TL.js} +2 -2
- package/dist/cli/chunks/domain-transfer-GCY7W5DA.js +2 -0
- package/dist/cli/chunks/dream-TRFBGDSQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-GPRR3ZGD.js} +2 -2
- package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-XPB3IGAP.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-2E554UB3.js} +3 -3
- package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-ZSMWZPUC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-GIWVDVVC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-N7EOGE5P.js} +2 -2
- package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +2 -0
- package/dist/cli/chunks/fleet-HCHDOUCX.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-CZNCNXXZ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-6YUIF2YQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +2 -0
- package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-J3M3IK24.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-ULGTGDZW.js} +2 -2
- package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-C4BUGYUQ.js} +28 -28
- package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-WINGVMPG.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-GADMWKAU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +2 -0
- package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-K2T4QWAO.js} +2 -2
- package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-PCZTDZYI.js} +6 -6
- package/dist/cli/chunks/init-wizard-TZDJQK3U.js +2 -0
- package/dist/cli/chunks/kernel-Y6RRIOKW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-XENXNEIU.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-3PG2TJ67.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +2 -0
- package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-6KDH7FK4.js} +3 -3
- package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-RKVDEWU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +2 -0
- package/dist/cli/chunks/{load-YATHI72E.js → load-ITHC564X.js} +2 -2
- package/dist/cli/chunks/load-test-RUF7DZA5.js +2 -0
- package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-TCL5UW3N.js} +2 -2
- package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-BKDAY2N2.js} +5 -5
- package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +2 -0
- package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-WN4FXFOA.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-VHAT7ZPF.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-E3VM3EEY.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-BMQ6X762.js} +58 -20
- package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-GOOR2BV5.js} +2 -2
- package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-5NSFQQIX.js} +2 -2
- package/dist/cli/chunks/{platform-5WONJSUX.js → platform-SQM34J5G.js} +2 -2
- package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-UQJZRMZG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-WMDJOL4S.js} +2 -2
- package/dist/cli/chunks/project-root-IO5KRNGL.js +2 -0
- package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +2 -0
- package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-OBDCVY6X.js} +2 -2
- package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-XDC7I4XT.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +2 -0
- package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-L4GQ6WX4.js} +2 -2
- package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-MJG66LKN.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +2 -0
- package/dist/cli/chunks/real-embeddings-HW4G2LWL.js +2 -0
- package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-FC7JOJ2C.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-KWS4CEIC.js} +2 -2
- package/dist/cli/chunks/router-YUO3I7RU.js +2 -0
- package/dist/cli/chunks/routing-feedback-36SLQGJE.js +2 -0
- package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-QF4WVB2S.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-2MTCOUK6.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-BREJCXWN.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-KKC6HOJD.js} +2 -2
- package/dist/cli/chunks/safe-db-4RRIGRXD.js +2 -0
- package/dist/cli/chunks/schedule-25RTO4DQ.js +2 -0
- package/dist/cli/chunks/scheduler-BPIOJZ5P.js +2 -0
- package/dist/cli/chunks/{security-CUEA3UIM.js → security-OSAE7VAP.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-COUOS665.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-YXMPZKQE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-E6JBMOIL.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-AFTCIYIX.js} +2 -2
- package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-2FROCEI4.js} +2 -2
- package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-VAYTOWDC.js} +2 -2
- package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-YIQYOFGW.js} +2 -2
- package/dist/cli/chunks/task-handler-KVQHDEX3.js +62 -0
- package/dist/cli/chunks/task-handlers-MVVECQA6.js +9 -0
- package/dist/cli/chunks/{test-D2XDJNDX.js → test-5JSVTOMY.js} +4 -4
- package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +2 -0
- package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-HBOHVLI3.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-5VEPTPFA.js} +2 -2
- package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-TBJHDLY6.js} +2 -2
- package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-VAWYMHMZ.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +2 -0
- package/dist/cli/chunks/{types-5YEMGPSQ.js → types-R5SDZU2E.js} +2 -2
- package/dist/cli/chunks/unified-memory-TLGSSLMI.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +2 -0
- package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +2 -0
- package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-K5PIHXRB.js} +2 -2
- package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-RPTS7RYJ.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-B2ZL556X.js} +2 -2
- package/dist/cli/chunks/visual-security-6Q44XNLB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-K4DUJC32.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-OK2AJN35.js} +2 -2
- package/dist/cli/chunks/witness-chain-KDOMXDQX.js +2 -0
- package/dist/cli/chunks/witness-chain-N3OY2RMH.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-L6Y5RFXR.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-N4CW7FZX.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-TDNPS3WD.js} +2 -2
- package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-XRZA3YCY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +2 -0
- package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-5JIFWKN6.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet-run.d.ts +12 -0
- package/dist/cli/commands/fleet-run.js +175 -0
- package/dist/cli/commands/fleet.js +2 -117
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +26 -0
- package/dist/cli/utils/coverage-verdict.d.ts +11 -2
- package/dist/cli/utils/coverage-verdict.js +26 -6
- package/dist/cli/utils/fleet-operation.d.ts +10 -2
- package/dist/cli/utils/fleet-operation.js +20 -3
- package/dist/cli/utils/fleet-result.d.ts +20 -4
- package/dist/cli/utils/fleet-result.js +32 -21
- package/dist/cli/utils/fleet-shard.d.ts +36 -0
- package/dist/cli/utils/fleet-shard.js +110 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
- package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
- package/dist/coordination/handlers/coverage-collection.js +2 -1
- package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
- package/dist/coordination/handlers/coverage-evidence.js +159 -0
- package/dist/coordination/handlers/coverage-handlers.js +16 -3
- package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
- package/dist/coordination/handlers/coverage-scope.js +321 -0
- package/dist/coordination/handlers/coverage-target.d.ts +9 -0
- package/dist/coordination/handlers/coverage-target.js +15 -5
- package/dist/coordination/handlers/handler-types.d.ts +2 -2
- package/dist/coordination/handlers/handler-utils.d.ts +11 -0
- package/dist/coordination/handlers/handler-utils.js +22 -8
- package/dist/coordination/handlers/misc-handlers.js +5 -2
- package/dist/coordination/handlers/quality-handlers.js +2 -2
- package/dist/coordination/handlers/security-handlers.js +12 -2
- package/dist/coordination/protocols/security-audit.js +11 -1
- package/dist/coordination/task-executor.js +7 -2
- package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
- package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
- package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
- package/dist/domains/code-intelligence/coordinator.js +24 -27
- package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +51 -5
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +144 -78
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +10 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +29 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +11 -3
- package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
- package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
- package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
- package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
- package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
- package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
- package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
- package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
- package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
- package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
- package/dist/domains/quality-assessment/coordinator.js +10 -4
- package/dist/domains/quality-assessment/interfaces.d.ts +2 -0
- package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
- package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
- package/dist/domains/security-compliance/index.d.ts +1 -1
- package/dist/domains/security-compliance/interfaces.d.ts +46 -5
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
- package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
- package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
- package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
- package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
- package/dist/domains/security-compliance/services/scanners/index.js +1 -1
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
- package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
- package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
- package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
- package/dist/domains/security-compliance/services/security-auditor.js +106 -65
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +33 -27
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
- package/dist/domains/test-execution/services/test-executor.js +16 -4
- package/dist/domains/visual-accessibility/coordinator.js +34 -9
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
- package/dist/domains/visual-accessibility/plugin.js +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
- package/dist/init/phases/10-workers.js +42 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +23 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +50 -15
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +7 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +8 -0
- package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
- package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
- package/dist/learning/embedder-endpoint-client.d.ts +8 -0
- package/dist/learning/embedder-endpoint-client.js +20 -0
- package/dist/learning/embedder-recovery.d.ts +63 -0
- package/dist/learning/embedder-recovery.js +94 -0
- package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
- package/dist/learning/qe-reasoning-bank.d.ts +21 -0
- package/dist/learning/qe-reasoning-bank.js +54 -8
- package/dist/learning/real-embeddings.d.ts +23 -0
- package/dist/learning/real-embeddings.js +69 -2
- package/dist/learning/real-qe-reasoning-bank.d.ts +24 -4
- package/dist/learning/real-qe-reasoning-bank.js +58 -20
- package/dist/logging/redaction.js +142 -12
- package/dist/mcp/bundle.js +509 -497
- package/dist/mcp/daemon-mode.d.ts +126 -0
- package/dist/mcp/daemon-mode.js +257 -0
- package/dist/mcp/entry.d.ts +4 -0
- package/dist/mcp/entry.js +50 -2
- package/dist/mcp/handlers/domain-handler-configs.d.ts +8 -0
- package/dist/mcp/handlers/domain-handler-configs.js +14 -2
- package/dist/mcp/handlers/handler-factory.js +3 -0
- package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
- package/dist/mcp/handlers/model-route-handlers.js +139 -0
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +94 -3
- package/dist/mcp/handlers/task-handlers.d.ts +3 -242
- package/dist/mcp/handlers/task-handlers.js +11 -788
- package/dist/mcp/handlers/task-inference.d.ts +26 -0
- package/dist/mcp/handlers/task-inference.js +156 -0
- package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
- package/dist/mcp/handlers/task-learning-handlers.js +230 -0
- package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
- package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
- package/dist/mcp/protocol-server.js +15 -2
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +9 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
- package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
- package/dist/mcp/tools/coverage-analysis/index.js +8 -2
- package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
- package/dist/mcp/tools/visual-accessibility/index.js +29 -13
- package/dist/mcp/types.d.ts +14 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/events/domain-events.d.ts +2 -0
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/metrics/code-metrics.js +21 -3
- package/dist/shared/parsers/typescript-parser.d.ts +6 -0
- package/dist/shared/parsers/typescript-parser.js +13 -1
- package/dist/shared/types/index.js +3 -1
- package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
- package/package.json +3 -3
- package/dist/cli/chunks/adapter-V4GSGOOK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +0 -2
- package/dist/cli/chunks/base-AK7BXBX2.js +0 -2
- package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +0 -2
- package/dist/cli/chunks/chunk-2DTX7YAZ.js +0 -6
- package/dist/cli/chunks/chunk-72ZBJD2E.js +0 -3
- package/dist/cli/chunks/chunk-EBPJY4DI.js +0 -3
- package/dist/cli/chunks/chunk-H43AFUKL.js +0 -2
- package/dist/cli/chunks/chunk-HJ3XNTTJ.js +0 -2
- package/dist/cli/chunks/chunk-IO5537OM.js +0 -2
- package/dist/cli/chunks/chunk-IW6WDGHM.js +0 -2
- package/dist/cli/chunks/chunk-K2HBNYAZ.js +0 -62
- package/dist/cli/chunks/chunk-LRL56ZYL.js +0 -21
- package/dist/cli/chunks/chunk-VLD7Z2ED.js +0 -13
- package/dist/cli/chunks/chunk-VO3DRK4P.js +0 -3
- package/dist/cli/chunks/ci-6GUFAZMJ.js +0 -81
- package/dist/cli/chunks/client-HL2COSFM.js +0 -2
- package/dist/cli/chunks/core-handlers-IX7ATLM6.js +0 -2
- package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +0 -2
- package/dist/cli/chunks/domain-transfer-DOBI67K6.js +0 -2
- package/dist/cli/chunks/dream-T6EP7B3F.js +0 -2
- package/dist/cli/chunks/file-discovery-JYMVTDMU.js +0 -2
- package/dist/cli/chunks/fleet-FVAUMKUT.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +0 -2
- package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +0 -2
- package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +0 -2
- package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +0 -2
- package/dist/cli/chunks/init-wizard-FUC7KDVX.js +0 -2
- package/dist/cli/chunks/kernel-ZCPMCVMW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +0 -2
- package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +0 -2
- package/dist/cli/chunks/load-test-ZHQ2MUGO.js +0 -2
- package/dist/cli/chunks/memory-backend-AAMQG6WH.js +0 -2
- package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +0 -2
- package/dist/cli/chunks/project-root-7QL4KP5C.js +0 -2
- package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +0 -2
- package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +0 -2
- package/dist/cli/chunks/real-embeddings-RQRVOKVM.js +0 -2
- package/dist/cli/chunks/router-LQB5SWAF.js +0 -2
- package/dist/cli/chunks/routing-feedback-OEEXA55N.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +0 -2
- package/dist/cli/chunks/safe-db-PE6G3L55.js +0 -2
- package/dist/cli/chunks/schedule-OLKQ6QYW.js +0 -2
- package/dist/cli/chunks/scheduler-LSGBDFAT.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +0 -2
- package/dist/cli/chunks/task-handler-TFKVUTNF.js +0 -60
- package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +0 -9
- package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +0 -2
- package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +0 -2
- package/dist/cli/chunks/unified-persistence-UCV7YETW.js +0 -2
- package/dist/cli/chunks/visual-security-ZLXRIQZV.js +0 -2
- package/dist/cli/chunks/witness-chain-CVIWYTD2.js +0 -2
- package/dist/cli/chunks/witness-chain-VBKORKOX.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +0 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP server daemon mode (#1158)
|
|
3
|
+
*
|
|
4
|
+
* The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
|
|
5
|
+
* a detached background process with no stdin (`stdio: 'ignore'`), only to
|
|
6
|
+
* host the worker daemon. The #513 guard treats stdin EOF as "the client is
|
|
7
|
+
* gone" and shuts the server down, so that daemon used to exit within
|
|
8
|
+
* seconds of starting.
|
|
9
|
+
*
|
|
10
|
+
* `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
|
|
11
|
+
* EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
|
|
12
|
+
* the process alive (worker timers are unref'd, also #513). The server then
|
|
13
|
+
* stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
|
|
14
|
+
* `shutdown` method, or a crash.
|
|
15
|
+
*
|
|
16
|
+
* Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
|
|
17
|
+
* MCP client always talks to the server over a pipe/socket, so an
|
|
18
|
+
* `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
|
|
19
|
+
* server into an orphan that outlives the client: the #513 guard stays on and
|
|
20
|
+
* a warning is logged. The variable is also removed from `process.env` once
|
|
21
|
+
* read, so processes the server spawns do not inherit it.
|
|
22
|
+
*
|
|
23
|
+
* Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
|
|
24
|
+
* opened with O_APPEND by start-daemon.cjs), so renaming the file would not
|
|
25
|
+
* stop the writes. Instead, on each heartbeat the server copies an oversized
|
|
26
|
+
* daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
|
|
27
|
+
* the next write lands at the new end of the file. start-daemon.cjs rotates an
|
|
28
|
+
* oversized log at start-up the same way (a rename, as nothing writes it then).
|
|
29
|
+
*/
|
|
30
|
+
export declare const DAEMON_MODE_ENV = "AQE_MCP_DAEMON";
|
|
31
|
+
/** Default interval of the daemon heartbeat line in daemon.log. */
|
|
32
|
+
export declare const DEFAULT_DAEMON_HEARTBEAT_MS = 60000;
|
|
33
|
+
/** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
|
|
34
|
+
export declare const DAEMON_HEARTBEAT_ENV = "AQE_DAEMON_HEARTBEAT_SECONDS";
|
|
35
|
+
/** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
|
|
36
|
+
export declare const DAEMON_LOG_MAX_SIZE_ENV = "AQE_DAEMON_LOG_MAX_SIZE";
|
|
37
|
+
export declare const DEFAULT_DAEMON_LOG_MAX_BYTES: number;
|
|
38
|
+
/**
|
|
39
|
+
* Absolute path of daemon.log, set by start-daemon.cjs for the server it
|
|
40
|
+
* starts. Internal: the server rotates the log only when this file is the one
|
|
41
|
+
* its stdout/stderr write to.
|
|
42
|
+
*/
|
|
43
|
+
export declare const DAEMON_LOG_PATH_ENV = "AQE_MCP_DAEMON_LOG";
|
|
44
|
+
export interface ParsedSetting {
|
|
45
|
+
value: number;
|
|
46
|
+
/** Set when the raw value was rejected and the default applies. */
|
|
47
|
+
warning?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
|
|
51
|
+
* (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
|
|
52
|
+
* Unset, empty or invalid values fall back to the 5 MB default.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseDaemonLogMaxBytes(raw: string | undefined): ParsedSetting;
|
|
55
|
+
/** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
|
|
56
|
+
export declare function parseDaemonHeartbeatMs(raw: string | undefined): ParsedSetting;
|
|
57
|
+
/** What `fd 0` is connected to, as far as the guard cares. */
|
|
58
|
+
export type StdinKind = 'tty' | 'pipe' | 'other';
|
|
59
|
+
/** How the server's lifecycle reacts to stdin. */
|
|
60
|
+
export type StdinGuardMode =
|
|
61
|
+
/** Normal stdio client: stdin EOF/close shuts the server down (#513). */
|
|
62
|
+
'stdio'
|
|
63
|
+
/** Interactive terminal: no guard, so Ctrl-D does not kill a debug session. */
|
|
64
|
+
| 'tty'
|
|
65
|
+
/** `AQE_MCP_DAEMON` with a non-pipe stdin: stdin is ignored (#1158). */
|
|
66
|
+
| 'daemon';
|
|
67
|
+
export interface StdinGuardDecision {
|
|
68
|
+
mode: StdinGuardMode;
|
|
69
|
+
/** Set when daemon mode was requested but refused. */
|
|
70
|
+
warning?: string;
|
|
71
|
+
}
|
|
72
|
+
/** Whether the environment asks for daemon mode. */
|
|
73
|
+
export declare function isDaemonModeRequested(env: Readonly<Record<string, string | undefined>>): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Classify the process's stdin. A FIFO or socket means a client is (or was)
|
|
76
|
+
* connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
|
|
77
|
+
*/
|
|
78
|
+
export declare function detectStdinKind(stdin?: {
|
|
79
|
+
isTTY?: boolean;
|
|
80
|
+
}, fd?: number): StdinKind;
|
|
81
|
+
/** Decide how the server should treat stdin EOF. Pure: no side effects. */
|
|
82
|
+
export declare function resolveStdinGuardMode(env: Readonly<Record<string, string | undefined>>, stdinKind: StdinKind): StdinGuardDecision;
|
|
83
|
+
export interface DaemonHeartbeatStatus {
|
|
84
|
+
totalWorkers: number;
|
|
85
|
+
errorWorkers: number;
|
|
86
|
+
/** Worker runs since the daemon started, all workers together. */
|
|
87
|
+
totalExecutions: number;
|
|
88
|
+
failedExecutions: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Keep a daemon-mode server alive and log one heartbeat line per interval.
|
|
92
|
+
* The timer is deliberately ref'd: nothing else holds the event loop open in
|
|
93
|
+
* daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
|
|
94
|
+
* an error it throws is ignored. Returns a function that stops it.
|
|
95
|
+
*/
|
|
96
|
+
export declare function startDaemonHeartbeat(log: (message: string) => void, getStatus: () => DaemonHeartbeatStatus | undefined, intervalMs?: number, beforeBeat?: () => void): () => void;
|
|
97
|
+
export type DaemonLogRotation = {
|
|
98
|
+
rotated: true;
|
|
99
|
+
bytes: number;
|
|
100
|
+
kept: boolean;
|
|
101
|
+
error?: string;
|
|
102
|
+
} | {
|
|
103
|
+
rotated: false;
|
|
104
|
+
reason: 'disabled' | 'not-a-regular-file' | 'not-our-log' | 'under-cap' | 'error';
|
|
105
|
+
error?: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
|
|
109
|
+
* to `<logPath>.1` (replacing the previous one) and truncate it in place
|
|
110
|
+
* through the server's own descriptor, which start-daemon.cjs opened with
|
|
111
|
+
* O_APPEND, so later writes start again at offset 0 of the same file.
|
|
112
|
+
*
|
|
113
|
+
* Acts only when `logPath` is a regular file (not a symlink, #970) and is the
|
|
114
|
+
* very file one of `fds` (stdout/stderr) writes to, matched by device and
|
|
115
|
+
* inode, so it never truncates a file the server does not own. If the copy
|
|
116
|
+
* fails the log is still truncated, to keep disk use bounded. Lines written
|
|
117
|
+
* between the copy and the truncate are lost; the window is one copy long.
|
|
118
|
+
*/
|
|
119
|
+
export declare function rotateDaemonLog(logPath: string, maxBytes: number, fds?: readonly number[]): DaemonLogRotation;
|
|
120
|
+
/**
|
|
121
|
+
* The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
|
|
122
|
+
* line into the fresh log after each rotation and a warning the first time a
|
|
123
|
+
* check fails. Returns undefined when there is nothing to rotate.
|
|
124
|
+
*/
|
|
125
|
+
export declare function createDaemonLogRotator(logPath: string | undefined, maxBytes: number, log: (message: string) => void): (() => void) | undefined;
|
|
126
|
+
//# sourceMappingURL=daemon-mode.d.ts.map
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP server daemon mode (#1158)
|
|
3
|
+
*
|
|
4
|
+
* The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
|
|
5
|
+
* a detached background process with no stdin (`stdio: 'ignore'`), only to
|
|
6
|
+
* host the worker daemon. The #513 guard treats stdin EOF as "the client is
|
|
7
|
+
* gone" and shuts the server down, so that daemon used to exit within
|
|
8
|
+
* seconds of starting.
|
|
9
|
+
*
|
|
10
|
+
* `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
|
|
11
|
+
* EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
|
|
12
|
+
* the process alive (worker timers are unref'd, also #513). The server then
|
|
13
|
+
* stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
|
|
14
|
+
* `shutdown` method, or a crash.
|
|
15
|
+
*
|
|
16
|
+
* Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
|
|
17
|
+
* MCP client always talks to the server over a pipe/socket, so an
|
|
18
|
+
* `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
|
|
19
|
+
* server into an orphan that outlives the client: the #513 guard stays on and
|
|
20
|
+
* a warning is logged. The variable is also removed from `process.env` once
|
|
21
|
+
* read, so processes the server spawns do not inherit it.
|
|
22
|
+
*
|
|
23
|
+
* Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
|
|
24
|
+
* opened with O_APPEND by start-daemon.cjs), so renaming the file would not
|
|
25
|
+
* stop the writes. Instead, on each heartbeat the server copies an oversized
|
|
26
|
+
* daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
|
|
27
|
+
* the next write lands at the new end of the file. start-daemon.cjs rotates an
|
|
28
|
+
* oversized log at start-up the same way (a rename, as nothing writes it then).
|
|
29
|
+
*/
|
|
30
|
+
import { closeSync, constants, fstatSync, ftruncateSync, lstatSync, openSync, readSync, renameSync, unlinkSync, writeSync, } from 'node:fs';
|
|
31
|
+
export const DAEMON_MODE_ENV = 'AQE_MCP_DAEMON';
|
|
32
|
+
/** Only these values enable daemon mode; anything else (or unset) is off. */
|
|
33
|
+
const DAEMON_ON_VALUES = new Set(['1', 'true', 'yes', 'on']);
|
|
34
|
+
/** Default interval of the daemon heartbeat line in daemon.log. */
|
|
35
|
+
export const DEFAULT_DAEMON_HEARTBEAT_MS = 60_000;
|
|
36
|
+
/** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
|
|
37
|
+
export const DAEMON_HEARTBEAT_ENV = 'AQE_DAEMON_HEARTBEAT_SECONDS';
|
|
38
|
+
const MAX_HEARTBEAT_SECONDS = 86_400;
|
|
39
|
+
/** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
|
|
40
|
+
export const DAEMON_LOG_MAX_SIZE_ENV = 'AQE_DAEMON_LOG_MAX_SIZE';
|
|
41
|
+
export const DEFAULT_DAEMON_LOG_MAX_BYTES = 5 * 1024 * 1024;
|
|
42
|
+
const MIN_DAEMON_LOG_MAX_BYTES = 1024;
|
|
43
|
+
/**
|
|
44
|
+
* Absolute path of daemon.log, set by start-daemon.cjs for the server it
|
|
45
|
+
* starts. Internal: the server rotates the log only when this file is the one
|
|
46
|
+
* its stdout/stderr write to.
|
|
47
|
+
*/
|
|
48
|
+
export const DAEMON_LOG_PATH_ENV = 'AQE_MCP_DAEMON_LOG';
|
|
49
|
+
const OFF_VALUES = new Set(['0', 'off', 'false', 'no', 'none', 'disable', 'disabled']);
|
|
50
|
+
const SIZE_UNITS = { '': 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
|
|
51
|
+
/**
|
|
52
|
+
* Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
|
|
53
|
+
* (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
|
|
54
|
+
* Unset, empty or invalid values fall back to the 5 MB default.
|
|
55
|
+
*/
|
|
56
|
+
export function parseDaemonLogMaxBytes(raw) {
|
|
57
|
+
const text = (raw ?? '').trim().toLowerCase();
|
|
58
|
+
if (text === '')
|
|
59
|
+
return { value: DEFAULT_DAEMON_LOG_MAX_BYTES };
|
|
60
|
+
if (OFF_VALUES.has(text))
|
|
61
|
+
return { value: 0 };
|
|
62
|
+
const match = /^(\d+)\s*([kmg]?)b?$/.exec(text);
|
|
63
|
+
const bytes = match ? Number(match[1]) * SIZE_UNITS[match[2]] : NaN;
|
|
64
|
+
if (Number.isSafeInteger(bytes) && bytes >= MIN_DAEMON_LOG_MAX_BYTES)
|
|
65
|
+
return { value: bytes };
|
|
66
|
+
return {
|
|
67
|
+
value: DEFAULT_DAEMON_LOG_MAX_BYTES,
|
|
68
|
+
warning: `[AQE] WARN ${DAEMON_LOG_MAX_SIZE_ENV}=${JSON.stringify(raw)} ignored: expected bytes ` +
|
|
69
|
+
`(at least ${MIN_DAEMON_LOG_MAX_BYTES}) or a size such as 512K or 5M; using 5M\n`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
|
|
73
|
+
export function parseDaemonHeartbeatMs(raw) {
|
|
74
|
+
const text = (raw ?? '').trim();
|
|
75
|
+
if (text === '')
|
|
76
|
+
return { value: DEFAULT_DAEMON_HEARTBEAT_MS };
|
|
77
|
+
const seconds = /^\d+$/.test(text) ? Number(text) : NaN;
|
|
78
|
+
if (seconds >= 1 && seconds <= MAX_HEARTBEAT_SECONDS)
|
|
79
|
+
return { value: seconds * 1000 };
|
|
80
|
+
return {
|
|
81
|
+
value: DEFAULT_DAEMON_HEARTBEAT_MS,
|
|
82
|
+
warning: `[AQE] WARN ${DAEMON_HEARTBEAT_ENV}=${JSON.stringify(raw)} ignored: expected whole ` +
|
|
83
|
+
`seconds from 1 to ${MAX_HEARTBEAT_SECONDS}; using 60\n`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Whether the environment asks for daemon mode. */
|
|
87
|
+
export function isDaemonModeRequested(env) {
|
|
88
|
+
const raw = env[DAEMON_MODE_ENV];
|
|
89
|
+
if (raw === undefined)
|
|
90
|
+
return false;
|
|
91
|
+
return DAEMON_ON_VALUES.has(raw.trim().toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Classify the process's stdin. A FIFO or socket means a client is (or was)
|
|
95
|
+
* connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
|
|
96
|
+
*/
|
|
97
|
+
export function detectStdinKind(stdin = process.stdin, fd = 0) {
|
|
98
|
+
if (stdin.isTTY)
|
|
99
|
+
return 'tty';
|
|
100
|
+
try {
|
|
101
|
+
const stat = fstatSync(fd);
|
|
102
|
+
return stat.isFIFO() || stat.isSocket() ? 'pipe' : 'other';
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Unknown stdin: treat it as a client pipe so the #513 guard stays on.
|
|
106
|
+
return 'pipe';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Decide how the server should treat stdin EOF. Pure: no side effects. */
|
|
110
|
+
export function resolveStdinGuardMode(env, stdinKind) {
|
|
111
|
+
const requested = isDaemonModeRequested(env);
|
|
112
|
+
if (stdinKind === 'tty')
|
|
113
|
+
return { mode: 'tty' };
|
|
114
|
+
if (!requested)
|
|
115
|
+
return { mode: 'stdio' };
|
|
116
|
+
if (stdinKind === 'pipe') {
|
|
117
|
+
return {
|
|
118
|
+
mode: 'stdio',
|
|
119
|
+
warning: `[AQE] WARN ${DAEMON_MODE_ENV} ignored: stdin is a pipe (an MCP client is attached), ` +
|
|
120
|
+
'so the server still shuts down when stdin closes\n',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { mode: 'daemon' };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Keep a daemon-mode server alive and log one heartbeat line per interval.
|
|
127
|
+
* The timer is deliberately ref'd: nothing else holds the event loop open in
|
|
128
|
+
* daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
|
|
129
|
+
* an error it throws is ignored. Returns a function that stops it.
|
|
130
|
+
*/
|
|
131
|
+
export function startDaemonHeartbeat(log, getStatus, intervalMs = DEFAULT_DAEMON_HEARTBEAT_MS, beforeBeat) {
|
|
132
|
+
const startedAt = Date.now();
|
|
133
|
+
const timer = setInterval(() => {
|
|
134
|
+
try {
|
|
135
|
+
beforeBeat?.();
|
|
136
|
+
}
|
|
137
|
+
catch { /* never let rotation stop the heartbeat */ }
|
|
138
|
+
const uptimeS = Math.round((Date.now() - startedAt) / 1000);
|
|
139
|
+
let status;
|
|
140
|
+
try {
|
|
141
|
+
status = getStatus();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
status = undefined;
|
|
145
|
+
}
|
|
146
|
+
const workers = status
|
|
147
|
+
? `${status.totalWorkers} workers (${status.errorWorkers} in error), ` +
|
|
148
|
+
`${status.totalExecutions} runs (${status.failedExecutions} failed)`
|
|
149
|
+
: 'workers unavailable';
|
|
150
|
+
log(`[AQE] Daemon heartbeat: pid ${process.pid}, up ${uptimeS}s, ${workers}\n`);
|
|
151
|
+
}, intervalMs);
|
|
152
|
+
return () => clearInterval(timer);
|
|
153
|
+
}
|
|
154
|
+
/** Copy `src` to a fresh `dest`; neither path may be a symlink. */
|
|
155
|
+
function copyNoFollow(src, dest, srcIno) {
|
|
156
|
+
const nofollow = constants.O_NOFOLLOW ?? 0;
|
|
157
|
+
const input = openSync(src, constants.O_RDONLY | nofollow);
|
|
158
|
+
let output;
|
|
159
|
+
try {
|
|
160
|
+
if (fstatSync(input).ino !== srcIno)
|
|
161
|
+
throw new Error('daemon.log changed while rotating');
|
|
162
|
+
try {
|
|
163
|
+
unlinkSync(dest);
|
|
164
|
+
}
|
|
165
|
+
catch { /* absent */ }
|
|
166
|
+
// O_EXCL: fails on anything already there, a symlink included.
|
|
167
|
+
output = openSync(dest, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | nofollow, 0o644);
|
|
168
|
+
const buffer = Buffer.allocUnsafe(64 * 1024);
|
|
169
|
+
let read;
|
|
170
|
+
while ((read = readSync(input, buffer, 0, buffer.length, null)) > 0) {
|
|
171
|
+
writeSync(output, buffer, 0, read);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
if (output !== undefined)
|
|
176
|
+
closeSync(output);
|
|
177
|
+
closeSync(input);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
|
|
182
|
+
* to `<logPath>.1` (replacing the previous one) and truncate it in place
|
|
183
|
+
* through the server's own descriptor, which start-daemon.cjs opened with
|
|
184
|
+
* O_APPEND, so later writes start again at offset 0 of the same file.
|
|
185
|
+
*
|
|
186
|
+
* Acts only when `logPath` is a regular file (not a symlink, #970) and is the
|
|
187
|
+
* very file one of `fds` (stdout/stderr) writes to, matched by device and
|
|
188
|
+
* inode, so it never truncates a file the server does not own. If the copy
|
|
189
|
+
* fails the log is still truncated, to keep disk use bounded. Lines written
|
|
190
|
+
* between the copy and the truncate are lost; the window is one copy long.
|
|
191
|
+
*/
|
|
192
|
+
export function rotateDaemonLog(logPath, maxBytes, fds = [1, 2]) {
|
|
193
|
+
if (maxBytes <= 0)
|
|
194
|
+
return { rotated: false, reason: 'disabled' };
|
|
195
|
+
try {
|
|
196
|
+
const stat = lstatSync(logPath);
|
|
197
|
+
if (!stat.isFile())
|
|
198
|
+
return { rotated: false, reason: 'not-a-regular-file' };
|
|
199
|
+
const fd = fds.find((candidate) => {
|
|
200
|
+
try {
|
|
201
|
+
const own = fstatSync(candidate);
|
|
202
|
+
return own.dev === stat.dev && own.ino === stat.ino;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
if (fd === undefined)
|
|
209
|
+
return { rotated: false, reason: 'not-our-log' };
|
|
210
|
+
if (stat.size <= maxBytes)
|
|
211
|
+
return { rotated: false, reason: 'under-cap' };
|
|
212
|
+
const tmp = `${logPath}.1.${process.pid}.tmp`;
|
|
213
|
+
let copyError;
|
|
214
|
+
try {
|
|
215
|
+
copyNoFollow(logPath, tmp, stat.ino);
|
|
216
|
+
renameSync(tmp, `${logPath}.1`); // replaces the old one, never follows it
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
copyError = error instanceof Error ? error.message : String(error);
|
|
220
|
+
try {
|
|
221
|
+
unlinkSync(tmp);
|
|
222
|
+
}
|
|
223
|
+
catch { /* absent */ }
|
|
224
|
+
}
|
|
225
|
+
ftruncateSync(fd, 0);
|
|
226
|
+
return copyError === undefined
|
|
227
|
+
? { rotated: true, bytes: stat.size, kept: true }
|
|
228
|
+
: { rotated: true, bytes: stat.size, kept: false, error: copyError };
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
return { rotated: false, reason: 'error', error: error instanceof Error ? error.message : String(error) };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
|
|
236
|
+
* line into the fresh log after each rotation and a warning the first time a
|
|
237
|
+
* check fails. Returns undefined when there is nothing to rotate.
|
|
238
|
+
*/
|
|
239
|
+
export function createDaemonLogRotator(logPath, maxBytes, log) {
|
|
240
|
+
if (!logPath || maxBytes <= 0)
|
|
241
|
+
return undefined;
|
|
242
|
+
let warned = false;
|
|
243
|
+
return () => {
|
|
244
|
+
const result = rotateDaemonLog(logPath, maxBytes);
|
|
245
|
+
if (result.rotated) {
|
|
246
|
+
log(result.kept
|
|
247
|
+
? `[AQE] daemon.log rotated: ${result.bytes} bytes moved to daemon.log.1 (cap ${maxBytes})\n`
|
|
248
|
+
: `[AQE] WARN daemon.log truncated at ${result.bytes} bytes (cap ${maxBytes}); ` +
|
|
249
|
+
`could not keep daemon.log.1: ${result.error}\n`);
|
|
250
|
+
}
|
|
251
|
+
else if (result.reason === 'error' && !warned) {
|
|
252
|
+
warned = true;
|
|
253
|
+
log(`[AQE] WARN daemon.log size check failed: ${result.error}\n`);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=daemon-mode.js.map
|
package/dist/mcp/entry.d.ts
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* Environment Variables:
|
|
13
13
|
* AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
|
|
14
14
|
* AQE_VERBOSE: Enable verbose logging
|
|
15
|
+
* AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
|
|
16
|
+
* server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
|
|
17
|
+
* AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
|
|
18
|
+
* heartbeat interval and daemon.log size cap (#1207).
|
|
15
19
|
*/
|
|
16
20
|
export {};
|
|
17
21
|
//# sourceMappingURL=entry.d.ts.map
|
package/dist/mcp/entry.js
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* Environment Variables:
|
|
13
13
|
* AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
|
|
14
14
|
* AQE_VERBOSE: Enable verbose logging
|
|
15
|
+
* AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
|
|
16
|
+
* server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
|
|
17
|
+
* AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
|
|
18
|
+
* heartbeat interval and daemon.log size cap (#1207).
|
|
15
19
|
*/
|
|
16
20
|
import { quickStart } from './protocol-server.js';
|
|
17
21
|
import { createHTTPServer } from './http-server.js';
|
|
@@ -25,7 +29,8 @@ import { initFeatureFlagsFromEnv } from '../integrations/ruvector/feature-flags.
|
|
|
25
29
|
import { resetSharedRvfAdapter } from '../integrations/ruvector/shared-rvf-adapter.js';
|
|
26
30
|
import { resetSharedRvfDualWriter } from '../integrations/ruvector/shared-rvf-dual-writer.js';
|
|
27
31
|
import { claimProcessLifecycle, closeRegisteredStores } from '../kernel/process-lifecycle.js';
|
|
28
|
-
import { startBackgroundWorkers } from './background-workers.js';
|
|
32
|
+
import { getBackgroundWorkersState, startBackgroundWorkers } from './background-workers.js';
|
|
33
|
+
import { DAEMON_HEARTBEAT_ENV, DAEMON_LOG_MAX_SIZE_ENV, DAEMON_LOG_PATH_ENV, DAEMON_MODE_ENV, createDaemonLogRotator, detectStdinKind, parseDaemonHeartbeatMs, parseDaemonLogMaxBytes, resolveStdinGuardMode, startDaemonHeartbeat, } from './daemon-mode.js';
|
|
29
34
|
import { readFileSync } from 'node:fs';
|
|
30
35
|
import { resolve, dirname } from 'node:path';
|
|
31
36
|
import { fileURLToPath } from 'node:url';
|
|
@@ -95,11 +100,15 @@ async function main() {
|
|
|
95
100
|
// resolved, which is why `kill <pid>` appeared to be "ignored" and only
|
|
96
101
|
// `kill -9` worked.
|
|
97
102
|
let shuttingDown = false;
|
|
103
|
+
let stopDaemonHeartbeat = null;
|
|
104
|
+
let daemonStatus = null;
|
|
105
|
+
const daemonWarnings = [];
|
|
98
106
|
const shutdown = async (reason) => {
|
|
99
107
|
if (shuttingDown)
|
|
100
108
|
return;
|
|
101
109
|
shuttingDown = true;
|
|
102
110
|
originalStderrWrite(`[AQE] Shutting down (${reason})\n`);
|
|
111
|
+
stopDaemonHeartbeat?.();
|
|
103
112
|
const watchdog = setTimeout(() => {
|
|
104
113
|
originalStderrWrite('[AQE] Shutdown watchdog fired — forcing exit\n');
|
|
105
114
|
process.exit(0);
|
|
@@ -139,10 +148,29 @@ async function main() {
|
|
|
139
148
|
// reaches EOF. An orphaned stdio MCP server has no parent to serve, so exit
|
|
140
149
|
// instead of lingering at high CPU. Guarded to a piped stdin so an
|
|
141
150
|
// interactive TTY debug session (Ctrl-D) is unaffected.
|
|
142
|
-
|
|
151
|
+
// #1158: start-daemon.cjs runs the server with no stdin and AQE_MCP_DAEMON=1;
|
|
152
|
+
// that daemon mode skips this guard (only when stdin is not a client pipe).
|
|
153
|
+
const stdinGuard = resolveStdinGuardMode(process.env, detectStdinKind(process.stdin));
|
|
154
|
+
const daemonLogPath = process.env[DAEMON_LOG_PATH_ENV];
|
|
155
|
+
delete process.env[DAEMON_MODE_ENV]; // never inherited by processes we spawn
|
|
156
|
+
delete process.env[DAEMON_LOG_PATH_ENV];
|
|
157
|
+
if (stdinGuard.mode === 'stdio') {
|
|
143
158
|
process.stdin.on('end', () => { void shutdown('stdin-eof'); });
|
|
144
159
|
process.stdin.on('close', () => { void shutdown('stdin-close'); });
|
|
145
160
|
}
|
|
161
|
+
else if (stdinGuard.mode === 'daemon') {
|
|
162
|
+
// Worker timers are unref'd (#513), so a daemon with no stdin needs its
|
|
163
|
+
// own ref'd timer to stay up, from the start of boot; it also logs
|
|
164
|
+
// liveness to daemon.log.
|
|
165
|
+
// #1207: each heartbeat also keeps daemon.log under its size cap.
|
|
166
|
+
const heartbeat = parseDaemonHeartbeatMs(process.env[DAEMON_HEARTBEAT_ENV]);
|
|
167
|
+
const logCap = parseDaemonLogMaxBytes(process.env[DAEMON_LOG_MAX_SIZE_ENV]);
|
|
168
|
+
for (const parsed of [heartbeat, logCap])
|
|
169
|
+
if (parsed.warning)
|
|
170
|
+
daemonWarnings.push(parsed.warning);
|
|
171
|
+
const log = (message) => { originalStderrWrite(message); }; // declared further down
|
|
172
|
+
stopDaemonHeartbeat = startDaemonHeartbeat(log, () => daemonStatus?.(), heartbeat.value, createDaemonLogRotator(daemonLogPath, logCap.value, log));
|
|
173
|
+
}
|
|
146
174
|
// Catch unhandled exceptions/rejections to prevent MCP connection drops
|
|
147
175
|
process.on('uncaughtException', (error) => {
|
|
148
176
|
process.stderr.write(`[AQE] FATAL uncaught exception: ${error.message}\n`);
|
|
@@ -334,6 +362,26 @@ async function main() {
|
|
|
334
362
|
// IMP-10: Start background workers (heartbeat scheduler, etc.) and the
|
|
335
363
|
// QualityDaemon. #1061: AQE_WORKERS_ENABLED=false skips both.
|
|
336
364
|
await startBackgroundWorkers(originalStderrWrite);
|
|
365
|
+
if (stdinGuard.warning)
|
|
366
|
+
originalStderrWrite(stdinGuard.warning);
|
|
367
|
+
for (const warning of daemonWarnings)
|
|
368
|
+
originalStderrWrite(warning);
|
|
369
|
+
if (stdinGuard.mode === 'daemon') {
|
|
370
|
+
if (getBackgroundWorkersState().state !== 'disabled') {
|
|
371
|
+
const { getDaemon } = await import('../workers/daemon.js');
|
|
372
|
+
daemonStatus = () => {
|
|
373
|
+
const health = getDaemon().getStatus().workerManager;
|
|
374
|
+
const workers = Object.values(health.workers);
|
|
375
|
+
return {
|
|
376
|
+
totalWorkers: health.totalWorkers,
|
|
377
|
+
errorWorkers: health.errorWorkers,
|
|
378
|
+
totalExecutions: workers.reduce((sum, w) => sum + w.totalExecutions, 0),
|
|
379
|
+
failedExecutions: workers.reduce((sum, w) => sum + w.failedExecutions, 0),
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
originalStderrWrite(`[AQE] Daemon mode (${DAEMON_MODE_ENV}): stdin EOF ignored; stop with SIGTERM (stop-daemon.cjs)\n`);
|
|
384
|
+
}
|
|
337
385
|
// Start HTTP server for AG-UI/A2A/A2UI if port is specified
|
|
338
386
|
const httpPort = parseInt(process.env.AQE_HTTP_PORT || '0', 10);
|
|
339
387
|
if (httpPort > 0) {
|
|
@@ -148,6 +148,9 @@ export interface AccessibilityTestResult {
|
|
|
148
148
|
score: number;
|
|
149
149
|
violations: unknown[];
|
|
150
150
|
warnings: unknown[];
|
|
151
|
+
/** #1145: false when no page was audited; `passed` is then not a verdict and `score` is -1. */
|
|
152
|
+
measured?: boolean;
|
|
153
|
+
note?: string;
|
|
151
154
|
duration: number;
|
|
152
155
|
savedFiles?: string[];
|
|
153
156
|
/** #933: true when result files were written; see savedFiles for their paths. */
|
|
@@ -247,6 +250,11 @@ export interface CodeIndexResult {
|
|
|
247
250
|
tests: number;
|
|
248
251
|
toolsUsed: string[];
|
|
249
252
|
};
|
|
253
|
+
/**
|
|
254
|
+
* #1224: non-fatal indexing warnings, e.g. that code search does not cover
|
|
255
|
+
* every indexed file. Absent when there are none.
|
|
256
|
+
*/
|
|
257
|
+
warnings?: string[];
|
|
250
258
|
/**
|
|
251
259
|
* #1096: discovered paths that were not indexed (missing, not a regular
|
|
252
260
|
* file, outside the project root, filtered out), with the reason. Absent
|
|
@@ -455,6 +455,11 @@ export const coverageAnalyzeConfig = {
|
|
|
455
455
|
...(data.runStatus === 'passed' || data.runStatus === 'failed' ? { runStatus: data.runStatus } : {}),
|
|
456
456
|
// #995: the target has no measurement at all — distinct from a measured 0%.
|
|
457
457
|
...(data.unmeasured === true ? { unmeasured: true } : {}),
|
|
458
|
+
// #1154: target files the report does not cover, and a stale report.
|
|
459
|
+
...(data.evidenceStatus === 'complete' || data.evidenceStatus === 'insufficient-evidence'
|
|
460
|
+
? { evidenceStatus: data.evidenceStatus } : {}),
|
|
461
|
+
...(Array.isArray(data.unmeasuredFiles) ? { unmeasuredFiles: data.unmeasuredFiles } : {}),
|
|
462
|
+
...(data.staleReport ? { staleReport: data.staleReport } : {}),
|
|
458
463
|
...(data.warning ? { warning: data.warning } : {}),
|
|
459
464
|
};
|
|
460
465
|
},
|
|
@@ -682,11 +687,15 @@ export const accessibilityTestConfig = {
|
|
|
682
687
|
}),
|
|
683
688
|
mapToResult: (taskId, data, duration, savedFiles) => ({
|
|
684
689
|
taskId,
|
|
685
|
-
status: 'completed',
|
|
690
|
+
status: data.measured === true ? 'completed' : 'not-measured',
|
|
686
691
|
passed: data.passed || false,
|
|
687
|
-
|
|
692
|
+
// #1145: an unmeasured score is -1, never a 0/100 grade
|
|
693
|
+
score: data.measured === true && typeof data.score === 'number' ? data.score : -1,
|
|
688
694
|
violations: data.violations || [],
|
|
689
695
|
warnings: data.warnings || [],
|
|
696
|
+
// #1145: fail closed; only an explicit measurement counts as one
|
|
697
|
+
measured: data.measured === true,
|
|
698
|
+
...(typeof data.note === 'string' ? { note: data.note } : {}),
|
|
690
699
|
duration,
|
|
691
700
|
savedFiles,
|
|
692
701
|
}),
|
|
@@ -808,6 +817,9 @@ export const codeIndexConfig = {
|
|
|
808
817
|
symbolsExtracted: data.symbolsExtracted || 0,
|
|
809
818
|
relationsFound: data.relationsFound || 0,
|
|
810
819
|
...(data.projectMetrics ? { projectMetrics: data.projectMetrics } : {}),
|
|
820
|
+
...(Array.isArray(data.warnings) && data.warnings.length > 0
|
|
821
|
+
? { warnings: data.warnings }
|
|
822
|
+
: {}),
|
|
811
823
|
...(Array.isArray(data.skipped) && data.skipped.length > 0
|
|
812
824
|
? { skipped: data.skipped }
|
|
813
825
|
: {}),
|
|
@@ -224,6 +224,9 @@ async function recordDomainFeedback(domain, data, durationMs, params) {
|
|
|
224
224
|
coverageMethod: data.coverageMethod ?? 'instrumented-report',
|
|
225
225
|
branchDataCollected: data.branchCoverage !== null && data.branchCoverage !== undefined,
|
|
226
226
|
functionDataCollected: data.functionCoverage !== null && data.functionCoverage !== undefined,
|
|
227
|
+
// #1030: coverage from a run whose tests failed says so, as
|
|
228
|
+
// coverage:latest and the per-file records already do (#1027 N4).
|
|
229
|
+
...(data.runStatus === 'passed' || data.runStatus === 'failed' ? { runStatus: data.runStatus } : {}),
|
|
227
230
|
},
|
|
228
231
|
};
|
|
229
232
|
await loop.recordCoverageSession(session);
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Model routing MCP handlers (ADR-051)
|
|
3
|
+
* Routing decisions, routing metrics and routing economics.
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolResult } from '../types';
|
|
6
|
+
import { type RoutingLogEntry, type RoutingStats } from '../services/task-router';
|
|
7
|
+
import type { ModelTier } from '../../integrations/agentic-flow';
|
|
8
|
+
export interface ModelRouteParams {
|
|
9
|
+
/** Task description to analyze */
|
|
10
|
+
task: string;
|
|
11
|
+
/** Optional code context for complexity analysis */
|
|
12
|
+
codeContext?: string;
|
|
13
|
+
/** Optional file paths */
|
|
14
|
+
filePaths?: string[];
|
|
15
|
+
/** Manual tier override */
|
|
16
|
+
manualTier?: ModelTier;
|
|
17
|
+
/** Mark as critical task */
|
|
18
|
+
isCritical?: boolean;
|
|
19
|
+
/** Agent type making the request */
|
|
20
|
+
agentType?: string;
|
|
21
|
+
/** Domain context */
|
|
22
|
+
domain?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ModelRouteResult {
|
|
25
|
+
tier: ModelTier;
|
|
26
|
+
tierName: string;
|
|
27
|
+
modelId: string;
|
|
28
|
+
executionStrategy: string;
|
|
29
|
+
useAgentBooster: boolean;
|
|
30
|
+
agentBoosterTransform?: string;
|
|
31
|
+
complexity: {
|
|
32
|
+
overall: number;
|
|
33
|
+
code: number;
|
|
34
|
+
reasoning: number;
|
|
35
|
+
scope: number;
|
|
36
|
+
};
|
|
37
|
+
confidence: number;
|
|
38
|
+
rationale: string;
|
|
39
|
+
warnings: string[];
|
|
40
|
+
budget: {
|
|
41
|
+
allowed: boolean;
|
|
42
|
+
wasDowngraded: boolean;
|
|
43
|
+
estimatedCostUsd: number;
|
|
44
|
+
};
|
|
45
|
+
decisionTimeMs: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Handle model routing query - returns routing decision without submitting task
|
|
49
|
+
*/
|
|
50
|
+
export declare function handleModelRoute(params: ModelRouteParams): Promise<ToolResult<ModelRouteResult>>;
|
|
51
|
+
export interface RoutingMetricsParams {
|
|
52
|
+
/** Include routing log entries */
|
|
53
|
+
includeLog?: boolean;
|
|
54
|
+
/** Max log entries to return */
|
|
55
|
+
logLimit?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface RoutingMetricsResult {
|
|
58
|
+
stats: RoutingStats;
|
|
59
|
+
log?: RoutingLogEntry[];
|
|
60
|
+
modelRouterMetrics: {
|
|
61
|
+
totalDecisions: number;
|
|
62
|
+
avgDecisionTimeMs: number;
|
|
63
|
+
agentBoosterStats: {
|
|
64
|
+
eligible: number;
|
|
65
|
+
used: number;
|
|
66
|
+
successRate: number;
|
|
67
|
+
};
|
|
68
|
+
budgetStats: {
|
|
69
|
+
totalSpentUsd: number;
|
|
70
|
+
budgetUtilization: number;
|
|
71
|
+
downgradeCount: number;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Handle routing metrics query
|
|
77
|
+
*/
|
|
78
|
+
export declare function handleRoutingMetrics(params: RoutingMetricsParams): Promise<ToolResult<RoutingMetricsResult>>;
|
|
79
|
+
export interface RoutingEconomicsParams {
|
|
80
|
+
/** Task complexity score 0-1 for tier scoring (default: 0.5) */
|
|
81
|
+
taskComplexity?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface RoutingEconomicsResult {
|
|
84
|
+
tierEfficiency: Array<{
|
|
85
|
+
tier: string;
|
|
86
|
+
qualityScore: number;
|
|
87
|
+
estimatedCostUsd: number;
|
|
88
|
+
qualityPerDollar: number | string;
|
|
89
|
+
economicScore: number;
|
|
90
|
+
}>;
|
|
91
|
+
currentHourlyCostUsd: number;
|
|
92
|
+
currentDailyCostUsd: number;
|
|
93
|
+
budgetRemaining: {
|
|
94
|
+
hourly: number | null;
|
|
95
|
+
daily: number | null;
|
|
96
|
+
};
|
|
97
|
+
recommendation: string;
|
|
98
|
+
savingsOpportunity: {
|
|
99
|
+
usd: number;
|
|
100
|
+
description: string;
|
|
101
|
+
} | null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle economic routing report query
|
|
105
|
+
*/
|
|
106
|
+
export declare function handleRoutingEconomics(params: RoutingEconomicsParams): Promise<ToolResult<RoutingEconomicsResult>>;
|
|
107
|
+
//# sourceMappingURL=model-route-handlers.d.ts.map
|