agentic-qe 3.15.10 → 3.15.11
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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +114 -0
- package/README.md +8 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/agent-cards/generator.js +6 -3
- package/dist/adapters/a2a/tasks/task-router.js +3 -1
- package/dist/adapters/trajectory-adapter.js +1 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +3 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.js +31 -2
- package/dist/agents/overlay-loader.js +26 -21
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-V4GSGOOK.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-H7ANGXW4.js → agent-booster-wasm-TIDSQ3ZK.js} +2 -2
- package/dist/cli/chunks/{agent-handler-SVXSHEET.js → agent-handler-G3EPBVA7.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WKQH36XL.js → agent-memory-branch-ARC5C7GW.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +2 -0
- package/dist/cli/chunks/{arena-OPS36NFZ.js → arena-36DTATJV.js} +4 -4
- package/dist/cli/chunks/{arena-EKOOFVST.js → arena-K4I4QDXB.js} +2 -2
- package/dist/cli/chunks/{audit-AO5NDZRI.js → audit-WQSJSJZF.js} +3 -3
- package/dist/cli/chunks/base-AK7BXBX2.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TFLVEMMY.js → better-sqlite3-BB4K67MT.js} +2 -2
- package/dist/cli/chunks/{brain-handler-ADBBJPYW.js → brain-handler-CU3GOIU3.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HGHUYYL5.js → branch-enumerator-NJQX7ZNB.js} +2 -2
- package/dist/cli/chunks/{browser-5LU6P4SZ.js → browser-6YJF4FQW.js} +2 -2
- package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +2 -0
- package/dist/cli/chunks/{chunk-LQEURY7C.js → chunk-25P77WA5.js} +1 -1
- package/dist/cli/chunks/{chunk-FFTPAWM6.js → chunk-2CW7VRPH.js} +8 -8
- package/dist/cli/chunks/chunk-2DTX7YAZ.js +6 -0
- package/dist/cli/chunks/{chunk-6KIL6CMD.js → chunk-2KFFEKSI.js} +2 -2
- package/dist/cli/chunks/{chunk-UARKIZAS.js → chunk-2VLYUF7U.js} +2 -2
- package/dist/cli/chunks/{chunk-A55QKKT2.js → chunk-325QCVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-FBXTQNRH.js → chunk-35M2X3C5.js} +2 -2
- package/dist/cli/chunks/{chunk-S75EYIJG.js → chunk-3RHOPP7A.js} +1 -1
- package/dist/cli/chunks/{chunk-SY2IB442.js → chunk-4HJKQIX5.js} +2 -2
- package/dist/cli/chunks/chunk-4MUBW4RT.js +7 -0
- package/dist/cli/chunks/{chunk-KSIWGGJI.js → chunk-4RAQ7PJA.js} +2 -2
- package/dist/cli/chunks/{chunk-DT7SIJOA.js → chunk-4RH5I24Q.js} +2 -2
- package/dist/cli/chunks/{chunk-JHIY4VCC.js → chunk-4UBVAJFO.js} +3 -3
- package/dist/cli/chunks/{chunk-RPHY2DU6.js → chunk-4UX35V7P.js} +2 -2
- package/dist/cli/chunks/{chunk-7LFZ4CHM.js → chunk-4X4MWMHB.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMBRDCA.js → chunk-55CH76ZO.js} +3 -3
- package/dist/cli/chunks/{chunk-6S3WJGUV.js → chunk-57LNKSW7.js} +2 -2
- package/dist/cli/chunks/chunk-5ERFHEEE.js +14 -0
- package/dist/cli/chunks/{chunk-KNQ2ERFX.js → chunk-5HQP4SLM.js} +2 -2
- package/dist/cli/chunks/{chunk-XFVTGAAJ.js → chunk-5MNASJOH.js} +2 -2
- package/dist/cli/chunks/{chunk-UCJMVXO4.js → chunk-5MTWCCZJ.js} +2 -2
- package/dist/cli/chunks/{chunk-GZLZCZ42.js → chunk-5N25I53C.js} +2 -2
- package/dist/cli/chunks/{chunk-NGKNYIQZ.js → chunk-5WYZHDIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-GWZZ7DAO.js → chunk-5YLOLACR.js} +2 -2
- package/dist/cli/chunks/{chunk-B6LTH6YV.js → chunk-672XOJDG.js} +1 -1
- package/dist/cli/chunks/{chunk-DNRWGATA.js → chunk-6NA3KZZT.js} +3 -3
- package/dist/cli/chunks/chunk-72ZBJD2E.js +3 -0
- package/dist/cli/chunks/{chunk-XLZYRTNO.js → chunk-76SNL7GU.js} +2 -2
- package/dist/cli/chunks/{chunk-37OWRCUN.js → chunk-7HEMJHPP.js} +2 -2
- package/dist/cli/chunks/{chunk-WQ4PYWSW.js → chunk-7R5HC56U.js} +1 -1
- package/dist/cli/chunks/{chunk-EDLFX4ZB.js → chunk-AFFN6E6Q.js} +2 -2
- package/dist/cli/chunks/{chunk-YCGP5VFP.js → chunk-AMZKAJLJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OEKP73MC.js → chunk-AP3ADWDK.js} +2 -2
- package/dist/cli/chunks/{chunk-DE4YJQJF.js → chunk-APPZATXA.js} +2 -2
- package/dist/cli/chunks/{chunk-RWWOHCMG.js → chunk-AUUJBXWX.js} +2 -2
- package/dist/cli/chunks/{chunk-LRZY4KS2.js → chunk-BTVWA35P.js} +2 -2
- package/dist/cli/chunks/{chunk-4G63WT4F.js → chunk-BZPE3LDO.js} +2 -2
- package/dist/cli/chunks/{chunk-OY2AHLSF.js → chunk-CFWGGRE7.js} +1 -1
- package/dist/cli/chunks/{chunk-7OZVZIBE.js → chunk-CIAL4YRY.js} +2 -2
- package/dist/cli/chunks/{chunk-TBLI254A.js → chunk-CO3DX2AX.js} +2 -2
- package/dist/cli/chunks/{chunk-GHBNRMSJ.js → chunk-DDEOZPWJ.js} +2 -2
- package/dist/cli/chunks/{chunk-62OAY5KJ.js → chunk-DOBZPSKE.js} +1 -1
- package/dist/cli/chunks/{chunk-NVYIZCSR.js → chunk-DOFREOPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-SU5H66SD.js → chunk-E44NNCEU.js} +2 -2
- package/dist/cli/chunks/{chunk-MG27QY4D.js → chunk-E6PF35JZ.js} +2 -2
- package/dist/cli/chunks/{chunk-4SJYIX54.js → chunk-EBPJY4DI.js} +2 -2
- package/dist/cli/chunks/{chunk-EWFECZ2U.js → chunk-EH2S6AOR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y76IAYQD.js → chunk-EIDJNT5C.js} +1 -1
- package/dist/cli/chunks/{chunk-6PX4OXQO.js → chunk-EJPK7OTR.js} +2 -2
- package/dist/cli/chunks/{chunk-EAU5KDFO.js → chunk-EK5GMOSO.js} +1 -1
- package/dist/cli/chunks/{chunk-ABFFWZPC.js → chunk-ERN43HOX.js} +151 -149
- package/dist/cli/chunks/{chunk-SO45NA4D.js → chunk-ETVAYGCB.js} +11 -11
- package/dist/cli/chunks/{chunk-RK73HB2F.js → chunk-EWPUQCN4.js} +2 -2
- package/dist/cli/chunks/{chunk-DMFTELBS.js → chunk-FL32MTKT.js} +2 -2
- package/dist/cli/chunks/chunk-FLU5FDSC.js +742 -0
- package/dist/cli/chunks/{chunk-NZYLNXT6.js → chunk-FUYOOKTH.js} +5 -5
- package/dist/cli/chunks/{chunk-NAXGWDVM.js → chunk-FWSGPE3V.js} +3 -3
- package/dist/cli/chunks/{chunk-ATHWDAXB.js → chunk-FZHSG75I.js} +2 -2
- package/dist/cli/chunks/{chunk-OBAREPDC.js → chunk-G2IJFNZS.js} +2 -2
- package/dist/cli/chunks/{chunk-H32EPIR2.js → chunk-G4CKPWF6.js} +1 -1
- package/dist/cli/chunks/{chunk-SKQUUE4F.js → chunk-G4FAPO57.js} +2 -2
- package/dist/cli/chunks/{chunk-KG336OV3.js → chunk-G77MLBDF.js} +2 -2
- package/dist/cli/chunks/{chunk-V6JBOIMX.js → chunk-GBFUANTC.js} +1 -1
- package/dist/cli/chunks/{chunk-YAKGBHO4.js → chunk-GVKVJJQX.js} +2 -2
- package/dist/cli/chunks/{chunk-GJHWY3ZX.js → chunk-GWJWSLDA.js} +2 -2
- package/dist/cli/chunks/{chunk-WDVRE6GN.js → chunk-H43AFUKL.js} +2 -2
- package/dist/cli/chunks/chunk-H7BLYMNU.js +59 -0
- package/dist/cli/chunks/{chunk-NW5JUCCG.js → chunk-HDJUYAZG.js} +1 -1
- package/dist/cli/chunks/{chunk-FKL3R5JQ.js → chunk-HDNWSKHA.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2O2YJAF.js → chunk-HFFPYC4G.js} +2 -2
- package/dist/cli/chunks/{chunk-WSF24I3D.js → chunk-HJ3XNTTJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YDAQK5UF.js → chunk-HYXUN7BW.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZI5FKSF.js → chunk-I36CRDHF.js} +2 -2
- package/dist/cli/chunks/{chunk-OY3NJNP2.js → chunk-I4K2HTQU.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZMF4NCF.js → chunk-IENZSO3K.js} +2 -2
- package/dist/cli/chunks/chunk-IO5537OM.js +2 -0
- package/dist/cli/chunks/{chunk-G3CZCUPM.js → chunk-IOZRKXR5.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUAE3CP.js → chunk-ITL3IN2E.js} +2 -2
- package/dist/cli/chunks/{chunk-3P34JFQH.js → chunk-ITPGWGQS.js} +14 -14
- package/dist/cli/chunks/{chunk-NSHU347M.js → chunk-IW6WDGHM.js} +1 -1
- package/dist/cli/chunks/{chunk-KOBVYY6H.js → chunk-J4JMCZVA.js} +2 -2
- package/dist/cli/chunks/{chunk-ACWFKES2.js → chunk-JFLU7L3W.js} +2 -2
- package/dist/cli/chunks/{chunk-YK7JN5N7.js → chunk-JGJXXAS6.js} +4 -4
- package/dist/cli/chunks/{chunk-ESUO3GTJ.js → chunk-JUMICXM6.js} +2 -2
- package/dist/cli/chunks/{chunk-VKRTTFB6.js → chunk-K2HBNYAZ.js} +2 -2
- package/dist/cli/chunks/{chunk-6MVVSSID.js → chunk-K7V2WZNF.js} +1 -1
- package/dist/cli/chunks/{chunk-XEB3NLJR.js → chunk-KDI5JOYZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YKMU4LBV.js → chunk-KJCIMNHS.js} +1 -1
- package/dist/cli/chunks/{chunk-IKISCIGH.js → chunk-KKYO2NKV.js} +2 -2
- package/dist/cli/chunks/{chunk-VFSYMOAL.js → chunk-KSE5TDM5.js} +2 -2
- package/dist/cli/chunks/{chunk-V2RSNVMW.js → chunk-KSLLHFVY.js} +1 -1
- package/dist/cli/chunks/{chunk-6C3II5OM.js → chunk-KXS3Y2AX.js} +2 -2
- package/dist/cli/chunks/{chunk-LMS3Y7JD.js → chunk-LBX7M4LW.js} +2 -2
- package/dist/cli/chunks/{chunk-2XGVTYVX.js → chunk-LCVEEII4.js} +2 -2
- package/dist/cli/chunks/{chunk-C522H7XR.js → chunk-LD5CFK53.js} +32 -32
- package/dist/cli/chunks/{chunk-FESZBPUB.js → chunk-LPU6PAJE.js} +2 -2
- package/dist/cli/chunks/{chunk-7ZCDZHDB.js → chunk-LQ4NUC6Q.js} +2 -2
- package/dist/cli/chunks/chunk-LRL56ZYL.js +21 -0
- package/dist/cli/chunks/{chunk-D6DA2KFD.js → chunk-LXQ3B4RY.js} +2 -2
- package/dist/cli/chunks/{chunk-I33O4BRQ.js → chunk-M5RQ6U3G.js} +2 -2
- package/dist/cli/chunks/{chunk-6GP6W46M.js → chunk-M5XYIQYZ.js} +2 -2
- package/dist/cli/chunks/chunk-M7XFBSIK.js +2 -0
- package/dist/cli/chunks/{chunk-IPJ7Q3AJ.js → chunk-MIK4RBEH.js} +1 -1
- package/dist/cli/chunks/{chunk-GRCIBCJ2.js → chunk-NC6K7SCQ.js} +2 -2
- package/dist/cli/chunks/{chunk-CESIR27V.js → chunk-NKTWKYHB.js} +2 -2
- package/dist/cli/chunks/{chunk-OPFGRS5S.js → chunk-NPZOBSAN.js} +2 -2
- package/dist/cli/chunks/{chunk-PGYMKGOE.js → chunk-NQZNMCZU.js} +2 -2
- package/dist/cli/chunks/{chunk-2T7RRL6G.js → chunk-NT7JRHMH.js} +1 -1
- package/dist/cli/chunks/{chunk-H2PYU7MN.js → chunk-NTB342NJ.js} +1 -1
- package/dist/cli/chunks/{chunk-NPPHWFA2.js → chunk-O4JAKWWM.js} +13 -13
- package/dist/cli/chunks/{chunk-APSRPR4W.js → chunk-OD5D4LSZ.js} +2 -2
- package/dist/cli/chunks/{chunk-UHTTW3IT.js → chunk-OH5V5EJW.js} +2 -2
- package/dist/cli/chunks/{chunk-PFG6VQ5Z.js → chunk-OHR7C777.js} +2 -2
- package/dist/cli/chunks/{chunk-U53ZB4IX.js → chunk-OURITHFV.js} +2 -2
- package/dist/cli/chunks/{chunk-DEF34AFL.js → chunk-OV5RPLKV.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMLK5UT.js → chunk-OYJC3YON.js} +2 -2
- package/dist/cli/chunks/{chunk-AH3ZD3NJ.js → chunk-QDESWOZP.js} +2 -2
- package/dist/cli/chunks/chunk-R5GRABPQ.js +2 -0
- package/dist/cli/chunks/{chunk-CZGOSJQ4.js → chunk-R5LGV6GZ.js} +2 -2
- package/dist/cli/chunks/{chunk-MNN5J4GU.js → chunk-RBZCA7SD.js} +2 -2
- package/dist/cli/chunks/chunk-RQMCZQN2.js +2 -0
- package/dist/cli/chunks/chunk-RTFKTKSO.js +4 -0
- package/dist/cli/chunks/{chunk-FB6TI3BH.js → chunk-RTY7VSZB.js} +2 -2
- package/dist/cli/chunks/{chunk-2SXBBUM6.js → chunk-S6IYEBAI.js} +2 -2
- package/dist/cli/chunks/{chunk-YYTGXD3R.js → chunk-SMVVAVN2.js} +2 -2
- package/dist/cli/chunks/{chunk-MA7JIQ6U.js → chunk-T5KHJ3J7.js} +5 -5
- package/dist/cli/chunks/{chunk-FZOWULMH.js → chunk-TCYSBC7Y.js} +1 -1
- package/dist/cli/chunks/{chunk-IU2IV4NE.js → chunk-TFW7CCKS.js} +1 -1
- package/dist/cli/chunks/chunk-TL6OFMXF.js +6 -0
- package/dist/cli/chunks/{chunk-ERQKYIP7.js → chunk-U3LJNNVJ.js} +5 -5
- package/dist/cli/chunks/{chunk-5E6GHSTY.js → chunk-UKKYMW3S.js} +2 -2
- package/dist/cli/chunks/{chunk-YK3BVZY6.js → chunk-UMVSWQNB.js} +2 -2
- package/dist/cli/chunks/{chunk-CFBEBXLO.js → chunk-UTTSH4NH.js} +3 -3
- package/dist/cli/chunks/{chunk-6XCMKIZN.js → chunk-V5AADCBC.js} +1 -1
- package/dist/cli/chunks/{chunk-5LPYV3TK.js → chunk-V7DA4HAK.js} +1 -1
- package/dist/cli/chunks/{chunk-7PJIR4ST.js → chunk-VBK2YAYY.js} +2 -2
- package/dist/cli/chunks/{chunk-ODJNUMV3.js → chunk-VEEYL2CZ.js} +2 -2
- package/dist/cli/chunks/{chunk-PPSAMXYN.js → chunk-VLD7Z2ED.js} +3 -3
- package/dist/cli/chunks/{chunk-N6PIIK6G.js → chunk-VO3DRK4P.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXPY654C.js → chunk-VWUZSNVC.js} +1 -1
- package/dist/cli/chunks/{chunk-WDQ7IEZY.js → chunk-VYTILW4R.js} +2 -2
- package/dist/cli/chunks/{chunk-CZ2IF6MC.js → chunk-WCAVIJ64.js} +1 -1
- package/dist/cli/chunks/{chunk-M2QV7PT7.js → chunk-WCVCOT4E.js} +2 -2
- package/dist/cli/chunks/{chunk-AI4VYSFS.js → chunk-WM3SRRA6.js} +2 -2
- package/dist/cli/chunks/{chunk-NNFZUTDH.js → chunk-X3PZCXWG.js} +1 -1
- package/dist/cli/chunks/{chunk-PCEW6Q2C.js → chunk-X4J73KP3.js} +1 -1
- package/dist/cli/chunks/{chunk-DBMNJSBV.js → chunk-XDI5X3FR.js} +1 -1
- package/dist/cli/chunks/{chunk-VJQYDYAJ.js → chunk-XGBU3KEM.js} +2 -2
- package/dist/cli/chunks/{chunk-3Y7SPD72.js → chunk-XGPTZUKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-EN2QSKFF.js → chunk-XJKZ7FTR.js} +2 -2
- package/dist/cli/chunks/{chunk-VWNFAW2M.js → chunk-XNLIWQYE.js} +2 -2
- package/dist/cli/chunks/{chunk-FAUCT5KR.js → chunk-XS2XF3YG.js} +6 -5
- package/dist/cli/chunks/chunk-Y7B5EUIJ.js +180 -0
- package/dist/cli/chunks/{chunk-Z7IYW5U7.js → chunk-YBBT3YYG.js} +1 -1
- package/dist/cli/chunks/{chunk-6TB6YOCZ.js → chunk-YNOCQ2SL.js} +1 -1
- package/dist/cli/chunks/{chunk-7TB6FK4B.js → chunk-YOCULVHR.js} +1 -1
- package/dist/cli/chunks/{chunk-H74Q7TJN.js → chunk-YPX2TV3M.js} +1 -1
- package/dist/cli/chunks/{chunk-V2M2XCR5.js → chunk-Z2EA7A4Z.js} +1 -1
- package/dist/cli/chunks/{chunk-KI73QCR5.js → chunk-ZMC543GI.js} +2 -2
- package/dist/cli/chunks/chunk-ZMHCMJ4J.js +2 -0
- package/dist/cli/chunks/{chunk-WBM6N6IM.js → chunk-ZP75ASUU.js} +1 -1
- package/dist/cli/chunks/{chunk-VFKF2XO7.js → chunk-ZQHDA4O7.js} +1 -1
- package/dist/cli/chunks/{ci-MSKMVH5X.js → ci-6GUFAZMJ.js} +2 -2
- package/dist/cli/chunks/{ci-config-7ODMNAUM.js → ci-config-J665XNOX.js} +2 -2
- package/dist/cli/chunks/{ci-output-FXZ7ZZW3.js → ci-output-PEQQQWVD.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-4VOUEPOX.js → circuit-breaker-HHB2JSKH.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-7D4SGLM4.js → claude-flow-setup-JKUJRWPN.js} +2 -2
- package/dist/cli/chunks/client-HL2COSFM.js +2 -0
- package/dist/cli/chunks/{cline-installer-WRRT7BGQ.js → cline-installer-Y77BWTAN.js} +2 -2
- package/dist/cli/chunks/{code-ZDJRIL3S.js → code-LV2HAGJY.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-4S4SHM56.js → code-index-extractor-4GKKSETB.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YTRHNDWR.js → codex-installer-WMKBYE5Y.js} +2 -2
- package/dist/cli/chunks/{completions-6N64JUXJ.js → completions-SBGFAOIJ.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-I4A26VCJ.js → complexity-analyzer-AQHFIJXC.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-IIDR66LB.js → continuedev-installer-26AYFS2E.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-SVVFY3S2.js → copilot-installer-4UD3DK55.js} +2 -2
- package/dist/cli/chunks/core-handlers-IX7ATLM6.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VGFS6IBX.js → cost-tracker-TP4NZCG4.js} +2 -2
- package/dist/cli/chunks/{coverage-B7MCGNTE.js → coverage-B2KIXHAI.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +2 -0
- package/dist/cli/chunks/{cursor-installer-UPETT57E.js → cursor-installer-AVZEQZ4W.js} +2 -2
- package/dist/cli/chunks/{daemon-7BDJHEIJ.js → daemon-P574WWBW.js} +4 -4
- package/dist/cli/chunks/{daemon-CQFNZLXU.js → daemon-XM2A7LQU.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-PJVABHON.js → dag-attention-scheduler-MIWOZ6ET.js} +2 -2
- package/dist/cli/chunks/{detect-56SKAGWX.js → detect-TYR7HT23.js} +2 -2
- package/dist/cli/chunks/{dist-node-UYTYUMLN.js → dist-node-2DGVQGLS.js} +2 -2
- package/dist/cli/chunks/{domain-handler-YOYLBYJE.js → domain-handler-RRA4ZOMF.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7TARX2XF.js → domain-plugins-IVZEZ5RB.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-AKVSBD6E.js → domain-transfer-DOBI67K6.js} +2 -2
- package/dist/cli/chunks/dream-T6EP7B3F.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-IS6HSR66.js → embed-and-insert-pattern-VNIEOVPO.js} +2 -2
- package/dist/cli/chunks/{eval-GNB574IM.js → eval-QV4LVPUF.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-RCAOCKM7.js → experience-capture-middleware-DAPKT763.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KTZ5SF54.js → fast-paths-WVRFPHX7.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ITX5LQ57.js → feature-flags-DEFTUIYT.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KFHSR5YF.js → feature-flags-O7ZXDDCD.js} +2 -2
- package/dist/cli/chunks/file-discovery-JYMVTDMU.js +2 -0
- package/dist/cli/chunks/{fleet-2Y3ZE6CE.js → fleet-FVAUMKUT.js} +22 -22
- package/dist/cli/chunks/{gnn-wrapper-RLFW3GSX.js → gnn-wrapper-LS4LZJDR.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EM2URCYZ.js → heartbeat-handler-RFTERD4K.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +2 -0
- package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-JMHEOIBH.js → hnsw-legacy-bridge-GPKGFFHY.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-CBP73QHY.js → hnswlib-node-PHL3F2PR.js} +2 -2
- package/dist/cli/chunks/{hooks-IP7XE34Z.js → hooks-GYJ6D4QM.js} +30 -30
- package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ONAYHU25.js → hypergraph-engine-YGEQPCKJ.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VINJRAID.js → hypergraph-handler-ZIMM647V.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +2 -0
- package/dist/cli/chunks/{init-guard-RYVV5R3Z.js → init-guard-VOMBXJXG.js} +2 -2
- package/dist/cli/chunks/{init-handler-MPRGWMOE.js → init-handler-PSMUBWK5.js} +26 -25
- package/dist/cli/chunks/init-wizard-FUC7KDVX.js +2 -0
- package/dist/cli/chunks/kernel-ZCPMCVMW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-OPD7JBRL.js → kilocode-installer-2YNTFBWJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-M4OPUNK2.js → kiro-installer-XHJDPVAZ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +2 -0
- package/dist/cli/chunks/{learning-4UWTQLMF.js → learning-GNSIDRNG.js} +3 -3
- package/dist/cli/chunks/{llm-router-SQ56FF6Z.js → llm-router-LQDM7IU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +2 -0
- package/dist/cli/chunks/{load-HPHKDGGL.js → load-YATHI72E.js} +2 -2
- package/dist/cli/chunks/load-test-ZHQ2MUGO.js +2 -0
- package/dist/cli/chunks/{mcp-TELMAC7Z.js → mcp-4Y6GDLYK.js} +2 -2
- package/dist/cli/chunks/{memory-PFQ3KPVJ.js → memory-OUW3L7H2.js} +5 -5
- package/dist/cli/chunks/memory-backend-AAMQG6WH.js +2 -0
- package/dist/cli/chunks/memory-handlers-G3LFF53U.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3VDRX6TZ.js → multi-model-executor-UBZJXAD2.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PJ576R63.js → opencode-installer-AMMNWVH5.js} +2 -2
- package/dist/cli/chunks/{orchestrator-72QP4UU7.js → orchestrator-Y44WDOER.js} +19 -19
- package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-754YQW7C.js → pattern-usage-recorder-ESR42RME.js} +2 -2
- package/dist/cli/chunks/{pipeline-AVXY4MVB.js → pipeline-EDTS6OSC.js} +2 -2
- package/dist/cli/chunks/{platform-3E3DXLYB.js → platform-5WONJSUX.js} +2 -2
- package/dist/cli/chunks/{plugin-7FUQAKRE.js → plugin-IJXPCLD4.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIB4F5NV.js → prime-radiant-advanced-wasm-5ECKGZK6.js} +2 -2
- package/dist/cli/chunks/project-root-7QL4KP5C.js +2 -0
- package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +2 -0
- package/dist/cli/chunks/{protocol-handler-BQRYMUTG.js → protocol-handler-DRD3GVNW.js} +2 -2
- package/dist/cli/chunks/{prove-H52QGC6B.js → prove-KTGW2HMJ.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +2 -0
- package/dist/cli/chunks/{quality-QO4XPAUM.js → quality-DV2WPRRS.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FBKE5E6F.js → quality-gate-HFUAFVZC.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +2 -0
- package/dist/cli/chunks/{real-embeddings-RWGOVOXO.js → real-embeddings-RQRVOKVM.js} +2 -2
- package/dist/cli/chunks/{ref-validation-LF76ZOBD.js → ref-validation-QWSKS5OY.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3BYEBTQ7.js → roocode-installer-RBAYRCHX.js} +2 -2
- package/dist/cli/chunks/router-LQB5SWAF.js +2 -0
- package/dist/cli/chunks/routing-feedback-OEEXA55N.js +2 -0
- package/dist/cli/chunks/{routing-handler-DST7BVCU.js → routing-handler-FMPP3XKO.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-XE32PGKC.js → ruvector-commands-KZZT4HWF.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-VP32XC75.js → rvf-migration-coordinator-7CHEV35N.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-SH2AMVI7.js → rvf-store-integrity-Q2TH52SN.js} +2 -2
- package/dist/cli/chunks/safe-db-PE6G3L55.js +2 -0
- package/dist/cli/chunks/schedule-OLKQ6QYW.js +2 -0
- package/dist/cli/chunks/scheduler-LSGBDFAT.js +2 -0
- package/dist/cli/chunks/{security-VSPNKCDS.js → security-CUEA3UIM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-HX6AHL3P.js → shared-rvf-adapter-DROMBRV2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MX4FC2JE.js → shared-rvf-dual-writer-DBNABOP7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +2 -0
- package/dist/cli/chunks/{standalone-memory-O4QUTK6L.js → standalone-memory-IAHA3M6B.js} +2 -2
- package/dist/cli/chunks/{status-handler-Z2BP6EOG.js → status-handler-AFUCASTX.js} +2 -2
- package/dist/cli/chunks/{structural-health-R36WNLQG.js → structural-health-AQRV6JJ6.js} +2 -2
- package/dist/cli/chunks/{sync-QF5Y3EMZ.js → sync-GX7FMJHL.js} +2 -2
- package/dist/cli/chunks/{sync-2ELWUFQU.js → sync-XW5TLZ7M.js} +2 -2
- package/dist/cli/chunks/{task-handler-43PYE75J.js → task-handler-TFKVUTNF.js} +2 -2
- package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +9 -0
- package/dist/cli/chunks/{test-UWA377D4.js → test-D2XDJNDX.js} +11 -11
- package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YQZPJRRN.js → test-scheduling-TS6I2PR7.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-F7C6UKTC.js → token-bootstrap-HBBLPCZ3.js} +2 -2
- package/dist/cli/chunks/{token-usage-DO6WLMXP.js → token-usage-3MBUX4PR.js} +2 -2
- package/dist/cli/chunks/{transformers-H5RGFKVO.js → transformers-ZWMQO3L2.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +2 -0
- package/dist/cli/chunks/{types-PJS2FGPF.js → types-5YEMGPSQ.js} +2 -2
- package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +2 -0
- package/dist/cli/chunks/unified-persistence-UCV7YETW.js +2 -0
- package/dist/cli/chunks/{upgrade-4IC4F6AB.js → upgrade-2TPBKIHI.js} +2 -2
- package/dist/cli/chunks/{validate-DHUWW7PF.js → validate-XRAXXFW6.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-OERQNOX5.js → validate-swarm-IYSCS3BZ.js} +2 -2
- package/dist/cli/chunks/visual-security-ZLXRIQZV.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-TV7DMKES.js → web-tree-sitter-PZQ3ZG2P.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-QZPWSH37.js → windsurf-installer-U6XWFRVT.js} +2 -2
- package/dist/cli/chunks/witness-chain-CVIWYTD2.js +2 -0
- package/dist/cli/chunks/witness-chain-VBKORKOX.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-RUXIOE7F.js → witness-chain-repair-K7YX2AO6.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YXENHB42.js → witness-chain-verifier-GUTC3W7N.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-HL26AGFO.js → witness-key-manager-YBNKMOP6.js} +2 -2
- package/dist/cli/chunks/{workflow-EOVVCN2E.js → workflow-UAJUILFQ.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +2 -0
- package/dist/cli/chunks/{wrappers-AGODHBOO.js → wrappers-AVZ3GPAL.js} +2 -2
- package/dist/cli/commands/fleet.js +4 -1
- package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +11 -6
- package/dist/cli/commands/test.js +5 -2
- package/dist/cli/handlers/init-handler.d.ts +12 -0
- package/dist/cli/handlers/init-handler.js +27 -12
- package/dist/cli/utils/ci-output.d.ts +2 -0
- package/dist/cli/utils/ci-output.js +2 -0
- package/dist/cli/utils/progress.d.ts +16 -2
- package/dist/cli/utils/progress.js +31 -14
- package/dist/coordination/consensus/consensus-engine.js +3 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +3 -2
- package/dist/coordination/handlers/coverage-collection.js +3 -1
- package/dist/coordination/handlers/coverage-runner.d.ts +3 -8
- package/dist/coordination/handlers/coverage-runner.js +6 -22
- package/dist/coordination/handlers/coverage-stderr.d.ts +23 -0
- package/dist/coordination/handlers/coverage-stderr.js +39 -0
- package/dist/coordination/handlers/coverage-target.js +6 -3
- package/dist/coordination/handlers/handler-utils.js +3 -1
- package/dist/coordination/handlers/requirements-handlers.js +3 -2
- package/dist/coordination/handlers/security-handlers.js +34 -20
- package/dist/coordination/queen-coordinator.js +8 -3
- package/dist/coordination/task-executability.d.ts +12 -0
- package/dist/coordination/task-executability.js +27 -0
- package/dist/coordination/workflow-orchestrator.d.ts +6 -0
- package/dist/coordination/workflow-orchestrator.js +22 -8
- package/dist/domains/code-intelligence/services/product-factors-bridge.js +7 -4
- package/dist/domains/coverage-analysis/services/coverage-parser.js +19 -10
- package/dist/domains/learning-optimization/interfaces.d.ts +2 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -1
- package/dist/domains/learning-optimization/services/metrics-optimizer.js +14 -4
- package/dist/domains/learning-optimization/services/production-intel.js +3 -1
- package/dist/domains/security-compliance/generic-finding-dedup.d.ts +40 -0
- package/dist/domains/security-compliance/generic-finding-dedup.js +63 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +14 -6
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -2
- package/dist/domains/security-compliance/services/security-auditor-sast.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor-secrets.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor.js +3 -2
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +5 -14
- package/dist/domains/test-execution/interfaces.d.ts +11 -1
- package/dist/domains/test-execution/services/retry-outcome.d.ts +18 -0
- package/dist/domains/test-execution/services/retry-outcome.js +53 -0
- package/dist/domains/test-generation/coordinator.js +2 -2
- package/dist/domains/test-generation/services/pattern-matcher.js +4 -4
- package/dist/domains/test-generation/services/test-generator.js +2 -2
- package/dist/governance/evolution-pipeline-integration.js +3 -1
- package/dist/hooks/cross-phase-hooks.js +3 -1
- package/dist/init/init-wizard-steps.js +5 -1
- package/dist/init/phases/04-database.js +7 -0
- package/dist/init/phases/12-verification.js +14 -4
- package/dist/init/settings-merge.js +7 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +7 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +31 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +3 -1
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +5 -0
- package/dist/integrations/ruvector/filter-adapter.js +2 -1
- package/dist/learning/dream/insight-generator.js +5 -4
- package/dist/learning/memory-auditor.js +3 -1
- package/dist/learning/qe-patterns.js +2 -1
- package/dist/learning/real-qe-reasoning-bank.d.ts +19 -0
- package/dist/learning/real-qe-reasoning-bank.js +70 -38
- package/dist/mcp/bundle.js +486 -481
- package/dist/mcp/handlers/domain-handler-configs.d.ts +2 -0
- package/dist/mcp/handlers/domain-handler-configs.js +8 -2
- package/dist/mcp/handlers/task-handlers.d.ts +13 -0
- package/dist/mcp/handlers/task-handlers.js +42 -16
- package/dist/mcp/handlers/validation-pipeline-handler.js +9 -9
- package/dist/mcp/protocol-server.js +8 -8
- package/dist/mcp/qe-tool-bridge.js +3 -0
- package/dist/mcp/services/reasoning-bank-service.d.ts +3 -1
- package/dist/mcp/services/reasoning-bank-service.js +4 -0
- package/dist/mcp/tool-annotations.js +4 -1
- package/dist/mcp/tools/coherence/check.js +1 -0
- package/dist/mcp/tools/coherence/consensus.js +4 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +1 -2
- package/dist/mcp/tools/mincut/index.js +3 -0
- package/dist/mcp/tools/quality-assessment/gate.js +7 -0
- package/dist/mcp/tools/qx-analysis/analyze.js +1 -0
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +10 -3
- package/dist/mcp/tools/security-compliance/scan.js +4 -2
- package/dist/mcp/tools/test-execution/e2e-execute.js +2 -2
- package/dist/mcp/tools/test-execution/execute.js +3 -2
- package/dist/memory/crdt/crdt-store.js +5 -0
- package/dist/memory/crdt/lww-register.js +12 -2
- package/dist/optimization/early-exit-token-optimizer.js +3 -1
- package/dist/planning/goap-planner.js +5 -0
- package/dist/planning/plan-executor.js +5 -0
- package/dist/shared/io/confined-read.d.ts +74 -0
- package/dist/shared/io/confined-read.js +256 -0
- package/dist/shared/io/file-reader.d.ts +6 -6
- package/dist/shared/io/file-reader.js +16 -42
- package/dist/shared/llm/providers/claude-code.js +4 -1
- package/dist/shared/native-module-errors.d.ts +51 -0
- package/dist/shared/native-module-errors.js +129 -0
- package/dist/shared/safe-db.js +14 -4
- package/dist/shared/security/osv-client.js +4 -1
- package/dist/shared/types/test-frameworks.js +2 -2
- package/dist/sync/readers/json-reader.js +2 -1
- package/dist/validation/anchor-set.d.ts +6 -0
- package/dist/validation/anchor-set.js +9 -1
- package/dist/validation/quality-gate-runner.d.ts +7 -1
- package/dist/validation/quality-gate-runner.js +3 -3
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-TR5SLAZC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +0 -2
- package/dist/cli/chunks/base-GTB6POYE.js +0 -2
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +0 -2
- package/dist/cli/chunks/chunk-6P7424AO.js +0 -21
- package/dist/cli/chunks/chunk-6X5DHU6Q.js +0 -14
- package/dist/cli/chunks/chunk-CMBLM26R.js +0 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +0 -3
- package/dist/cli/chunks/chunk-DURHK377.js +0 -742
- package/dist/cli/chunks/chunk-FPUDRSFJ.js +0 -180
- package/dist/cli/chunks/chunk-G5I6KGMW.js +0 -59
- package/dist/cli/chunks/chunk-HOZUDE4C.js +0 -2
- package/dist/cli/chunks/chunk-TYFZXDGZ.js +0 -4
- package/dist/cli/chunks/chunk-U4OICXV2.js +0 -6
- package/dist/cli/chunks/chunk-XBVUVFJK.js +0 -4
- package/dist/cli/chunks/chunk-XUZDBQ5X.js +0 -6
- package/dist/cli/chunks/chunk-YBSBABOS.js +0 -2
- package/dist/cli/chunks/chunk-ZG5666GJ.js +0 -2
- package/dist/cli/chunks/client-POSVREVS.js +0 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +0 -2
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +0 -2
- package/dist/cli/chunks/dream-UA7MKOPQ.js +0 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +0 -2
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +0 -2
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +0 -2
- package/dist/cli/chunks/kernel-JQK7PRAI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +0 -2
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +0 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +0 -2
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +0 -2
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +0 -2
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +0 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +0 -2
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +0 -2
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +0 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +0 -2
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +0 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +0 -2
- package/dist/cli/chunks/schedule-ORDDXXY4.js +0 -2
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +0 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +0 -9
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +0 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +0 -2
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +0 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +0 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +0 -2
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +0 -2
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { detectQEDomain } from '../learning/qe-patterns.js';
|
|
10
10
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
11
|
+
import { createSafeRecord } from '../shared/utils/safe-record.js';
|
|
11
12
|
/**
|
|
12
13
|
* Default early exit configuration
|
|
13
14
|
*/
|
|
@@ -374,7 +375,8 @@ export class EarlyExitTokenOptimizer {
|
|
|
374
375
|
reasonBreakdown[attempt.reason]++;
|
|
375
376
|
}
|
|
376
377
|
// Calculate domain breakdown
|
|
377
|
-
|
|
378
|
+
// #1157: domains come from recorded requests.
|
|
379
|
+
const domainBreakdown = createSafeRecord();
|
|
378
380
|
for (const reuse of this.reuseHistory) {
|
|
379
381
|
const domain = reuse.domain ?? 'unknown';
|
|
380
382
|
if (!domainBreakdown[domain]) {
|
|
@@ -645,6 +645,11 @@ export class GOAPPlanner {
|
|
|
645
645
|
if (current === null || current === undefined) {
|
|
646
646
|
return undefined;
|
|
647
647
|
}
|
|
648
|
+
// #1157: goal and condition keys can come from callers; an inherited
|
|
649
|
+
// member such as `constructor` is not part of the world state.
|
|
650
|
+
if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
|
|
651
|
+
return undefined;
|
|
652
|
+
}
|
|
648
653
|
current = current[part];
|
|
649
654
|
}
|
|
650
655
|
return current;
|
|
@@ -900,6 +900,11 @@ export class PlanExecutor {
|
|
|
900
900
|
if (current === null || current === undefined) {
|
|
901
901
|
return undefined;
|
|
902
902
|
}
|
|
903
|
+
// #1157: goal and condition keys can come from callers; an inherited
|
|
904
|
+
// member such as `constructor` is not part of the world state.
|
|
905
|
+
if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
|
|
906
|
+
return undefined;
|
|
907
|
+
}
|
|
903
908
|
current = current[part];
|
|
904
909
|
}
|
|
905
910
|
return current;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1161: read a file inside the project root without a check-then-use race.
|
|
3
|
+
*
|
|
4
|
+
* The payload path guard (#1126) checks a path by name and the handler opens
|
|
5
|
+
* it again later, so a file or symlink swapped in between could be read
|
|
6
|
+
* unchecked. These readers OPEN first and validate what was opened:
|
|
7
|
+
*
|
|
8
|
+
* - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
|
|
9
|
+
* final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
|
|
10
|
+
* - the descriptor must be a regular file within the size limit (fstat);
|
|
11
|
+
* - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
|
|
12
|
+
* re-resolved realpath, which must be the same inode) must lie inside the
|
|
13
|
+
* project root, so a directory component swapped for a symlink is caught;
|
|
14
|
+
* - the content is read from that same descriptor, and never past the limit,
|
|
15
|
+
* even if the file grows after the fstat.
|
|
16
|
+
*
|
|
17
|
+
* A path spelled outside the root is refused before any filesystem call,
|
|
18
|
+
* unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
|
|
19
|
+
* from a trusted source (the other checks still apply).
|
|
20
|
+
*/
|
|
21
|
+
import { type Stats } from 'node:fs';
|
|
22
|
+
import { CallerInputError } from '../error-utils.js';
|
|
23
|
+
/** Default upper bound for a confined read when the caller names none. */
|
|
24
|
+
export declare const DEFAULT_MAX_CONFINED_READ_BYTES: number;
|
|
25
|
+
export type ConfinedReadReason = 'not-found' | 'not-a-file' | 'outside-project-root' | 'unreadable' | 'too-large';
|
|
26
|
+
export interface ConfinedReadOptions {
|
|
27
|
+
/** Project root; defaults to findProjectRoot(). */
|
|
28
|
+
projectRoot?: string;
|
|
29
|
+
/** Refuse files larger than this; defaults to DEFAULT_MAX_CONFINED_READ_BYTES. */
|
|
30
|
+
maxBytes?: number;
|
|
31
|
+
/**
|
|
32
|
+
* A path spelled outside the project root is refused ('refuse', default),
|
|
33
|
+
* or read without the containment check ('allow') when the caller already
|
|
34
|
+
* trusts it. Paths spelled inside the root are always held to the root.
|
|
35
|
+
*/
|
|
36
|
+
outsideRoot?: 'refuse' | 'allow';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A confined read that was refused; `reason` matches the payload guard's.
|
|
40
|
+
* `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
|
|
41
|
+
* otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
|
|
42
|
+
* TOO_LARGE), so callers that report error codes keep working.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ConfinedReadError extends CallerInputError {
|
|
45
|
+
readonly filePath: string;
|
|
46
|
+
readonly reason: ConfinedReadReason;
|
|
47
|
+
readonly code: string;
|
|
48
|
+
constructor(filePath: string, reason: ConfinedReadReason, errnoCode?: string);
|
|
49
|
+
}
|
|
50
|
+
/** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
|
|
51
|
+
export declare const CONFINED_OPEN_FLAGS: number;
|
|
52
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
53
|
+
export declare function isWithinRoot(root: string, candidate: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
|
|
56
|
+
* to the opened file itself. Elsewhere, re-resolve the path and accept it only
|
|
57
|
+
* if it is the same inode as the descriptor, so a swap after the open is
|
|
58
|
+
* detected. Returns null when it cannot be proven.
|
|
59
|
+
*/
|
|
60
|
+
export declare function openedLocation(fd: number, lexical: string, opened: Stats): Promise<string | null>;
|
|
61
|
+
/** Synchronous openedLocation, for callers that read synchronously. */
|
|
62
|
+
export declare function openedLocationSync(fd: number, lexical: string, opened: Stats): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Read a file by path, confined to the project root and validated on the
|
|
65
|
+
* opened descriptor (see the module comment). Throws ConfinedReadError.
|
|
66
|
+
*/
|
|
67
|
+
export declare function readConfinedFile(filePath: string, options?: ConfinedReadOptions): Promise<Buffer>;
|
|
68
|
+
/** readConfinedFile decoded as UTF-8. */
|
|
69
|
+
export declare function readConfinedText(filePath: string, options?: ConfinedReadOptions): Promise<string>;
|
|
70
|
+
/** Synchronous readConfinedFile, for callers that cannot await. */
|
|
71
|
+
export declare function readConfinedFileSync(filePath: string, options?: ConfinedReadOptions): Buffer;
|
|
72
|
+
/** readConfinedFileSync decoded as UTF-8. */
|
|
73
|
+
export declare function readConfinedTextSync(filePath: string, options?: ConfinedReadOptions): string;
|
|
74
|
+
//# sourceMappingURL=confined-read.d.ts.map
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1161: read a file inside the project root without a check-then-use race.
|
|
3
|
+
*
|
|
4
|
+
* The payload path guard (#1126) checks a path by name and the handler opens
|
|
5
|
+
* it again later, so a file or symlink swapped in between could be read
|
|
6
|
+
* unchecked. These readers OPEN first and validate what was opened:
|
|
7
|
+
*
|
|
8
|
+
* - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
|
|
9
|
+
* final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
|
|
10
|
+
* - the descriptor must be a regular file within the size limit (fstat);
|
|
11
|
+
* - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
|
|
12
|
+
* re-resolved realpath, which must be the same inode) must lie inside the
|
|
13
|
+
* project root, so a directory component swapped for a symlink is caught;
|
|
14
|
+
* - the content is read from that same descriptor, and never past the limit,
|
|
15
|
+
* even if the file grows after the fstat.
|
|
16
|
+
*
|
|
17
|
+
* A path spelled outside the root is refused before any filesystem call,
|
|
18
|
+
* unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
|
|
19
|
+
* from a trusted source (the other checks still apply).
|
|
20
|
+
*/
|
|
21
|
+
import { constants as fsConstants } from 'node:fs';
|
|
22
|
+
import * as fsSync from 'node:fs';
|
|
23
|
+
import * as fs from 'node:fs/promises';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
26
|
+
import { CallerInputError } from '../error-utils.js';
|
|
27
|
+
/** Default upper bound for a confined read when the caller names none. */
|
|
28
|
+
export const DEFAULT_MAX_CONFINED_READ_BYTES = 128 * 1024 * 1024;
|
|
29
|
+
/**
|
|
30
|
+
* A confined read that was refused; `reason` matches the payload guard's.
|
|
31
|
+
* `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
|
|
32
|
+
* otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
|
|
33
|
+
* TOO_LARGE), so callers that report error codes keep working.
|
|
34
|
+
*/
|
|
35
|
+
export class ConfinedReadError extends CallerInputError {
|
|
36
|
+
filePath;
|
|
37
|
+
reason;
|
|
38
|
+
code;
|
|
39
|
+
constructor(filePath, reason, errnoCode) {
|
|
40
|
+
super(`Cannot read ${filePath}: ${reason}`);
|
|
41
|
+
this.filePath = filePath;
|
|
42
|
+
this.reason = reason;
|
|
43
|
+
this.name = 'ConfinedReadError';
|
|
44
|
+
this.code = errnoCode ?? reason.toUpperCase().replace(/-/g, '_');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
|
|
48
|
+
export const CONFINED_OPEN_FLAGS = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0) | (fsConstants.O_NONBLOCK ?? 0);
|
|
49
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
50
|
+
export function isWithinRoot(root, candidate) {
|
|
51
|
+
const relative = path.relative(root, candidate);
|
|
52
|
+
return relative === '' || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
|
|
56
|
+
* to the opened file itself. Elsewhere, re-resolve the path and accept it only
|
|
57
|
+
* if it is the same inode as the descriptor, so a swap after the open is
|
|
58
|
+
* detected. Returns null when it cannot be proven.
|
|
59
|
+
*/
|
|
60
|
+
export async function openedLocation(fd, lexical, opened) {
|
|
61
|
+
const sameFile = async (candidate) => {
|
|
62
|
+
const st = await fs.stat(candidate).catch(() => null);
|
|
63
|
+
return st !== null && st.dev === opened.dev && st.ino === opened.ino;
|
|
64
|
+
};
|
|
65
|
+
const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
|
|
66
|
+
if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
|
|
67
|
+
return viaProc;
|
|
68
|
+
const real = await fs.realpath(lexical).catch(() => null);
|
|
69
|
+
if (real && await sameFile(real))
|
|
70
|
+
return real;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/** Synchronous openedLocation, for callers that read synchronously. */
|
|
74
|
+
export function openedLocationSync(fd, lexical, opened) {
|
|
75
|
+
const sameFile = (candidate) => {
|
|
76
|
+
try {
|
|
77
|
+
const st = fsSync.statSync(candidate);
|
|
78
|
+
return st.dev === opened.dev && st.ino === opened.ino;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const realOrNull = (p) => {
|
|
85
|
+
try {
|
|
86
|
+
return fsSync.realpathSync(p);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const viaProc = realOrNull(`/proc/self/fd/${fd}`);
|
|
93
|
+
if (viaProc && path.isAbsolute(viaProc) && sameFile(viaProc))
|
|
94
|
+
return viaProc;
|
|
95
|
+
const real = realOrNull(lexical);
|
|
96
|
+
if (real && sameFile(real))
|
|
97
|
+
return real;
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function reasonFor(error) {
|
|
101
|
+
const code = error?.code;
|
|
102
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
103
|
+
return 'not-found';
|
|
104
|
+
// ELOOP: a symlink was swapped onto the checked realpath's final name.
|
|
105
|
+
if (code === 'EISDIR' || code === 'ELOOP')
|
|
106
|
+
return 'not-a-file';
|
|
107
|
+
return 'unreadable';
|
|
108
|
+
}
|
|
109
|
+
function fail(filePath, reason, error) {
|
|
110
|
+
return new ConfinedReadError(filePath, reason, error?.code);
|
|
111
|
+
}
|
|
112
|
+
function plan(filePath, rootReal, options) {
|
|
113
|
+
if (typeof filePath !== 'string' || filePath === '' || filePath.includes('\0')) {
|
|
114
|
+
throw fail(String(filePath), 'unreadable');
|
|
115
|
+
}
|
|
116
|
+
const rootLexical = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
117
|
+
const lexical = path.resolve(filePath);
|
|
118
|
+
const inRoot = isWithinRoot(rootLexical, lexical) || isWithinRoot(rootReal, lexical);
|
|
119
|
+
// Spelled outside the root: refused before any filesystem call, so the
|
|
120
|
+
// reason cannot reveal whether an outside path exists.
|
|
121
|
+
if (!inRoot && options.outsideRoot !== 'allow')
|
|
122
|
+
throw fail(filePath, 'outside-project-root');
|
|
123
|
+
return { lexical, rootReal, inRoot, limit: options.maxBytes ?? DEFAULT_MAX_CONFINED_READ_BYTES };
|
|
124
|
+
}
|
|
125
|
+
/** Check the opened descriptor's stat before anything is read. */
|
|
126
|
+
function checkOpened(filePath, st, limit) {
|
|
127
|
+
if (!st.isFile())
|
|
128
|
+
throw fail(filePath, 'not-a-file');
|
|
129
|
+
if (st.size > limit)
|
|
130
|
+
throw fail(filePath, 'too-large');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Read a file by path, confined to the project root and validated on the
|
|
134
|
+
* opened descriptor (see the module comment). Throws ConfinedReadError.
|
|
135
|
+
*/
|
|
136
|
+
export async function readConfinedFile(filePath, options = {}) {
|
|
137
|
+
const root = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
138
|
+
const rootReal = await fs.realpath(root).catch(() => root);
|
|
139
|
+
const p = plan(filePath, rootReal, options);
|
|
140
|
+
let real;
|
|
141
|
+
try {
|
|
142
|
+
real = await fs.realpath(p.lexical);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw fail(filePath, reasonFor(error), error);
|
|
146
|
+
}
|
|
147
|
+
if (p.inRoot && !isWithinRoot(p.rootReal, real))
|
|
148
|
+
throw fail(filePath, 'outside-project-root');
|
|
149
|
+
let handle;
|
|
150
|
+
try {
|
|
151
|
+
handle = await fs.open(real, CONFINED_OPEN_FLAGS);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw fail(filePath, reasonFor(error), error);
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const st = await handle.stat();
|
|
158
|
+
checkOpened(filePath, st, p.limit);
|
|
159
|
+
if (p.inRoot) {
|
|
160
|
+
const location = await openedLocation(handle.fd, real, st);
|
|
161
|
+
if (!location || !isWithinRoot(p.rootReal, location))
|
|
162
|
+
throw fail(filePath, 'outside-project-root');
|
|
163
|
+
}
|
|
164
|
+
// Read at most limit + 1 bytes from this descriptor: a file that grew
|
|
165
|
+
// after the fstat is refused rather than read without bound.
|
|
166
|
+
const chunks = [];
|
|
167
|
+
let total = 0;
|
|
168
|
+
for (;;) {
|
|
169
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
|
|
170
|
+
const { bytesRead } = await handle.read(chunk, 0, chunk.length, null);
|
|
171
|
+
if (bytesRead === 0)
|
|
172
|
+
break;
|
|
173
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
174
|
+
total += bytesRead;
|
|
175
|
+
if (total > p.limit)
|
|
176
|
+
throw fail(filePath, 'too-large');
|
|
177
|
+
}
|
|
178
|
+
return Buffer.concat(chunks, total);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof ConfinedReadError)
|
|
182
|
+
throw error;
|
|
183
|
+
throw fail(filePath, reasonFor(error), error);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await handle.close().catch(() => undefined);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** readConfinedFile decoded as UTF-8. */
|
|
190
|
+
export async function readConfinedText(filePath, options = {}) {
|
|
191
|
+
return (await readConfinedFile(filePath, options)).toString('utf-8');
|
|
192
|
+
}
|
|
193
|
+
/** Synchronous readConfinedFile, for callers that cannot await. */
|
|
194
|
+
export function readConfinedFileSync(filePath, options = {}) {
|
|
195
|
+
const root = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
196
|
+
let rootReal = root;
|
|
197
|
+
try {
|
|
198
|
+
rootReal = fsSync.realpathSync(root);
|
|
199
|
+
}
|
|
200
|
+
catch { /* keep the lexical root */ }
|
|
201
|
+
const p = plan(filePath, rootReal, options);
|
|
202
|
+
let real;
|
|
203
|
+
try {
|
|
204
|
+
real = fsSync.realpathSync(p.lexical);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
throw fail(filePath, reasonFor(error), error);
|
|
208
|
+
}
|
|
209
|
+
if (p.inRoot && !isWithinRoot(p.rootReal, real))
|
|
210
|
+
throw fail(filePath, 'outside-project-root');
|
|
211
|
+
let fd;
|
|
212
|
+
try {
|
|
213
|
+
fd = fsSync.openSync(real, CONFINED_OPEN_FLAGS);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw fail(filePath, reasonFor(error), error);
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const st = fsSync.fstatSync(fd);
|
|
220
|
+
checkOpened(filePath, st, p.limit);
|
|
221
|
+
if (p.inRoot) {
|
|
222
|
+
const location = openedLocationSync(fd, real, st);
|
|
223
|
+
if (!location || !isWithinRoot(p.rootReal, location))
|
|
224
|
+
throw fail(filePath, 'outside-project-root');
|
|
225
|
+
}
|
|
226
|
+
const chunks = [];
|
|
227
|
+
let total = 0;
|
|
228
|
+
for (;;) {
|
|
229
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
|
|
230
|
+
const bytesRead = fsSync.readSync(fd, chunk, 0, chunk.length, null);
|
|
231
|
+
if (bytesRead === 0)
|
|
232
|
+
break;
|
|
233
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
234
|
+
total += bytesRead;
|
|
235
|
+
if (total > p.limit)
|
|
236
|
+
throw fail(filePath, 'too-large');
|
|
237
|
+
}
|
|
238
|
+
return Buffer.concat(chunks, total);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (error instanceof ConfinedReadError)
|
|
242
|
+
throw error;
|
|
243
|
+
throw fail(filePath, reasonFor(error), error);
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
try {
|
|
247
|
+
fsSync.closeSync(fd);
|
|
248
|
+
}
|
|
249
|
+
catch { /* already closed */ }
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** readConfinedFileSync decoded as UTF-8. */
|
|
253
|
+
export function readConfinedTextSync(filePath, options = {}) {
|
|
254
|
+
return readConfinedFileSync(filePath, options).toString('utf-8');
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=confined-read.js.map
|
|
@@ -74,12 +74,12 @@ export declare class FileReader {
|
|
|
74
74
|
*/
|
|
75
75
|
private inProjectRoot;
|
|
76
76
|
/**
|
|
77
|
-
* #1021 round 2b: read an in-root path without a check-then-use
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
77
|
+
* #1021 round 2b / #1161: read an in-root path without a check-then-use
|
|
78
|
+
* race. readConfinedText opens the path once and verifies the opened
|
|
79
|
+
* descriptor (a regular file whose real location lies inside the root) and
|
|
80
|
+
* reads from that same descriptor, so swapping a symlink (file or directory
|
|
81
|
+
* component) between a check and the read cannot redirect it, and a FIFO or
|
|
82
|
+
* device cannot hang or flood the read.
|
|
83
83
|
*/
|
|
84
84
|
private readContained;
|
|
85
85
|
/**
|
|
@@ -7,6 +7,7 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { ok, err } from '../types/index.js';
|
|
8
8
|
import { validatePath } from '../security/path-traversal-validator.js';
|
|
9
9
|
import { safeJsonParse } from '../safe-json.js';
|
|
10
|
+
import { ConfinedReadError, readConfinedText } from './confined-read.js';
|
|
10
11
|
/** Extensions never read, inside or outside the project root. */
|
|
11
12
|
const DENIED_EXTENSIONS = ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'];
|
|
12
13
|
export class FileReadError extends Error {
|
|
@@ -65,25 +66,6 @@ function readError(error, absolutePath) {
|
|
|
65
66
|
}
|
|
66
67
|
return new FileReadError(message, absolutePath, nodeError.code, nodeError);
|
|
67
68
|
}
|
|
68
|
-
/**
|
|
69
|
-
* #1021 round 2b: where an OPEN descriptor really points. On Linux,
|
|
70
|
-
* /proc/self/fd/N resolves to the opened file itself. Elsewhere, re-resolve
|
|
71
|
-
* the path and accept it only if it is the same inode as the descriptor, so
|
|
72
|
-
* a swap after the open is detected. Returns null when it cannot be proven.
|
|
73
|
-
*/
|
|
74
|
-
async function openedLocation(fd, lexical, opened) {
|
|
75
|
-
const sameFile = async (candidate) => {
|
|
76
|
-
const st = await fs.stat(candidate).catch(() => null);
|
|
77
|
-
return st !== null && st.dev === opened.dev && st.ino === opened.ino;
|
|
78
|
-
};
|
|
79
|
-
const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
|
|
80
|
-
if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
|
|
81
|
-
return viaProc;
|
|
82
|
-
const real = await fs.realpath(lexical).catch(() => null);
|
|
83
|
-
if (real && await sameFile(real))
|
|
84
|
-
return real;
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
69
|
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
88
70
|
function isWithin(root, candidate) {
|
|
89
71
|
const relative = path.relative(root, candidate);
|
|
@@ -341,38 +323,30 @@ export class FileReader {
|
|
|
341
323
|
return { lexical, rootReal };
|
|
342
324
|
}
|
|
343
325
|
/**
|
|
344
|
-
* #1021 round 2b: read an in-root path without a check-then-use
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
326
|
+
* #1021 round 2b / #1161: read an in-root path without a check-then-use
|
|
327
|
+
* race. readConfinedText opens the path once and verifies the opened
|
|
328
|
+
* descriptor (a regular file whose real location lies inside the root) and
|
|
329
|
+
* reads from that same descriptor, so swapping a symlink (file or directory
|
|
330
|
+
* component) between a check and the read cannot redirect it, and a FIFO or
|
|
331
|
+
* device cannot hang or flood the read.
|
|
350
332
|
*/
|
|
351
333
|
async readContained(filePath, lexical, rootReal) {
|
|
352
334
|
this.stats.totalReads++;
|
|
353
|
-
let handle;
|
|
354
335
|
try {
|
|
355
|
-
|
|
336
|
+
// The lexical root, so a path spelled under a symlinked root still
|
|
337
|
+
// counts as inside; the primitive resolves the root's realpath itself.
|
|
338
|
+
return ok(await readConfinedText(lexical, { projectRoot: this.projectRoot ?? rootReal }));
|
|
356
339
|
}
|
|
357
340
|
catch (error) {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
const opened = await handle.stat();
|
|
362
|
-
const location = await openedLocation(handle.fd, lexical, opened);
|
|
363
|
-
if (!location || !isWithin(rootReal, location)) {
|
|
341
|
+
if (!(error instanceof ConfinedReadError))
|
|
342
|
+
return err(readError(error, lexical));
|
|
343
|
+
if (error.reason === 'outside-project-root') {
|
|
364
344
|
return err(new PathTraversalError(filePath, ['Path resolves outside the project root'], 'critical'));
|
|
365
345
|
}
|
|
366
|
-
if (
|
|
367
|
-
return err(new FileReadError('
|
|
346
|
+
if (error.reason === 'not-a-file') {
|
|
347
|
+
return err(new FileReadError('Not a regular file: ' + lexical, lexical, error.code === 'NOT_A_FILE' ? 'EISDIR' : error.code));
|
|
368
348
|
}
|
|
369
|
-
return
|
|
370
|
-
}
|
|
371
|
-
catch (error) {
|
|
372
|
-
return err(readError(error, lexical));
|
|
373
|
-
}
|
|
374
|
-
finally {
|
|
375
|
-
await handle.close().catch(() => undefined);
|
|
349
|
+
return err(readError({ code: error.reason === 'not-found' ? 'ENOENT' : error.code }, lexical));
|
|
376
350
|
}
|
|
377
351
|
}
|
|
378
352
|
/**
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { spawn } from 'node:child_process';
|
|
17
17
|
import { createLLMError, } from '../interfaces.js';
|
|
18
18
|
import { TokenMetricsCollector } from '../../../learning/token-tracker.js';
|
|
19
|
+
import { redactLogText } from '../../../logging/redaction.js';
|
|
19
20
|
/** Env vars whose presence flips the CLI from subscription to API billing. */
|
|
20
21
|
export const API_BILLING_ENV_VARS = [
|
|
21
22
|
'ANTHROPIC_API_KEY',
|
|
@@ -108,7 +109,9 @@ export class ClaudeCodeProvider {
|
|
|
108
109
|
data = JSON.parse(stdout);
|
|
109
110
|
}
|
|
110
111
|
catch {
|
|
111
|
-
throw createLLMError(
|
|
112
|
+
throw createLLMError(
|
|
113
|
+
// #1150: redact, then cut, so a cut secret leaves no fragment behind.
|
|
114
|
+
`Could not parse claude -p JSON output: ${redactLogText(stdout, Number.POSITIVE_INFINITY).slice(0, 200)}`, 'PROVIDER_UNAVAILABLE', { provider: 'claude-code', model, retryable: true });
|
|
112
115
|
}
|
|
113
116
|
if (data.is_error) {
|
|
114
117
|
throw this.classifyError(data.result ?? data.api_error_status ?? 'claude error', model);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native module load-failure diagnostics (issue #1173).
|
|
3
|
+
*
|
|
4
|
+
* better-sqlite3 ships a native addon whose binary is fetched/compiled by its
|
|
5
|
+
* `install` script. npm 12 blocks dependency install scripts unless they are
|
|
6
|
+
* allowed (`allowScripts`), so a plain `npm install -g agentic-qe` leaves the
|
|
7
|
+
* addon missing and the first `new Database()` throws "Could not locate the
|
|
8
|
+
* bindings file". Other installs hit the same wall via a Node upgrade
|
|
9
|
+
* (NODE_MODULE_VERSION mismatch) or an arch mismatch.
|
|
10
|
+
*
|
|
11
|
+
* These helpers recognise those failures and turn them into a message that
|
|
12
|
+
* names the cause and the exact command that fixes it, instead of a 20-line
|
|
13
|
+
* list of probed paths (or, in `aqe init`, nothing at all).
|
|
14
|
+
*/
|
|
15
|
+
export type NativeModuleFailureReason = 'missing-binding' | 'abi-mismatch' | 'load-failed';
|
|
16
|
+
export interface NativeModuleFailure {
|
|
17
|
+
/** npm package whose native addon failed to load */
|
|
18
|
+
readonly moduleName: string;
|
|
19
|
+
readonly reason: NativeModuleFailureReason;
|
|
20
|
+
/** First line of the original error, without the probed-path list */
|
|
21
|
+
readonly detail: string;
|
|
22
|
+
}
|
|
23
|
+
/** Marker present in every remedy we emit; used to avoid double-wrapping. */
|
|
24
|
+
export declare const NATIVE_MODULE_REMEDY_MARKER = "native module could not be loaded";
|
|
25
|
+
/** Packages with install scripts that a global agentic-qe install needs allowed. */
|
|
26
|
+
export declare const AQE_INSTALL_SCRIPT_PACKAGES = "agentic-qe,better-sqlite3,hnswlib-node";
|
|
27
|
+
/**
|
|
28
|
+
* Classify `error` as a native-addon load failure, or return null when it is
|
|
29
|
+
* something else (I/O error, corrupt DB, lock contention, ...).
|
|
30
|
+
*/
|
|
31
|
+
export declare function diagnoseNativeModuleError(error: unknown, moduleName?: string): NativeModuleFailure | null;
|
|
32
|
+
/** Multi-line, actionable explanation for a diagnosed native-module failure. */
|
|
33
|
+
export declare function formatNativeModuleRemedy(failure: NativeModuleFailure): string;
|
|
34
|
+
/**
|
|
35
|
+
* Error raised when a native addon cannot be loaded. The message carries the
|
|
36
|
+
* remedy; the original error is preserved as `cause`.
|
|
37
|
+
*/
|
|
38
|
+
export declare class NativeModuleLoadError extends Error {
|
|
39
|
+
readonly moduleName: string;
|
|
40
|
+
readonly reason: NativeModuleFailureReason;
|
|
41
|
+
constructor(failure: NativeModuleFailure, cause: unknown);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Return a NativeModuleLoadError for native-load failures, or the original
|
|
45
|
+
* error unchanged otherwise. Idempotent: an error that already carries the
|
|
46
|
+
* remedy is returned as-is.
|
|
47
|
+
*/
|
|
48
|
+
export declare function withNativeModuleRemedy(error: unknown, moduleName?: string): unknown;
|
|
49
|
+
/** True when `error` (or its message, after re-wrapping) is a native-load failure. */
|
|
50
|
+
export declare function isNativeModuleLoadFailure(error: unknown): boolean;
|
|
51
|
+
//# sourceMappingURL=native-module-errors.d.ts.map
|